Redis系列:高可用哨兵方案部署

JAVA乐园

共 6585字,需浏览 14分钟

 ·

2020-10-02 21:48

点击上方「蓝字」关注我们


        Sentinel是Redis的高可用性(HA)解决方案,由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进行下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。

         Redis提供的sentinel(哨兵)机制,通过sentinel模式启动redis后,自动监控master/slave的运行状态,基本原理是:心跳机制+投票裁决

  • 监控(Monitoring):Sentinel 会不断地检查主服务器和从服务器是否运作正常。

  • 提醒(Notification):当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。

  • 自动故障迁移(Automatic failover):当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器改为复制新的主服务器;当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。


0x01: 高可用哨兵方案推演

服务器信息如下

这里只有一台虚拟主机,采用端口不一样的方式。如果大家有多台虚拟主机的话,也可以使用多台虚拟主机部署。

基于redis.conf创建主从配置文件

cp /usr/local/redis/etc/redis.conf /usr/local/redis/redis-6739.conf
cp /usr/local/redis/etc/redis.conf /usr/local/redis/redis-26379.conf
cp /usr/local/redis/etc/redis.conf /usr/local/redis/redis-26380.conf

基于sentinel.conf 创建哨兵配置文件,sentinel.conf配置文件可以在下载的redis源码目录找到

cp sentinel.conf /usr/local/redis/sentinel-36378.conf
cp sentinel.conf  /usr/local/redis/sentinel-36379.conf
cp sentinel.conf  /usr/local/redis/sentinel-36380.conf

  • 主服务器配置

bind 127.0.0.1 192.168.122.1
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
logfile "/tmp/redis-6379.log"
dbfilename dump-6379.rdb
requirepass new2020
  • 从服务器一配置

bind 127.0.0.1 192.168.122.1
port 26379
daemonize yes
pidfile /var/run/redis_26379.pid
logfile "/tmp/redis-26379.log"
dbfilename dump-26379.rdb
requirepass new2020
replicaof 127.0.0.1 6379
masterauth new2020
  • 从服务器二配置

bind 127.0.0.1 192.168.122.1
port 26380
daemonize yes
pidfile /var/run/redis_26380.pid
logfile "/tmp/redis-26380.log"
dbfilename dump-26380.rdb
requirepass new2020
replicaof 127.0.0.1 6379
masterauth new2020

哨兵一配置

bind 127.0.0.1 192.168.122.1
protected-mode no
port 36378
daemonize 
yes
pidfile /var/run/redis-sentinel-
36278.pid
logfile 
/tmp/redis-36378.log"
dir /tmp/36378

sentinel monitor mymaster 
127.0.0.1 6379 2
sentinel auth-pass mymaster new2020

sentinel down-after-milliseconds mymaster 
30000
sentinel parallel-syncs mymaster 
1
sentinel failover-timeout mymaster 
180000
sentinel deny-scripts-reconfig 
yes

哨兵二配置

bind 127.0.0.1 192.168.122.1
protected-mode no
port 36379
daemonize yes
pidfile /var/run/redis-sentinel-36379.pid
logfile "/tmp/redis-36379.log"
dir /tmp/36379
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel auth-pass mymaster new2020
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes

哨兵三配置

bind 127.0.0.1 192.168.122.1
protected-mode no
port 36380
daemonize yes
pidfile /var/run/redis-sentinel-36380.pid
logfile "/tmp/redis-36380.log"
dir /tmp/36380
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel auth-pass mymaster new2020
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes

说明:

① 禁止保护模式

protected-mode no

② 配置监听的主服务器,这里sentinel monitor代表监控,mymaster代表服务器的名称,可以自定义,127.0.0.1代表监控的主服务器,6379代表端口,2代表只有两个或两个以上的哨兵认为主服务器不可用的时候,才会进行failover操作。

sentinel monitor mymaster 127.0.0.1 6379 2

③ sentinel author-pass定义服务的密码,mymaster是服务名称,new2020是Redis服务器密码

# sentinel auth-pass  
sentinel auth-pass mymaster new2020

④ 判断主master的挂机时间(毫秒),超时未返回正确信息后标记为sdown状态

sentinel down-after-milliseconds master-1 3000

⑤ 选项指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步,这个数字越小,完成故障转移所需的时间就越长

sentinel parallel-syncs mymaster 1

⑥ 若sentinel在该配置值内未能完成failover操作(即故障时master/slave自动切换),则认为本次failover失败。

sentinel failover-timeout mymaster 180000

⑦ 工作路径,注意路径不要和主重复

dir "/tmp/36379"


0x02:启动redis

安装如下顺序

首先是主Redis服务进程,然后再启动从机的服务进程,最后启动3个哨兵的服务进程。

  • 主Redis启动

# 启动主Redis服务器进程
/usr/local/redis/bin/redis-server /usr/local/redis/redis-6379.conf 
  • 从Rdis启动

# 启动从Redis服务器进程
/usr/local/redis/bin/redis-server /usr/local/redis/redis-26379.conf 
/usr/local/redis/bin/redis-server /usr/local/redis/redis-26380.conf 
  • 启动哨兵

# 启动启动Redis哨兵进程
/usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel-36378.conf 
/usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel-36379.conf 
/usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel-36380.conf 
启动完毕后使用如下命令验证是否启动成功
ps -ef | grep redis

如下图所示,说明启动成功


0x03:查看各服务的状态

  • 查看主Redis状态

输入info命令,如果出现信息,说明一主两从搭建成功

# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=26379,state=online,offset=43689,lag=1
slave1:ip=127.0.0.1,port=26380,state=online,offset=43955,lag=0
master_replid:b92588e7ee2f1922498de16031b7649b3082b22b
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:43955
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:43955
  • 查看从Redis一状态

输入info命令

# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:101019
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:b92588e7ee2f1922498de16031b7649b3082b22b
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:101019
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:101019

注,使用同样的方式可以看到从Redis二也是一样的。

  • 查看哨兵Redis状态

输入info命令

# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=3

注,使用同样的方式可以看到哨兵Redis二和哨兵Redis三也是一样的。


0x04:验证主从切换

1、首先关闭主Redis(6379)服务(shutdown)。

2、查看哨兵,发现端口号为263的从服务变成了主服务,sentinel自动完成了故障切换。

#查看主Reids的进程号
ps -ef | grep redis
#杀死主Redis进程
kill -9 7973
#连接哨兵一
/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 36378

使用info sentinel命令

127.0.0.1:36378> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=127.0.0.1:26379,slaves=2,sentinels=3

3、启动刚才被shutdown的6379服务并查看,发现它变成了从服务。

连接6379Redis服务

/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379

使用info replication命令

127.0.0.1:6379info replication
Replication
role:slave
master_host:127.0.0.1
master_port:26379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:1
master_link_down_since_seconds:1601531690
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:739195dc3c4b405905edb43b35cdd48e1589e48d
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

扫码二维码

获取更多精彩

Java乐园

有用!分享+在看☟


浏览 43
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报