为了解决Redis
的主从复制的不支持高可用性能,Redis
实现了Sentinel
哨兵机制解决方案。由一个或多个Sentinel
去监听任意多个主服务以及主服务器下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线的主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已经下线的从服务器,并且Sentinel
可以互相监视。
- cd /usr/local/etc
- wget http://download.redis.io/releases/redis-5.0.5.tar.gz
- tar xzf redis-5.0.5.tar.gz
- cd redis-5.0.5
- make (解释:编译redis源码)
- cd src
- make install
[root@localhost src]# redis-server # 前台运行(会占用终端,一般设置后台启动)
# 创建一个新的配置文件
[root@localhost redis-5.0.5]# vim redis.custom.conf
daemonize yes
port 6379
requirepass admin123
databases 16
logfile ./redislog.log
dir ./
################################
daemonize yes 代表可以在后台运行
port 6379 默认端口可自定义
requirepass admin123 redis的密码
databases 16 数据库总量,默认16个
logfile ./redislog.log 日志文件
dir ./ 持久化数据文件保存路径
###################################
# 启动redis
[root@localhost redis-5.0.5]# ./src/redis-server redis.custom.conf
[root@localhost redis-5.0.5]# ./src/redis-cli -a admin123 #redis客户端
127.0.0.1:6379>
环境说明:
角色 | IP | port |
---|---|---|
master | 192.168.100.250 | 7000 |
slave1 | 192.168.100.100 | 7001 |
slave2 | 192.168.100.200 | 7002 |
master
#新建配置文件
[root@localhost redis-5.0.5]# vim redis-7000.conf
daemonize yes
port 7000
logfile 7000.log
dir ./
requirepass admin123
masterauth admin123
bind 192.168.100.250 127.0.0.1
# AOF 数据持久化
appendonly yes
appendfilename aof-7000.aof
appendfsync everysec
no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# 配置masterauth作用主要是为了后期sentinel引入后重新选举master并且7000端口redis重新加入主从复制时必备的,否则会出现权限不足
# 设置bind 的IP地址,此IP为redis服务器IP以及本地127,如果没有设置 127,会出现无法启动问题,没有设置服务器IP会出现slave服务器无法连接master服务器
slave1
# 新建slave配置文件
[root@localhost redis-5.0.5]# vim redis-7001.conf
port 7001
daemonize yes
logfile 7001.log
dir ./
requirepass admin123
slaveof 192.168.100.250 7000
masterauth admin123
bind 192.168.100.100 127.0.0.1
# AOF 数据持久化
appendonly yes
appendfilename aof-7001.aof
appendfsync everysec
no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
##########################################
1. slaveof 后面绑定的是master 服务器IP 和端口
2. 需要设置master的密码,否则在连接的时候会报 权限不足
3. 设置slave 服务器的密码强烈建议与master服务器上的密码一致,因为这样在后面的哨兵模式自动选出主服务器有很大的帮助,否则会报错
###########################################
slave2
[root@localhost redis-5.0.5]# vim redis-7002.conf
port 7002
daemonize yes
logfile 7002.log
dir ./
requirepass admin123
slaveof 192.168.100.250 7000
masterauth admin123
bind 192.168.100.200 127.0.0.1
# AOF 数据持久化
appendonly yes
appendfilename aof-7002.aof
appendfsync everysec
no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
启动redis
master:
[root@localhost redis-5.0.5]# ./src/redis-server redis-7000.conf
[root@localhost redis-5.0.5]# ./src/redis-cli -a admin123 -p 7000
slave1:
[root@localhost redis-5.0.5]# ./src/redis-server redis-7001.conf
[root@localhost redis-5.0.5]# ./src/redis-cli -a admin123 -p 7001
slave2:
[root@localhost redis-5.0.5]# ./src/redis-server redis-7002.conf
[root@localhost redis-5.0.5]# ./src/redis-cli -a amdin123 -p 7002
验证主从同步
master:
127.0.0.1:7000> set 123 aaa
OK
127.0.0.1:7000> set 321 bbb
OK
127.0.0.1:7000> keys *
1) "321"
2) "123"
127.0.0.1:7000>
slave1:
127.0.0.1:7001> keys *
1) "321"
2) "123"
127.0.0.1:7001> get 123
"aaa"
127.0.0.1:7001>
slave2:
127.0.0.1:7002> keys *
1) "321"
2) "123"
127.0.0.1:7002>
如果redis主从复制的master服务器挂掉了,那么整体redis就崩溃了,因为master无法进行写数据,导致slave中无法更新数据。
那么为了解决这个问题我们就需要有一种方案让redis宕机后可以自动进行故障转移,还好redis给我们提供一种高可用解决方案 Redis-Sentinel。Redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自动切换。Sentinel可以监视任意多个主服务器
以及主服务器属下的从服务器,并在被监视的主服务器下线时,自动执行故障转移操作
环境说明:
主机说明 | 主机IP | 端口 | sentinel端口 |
---|---|---|---|
master | 192.168.100.250 | 7000 | 26379 |
slave1 | 192.168.100.100 | 7001 | 26380 |
slave2 | 192.168.100.200 | 7002 | 26381 |
我这边的sentinel采用的是集群部署的方式,而不是单点,想必大家也知道单点会存在很多的问题,比如:
- 当sentinel进程宕掉后(sentinel本身也有单点问题,single-point-of-failure)整个集群系统将无法按照预期的方式运行;
- 如果只有一个sentinel进程,如果这个进程运行出错,或者是网络堵塞,那么将无法实现redis集群的主备切换(单点问题)。
如果有多个sentinel,redis的客户端可以随意地连接任意一个sentinel来获得关于redis集群中的信息;即使有一些sentinel进程宕掉了,依然可以进行redis集群的主备切换。
创建sentinel配置文件
#在上面主从的基础上配置sentinel
master:
[root@localhost redis-5.0.5]# vim sentinel-26379.conf
port 26379
daemonize yes
logfile "26379.log"
dir "./"
sentinel monitor mymaster 192.168.100.250 7000 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 15000
sentinel auth-pass mymaster admin123
bind 192.168.100.250 127.0.0.1
slave1:
[root@localhost redis-5.0.5]# vim sentinel-26380.conf
port 26380
daemonize yes
logfile "26380.log"
dir "./"
sentinel monitor mymaster 192.168.100.250 7000 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 15000
sentinel auth-pass mymaster admin123
bind 192.168.100.100 127.0.0.1
slave2:
vim sentinel-26381.conf
port 26381
daemonize yes
logfile "26381.log"
dir "./"
sentinel monitor mymaster 192.168.100.250 7000 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 15000
sentinel auth-pass mymaster admin123
bind 192.168.100.200 127.0.0.1
##############################################################################################################################
sentinel monitor
告诉sentinel去监听地址为ip:port的一个master,这里的master-name可以自定义,quorum是一个数字,指明当有多少个sentinel认为一个master失效时,master才算真正失效
sentinel auth-pass
设置连接master和slave时的密码,注意的是sentinel不能分别为master和slave设置不同的密码,因此master和slave的密码应该设置相同。
sentinel down-after-milliseconds
这个配置项指定了需要多少失效时间,一个master才会被这个sentinel主观地认为是不可用的。 单位是毫秒,默认为30秒
sentinel parallel-syncs
这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
sentinel failover-timeout
failover-timeout 可以用在以下这些方面:
1. 同一个sentinel对同一个master两次failover之间的间隔时间。
2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。
3.当想要取消一个正在进行的failover所需要的时间。
4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了。
################################################################################################################################
开始启动sentinel,当然前提要先把redis主从复制开启
sentinel启动
master:
[root@localhost redis-5.0.5]# ./src/redis-sentinel sentinel-26379.conf
slave1:
[root@localhost redis-5.0.5]# ./src/redis-sentinel sentinel-26380.conf
slave2:
[root@localhost redis-5.0.5]# ./src/redis-sentinel sentinel-26381.conf
[root@localhost redis-5.0.5]# ps -ef|grep redis-server
root 24207 1 0 17:58 ? 00:00:00 redis-server 192.168.100.250:7000
root 24238 23974 0 18:03 pts/0 00:00:00 grep --color=auto redis-server
[root@localhost redis-5.0.5]# kill 24207
#查看sentinel日志发现192.168.100.100备选为master
[root@localhost redis-5.0.5]# vim 26379.log
...
24230:X 22 Jun 2020 18:03:45.028 # +switch-master mymaster 192.168.100.250 7000 192.168.100.100 7001
24230:X 22 Jun 2020 18:03:45.028 * +slave slave 192.168.100.200:7002 192.168.100.200 7002 @ mymaster 192.168.100.100 7001
24230:X 22 Jun 2020 18:03:45.028 * +slave slave 192.168.100.250:7000 192.168.100.250 7000 @ mymaster 192.168.100.100 7001
# 配置文件也会重写,显示master的IP
[root@localhost redis-5.0.5]# vim redis-7000.conf
# Generated by CONFIG REWRITE
replicaof 192.168.100.100 7001
#登录192.168.100.100的redis查看
[root@localhost redis-5.0.5]# ./src/redis-cli -p 7001
127.0.0.1:7001> auth admin123
OK
127.0.0.1:7001> info replication
# Replication
role:master ##成为了master实现了主备切换
connected_slaves:1
slave0:ip=192.168.100.200,port=7002,state=online,offset=68377,lag=1
master_replid:085ce2aabd1500bd971be0ee955e5990dd87787a
master_replid2:ed93f701b086961834cb0b72dcb292385675b149
master_repl_offset:68522
second_repl_offset:20922
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:6881
repl_backlog_histlen:61642
127.0.0.1:7001>
#重新登录100.250(之前的master)
[root@localhost redis-5.0.5]# redis-server redis-7000.conf
[root@localhost redis-5.0.5]# redis-cli -p 7000
127.0.0.1:7000> auth admin123
OK
127.0.0.1:7000> info replication
# Replication
role:slave ##成为了slave
master_host:192.168.100.100
master_port:7001
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:85187
slave_priority:100
这里虽然3台服务器都部署了sentinel,但是只要当前master的sentinel故障后,master还是无法自动切换