redis主从备份
主从复制介绍
redis主从复制原理:
- 从服务器向主服务器发送 SYNC 命令。
- 接到 SYNC 命令的主服务器会调用BGSAVE 命令,创建一个 RDB 文件,并使用缓冲区记录接下来执行的所有写命令。
- 当主服务器执行完 BGSAVE 命令时,它会向从服务器发送 RDB 文件,而从服务器则会接收并载入这个文件。
- 主服务器将缓冲区储存的所有写命令发送给从服务器执行。
主从复制手动执行
一般情况,我们有两种方式执行主从复制:
- 通过写入配置文件通过配置文件启动的方式
- 通过执行salveof host port的方式进行启动(在交互式redis客户端当中)
# 我们设置完成主从同步之后,可以通过命令来看库的主从情况
redis-cli -p 6380 info replication
# 主库6380输出如下
root@long:/opt/test_redis# redis-cli -p 6380 info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6381,state=online,offset=70,lag=0
slave1:ip=127.0.0.1,port=6382,state=online,offset=70,lag=1
master_replid:a9346280d6d445a1cde9f7a2cc5921f747126165
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:70
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:70
# 某一从库输入如下
root@long:/opt/test_redis# redis-cli -p 6382 info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6380
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_repl_offset:56
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:a9346280d6d445a1cde9f7a2cc5921f747126165
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:56
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:56
主库故障处理
如果在主从复制当中,我们的主库挂了,可以切换从库为主库
# 进入需要切换的主库的从库运行
127.0.0.1:6381> slaveof no one
OK
# 可以看到它的配置当中已变成主库
127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:0
master_replid:a5d9427d968c91b406054f45de51295689d9644e
master_replid2:a9346280d6d445a1cde9f7a2cc5921f747126165
master_repl_offset:662
second_repl_offset:663
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:662
# 接下来将另一个从库转换为以它为主
127.0.0.1:6382> slaveof 127.0.0.1 6381
OK
127.0.0.1:6382> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6381
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:662
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:a5d9427d968c91b406054f45de51295689d9644e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:662
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:663
repl_backlog_histlen:0
通过哨兵模式使其自动主从备份
以上主从切换的功能都需要手动完成。而哨兵就是在时刻监测是不是一个redis节点挂了,如果一个主库挂了,哨兵就会选出一个从库来代替主库。从而保证服务正常运行。
综上,哨兵主要功能有:
- 不时的监控redis是否良好运行,如果节点不可达就会对节点进行下线标识(检查一般是通过定时ping主节点的方式)
- 如果被标识的是主节点,sentinel就会和其他的sentinel节点“协商”,如果其他节点也人为主节点不可达,就会选举一个sentinel节点来完成自动故障转义
- 在master-slave进行切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换
哨兵的启动和检查
# 设置哨兵的配置文件如:26380.conf
# 启动于26380端口
port 26380
dir "/opt/test_redis/sentinel"
logfile "26380.log"
# 后台启动
daemonize yes
# 当前Sentinel节点监控 127.0.0.1:6379 这个主节点
# 2代表判断主节点失败至少需要2个Sentinel节点节点同意
# mymaster是主节点的别名
sentinel monitor mymaster 127.0.0.1 6379 2
# 每个Sentinel节点都要定期PING命令来判断Redis数据节点和其余Sentinel节点是否可达,如果超过30000毫秒30s且没有回复,则判定不可达
sentinel down-after-milliseconds mymaster 30000
# 当Sentinel节点集合对主节点故障判定达成一致时,Sentinel领导者节点会做故障转移操作,选出新的主节点,
# 原来的从节点会向新的主节点发起复制操作,限制每次向新的主节点发起复制操作的从节点个数为1
sentinel parallel-syncs mymaster 1
# 故障转移超时时间为180000毫秒
sentinel failover-timeout mymaster 180000
如此配置之后便可通过命令启动哨兵(注意启动哨兵时要确保主从库已启动)
# 启动哨兵
redis-sentinel 26380.conf
# 确认启动成功看哨兵的配置文件,会有很多改变
root@long:/opt/test_redis/sentinel# cat 26380.conf
port 26380
dir "/opt/test_redis/sentinel"
logfile "26380.log"
sentinel myid 5f9c80321fe544208459df14b5aa5069259f37ab
sentinel monitor mymaster 127.0.0.1 6380 1
sentinel down-after-milliseconds mymaster 10000
sentinel config-epoch mymaster 0
daemonize yes
# Generated by CONFIG REWRITE
sentinel leader-epoch mymaster 0
sentinel known-slave mymaster 127.0.0.1 6381
sentinel known-slave mymaster 127.0.0.1 6382
sentinel known-sentinel mymaster 127.0.0.1 26382 f44680655e286f25504ad3a1b0c9cf1e86d8dba9
sentinel known-sentinel mymaster 127.0.0.1 26381 3bf65b4fc567789e59f7969815cf58cd788742c0
sentinel current-epoch 0
重点检查
附加:
接下来可以手动将主库kill掉检查从库身份是否发生改变。这里不做演示(展示身份变化之后从库6381和26380哨兵的配置情况如下)