Day22 Redis架构实战-高可用性使用Sentinel机制

Redis高可用性

# 高可用配置
                           --->   Redis (Replica)
client ---> Redis (Master)
                           --->   Redis (Replica)

# 当Master挂掉时,会把Replica切换为Master提供用户端服务


Client ----------------------->   Redis (Master)
Client                                  | 同步
            Redis (X)                   V
                                  Redis (Replica)
  • 依照以上的配置,当Master挂掉时,会把Replica切换为Master提供用户端服务,如下验证一下此情境是否如期切换。
# 关闭Redis Server (Master) 6379

# 确认Redis Server (Replica) 6380 角色
# role:slave
./redis-cli -h 127.0.0.1 -p 6380
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:2590
master_link_down_since_seconds:327
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:943718468a346457e58ad233607f464998e6159c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2590
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2590

# 确认Redis Server (Replica) 6381 角色
# role:slave
./redis-cli -h 127.0.0.1 -p 6381
127.0.0.1:6381> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:2590
master_link_down_since_seconds:355
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:943718468a346457e58ad233607f464998e6159c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2590
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15
repl_backlog_histlen:2576

https://ithelp.ithome.com.tw/upload/images/20211007/20111658LemgqToA56.png

https://ithelp.ithome.com.tw/upload/images/20211007/20111658Ro6NEi8Mcf.png

  • 依照以上的情境验证看起来2台Replica并没有自动选定一台转换为Master,这样跟情境预期不一致。主要是因为Redis Server并非透过自动透过多数成员投票机制进行选取Master,此时可以透过手动自己进行切换。
# 将Redis Server (Replica) 6381 手动转换为Master
./redis-cli -h 127.0.0.1 -p 6381
127.0.0.1:6381> replicaof no one
OK
127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:458e0f8b3f40adb50a3dca8cc90e76b96937107b
master_replid2:943718468a346457e58ad233607f464998e6159c
master_repl_offset:2590
second_repl_offset:2591
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15
repl_backlog_histlen:2576

# 将Redis Server (Replica) 6380 与 6381建立Replication
./redis-cli -h 127.0.0.1 -p 6380
127.0.0.1:6380> replicaof 127.0.0.1 6381
OK
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6381
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_repl_offset:2604
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:458e0f8b3f40adb50a3dca8cc90e76b96937107b
master_replid2:943718468a346457e58ad233607f464998e6159c
master_repl_offset:2604
second_repl_offset:2591
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2604

# 确认目前架构 Redis Server (Master) 6381 与 Redis Server (Replica) 6380
./redis-cli -h 127.0.0.1 -p 6381
127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=2632,lag=1
master_failover_state:no-failover
master_replid:458e0f8b3f40adb50a3dca8cc90e76b96937107b
master_replid2:943718468a346457e58ad233607f464998e6159c
master_repl_offset:2632
second_repl_offset:2591
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15
repl_backlog_histlen:2618
  • 当原有异常的Master修复後重新加入高可用时,需要转换为现有Master的Replica,不影响用户端服务操作。
# 启动服务 6379
$ ./redis-server redis_6379.conf

# Redis Server (Master) 6379 目前角色为Master
 ./redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:0f0546acb0aecd970497a0dac52e71539d3b2f16
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

# 将 Redis Server (Master) 6379 角色转换为 Replica
127.0.0.1:6379> replicaof 127.0.0.1 6381
OK
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6381
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:4018
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:458e0f8b3f40adb50a3dca8cc90e76b96937107b
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:4018
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:4019
repl_backlog_histlen:0

# 确认目前高可用架构
$ ./redis-cli -h 127.0.0.1 -p 6381
127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=4046,lag=0
slave1:ip=127.0.0.1,port=6379,state=online,offset=4046,lag=0
master_failover_state:no-failover
master_replid:458e0f8b3f40adb50a3dca8cc90e76b96937107b
master_replid2:943718468a346457e58ad233607f464998e6159c
master_repl_offset:4046
second_repl_offset:2591
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15
repl_backlog_histlen:4032

Redis 高可用使用Sentinel机制

  • 透过人为手动机制虽然可以达成情境所需要的结果,但是实务上还是会有Redis服务操作中断的问题,故我们希望的高可用架构是可以不中断服务操作的,此时需要经由第三方sentinel机制来达成自动切换的方式,不需要人为介入就能将某个Replica转换成为新的Master.

  • Sentinel功能

    • 监控
    • 通知
    • 失效自动切换
    • 组态设定提供
  • sentinel组态设定

cp /home/redis/redis-6.2.5/sentinel.conf sentinel_26379.conf

vi sentinel_26379.conf

# 修改以下项目组态设定
port 26379
daemonize yes
logfile "/tmp/redis-sentinel_26379.log"
dir /tmp
sentinel monitor mymaster 127.0.0.1 6379 1
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

https://ithelp.ithome.com.tw/upload/images/20211007/20111658Slbsnyzx4U.png

https://ithelp.ithome.com.tw/upload/images/20211007/20111658OQeSjI4svI.png

https://ithelp.ithome.com.tw/upload/images/20211007/201116582taTcpnNfp.png

https://ithelp.ithome.com.tw/upload/images/20211007/20111658As1oDtKG7y.png

https://ithelp.ithome.com.tw/upload/images/20211007/201116584S7QGXolNf.png

https://ithelp.ithome.com.tw/upload/images/20211007/20111658jJlXZ48Pji.png

https://ithelp.ithome.com.tw/upload/images/20211007/201116580hVnsegV3I.png

https://ithelp.ithome.com.tw/upload/images/20211007/201116588AATxuHWsf.png

  • 启动sentinel
./redis-sentinel sentinel_26379.conf 
# 确认是否已经启动sentinel
ps -ef|grep redis-s

https://ithelp.ithome.com.tw/upload/images/20211007/20111658S5Ngp9mGEZ.png

  • 关闭Redis Server (Master)确认是否自动切换
# 关闭Redis Server (Master) 6379

# 连线至Redis Server (Replica) 6380 确认角色
./redis-cli -h 127.0.0.1 -p 6380

# 确认Redis Server (Replica) 6380 已自动切换Redis Server (Master) 6380
# 当Redis Server (Master) 6379 修复後会转为Redis Server (Replica) 6379
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6381,state=online,offset=23418,lag=0
slave1:ip=127.0.0.1,port=6379,state=online,offset=23551,lag=0
master_failover_state:no-failover
master_replid:ea3bc11d99568d87b0496fb83c6f2ccc58425baa
master_replid2:a30878092cdd31e404af76eaa7a2d024c8ae843e
master_repl_offset:23551
second_repl_offset:19299
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:71
repl_backlog_histlen:23481

<<:  Day 22: Behavioral patterns - Mediator

>>:  Day22 - [丰收款] 以Django Web框架实作永丰API线上支付模拟情境(3) - 两种付款方式实作

NetSuite Order to Cash flow - Fulfill Sales Order

Recap 前天提到, 建立一顶订单销售的流程大致可以分为 Customer enter Sales...

Day 13:杂凑表(hash table)

在通讯录或朋友列表里,我们可以搜寻一个名字,就找到电话或页面,只需要O(1)。如果想要实现这样的操作...

前两次题目的结论 | ML#Day10

接下来跟大家分享我们的入门命题,其实是第三次的题目了,就这点而言,感谢团队拥有这样的弹性,并愿意一同...

Python - Video to Ascii 影片转 Ascii 套件参考笔记

Python - Video to Ascii 影片转 Ascii 套件参考笔记 参考资料 Gith...

Day-13 观念补遗:TDZ与全域变数

在先前的『Day-06 始於足下:基本语法、陈述句与宣告』一文中,曾经介绍JavaScript的不同...