Redis的哨兵

Redis的哨兵

为了解决Redis的主从复制的不支持高可用性能,Redis实现了Sentinel哨兵机制解决方案。由一个或多个Sentinel去监听任意多个主服务以及主服务器下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线的主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已经下线的从服务器,并且Sentinel可以互相监视。

redis部署
-	  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
运行redis
[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>
主从配置

环境说明:

角色IPport
master192.168.100.2507000
slave1192.168.100.1007001
slave2192.168.100.2007002

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的哨兵

如果redis主从复制的master服务器挂掉了,那么整体redis就崩溃了,因为master无法进行写数据,导致slave中无法更新数据。

那么为了解决这个问题我们就需要有一种方案让redis宕机后可以自动进行故障转移,还好redis给我们提供一种高可用解决方案 Redis-Sentinel。Redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自动切换。Sentinel可以监视任意多个主服务器

以及主服务器属下的从服务器,并在被监视的主服务器下线时,自动执行故障转移操作

环境说明:

主机说明主机IP端口sentinel端口
master192.168.100.250700026379
slave1192.168.100.100700126380
slave2192.168.100.200700226381

我这边的sentinel采用的是集群部署的方式,而不是单点,想必大家也知道单点会存在很多的问题,比如:

  1. 当sentinel进程宕掉后(sentinel本身也有单点问题,single-point-of-failure)整个集群系统将无法按照预期的方式运行;
  2. 如果只有一个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 <master-name> <ip> <redis-port> <quorum>
告诉sentinel去监听地址为ip:port的一个master,这里的master-name可以自定义,quorum是一个数字,指明当有多少个sentinel认为一个master失效时,master才算真正失效

sentinel auth-pass <master-name> <password>
设置连接master和slave时的密码,注意的是sentinel不能分别为master和slave设置不同的密码,因此master和slave的密码应该设置相同。

sentinel down-after-milliseconds <master-name> <milliseconds> 
这个配置项指定了需要多少失效时间,一个master才会被这个sentinel主观地认为是不可用的。 单位是毫秒,默认为30秒

sentinel parallel-syncs <master-name> <numslaves> 
这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。

sentinel failover-timeout <master-name> <milliseconds>
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

验证sentinel的主备切换
[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还是无法自动切换

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值