redis主从复制
转自:http://blog.csdn.net/lijunxian1013/article/details/51994254
通常使用redis时,如果redis存储的是一些非常重要的数据,那么只配置一台服务器的redis是有风险的,以为如果主服务器宕机,影响到正常业务之外,最终要的是数据的丢失,因此我们常常会配置多台redis做集群,除了防止主机宕机,我们还可以实现读写分离,任务分离等。
为了使redis其高可用,redis在2.4版本后加入了sentinel功能,主要功能是在主机宕机时自动选举出一个slave,并且将其转换为master,保证业务的正常运行。这篇文章我们就模拟配置redis的集群和sentinel监控功能
一、 配置redis集群
1、 服务器信息
系统:centos 6.5
服务器: 采用3台服务器,实现一主两从
主master:192.168.1.11
从slave1: 192.168.1.12
从slave1: 192.168.1.13
确保三台机器安装了相同版本的redis,并且
主服务器Master配置(192.168.1.11)
从服务器Slave配置
1、 关闭rdb快照,rdb备份交由slave进行(只需在一台slave开启rdb即可)
#save 900 1
#save 300 10
#save 60 10000
2、 开启aof日志,因为主服务器的aof日志数据是最新最全的,slave在数据同步时有可能会出现延迟
appendonly yes
appendfsync everysec
no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
appendfilename appendonly.aof
3、 配置ip绑定,redis默认只绑定只允许本机的服务访问,在配置集群时,需要绑定本机的局域网ip后slave才可以连接到master服务器
bind 127.0.0.1 192.168.1.11
1、配置master的IP和端口
格式: slaveof 192.168.1.11 6379
2、 配置密码(如果master有密码)
3、 打开 rdb快照功能(多台slave只需开一台)
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
dir "/root"
4、 通常从服务器不能写,因此需要配置是否只读,配置项:
slave-read-only yes
5、 优先级配置
slave-priority 100
3、 配置成功后启动三台服务器的redis,启动顺序最好为先master后slave,启动后,登录到redis命令行,执行info Replication
Replication主要需要监控的信息已标红,上面的信息则表示主从启动成功
二、 sentinel监控
如果主服务器master挂了,那么我们需要切换master服务器并且将其他slave指向新的master,具体的操作流程为:选取一台slave, 该服务器是我们即将配置的new master,将其slaveof选项配为no one,并且将slave-read-only配置为no,然后将其它所有的slave指向新的master
1、 手动进行master-slave切换
1)登录192.168.1.11(master)主机的redis,执行shutdown命令关闭redis
2)登录192.168.1.12(new master),执行如下命令:
127.0.0.1:6379> slaveof no one
127.0.0.1:6379> config set slave-read-only no
3)登录192.168.1.13(slave),执行如下命令,:
127.0.0.1:6379> slaveof 192.168.1.12 6379 #若有多台slave,则所有slave都需重新指定master
此时再执行info Replication命令,发现主从一切换完毕
2、 sentinel监控实现自动切换
1、 配置文件位置
sentinel.conf配置文件一般在redis的[root@master ~]# vi /application/redis/sentinel.conf port 26379 # sentinel监听的端口 sentinel monitor mymaster 192.168.1.11 6379 1 # 主服务器信息 # 注意:末尾的数字n表示当有n个哨兵同事检测到主服务器挂了时,redis才会认为master挂掉并进行从服务器的切换,这里的数字不能大于哨兵的个数,我们只有一个哨兵监控,因此配置1即可,mymaster 可随意起名,但是要与下列的配置保持一致 sentinel down-after-milliseconds mymaster 30000 # 表示sentinel在多少毫秒后连接不到master认为master断开 sentinel parallel-syncs mymaster 1 # 表示一次性允许多少slave指向新的new master. 这里默认为1,如果该数值过大会导致新的master服务器IO剧增,保持默认1即可 sentinel client-reconfig-script mymaster /var/redis/reconfig.sh # 在重新配置new master,new slave过程,可以触发的脚本,可发邮件或者修改项目中的redis指向等
3、 启动sentinel
/application/redis/bin/redis-server /application/redis/sentinel.conf --sentinel
启动后sentinel会占据终端窗口,若想让sentinel在后台运行,执行下面命令即可:
/application/redis/redis-server /application/redis/sentinel.conf --sentinel 2>&1 >> /tmp/sentinel.log &
状态可检测日志
启动sentinel后,可看到master状态和slave的状态,窗口如下:
[root@master ~]# redis-server /application/redis/sentinel.conf --sentinel
9965:X 20 Jul 10:13:43.110 * Increased maximum number of open files to 10032 (it was originally set to 1024).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 3.2.1 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in sentinel mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 26379
| `-._ `._ / _.-' | PID: 9965
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
9965:X 20 Jul 10:13:43.111 # Sentinel ID is 79dfd62f9884969637c28f36ced52c2b9a8ac425
9965:X 20 Jul 10:13:43.111 # +monitor master mymaster 192.168.1.11 6379 quorum 1
9965:X 20 Jul 11:25:37.147 * +slave slave 192.168.1.12:6379 192.168.1.12 6379 @ mymaster 192.168.1.11 6379
9965:X 20 Jul 11:25:37.158 * +slave slave 192.168.1.11:6379 192.168.1.13 6379 @ mymaster 192.168.1.11 6379
4、 此时我们登陆master(192.168.1.11)使用shutdown命令关闭master,
127.0.0.1:6379> shutdown
not connected>
查看两个slave的 192.168.1.12 192.168.1.13
# Replication
role:slave
master_host:192.168.1.11
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:17472
master_link_down_since_seconds:8 # master断开时间
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
# Replication
role:slave
master_host:192.168.1.11
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:17472
master_link_down_since_seconds:8
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
可以看到,两台slave机子会显示主机master为192.168.1.11,但是权重值最低redis.conf中的[root@master ~]# redis-server /application/redis/sentinel.conf --sentinel 9965:X 20 Jul 10:13:43.110 * Increased maximum number of open files to 10032 (it was originally set to 1024). _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 3.2.1 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in sentinel mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 26379 | `-._ `._ / _.-' | PID: 9965 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' 9965:X 20 Jul 10:13:43.111 # Sentinel ID is 79dfd62f9884969637c28f36ced52c2b9a8ac425 9965:X 20 Jul 10:13:43.111 # +monitor master mymaster 192.168.1.11 6379 quorum 1 9965:X 20 Jul 10:17:10.072 # +sdown master mymaster 192.168.1.11 6379 9965:X 20 Jul 10:17:10.072 # +odown master mymaster 192.168.1.11 6379 #quorum 1/1 9965:X 20 Jul 10:17:10.072 # +new-epoch 20 9965:X 20 Jul 10:17:10.072 # +try-failover master mymaster 192.168.1.11 6379 9965:X 20 Jul 10:17:10.093 # +vote-for-leader 79dfd62f9884969637c28f36ced52c2b9a8ac425 20 9965:X 20 Jul 10:17:10.093 # +elected-leader master mymaster 192.168.1.11 6379 9965:X 20 Jul 10:17:10.093 # +failover-state-select-slave master mymaster 192.168.1.11 6379 # Leader开始查找合适的slave 9965:X 20 Jul 10:17:10.194 # +selected-slave slave 192.168.1.13:6379 192.168.1.13 6379 @ mymaster 192.168.1.11 6379 # 确定合适的slave 9965:X 20 Jul 10:17:10.194 * +failover-state-send-slaveof-noone slave 192.168.1.13:6379 192.168.1.13 6379 @ mymaster 192.168.1.11 6379 # Leader向slave发送“slaveof no one”指令,此时slave已经完成master的角色转换 9965:X 20 Jul 10:17:10.279 * +failover-state-wait-promotion slave 192.168.1.13:6379 192.168.1.13 6379 @ mymaster 192.168.1.11 6379 # 等待其他sentinel确认slave 9965:X 20 Jul 10:17:11.103 # +promoted-slave slave 192.168.1.13:6379 192.168.1.13 6379 @ mymaster 192.168.1.11 6379 # 确认成功 9965:X 20 Jul 10:17:11.103 # +failover-state-reconf-slaves master mymaster 192.168.1.11 6379 # 开始对slaves进行reconfig操作 9965:X 20 Jul 10:17:11.172 * +slave-reconf-sent slave 192.168.1.12:6379 192.168.1.12 6379 @ mymaster 192.168.1.11 6379 # 向指定的slave发送“slaveof”指令,告知此slave跟随新的master 9965:X 20 Jul 10:17:12.167 * +slave-reconf-inprog slave 192.168.1.12:6379 192.168.1.12 6379 @ mymaster 192.168.1.11 6379 # 此slave正在执行slaveof + SYNC过程,如过slave收到“+slave-reconf-sent”之后将会执行slaveof操作 9965:X 20 Jul 10:17:12.167 * +slave-reconf-done slave 192.168.1.12:6379 192.168.1.12 6379 @ mymaster 192.168.1.11 6379 # 此slave同步完成,此后leader可以继续下一个slave的reconfig操作,直至操作完所有slave 9965:X 20 Jul 10:17:12.257 # +failover-end master mymaster 192.168.1.11 6379 # 切换完成 9965:X 20 Jul 10:17:12.257 # +switch-master mymaster 192.168.1.11 6379 192.168.1.13 6379 # 切换master后,所有sentinel开始监控新的master 9965:X 20 Jul 10:17:12.259 * +slave slave 192.168.1.12:6379 192.168.1.12 6379 @ mymaster 192.168.1.13 6379 9965:X 20 Jul 10:17:12.259 * +slave slave 192.168.1.11:6379 192.168.1.11 6379 @ mymaster 192.168.1.13 6379 9965:X 20 Jul 10:17:42.270 # +sdown slave 192.168.1.11:6379 192.168.1.11 6379 @ mymaster 192.168.1.13 6379 # 11号机子下线
再查看两台slave的状态,发现192.168.1.13的role已变为master,并且 192.168.1.12 192.168.1.13
# Replication
role:slave
master_host:192.168.1.13
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:8934
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
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.1.12,port=6379,state=online,offset=5776,lag=1
master_repl_offset:5917
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:5916
这时如果重新启动192.168.1.11这台原始的master主句
sentinel监控端显示:
10050:X 20 Jul 12:17:50.984 # -sdown slave 192.168.1.11:6379 192.168.1.13 6379 @ mymaster 192.168.1.11 6379
10050:X 20 Jul 12:18:00.904 * +convert-to-slave slave 192.168.1.11:6379 192.168.1.11 6379 @ mymaster 192.168.1.13 6379 # 转换为从服务器
发现sentinel已经将原有的主服务master器转换为了从服务器slave