1:主从复制
要知道哨兵模式之前需要知道什么是Redis的主从复制:主机数据更新后根据配置和策略, 自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主。
1. 读写分离,性能扩展
2. 容灾快速恢复
2:Redis搭建主从复制
需要几个Redis服务器就创建几个配置文件:配置文件格式为redis+端口号.conf
配置文件内容:
include (redis.conf文件位置)
pidfile (/var/run/redis_Redis服务端口号.pid)
port (Redis服务端口号)
dbfilename (生成的rdb文件名)
比如Redis主服务器的端口号为6379则配置如下:
include redis.conf
pidfile /var/run/redis_6379.pid
port 6379
dbfilename dump6379.rdb
配置好主服务器和从服务器后运行Redis即可:
主服务负责写操作,而从服务器只能读取不能写,在主服务器写的数据可以在从服务器读取到。
3:主从复制的问题
3.1:一仆二主
1:当从服务器宕机期间,主服务器继续进行写操作,当从服务器重启后,会变成主服务器,需要重新slaveof配置成为从服务器,且可以读取宕机期间期间主服务器添加的数据。
2:当主服务器宕机,从服务器不会充当主服务器,当主服务器重启后还是主服务器。
3.2:薪火相传
上一个从服务器可以是下一个从服务器的主服务器,从服务器同样可以接收其他从服务器的连接和同步请求,那么该从服务器作为了链条中下一个的主服务器, 可以有效减轻主服务器的写压力,去中心化降低风险。
- 中途变更转向:会清除之前的数据,重新建立拷贝最新的
- 风险是一旦某个从服务器宕机,后面的从服务器都没法备份
- 主机挂了,从机还是从机,无法写数据了
3.3:反客为主
当一个主服务器宕机后,后面的从服务器可以立刻升为主服务器,其后面的从服务器不用做任何修改。
用 slaveof no one 命令 将从机变为主机。
4:哨兵模式-自动反客为主
反客为主需要我们手动执行命令slaveof no one进行从机到主机的变换,很不方便,所以引入哨兵模式,当主服务器宕机后,哨兵会从剩下的从服务器选择一个作为新的主服务器,而宕机的主服务器重启后作为新的从服务器。
实现哨兵模式:比如现在主服务器为redis6379,从服务器为redis6380和redis6381。
1:新建 sentinel.conf 文件,名字绝不能错
配置内容为sentinel monitor mymaster Redis服务器IP 6379 1
添加这段话:其中mymaster为监控对象起的服务器名称, 1 的意思是:至少有多少个哨兵同意迁移的数量。
2:启动哨兵进程
[root@LKCentos01 bin]# redis-sentinel sentinel.conf
14067:X 23 Apr 2022 10:30:48.243 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
14067:X 23 Apr 2022 10:30:48.243 # Redis version=6.2.1, bits=64, commit=00000000, modified=0, pid=14067, just started
14067:X 23 Apr 2022 10:30:48.243 # Configuration loaded
14067:X 23 Apr 2022 10:30:48.244 * Increased maximum number of open files to 10032 (it was originally set to 1024).
14067:X 23 Apr 2022 10:30:48.244 * monotonic clock: POSIX clock_gettime
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 6.2.1 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in sentinel mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 26379 哨兵端口
| `-._ `._ / _.-' | PID: 14067 哨兵进程ID
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
14067:X 23 Apr 2022 10:30:48.244 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
14067:X 23 Apr 2022 10:30:48.245 # Sentinel ID is 5488eb452f9b968168ef397b4d978227d271170d
14067:X 23 Apr 2022 10:30:48.245 # +monitor master mymaster RedisIP 6379 quorum 1 #监视主服务器redis6379
3:测试哨兵
#6379主机宕机
Redis服务器IP:6379> SHUTDOWN
not connected> quit
#查看6380、6381的信息
#6380作为从机
Redis服务器IP:6380> info replication
# Replication
role:slave
master_host:Redis服务器IP
master_port:6381
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:50433
slave_priority:100
slave_read_only:1
connected_slaves:0
master_failover_state:no-failover
master_replid:d6e90344a4f9f115eeb3c3bf9a646a1cfcbde14a
master_replid2:982754621d55bcbd27b20d46136aea3e86ec6531
master_repl_offset:50433
second_repl_offset:30023
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:50433
#6381作为新的主机
Redis服务器IP:6381> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=Redis服务器IP,port=6380,state=online,offset=52505,lag=0
master_failover_state:no-failover
master_replid:d6e90344a4f9f115eeb3c3bf9a646a1cfcbde14a
master_replid2:982754621d55bcbd27b20d46136aea3e86ec6531
master_repl_offset:52505
second_repl_offset:30023
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:43
repl_backlog_histlen:52463
4:重启宕机的主服务器
重启后作为新主服务器的从服务器
[root@LKCentos01 myRedis]# clear
[root@LKCentos01 myRedis]# redis-server redis6379.conf
[root@LKCentos01 myRedis]# redis-cli
Redis服务器IP> info replication
# Replication
role:slave
master_host:Redis服务器IP
master_port:6381
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:126158
slave_priority:100
slave_read_only:1
connected_slaves:0
master_failover_state:no-failover
master_replid:d6e90344a4f9f115eeb3c3bf9a646a1cfcbde14a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:126158
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:126159
repl_backlog_histlen:0
5:哨兵选取新主服务器原则
- 优先级在redis.conf中默认:slave-priority 100(版本不同可能为-replica-priority 100),值越小优先级越高。
- 偏移量是指获得原主机数据最全的(即复制原主服务器内容最全的从服务器)。
- 每个redis实例启动后都会随机生成一个40位的runid,选最小的。