《redis学习》之主从复制&哨兵机制
redis主从复制
主从复制之一主多从

配置详解
1.编辑从服务器上的redis.conf文件,并修改如下配置
slaveof 192.168.199.128 6379
masterauth 123456 #如果主服务器有设置了密码的话这里才需要
2.配置完可以通过配置查看
192.168.199.128(master)
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.199.129,port=6379,state=online,offset=182,lag=1
slave1:ip=192.168.199.130,port=6379,state=online,offset=182,lag=1
master_replid:84908783c1c16571e3a563de043f4a50fb347091
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:182
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:182
192.168,199.129 , 192.168,199.130 (slave)
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.199.128
master_port:6379
#master当前的状态up表示在线,down表示离线
master_link_status:up
master_last_io_seconds_ago:4
master_sync_in_progress:0
slave_repl_offset:294
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:84908783c1c16571e3a563de043f4a50fb347091
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:294
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:294
通过连接到从服务器的客户端执行keys *,可以发现已经复制成功。如果要让从服务器不能写操作可以设置
slave-read-only yes
主从复制之线性复制

配置过程跟一主多从差不多,这样的好处是假如master挂掉后,可以直接slave1作为master,slave2不需要变化
复制的原理详解
redis的复制功能包括 同步 和 命令传播
旧版(Redis2.8之前)复制功能
同步: 将从服务器的数据库状态更新至主服务器所处的数据库状态
同步操作一般发生从服务器连接上主服务器的时候,断线重连后需要再次执行同步操作


命令传播:同步完成后,主服务器进行操作会使得从服务器再次不一致,所以主服务器需要将操作执行的命令(造成主从不一致的命令,例如增删改)发送给从服务器,使其再次一致
旧版复制的缺陷
我们知道从服务器连接主服务器时会做一次同步操作,期间需要将主服务器上的数据生成一个RDB文件传给从服务器,如果从服务器出现跟主服务器断线后重新连接时会再次执行同步操作。本身RDB这一步是一个很耗时的工作,如果只是仅仅的断线几秒钟,期间主服务器只执行了几次写操作,从服务器都必须执行RDB操作,这样会使得效率低下

新版(Redis2.8以上)复制功能
新版将SYNC命令换成了PSYNC,其中包括完整重新同步,部分重新同步。
完整重新同步:初次复制的时候使用,跟SYNC的步骤一样
部分重新同步:断线重连时候使用,使用了复制偏移量,可以判断断线期间的偏移量是否大于某个阈值,如果不大于则不用完整重新同步,而是只是发送断线后主服务器执行过的操作命令进行同步。
部分重新同步
主服务器的复制偏移量和从服务器的复制偏移量
主服务器的复制积压缓冲区
服务器的运行ID(用来区分是哪个从服务器的)

#复制积压缓冲器的大小设置
repl-backlog-size 1mb
sentinel哨兵机制
常用配置文件详解
port 26379
dir /tmp
#哨兵监控这个master,在至少quorum个哨兵实例都认为master down后把master标记为odown
sentinel monitor master001 192.168.110.10163792
#设置master和slaves的密码
# sentinel auth-pass <master-name> <password>
#master或slave多长时间(默认30秒)不能使用后标记为s_down状态
sentinel down-after-milliseconds master001 30000
#选项指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长
sentinel parallel-syncs master001 1
#若sentinel在该配置值内未能完成failover操作(即故障时master/slave自动切换),则认为本次failover失败
sentinel failover-timeout master001 180000
# sentinel notification-script <master-name> <script-path>
# sentinel client-reconfig-script <master-name> <script-path>
配置一主二从三哨兵实例

1.先按照上面的配置方法配置主从复制
....参考上面配置
2.配置三台哨兵(三台哨兵一样)
1.开启sentinel的端口的防火墙
vim /etc/sysconfig/iptables
加入
-A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 26379 -j ACCEPT
重启网络
service iptables restart
2.配置哨兵sentinel.conf
port 26379
#关闭保护模式
protected-mode no
#哨兵的工作目录
dir /usr/local/redis/work
#配置监控的master实例,2表示至少两台同意后才会故障转移
sentinel monitor mymaster 192.168.199.128 6379 2
#配置过期的时间
sentinel down-after-milliseconds mymaster 30000
选项指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长,这里指定每次只有一个同步
sentinel parallel-syncs mymaster 1
#配置认证master的密码
sentinel auth-pass mymaster 123456
3.启动哨兵集群
[root@server-1 bin]# ./redis-sentinel /usr/local/redis/etc/sentinel.conf
2459:X 13 Apr 02:05:10.808 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
2459:X 13 Apr 02:05:10.808 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=2459, just started
2459:X 13 Apr 02:05:10.808 # Configuration loaded
2459:X 13 Apr 02:05:10.812 * Increased maximum number of open files to 10032 (it was originally set to 1024).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 4.0.14 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in sentinel mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 26379
| `-._ `._ / _.-' | PID: 2459
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
2459:X 13 Apr 02:05:10.858 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
2459:X 13 Apr 02:05:10.867 # Sentinel ID is 91cf03707d04919d59f08911f9549432f034fd1a
2459:X 13 Apr 02:05:10.867 # +monitor master mymaster 192.168.199.128 6379 quorum 2
分别查看三台的状态
#-------------------128
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.199.129,port=6379,state=online,offset=25949,lag=1
slave1:ip=192.168.199.130,port=6379,state=online,offset=25949,lag=1
master_replid:06771fc0a9902eba5016cc3d6ebd126cbec97789
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:26239
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:26239
#-------------------129
192.168.199.129:6379> info replication
# Replication
role:slave
master_host:192.168.199.128
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:51333
slave_priority:100
slave_read_only:1
connected_slaves:0
#-------------------130
192.168.199.130:6379> info replication
# Replication
role:slave
master_host:192.168.199.128
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:40678
slave_priority:100
slave_read_only:1
connected_slaves:0
4.到此集群已经搭建好了,这可以发现redis自动在sentinel.conf加了额外的配置(查看每一台的sentinel.conf文件末尾)
#128
sentinel known-slave mymaster 192.168.199.129 6379
sentinel known-slave mymaster 192.168.199.130 6379
sentinel known-sentinel mymaster 192.168.199.129 26379 abde7eac0f5a3bab66f8a8d483257dde3918fc0c
sentinel known-sentinel mymaster 192.168.199.130 26379 c74804d00075b185655cec328df2dabd87dd6300
sentinel current-epoch 0
#129
sentinel known-slave mymaster 192.168.199.129 6379
sentinel known-slave mymaster 192.168.199.130 6379
sentinel known-sentinel mymaster 192.168.199.130 26379 c74804d00075b185655cec328df2dabd87dd6300
sentinel known-sentinel mymaster 192.168.199.128 26379 91cf03707d04919d59f08911f9549432f034fd1a
sentinel current-epoch 0
#130
sentinel known-slave mymaster 192.168.199.129 6379
sentinel known-slave mymaster 192.168.199.130 6379
sentinel known-sentinel mymaster 192.168.199.129 26379 abde7eac0f5a3bab66f8a8d483257dde3918fc0c
sentinel known-sentinel mymaster 192.168.199.128 26379 91cf03707d04919d59f08911f9549432f034fd1a
sentinel current-epoch 0
5.模拟master宕机后,查看是否有做故障转移(redis做故障转移会自动修改redis.conf,sentinel.conf的配置)
#在192.168.199.128上执行shudown关闭服务器后观察sentinel日志状态
127.0.0.1:6379> shutdown
查看控制台日志输入
2505:X 13 Apr 02:12:02.012 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
2505:X 13 Apr 02:12:02.012 # Sentinel ID is 91cf03707d04919d59f08911f9549432f034fd1a
2505:X 13 Apr 02:12:02.012 # +monitor master mymaster 192.168.199.128 6379 quorum 2
2505:X 13 Apr 02:12:02.015 * +slave slave 192.168.199.129:6379 192.168.199.129 6379 @ mymaster 192.168.199.128 6379
2505:X 13 Apr 02:12:02.027 * +slave slave 192.168.199.130:6379 192.168.199.130 6379 @ mymaster 192.168.199.128 6379
2505:X 13 Apr 02:12:42.959 * +sentinel sentinel abde7eac0f5a3bab66f8a8d483257dde3918fc0c 192.168.199.129 26379 @ mymaster 192.168.199.128 6379
2505:X 13 Apr 02:13:05.846 * +sentinel sentinel c74804d00075b185655cec328df2dabd87dd6300 192.168.199.130 26379 @ mymaster 192.168.199.128 6379
2505:X 13 Apr 02:22:26.389 # +sdown master mymaster 192.168.199.128 6379
2505:X 13 Apr 02:22:26.724 # +new-epoch 1
2505:X 13 Apr 02:22:26.730 # +vote-for-leader abde7eac0f5a3bab66f8a8d483257dde3918fc0c 1
2505:X 13 Apr 02:22:27.029 # +config-update-from sentinel abde7eac0f5a3bab66f8a8d483257dde3918fc0c 192.168.199.129 26379 @ mymaster 192.168.199.128 6379
#==========这里可以看到将master变成了192.168.199.130=======
2505:X 13 Apr 02:22:27.029 # +switch-master mymaster 192.168.199.128 6379 192.168.199.130 6379
2505:X 13 Apr 02:22:27.041 * +slave slave 192.168.199.129:6379 192.168.199.129 6379 @ mymaster 192.168.199.130 6379
2505:X 13 Apr 02:22:27.045 * +slave slave 192.168.199.128:6379 192.168.199.128 6379 @ mymaster 192.168.199.130 6379
查看129和130目前的状态可以发现130变成了master,129变成了130丛服务器
192.168.199.130:6379> info replication
# Replication
role:master
connected_slaves:0
master_replid:90cf45c2cae935fe53f6119748844b528aeec09a
master_replid2:06771fc0a9902eba5016cc3d6ebd126cbec97789
master_repl_offset:152883
second_repl_offset:122266
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15
repl_backlog_histlen:152869
https://www.cnblogs.com/PatrickLiu/p/8444546.html
https://blog.csdn.net/zc309087694/article/details/83417335
https://www.jianshu.com/p/06ab9daf921d