Day21 Redis架构实战-高可用性

Redis高可用性

  • 前面的说明与范例都是透过单台的Redis Server的方式进行,这样的配置下当节点出现故障时,等於整个Redis的服务就会停止,此时会影响到用户端的相关操作,重则让整个应用也跟着停止服务.高可用性的架构就是要避免单一节点的错误造成服务中断,透过资料冗余从Master同步复制到Replica和当失效的时候可以透过机制切换,避免服务的中断.
# 高可用配置
                           --->   Redis (Replica)
client ---> Redis (Master)
                           --->   Redis (Replica)

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


Client ----------------------->   Redis (Master)
Client                                  | 同步
            Redis (X)                   V
                                  Redis (Replica)
  • 读写分离
    • 当用户端需要读写的时候,必须要透过Master才可以进行读写操作.
    • 当用户端只需要读取资料而不需要写入的时後,可以考虑直接连Replica取得资料,减轻Master的负担.

            读取/写入
Client ----------------------->   Redis (Master)
                                        | 同步
                                        V
Client ----------------------->   Redis (Replica)
            读取only


  • 常见高可用架构配置
# 高可用配置
                           --->   Redis (Replica)
client ---> Redis (Master)
                           --->   Redis (Replica)


# 高可用链结配置(应用於分散多个资料中心架构或是允许较慢同步的需求)

client ---> Redis (Master) ---> Redis (Replica) ---> Redis (Replica)
            _____________________      _________ 
                        A区资料中心 (LAN)        (WAN)    B区资料中心
                                            or
                        应用服务                           报表服务
  • 实际配置

在配置Redis Server高可用架构时,基本上会配置三台服务器,并给予相同或是不同的Port来配置,下面实际配置的内容会在单机进行,故会将Port分配三个来模拟三台服务器的状况.

因需要在同一台机器模拟三台服务器的配置,故有以下前置作业需要先完成 (如果三台服务器则不需要这样做)

  • 6379-->Reids Server (Master)
  • 6380-->Reids Server (Replica)
  • 6381-->Reids Server (Replica)
# 复制三份设定档,结尾用Port命名
$ cp /home/redis/config/redis.conf redis_6379.conf
$ cp /home/redis/config/redis.conf redis_6380.conf
$ sudo cp /home/redis/config/redis.conf redis_6381.conf

# 修改各个设定档中的rdb与aof档案名称,一样结尾用Port命名
# redis_6379.conf
vi dump_6379.rdb
dbfilename dump_6379.rdb
appendfilename "appendonly_6379.aof"

# redis_6380.conf
vi dump_6380.rdb
dbfilename dump_6380.rdb
appendfilename "appendonly_6380.aof"

# redis_6381.conf
vi dump_6381.rdb
dbfilename dump_6381.rdb
appendfilename "appendonly_6381.aof"

https://ithelp.ithome.com.tw/upload/images/20211006/20111658RCSgRzY8kU.png

https://ithelp.ithome.com.tw/upload/images/20211006/20111658CXfLJomSQl.png

https://ithelp.ithome.com.tw/upload/images/20211006/20111658JYtlHCRQMz.png

# 启动服务
./redis-server ./redis_6379.conf 
./redis-server ./redis_6380.conf 
./redis-server ./redis_6381.conf 

#连线到 127.0.0.1 Port: 6379
./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:1363014961ee0ae4061c2493c44a709b387c0c5e
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

#连线到 127.0.0.1 Port: 6380
./redis-cli -h 127.0.0.1 -p 6380
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:7b48682e1628f579bf5a3c79420e0324c859046e
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

#连线到 127.0.0.1 Port: 6381
./redis-cli -h 127.0.0.1 -p 6381
127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:bf1bb9f71dd3b8a4fc2784f71c700ffbb5b9c800
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

https://ithelp.ithome.com.tw/upload/images/20211006/20111658ba2J6tMMoQ.png
https://ithelp.ithome.com.tw/upload/images/20211006/201116584LEZdMxLB1.png
https://ithelp.ithome.com.tw/upload/images/20211006/20111658yX0LiNbVom.png

# 将127.0.0.1 Port: 6380 与 127.0.0.1 Port: 6381 设为Replica
# 如果有设定replica password 则需要在replicaof 127.0.0.1 6379 -a password
./redis-cli -h 127.0.0.1 -p 6380
127.0.0.1:6380> replicaof 127.0.0.1 6379
OK
127.0.0.1:6380> role
1) "slave"
2) "127.0.0.1"
3) (integer) 6379
4) "connected"
5) (integer) 84

./redis-cli -h 127.0.0.1 -p 6381
127.0.0.1:6381> replicaof 127.0.0.1 6379
OK
127.0.0.1:6381> role
1) "slave"
2) "127.0.0.1"
3) (integer) 6379
4) "connected"
5) (integer) 0

# 确认Replication结果
./redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> role
1) "master"
2) (integer) 308
3) 1) 1) "127.0.0.1"
      2) "6381"
      3) "308"
   2) 1) "127.0.0.1"
      2) "6380"
      3) "308"
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6381,state=online,offset=336,lag=1
slave1:ip=127.0.0.1,port=6380,state=online,offset=336,lag=1
master_failover_state:no-failover
master_replid:a30878092cdd31e404af76eaa7a2d024c8ae843e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:336
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:336

# 如果Replica要退出则可以透过以下方式
./redis-cli -h 127.0.0.1 -p 6381
127.0.0.1:6381> replicaof no one
# 在Master操作验证同步到另外两个Replica节点
./redis-cli -h 127.0.0.1 -p 6379

127.0.0.1:6379> set book a
OK
127.0.0.1:6379> get book
"a"
127.0.0.1:6379> set book b
OK
127.0.0.1:6379> get book
"b"

# 确认Replica
./redis-cli -h 127.0.0.1 -p 6380
127.0.0.1:6380> get book
"b"

# 确认Replica
./redis-cli -h 127.0.0.1 -p 6381
127.0.0.1:6381> get book
"b"

# 尝试写入Replica会有错误
127.0.0.1:6381> set book c
#(error) READONLY You can't write against a read only replica.

# 以上错误是因为这个设定而来的,当然也可以关闭但不建议
127.0.0.1:6381> config get replica-read-only
1) "replica-read-only"
2) "yes"

https://ithelp.ithome.com.tw/upload/images/20211006/20111658rhRD1aYJXh.png


<<:  <Day21> Snapshots — 取得多档股票最新资讯

>>:  基本面要看那些?

[DAY13?]SSH container

一番寻找一下发现了这个 https://github.com/jeroenpeeters/docke...

基本面要看那些?

又到了每月公布营收的时间点了,随着营收的公布,可说是几家欢乐几家愁。 很多人认为,要在股市获利,就必...

Computer Typing

The WPM stands for words per minute, and it is a m...

建立Endpoint执行二次开发

上一篇我们已经建立好模型, 而且也上传一张图片验证推论的结果符合我们的预期. 接下来我们要把mode...

Day30 | 30天系列回顾 X赛程後规划

好啦,今天是第三十天了,今天会分享下赛程心得,并回顾一下前面系列文,最後是三十天後的规划! 参赛动机...