主从复制(master/slave)

主机(master)数据更新后根据配置和策略,自动同步到备机(slave)。通过主从复制,能够实现读写分离容灾恢复

实现主从复制非常简单,只需要在从(slave)执行slaveof <masterip> <masterport>命令即可,也可以在配置文件redis.conf中配置启动redis时自动实现主从复制。

特别注意:如果master设置了requirepass,则slave必须设置masterauth,否则会复制失败

################################# REPLICATION #################################

# Master-Slave replication. Use slaveof to make a Redis instance a copy of
# another Redis server. A few things to understand ASAP about Redis replication.
#
# 1) Redis replication is asynchronous, but you can configure a master to
# stop accepting writes if it appears to be not connected with at least
# a given number of slaves.
# 2) Redis slaves are able to perform a partial resynchronization with the
# master if the replication link is lost for a relatively small amount of
# time. You may want to configure the replication backlog size (see the next
# sections of this file) with a sensible value depending on your needs.
# 3) Replication is automatic and does not need user intervention. After a
# network partition slaves automatically try to reconnect to masters
# and resynchronize with them.
#
# slaveof <masterip> <masterport> # If the master is password protected (using the "requirepass" configuration
# directive below) it is possible to tell the slave to authenticate before
# starting the replication synchronization process, otherwise the master will
# refuse the slave request.
#
# masterauth <master-password>
1.单主机上启动3个Redis实例来演示1主2从

step1:从/etc/redis.conf拷贝3份配置文件,并修改配置,分别用于3个实例

[root@VM_0_171_centos ~]# ls -l
总用量 152
-rw-r--r-- 1 root root 46755 4月 4 15:35 redis-6379.conf
-rw-r--r-- 1 root root 46746 4月 4 15:35 redis-6380.conf
-rw-r--r-- 1 root root 46777 4月 4 15:37 redis-6381.conf
[root@VM_0_171_centos ~]#

配置项

port 6380
daemonize yes
pidfile "redis-6380.pid"
logfile "redis-6380.log"
dbfilename "dump-6380.rdb"
slaveof 127.0.0.1 6379

step2:分别启动3个Redis示例,查看进程发现3个进程都已经启动,连接master查看replication信息发现6379为master,6780、6381为slave

[root@VM_0_171_centos ~]# redis-server redis-6379.conf
[root@VM_0_171_centos ~]# redis-server redis-6380.conf
[root@VM_0_171_centos ~]# redis-server redis-6381.conf
[root@VM_0_171_centos ~]# ps -ef | grep redis
root 30870 1 0 22:37 ? 00:00:00 redis-server 127.0.0.1:6379
root 30881 1 0 22:37 ? 00:00:00 redis-server 127.0.0.1:6380
root 30885 1 0 22:37 ? 00:00:00 redis-server 127.0.0.1:6381
root 30890 28045 0 22:37 pts/0 00:00:00 grep --color=auto redis
[root@VM_0_171_centos ~]# redis-cli -p 6379
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=29,lag=0
slave1:ip=127.0.0.1,port=6381,state=online,offset=29,lag=1
master_repl_offset:29
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:28
127.0.0.1:6379>

step3:验证,连接6379,保存k0;退出,连接6380,查询k0,得到刚才保存的v0,主从复制成功。

127.0.0.1:6379> keys *
1) "k1"
2) "k2"
3) "k5"
4) "k4"
5) "k3"
6) "k6"
127.0.0.1:6379> set k0 v0
OK
127.0.0.1:6379> exit
[root@VM_0_171_centos ~]# redis-cli -p 6380
127.0.0.1:6380> keys *
1) "k0"
2) "k6"
3) "k5"
4) "k2"
5) "k4"
6) "k3"
7) "k1"
127.0.0.1:6380> get k0
"v0"
127.0.0.1:6380>
2.sentinel哨兵模式

sentinel能够后台监控主机是否故障,如果故障了根据投票自动将slave转换为master,master恢复后会自动变成slave。

监控同一master的sentinel自动集群,协同工作。

示例

step1:复制/etc/redis-sentinel.conf,修改配置

#以守护进程启动
daemonize yes
#sentinel默认端口
port 26379
#工作目录
dir "/tmp"
#监控的master,最后的1表示1个sentinel认为master短线就干预,进行主从切换
sentinel monitor mymaster 127.0.0.1 6379 1
#master30000毫秒无响应,sentinel就认为它已经断线
sentinel down-after-milliseconds mymaster 30000
#在执行故障转移时, 最多可以有多少个slave同时对新的master进行同步, 这个数字越小, 完成故障转移所需的时间就越长,但越大就意味着越多的slave因为复制而不可用。可以通过将这个值设为 1 来保证每次只有一个slave处于不能处理命令请求的状态。
sentinel parallel-syncs mymaster 1
#故障转移的毫秒数
sentinel failover-timeout mymaster 180000
#日志文件
logfile /var/log/redis/sentinel.log

step2:后台启动sentinel(daemonize yes)

[root@VM_0_171_centos ~]# redis-sentinel redis-sentinel.conf
[root@VM_0_171_centos ~]# ps -ef | grep redis
root 2169 1 0 23:33 ? 00:00:00 redis-sentinel *:26379 [sentinel]
root 2180 28045 0 23:33 pts/0 00:00:00 grep --color=auto redis
root 31340 1 0 22:43 ? 00:00:01 redis-server 127.0.0.1:6379
root 31344 1 0 22:43 ? 00:00:01 redis-server 127.0.0.1:6380
root 31349 1 0 22:43 ? 00:00:01 redis-server 127.0.0.1:6381
[root@VM_0_171_centos ~]#

step3:停止mster,查看sentinel.log发现6380成了新的master,连接6380查看replication信息进行验证

[root@VM_0_171_centos ~]# redis-cli -p 6379
127.0.0.1:6379> shutdown
not connected> exit
                _._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 3.2.3 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in sentinel mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 26379
| `-._ `._ / _.-' | PID: 2169
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-' 2169:X 04 Apr 23:33:26.845 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
2169:X 04 Apr 23:33:26.845 # Sentinel ID is 5a7283b3989cece81dea1e770e1e83b3ee174004
2169:X 04 Apr 23:33:26.845 # +monitor master mymaster 127.0.0.1 6381 quorum 1
2169:X 04 Apr 23:34:16.908 # +sdown master mymaster 127.0.0.1 6381
2169:X 04 Apr 23:34:16.908 # +odown master mymaster 127.0.0.1 6381 #quorum 1/1
2169:X 04 Apr 23:34:16.908 # +new-epoch 4
2169:X 04 Apr 23:34:16.908 # +try-failover master mymaster 127.0.0.1 6381
2169:X 04 Apr 23:34:16.920 # +vote-for-leader 5a7283b3989cece81dea1e770e1e83b3ee174004 4
2169:X 04 Apr 23:34:16.920 # +elected-leader master mymaster 127.0.0.1 6381
2169:X 04 Apr 23:34:16.920 # +failover-state-select-slave master mymaster 127.0.0.1 6381
2169:X 04 Apr 23:34:17.020 # +selected-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
2169:X 04 Apr 23:34:17.020 * +failover-state-send-slaveof-noone slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
2169:X 04 Apr 23:34:17.091 * +failover-state-wait-promotion slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
2169:X 04 Apr 23:34:18.048 # +promoted-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
2169:X 04 Apr 23:34:18.048 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6381
2169:X 04 Apr 23:34:18.117 * +slave-reconf-sent slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381
2169:X 04 Apr 23:34:19.093 * +slave-reconf-inprog slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381
2169:X 04 Apr 23:34:19.094 * +slave-reconf-done slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381
2169:X 04 Apr 23:34:19.176 # +failover-end master mymaster 127.0.0.1 6381
2169:X 04 Apr 23:34:19.176 # +switch-master mymaster 127.0.0.1 6381 127.0.0.1 6380
2169:X 04 Apr 23:34:19.176 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380
2169:X 04 Apr 23:34:19.176 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
2169:X 04 Apr 23:35:30.920 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380
[root@VM_0_171_centos ~]#
[root@VM_0_171_centos ~]# redis-cli -p 6380
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=37410,lag=0
master_repl_offset:37410
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:7475
repl_backlog_histlen:29936
127.0.0.1:6380>

step4:恢复6379端口的redis实例,发现它成了slave

[root@VM_0_171_centos ~]# redis-server redis-6379.conf
[root@VM_0_171_centos ~]# redis-cli -p 6379
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6380
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:45049
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6379>
3.特别说明
1.如果master设置了requirepass,则slave需要设置masterauth

2.slave默认是read only模式,不能写入数据

3.master宕机后,slave正常工作,master恢复后会自动与salve连接

4.slave宕机后,master及其它slave(如果slave>1)继续工作,slave恢复后需要手动通过slaveof <masterip> <masterport>连接(或者在redis.conf中配置了slave of)

5.slaveof no one可以将slave变成master供其它slave连接

Redis-05.主从复制与Sentinel的更多相关文章

  1. Redis实现主从复制以及sentinel的配置

    redis 是一个高性能的 key-value 数据库. redis 的出现,很大程度补偿了 memcached 这类 keyvalue 存储的不足,在部分场合可以对关系数据库起到很 好的补充作用.它 ...

  2. Redis 主从、哨兵Sentinel、Jedis

    Redis 主从.哨兵Sentinel.Jedis 2017年02月15日 15:52:48 有且仅有 阅读数 6183 文章标签: redis主从sentineljedis 更多 分类专栏: 7/1 ...

  3. Redis哨兵模式(sentinel)学习总结及部署记录(主从复制、读写分离、主从切换)

    Redis的集群方案大致有三种:1)redis cluster集群方案:2)master/slave主从方案:3)哨兵模式来进行主从替换以及故障恢复. 一.sentinel哨兵模式介绍Sentinel ...

  4. [转]Redis哨兵模式(sentinel)学习总结及部署记录(主从复制、读写分离、主从切换)

    Redis的集群方案大致有三种:1)redis cluster集群方案:2)master/slave主从方案:3)哨兵模式来进行主从替换以及故障恢复. 一.sentinel哨兵模式介绍Sentinel ...

  5. Redis哨兵模式(sentinel)部署记录(主从复制、读写分离、主从切换)

    部署环境: CentOS7.5  192.168.94.11 (master) 192.168.94.22 (slave0) 192.168.94.33 (slave1) 192.168.94.44 ...

  6. redis的主从复制,以及使用sentinel自动处理主机宕机问题,集群

    以下部分想看懂得有一定的redis基础,且步骤是连贯的,错一步都不行.redis运行多个实例,不懂得自行百度. 1. redis主从同步 原理: 从服务器向主服务器发送 SYNC 命令. 接到 SYN ...

  7. contos7下安装redis&redis的主从复制的配置&redis 哨兵(sentinel)

    一.centos7下安装redis 1.解压 redis-5.0.5.tar.gz 压缩文件 解压命令为: .tar.gz -C redis 解压后进入 redis 工作目录,进入 redis-5.0 ...

  8. Redis的主从复制与Redis Sentinel哨兵机制

    1    Redis的主从复制 1.1   什么是主从复制 持久化保证了即使redis服务重启也不会丢失数据,因为redis服务重启后会将硬盘上持久化的数据恢复到内存中,但是当redis服务器的硬盘损 ...

  9. redis主从复制和sentinel配置高可用

    一:redis主从配置1.环境准备 master : 192.168.50.10 6179 slave1: 192.168.50.10 6279 slave2: 192.168.50.10 63792 ...

  10. 深入理解Redis高可用方案-Sentinel

    Redis Sentinel是Redis的高可用方案.是Redis 2.8中正式引入的. 在之前的主从复制方案中,如果主节点出现问题,需要手动将一个从节点升级为主节点,然后将其它从节点指向新的主节点, ...

随机推荐

  1. 微信小程序记账本进度七

    最后大体上完成了,但是好像少了点功能,整体并不是特别华丽

  2. JVM学习04:类的文件结构

    JVM学习04:类的文件结构 写在前面:本系列分享主要参考资料是  周志明老师的<深入理解Java虚拟机>第二版. 类的文件结构知识要点Xmind梳理

  3. CRM--自定义stark

    一:启动 解释django的启动 完成以上两步,在app01下创建stark.py文件,就会被加载 (admin.py就是这样启动的) 二:注册 三:设计urls 四:增删改查

  4. ios OC 关键字 copy,strong,weak,assign的区别

    一.先介绍 copy.strong.weak 的区别,如代码所示 @property(copy,nonatomic)NSMutableString*aCopyMStr; @property(stron ...

  5. EventEmitter事件处理器中的this问题

    JavaScript中的this是一个比较绕的问题,有非常非常多的文章在讲这件事,这里推荐一篇文章,看了这篇文章基本上就能弄明白了. 这篇文章讲了关于this的一个基本原则: 包含this的Funct ...

  6. 除非你是BAT,前端开发中最好少造轮子

    站在前人的肩膀上 HTML.CSS.JavaScript是前端的根基,这是无可否认的事实.正如一辆车当然都是由一堆钢板和螺钉组成的,但是现在还有人拎着个锤子敲敲打打的造车吗?李书福说过,“汽车不过是四 ...

  7. 自定义View之一圆形图片

    自定义View的方法 对现有控件进行扩展 通过组合来实现新的控件 重写View来实现全新的控件 本篇文章主要讲对现有控件的扩展 1.圆形图片控件 自定义View,对ImageView的扩展 重写onD ...

  8. ASP.NET Core 项目简单实现身份验证及鉴权

    ASP.NET Core 身份验证及鉴权 目录 项目准备 身份验证 定义基本类型和接口 编写验证处理器 实现用户身份验证 权限鉴定 思路 编写过滤器类及相关接口 实现属性注入 实现用户权限鉴定 测试 ...

  9. 计数排序之python

    话说,一口气不能吃个胖子, 一次性 学习 计数排序, 也确实容易消化不良. 下面,我们逐步学习下计数排序. 1.  已知一个简单列表 l1 = [5, 4, 3], 分析下这个列表的情况 5 > ...

  10. oracle primary key & foreign key

    主键:一个表中只有一个主键约束,但是一个主键约束可以由数据表中的多个列组成:primary key alter table TName add constraints pk_name PRIMARY ...