2.6_11 Redis主从复制、哨兵模式、分片集群

相关链接


Redis集群

1) 主从复制replication:一个master,多个slave,要几个slave取决于要求的读吞吐量[10万QPS/台]。
2) 哨兵模式sentinal:保证主从架构的高可用,解决主机宕机后从机只可读不可写的问题。
3) 分片集群redis cluster:多个master,多个slave,针对海量数据+高并发+高可用,通过横向扩展master解决数据量大[单台20G]的问题。


一、Redis主从模式

1 简介

  主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower)。主从复制(数据的复制是单向的,只能由主节点到从节点)。读写分离(Master以写为主,Slave以读为主)。缓解服务器的压力,架构中经常使用(最少一主二从,通过哨兵模式可以选举新的主机)。

  默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。


1.1 作用

主从复制的作用
  1) 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
  2) 故障恢复:当主节点出现问题是,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
  3) 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
  4) 高可用基石:除了上述作用外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。


1.2 使用原因

一般来说,要将Redis运用于工程项目中,只是用一台Redis是不行的,原因如下:
  1) 从结构上,单个Redis服务器会发生单点故障,并且以台服务器需要处理所有的请求负载,压力较大(单台最大10万QPS)。
  2) 从容量上,单个Redis服务器内存容量有限,就算一台Redis服务器内存容量为256G,也不能将所有的内存用作Redis存储内存,一般来说,单台Redis最大使用内存不应超过20G

  针对于不同场景,可以使用不同结构,以电商平台为例:电商平台上的商品,一般都是一次上传,多次浏览的,也就是“多读少写”。从机使用 slaveof host port 认主机,对于这种场景,可以使用以下结构(1主3从):

在这里插入图片描述
  主机宕机后,就没有机器可以进行写的操作了,这时候就需要一台新的主机出现,有以下两种方式。
    手动:可以使用slaveof no one让自己变成主机,其他的节点就可以手动连接到最新的主节点。
    自动:另一种方式是通过Redis自动选举机制选出一台新的主机,这种方式叫哨兵模式
    区别:通过哨兵模式选出来的新主机,在原主机重启后,会恢复之前的主从关系,手动方式则不然。

  P.S: 所以一般不将主从关系写到配置文件中,这样可以通过命令行直接修改主从关系而不需要重启服务。


1.3 主从复制原理

  Slave 启动成功连接到 Master 后会发送一个sync(同步)命令。

  Master 接收到命令,启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后, master将传送整个数据文件到slave,并完成一次完全同步。

  全量复制:Slave 服务在接收到数据库文件数据后,将其存盘并加载到内存中。(重连主机时也会进行一次全量复制)

  增量复制:Master 继续将新的所有手机到的修改命令依次传给slave,完成同步。


1.4 info replication

  环境配置时,只配置从库,不用配置主库。通过 info replication 命令查看主从信息。

服务端:默认就是master角色

groupiesm@GroupiesMdeMacBook-Pro src % pwd
/Users/d/develop/redis-6.2.6/src
groupiesm@GroupiesMdeMacBook-Pro src % redis-server
5112:C 11 Mar 2022 12:18:46.858 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
5112:C 11 Mar 2022 12:18:46.858 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=5112, just started
5112:C 11 Mar 2022 12:18:46.858 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
5112:M 11 Mar 2022 12:18:46.859 * Increased maximum number of open files to 10032 (it was originally set to 256).
5112:M 11 Mar 2022 12:18:46.859 * monotonic clock: POSIX clock_gettime
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 6.2.6 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 5112
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           https://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

客户端

groupiesm@GroupiesMdeMacBook-Pro src % redis-cli	# 连接客户端
127.0.0.1:6379> info replication
# Replication
role:master											# 默认就是主库
connected_slaves:0									# 没有从机
master_failover_state:no-failover
master_replid:b554ade72abcc57bbe4ad788ea2fa271f6b86f77		# 随机生成id
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

2. 主从复制(1主2从) - 配置

  1) 主机可以写,从机不能写只能读。主机中所有的信息都会被从机自动保存
  2) 通过 info replication 命令查看主从信息。
  3) 命令行配置主从:将 host 认作自己的主机、是自己成为从机: slaveof host port。主机宕机时,从机使用slaveof no one让自己变成主机,其他的节点就可以手动连接到最新的主节点。
  4) 配置文件主从:通过修改redis.conf文件的 REPLICATION => replicaof 参数,指定主机。


准备工作 - Redis集群搭建

  由于没安装虚拟机(不知道mac怎么搭虚拟机,而且太麻烦),我采用单机多集群方式(正常情况下应采用多机多集群)。修改配置文件搭建Redis集群(1主2从)。单台机器上多次启动redis-server(3个窗口),每次指向不同的配置文件(3个配置文件),每个配置文件配置不同端口(3个端口)。

Step1. 复制配置文件(daemonize默认为no,我安装redis后已经将其改为yes:redis会在后台运行)

groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % pwd
/Users/d/develop/redis-6.2.6
groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % cp redis.conf redis79.conf
groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % cp redis.conf redis80.conf
groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % cp redis.conf redis81.conf
groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % ls redis*.conf
redis.conf   redis79.conf redis80.conf redis81.conf

Step2. 【服务1 主机6379】 修改 redis79.conf

groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % vim redis79.conf
# logfile "" 修改为 
logfile "redis6379.log"

# dbfilename dump.rdb 修改为
dbfilename dump6379.rdb

Step3. 【服务2 从机6380】 修改 redis80.conf

groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % vim redis80.conf
# port 6379 修改为
port 6380

# pidfile /var/run/redis_6379.pid 修改为
pidfile /var/run/redis_6380.pid

# logfile "" 修改为 
logfile "6380.log"

# dbfilename dump.rdb 修改为
dbfilename dump6380.rdb

Step4. 【服务3 从机6381】 修改 redis81.conf

groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % vim redis81.conf
# port 6379 修改为
port 6381

# pidfile /var/run/redis_6379.pid 修改为
pidfile /var/run/redis_6381.pid

# logfile "" 修改为 
logfile "6381.log"

# dbfilename dump.rdb 修改为
dbfilename dump6381.rdb

Step5. 【窗口1】 启动服务。指定配置文件是没有启动服务动画的,可以通过命令查看后台进程ps -ef | grep redis

groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % pwd
/Users/d/develop/redis-6.2.6
groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % redis-server redis79.conf
groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % redis-server redis80.conf
groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % redis-server redis81.conf
groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % ps -ef | grep redis
  501 12201     1   0  6:39下午 ??         0:01.01 redis-server 127.0.0.1:6379	# 服务1 主 master
  501 12277     1   0  6:42下午 ??         0:00.19 redis-server 127.0.0.1:6380	# 服务2 从 slave
  501 12297     1   0  6:43下午 ??         0:00.01 redis-server 127.0.0.1:6381	# 服务3 从 slave
  501 12299  6965   0  6:43下午 ttys001    0:00.00 grep redis

Step5. 【窗口1 主机6379】 连接客户端,默认为主节点

groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % pwd
/Users/d/develop/redis-6.2.6
groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % redis-cli -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:0c15b81f9442af370f490cdaaa873cd00d0255c3
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

Step6. 【窗口2 从机6380】 连接客户端,默认为主节点

groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % pwd
/Users/d/develop/redis-6.2.6
groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % redis-cli -p 6380
127.0.0.1:6380> ping
PONG
127.0.0.1:6380> info replication
# Replication
role:master			# master = 主节点
connected_slaves:0
master_failover_state:no-failover
master_replid:14297ec6de67b747b11bf2a0bd0347ff1a629e4a
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

Step7. 【窗口3 从机6381】 连接客户端,默认为主节点

groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % pwd
/Users/d/develop/redis-6.2.6
groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % redis-cli -p 6381
127.0.0.1:6381> ping
PONG
127.0.0.1:6381> info replication
# Replication
role:master			# master = 主节点
connected_slaves:0
master_failover_state:no-failover
master_replid:fcd1f40d668af3650bd12c5237fad0a423596e0f
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

2.1 命令行方式

默认情况下,每台Redis服务器都是主节点,我们一般情况下只用配置从机就好了( 从机 => 认主机 slaveof host port ),一主(6379)二从(6380、6381)。

Step1. 【窗口2 从机6380】 将 6379 认作自己的主机 slaveof 127.0.0.1 6379

groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % pwd
/Users/d/develop/redis-6.2.6
groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % redis-cli -p 6380
127.0.0.1:6380> ping
PONG
127.0.0.1:6380> info replication
# Replication
role:master			# master = 主节点
connected_slaves:0
master_failover_state:no-failover
master_replid:14297ec6de67b747b11bf2a0bd0347ff1a629e4a
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:6380> slaveof 127.0.0.1 6379		# 认主机
OK
127.0.0.1:6380> info replication	
# Replication			
role:slave									# 角色:从机
master_host:127.0.0.1						# 主机ip
master_port:6379							# 主机端口号
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_read_repl_offset:14
slave_repl_offset:14
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:863ab25b84788aad9f6daa930b5403efbd282ca9
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14

Step2. 【窗口3 从机6381】 将 6379 认作自己的主机 slaveof localhost 6379

groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % pwd
/Users/d/develop/redis-6.2.6
groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % redis-cli -p 6381
127.0.0.1:6381> ping
PONG
127.0.0.1:6381> info replication
# Replication
role:master			# master = 主节点
connected_slaves:0
master_failover_state:no-failover
master_replid:fcd1f40d668af3650bd12c5237fad0a423596e0f
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:6381> slaveof localhost 6379		# 认主机
OK
127.0.0.1:6381> info replication
# Replication
role:slave									# 角色:从机
master_host:localhost						# 主机ip
master_port:6379							# 主机端口
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_read_repl_offset:98
slave_repl_offset:98
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:863ab25b84788aad9f6daa930b5403efbd282ca9
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:98
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:99
repl_backlog_histlen:0

Step3. 【窗口1 主机 6379】 查看从机信息 info replication

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:0c15b81f9442af370f490cdaaa873cd00d0255c3
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:6379> info replication
# Replication
role:master
connected_slaves:2											# 2个从机
slave0:ip=127.0.0.1,port=6380,state=online,offset=336,lag=0 # 从机1号 6380
slave1:ip=127.0.0.1,port=6381,state=online,offset=336,lag=0 # 从机2号 6381
master_failover_state:no-failover	
master_replid:863ab25b84788aad9f6daa930b5403efbd282ca9
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

2.2 配置文件方式

1.9 REPLICATION 主从复制⭐️ => Redis.conf 配置文件

2) replicaof:主机的ip,端口号。默认 无。除了配置文件,还可以通过命令的方式配置主机 slaveof host port
2) replica-serve-stale-data:是否保存数据。默认 yes。
3) replica-read-only:是否只读。默认 yes。


3. 主从复制(1主2从) - 测试

1) 主机可以做所有操作,从机只能做读操作。
2) 主机宕机后,从机依然可以读数据,但不能进行写的操作。需要等待主机重启后通过主机进行写操作。
3) 如果采用命令行配置主从复制,从机重启后自动变回主机。再次成为从机后,立即会从主机中获取所有值。


3.1 主机/从机 get、set

Step1. 【窗口2 从机 6380】 get值、set值(不可以set值)

127.0.0.1:6380> keys *
(empty array)
127.0.0.1:6380> set k1 v1
(error) READONLY You can't write against a read only replica.

Step2. 【窗口1 主机 6379】 set值

127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> get k1
"v1"

Step3. 【窗口2 从机 6380】 get值

127.0.0.1:6380> get k1
"v1"

Step4. 【窗口1 主机 6379】 flushdb => 从机的信息也被清除了

127.0.0.1:6379> flushdb
OK

Step5. 【窗口2 从机 6380】 get值

127.0.0.1:6380> get k1
(nil)

3.2 主机宕机后

Step1. 【窗口1 主机 6379】 手动宕机

127.0.0.1:6379> shutdown
not connected> ping
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected> quit
groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % ps -ef | grep redis
  501 12277     1   0 五06下午 ??        17:09.38 redis-server 127.0.0.1:6380
  501 12297     1   0 五06下午 ??        17:08.99 redis-server 127.0.0.1:6381
  501 12364 12354   0 五06下午 ttys000    0:00.03 redis-cli -p 6380
  501 69944  6965   0 11:36上午 ttys001    0:00.01 grep redis
  501 12376 12366   0 五06下午 ttys002    0:00.01 redis-cli -p 6381

Step2. 【窗口2 从机 6380】 get值

127.0.0.1:6380> get k1
"v1"

Step3. 【窗口1 主机 6379】 重启服务

127.0.0.1:6379> shutdown
not connected> quit
groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % ps -ef | grep redis
  501 12277     1   0 五06下午 ??        17:09.38 redis-server 127.0.0.1:6380
  501 12297     1   0 五06下午 ??        17:08.99 redis-server 127.0.0.1:6381
  501 12364 12354   0 五06下午 ttys000    0:00.03 redis-cli -p 6380
  501 69944  6965   0 11:36上午 ttys001    0:00.01 grep redis
  501 12376 12366   0 五06下午 ttys002    0:00.01 redis-cli -p 6381
groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % redis-server redis79.conf
groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % redis-cli -p 6379
127.0.0.1:6379> ping
PONG

3.3 从机宕机后

Step1. 【窗口3 从机 6381】 手动宕机

127.0.0.1:6381> shutdown
not connected> quit
groupiesm@GroupiesMdeMacBook-Pro ~ %

Step2. 【窗口1 主机 6379】 set值

127.0.0.1:6379> keys *
1) "k1"
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k1"

Step3. 【窗口3 从机 6381】 重连服务

groupiesm@GroupiesMdeMacBook-Pro ~ % cd /Users/d/develop/redis
cd: no such file or directory: /Users/d/develop/redis
groupiesm@GroupiesMdeMacBook-Pro ~ % cd /Users/d/develop/redis-6.2.6/
groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % redis-server redis81.conf
groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % redis-cli -p 6381
127.0.0.1:6381> get k2
(nil)
127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:c20ca77c6a9b46ab50ef40d6a1d3a4d46b1da025
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

Step4. 【窗口3 从机 6381】 认主机 => 6379

127.0.0.1:6381> slaveof localhost 6379
OK
127.0.0.1:6381> get k2
"v2"

3.4 从机=>主机 slaveof no one

Step1. 【窗口1 主机 6379】 手动宕机

127.0.0.1:6379> shutdown
not connected> ping
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected> quit
groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % ps -ef | grep redis
  501 12277     1   0 五06下午 ??        17:09.38 redis-server 127.0.0.1:6380
  501 12297     1   0 五06下午 ??        17:08.99 redis-server 127.0.0.1:6381
  501 12364 12354   0 五06下午 ttys000    0:00.03 redis-cli -p 6380
  501 69944  6965   0 11:36上午 ttys001    0:00.01 grep redis
  501 12376 12366   0 五06下午 ttys002    0:00.01 redis-cli -p 6381

Step2. 【窗口2 从机 6380】 成为主机 slaveof no one

127.0.0.1:6380> info replication		# 查看主从信息
# Replication
role:slave								# 角色:从机
master_host:localhost
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_read_repl_offset:248
slave_repl_offset:248
master_link_down_since_seconds:5
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:22c1c03d5357629cd9f34c9a2010c22538a31d8a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:248
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:111
repl_backlog_histlen:138
127.0.0.1:6380> keys *		# 查看key
1) "k2"
2) "k1"
127.0.0.1:6381> set k3 v3			
(error) READONLY You can't write against a read only replica.	# 从机没有权限设置key
127.0.0.1:6380> slaveof no one		# 自己成为主机
OK
127.0.0.1:6380> info replication	# 查看主从信息
# Replication
role:master							# 角色:主机
connected_slaves:0
master_failover_state:no-failover
master_replid:80dfc871c9084f91e2f99413cf316244d07fe6e4
master_replid2:fa510ddff53479f6facc40fae8a8068b8c4589f0
master_repl_offset:15592
second_repl_offset:15593
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:15592
127.0.0.1:6380> keys *				# 查看key(数据不变)
1) "k2"
2) "k1"
127.0.0.1:6380> set k3 v3			# 成为主机后可以设置新的key
OK
127.0.0.1:6380> keys *
1) "k2"
2) "k1"
3) "k3"

Step3. 【窗口2 从机 6381】 认主机 slaveof host port

127.0.0.1:6381> info replication		# 查看主从信息
# Replication
role:slave		
master_host:localhost
master_port:6379						# 是6379的从机,但是6379已经挂了
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_read_repl_offset:248
slave_repl_offset:248
master_link_down_since_seconds:216
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:22c1c03d5357629cd9f34c9a2010c22538a31d8a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:248
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:248
127.0.0.1:6381> keys *				# 6380成为主机后设置了新key => k3 没有获取到
1) "k1"
2) "k2"
127.0.0.1:6381> slaveof localhost 6380	# 成为6380的从机
OK
127.0.0.1:6381> keys *				# 获取到了k3
1) "k1"
2) "k3"
3) "k2"

Step4. 【窗口1 主机 6379】 重启服务

groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % redis-server redis79.conf
groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % redis-cli -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> keys *
1) "k2"
2) "k1"

Step5. 【窗口2 从机 6380】 成为从机后,数据再次和之前的主机保持一致

127.0.0.1:6380> keys *
1) "k2"
2) "k1"
3) "k3"
127.0.0.1:6380> slaveof 127.0.0.1 6379
OK
127.0.0.1:6380> keys *
1) "k2"
2) "k1"
127.0.0.1:6380>

二. 哨兵模式(自动选举) Sentinel

1 简介

  主从模式下当主服务断掉后,服务将只可读不可写,Redis 2.8开始正式提供了Sentinel(哨兵)来解决这个问题的。哨兵模式(redis-sentinel)作为一个独立的进程,其作用就是在主服务宕机后,(通过raft算法) 在从服务里面选一个来做新的主服务。


1.1 作用

哨兵模式的作用
  1) 监控:哨兵会不断的检查你的主服务器和从服务器是否运作正常。
  2) 通知:当被监控的某个 Redis 服务器出现问题时, 哨兵可以通过API向管理员或者其他应用程序发送通知。
  3) 故障迁移:当主服务器不能正常工作时,哨兵会自动进行故障迁移,也就是主从切换(自动投票,将票数最高的从库自动转为主库,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让他们切换主机)。
  4) 统一的配置管理:连接者询问哨兵取得主从的地址。

哨兵模式
在这里插入图片描述
多哨兵模式:一个哨兵进程对Redis服务器进行监控,可能会出现问题。为此可以使用多个哨兵进行监控,各个哨兵之间还可以互相监控,就形成了多哨兵模式。
  主观下线:假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象称为主观下线。
  客观下线:当后面的哨兵也检测到主服务器不可用,并且达到一定值时,那么哨兵之间会进行一次投票,投票的结果由一个哨兵发起,进行failover[故障转移]操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器,进行切换主机。这个过程成为客观下线。

在这里插入图片描述


1.2 使用原因

哨兵模式sentinal:保证主从架构的高可用,解决主机宕机后从机只可读不可写的问题。

优点
  1) 基于主从复制模式,所有主从配置的有点,他全都有
  2) 主从可以切换,故障可以转移,系统的可用性会更好
  3) 哨兵模式就是主从模式的升级

缺点
  1) Redis 不好在线扩容,集群容量一旦达到上线,在线扩容就十分麻烦(修改大量配置文件,横向扩容)。
  2) 实现哨兵模式的配置十分麻烦,里面有很多参数。

1.3 配置文件 sentinel.conf ⭐️
# 哨兵sentinel实例运行的端口 默认26379。如果是多哨兵模式,还需要配置每个哨兵的端口
port 26379

# 守护模式运行(后台运行),默认为no
daemonize no

# Redis Sentinel写入pid文件到/var/run/redis-sentinel
pidfile "/var/run/redis-sentinel.pid"

# 日志文件
logfile ""

# 哨兵sentinel的工作目录
dir "/private/tmp"

# 哨兵sentinel监控的redis主节点的 ip port
# master-name可以自己明明主节点的名字 只能由a-Z 0-9, 和".-_"三个字符组成
# quorum 配置多少个sentinel哨兵统一认为master主节点失联 那么这时客观上认为主节点失联了
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel monitor mymaster 127.0.0.1 6381 1

# 当在Redis实例中开启了requirepass foodbared 授权密码,所有连接Redis实例的客户端都要提供密码
# 设置哨兵sentinel 连接主从的密码 注意必须为主从设置一样的密码
# sentinel auth-pass <mster-name> <password>
# sentinel auth-pass mymaster MySUPER--secret-0123passw0rd

 
#
# This is useful in order to authenticate to instances having ACL capabilities,
# that is, running Redis 6.0 or greater. When just auth-pass is provided the
# Sentinel instance will authenticate to Redis using the old "AUTH <pass>"
# method. When also an username is provided, it will use "AUTH <user> <pass>".
# In the Redis servers side, the ACL to provide just minimal access to
# Sentinel instances, should be configured along the following lines:
#
#     user sentinel-user >somepassword +client +subscribe +publish \
#                        +ping +info +multi +slaveof +config +client +exec on

  指定多少毫秒后,主节点没有应答哨兵sentinel 此时 哨兵主观上认为主节点下线 默认3分钟
# sentinel down-after-milliseconds <master-name> <milliseconds>


# IMPORTANT NOTE: starting with Redis 6.2 ACL capability is supported for
# Sentinel mode, please refer to the Redis website https://redis.io/topics/acl
# for more details.

# Sentinel's ACL users are defined in the following format:
#
#   user <username> ... acl rules ...
#
# For example:
#
#   user worker +@admin +@connection ~* on >ffa9203c493aa99
#
# For more information about ACL configuration please refer to the Redis
# website at https://redis.io/topics/acl and redis server configuration
# template redis.conf.

# ACL LOG
#
# The ACL Log tracks failed commands and authentication events associated
# with ACLs. The ACL Log is useful to troubleshoot failed commands blocked
# by ACLs. The ACL Log is stored in memory. You can reclaim memory with
# ACL LOG RESET. Define the maximum entry length of the ACL Log below.
acllog-max-len 128

# Using an external ACL file
#
# Instead of configuring users here in this file, it is possible to use
# a stand-alone file just listing users. The two methods cannot be mixed:
# if you configure users here and at the same time you activate the external
# ACL file, the server will refuse to start.
#
# The format of the external ACL user file is exactly the same as the
# format that is used inside redis.conf to describe users.
#
# aclfile /etc/redis/sentinel-users.acl

# requirepass <password>
#
# You can configure Sentinel itself to require a password, however when doing
# so Sentinel will try to authenticate with the same password to all the
# other Sentinels. So you need to configure all your Sentinels in a given
# group with the same "requirepass" password. Check the following documentation
# for more info: https://redis.io/topics/sentinel
#
# IMPORTANT NOTE: starting with Redis 6.2 "requirepass" is a compatibility
# layer on top of the ACL system. The option effect will be just setting
# the password for the default user. Clients will still authenticate using
# AUTH <password> as usually, or more explicitly with AUTH default <password>
# if they follow the new protocol: both will work.
#
# New config files are advised to use separate authentication control for
# incoming connections (via ACL), and for outgoing connections (via
# sentinel-user and sentinel-pass)
#
# The requirepass is not compatable with aclfile option and the ACL LOAD
# command, these will cause requirepass to be ignored.

# sentinel sentinel-user <username>
#
# You can configure Sentinel to authenticate with other Sentinels with specific
# user name.

# sentinel sentinel-pass <password>
#
# The password for Sentinel to authenticate with other Sentinels. If sentinel-user
# is not configured, Sentinel will use 'default' user with sentinel-pass to authenticate.

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

  故障转移的超时时间 failover-timeout 可以用在以下这些方面 ,默认3分钟
  1. 同一个sentinel对同一个master两次failover之间的间隔时间
  2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时
  3. 当想要取消一个正在进行的failover所需要的时间
  4. 当进行failover时,配置所有slaves指向新的master所需的最大时间。
     不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了
# sentinel failover-timeout <master-name> <milliseconds>

# SCRIPTS EXECUTION
#
# sentinel notification-script and sentinel reconfig-script are used in order
# to configure scripts that are called to notify the system administrator
# or to reconfigure clients after a failover. The scripts are executed
# with the following rules for error handling:
#
# If script exits with "1" the execution is retried later (up to a maximum
# number of times currently set to 10).
#
# If script exits with "2" (or an higher value) the script execution is
# not retried.
#
# If script terminates because it receives a signal the behavior is the same
# as exit code 1.
#
# A script has a maximum running time of 60 seconds. After this limit is
# reached the script is terminated with a SIGKILL and the execution retried.


  通知型脚本:当sentinel有任何警告级别的事件发生时(比如说redis实例的主观失效和客观失效等等),将会去调用这个脚本,
  这时这个脚本应该通过邮件,SMS等方式去通知系统管理员关于系统不正常运行的信息。调用该脚本时,将传给脚本两个参数,
  一个是事件的类型,一个是事件的描述。如果sentinel.conf配置文件中配置了这个脚本路径,那么必须保证这个脚本存在于这个路径,
  并且是可执行的,否则sentinel无法正常启动。
  
# sentinel notification-script <master-name> <script-path>
# sentinel notification-script mymaster /var/redis/notify.sh


  客户端重新配置主节点参数脚本
  当一个master因failover而发生改变时,这个脚本将会被调用,通知相关客户端关于master地址已经发生改变的信息
  以下下参数将会在调用脚本时传给脚本
  # <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
  目前<state>总是 failover
  <role>是leader或者observer中的一个
  参数 from-ip,from-port,to-ip,to-port是用来和旧的master和新的master(即旧的slave)通信的
  这个脚本应该是通用的,能被多次调用,不是针对性的
  sentinel client-reconfig
# sentinel client-reconfig-script <master-name> <script-path>  
# sentinel client-reconfig-script mymaster /var/redis/reconfig.sh


# SECURITY
#
# By default SENTINEL SET will not be able to change the notification-script
# and client-reconfig-script at runtime. This avoids a trivial security issue
# where clients can set the script to anything and trigger a failover in order
# to get the program executed.

sentinel deny-scripts-reconfig yes

# REDIS COMMANDS RENAMING
#
# Sometimes the Redis server has certain commands, that are needed for Sentinel
# to work correctly, renamed to unguessable strings. This is often the case
# of CONFIG and SLAVEOF in the context of providers that provide Redis as
# a service, and don't want the customers to reconfigure the instances outside
# of the administration console.
#
# In such case it is possible to tell Sentinel to use different command names
# instead of the normal ones. For example if the master "mymaster", and the
# associated replicas, have "CONFIG" all renamed to "GUESSME", I could use:
#
# SENTINEL rename-command mymaster CONFIG GUESSME
#
# After such configuration is set, every time Sentinel would use CONFIG it will
# use GUESSME instead. Note that there is no actual need to respect the command
# case, so writing "config guessme" is the same in the example above.
#
# SENTINEL SET can also be used in order to perform this configuration at runtime.
#
# In order to set a command back to its original name (undo the renaming), it
# is possible to just rename a command to itself:
#
# SENTINEL rename-command mymaster CONFIG CONFIG

# HOSTNAMES SUPPORT
#
# Normally Sentinel uses only IP addresses and requires SENTINEL MONITOR
# to specify an IP address. Also, it requires the Redis replica-announce-ip
# keyword to specify only IP addresses.
#
# You may enable hostnames support by enabling resolve-hostnames. Note
# that you must make sure your DNS is configured properly and that DNS
# resolution does not introduce very long delays.
#
sentinel resolve-hostnames no

# When resolve-hostnames is enabled, Sentinel still uses IP addresses
# when exposing instances to users, configuration files, etc. If you want
# to retain the hostnames when announced, enable announce-hostnames below.
#
sentinel announce-hostnames no
# Generated by CONFIG REWRITE
protected-mode no
user default on nopass ~* &* +@all
sentinel myid a4197b55b71b772e7df2743765e3e591c49928e2
sentinel config-epoch mymaster 1
sentinel leader-epoch mymaster 1
sentinel current-epoch 1
sentinel known-replica mymaster 127.0.0.1 6379
sentinel known-replica mymaster 127.0.0.1 6380

2. 哨兵模式 - 配置

Redis6.2.6版本的 sentinel.conf 在redis目录下,并且有一些默认配置的,一些较老版本可能需要手动创建这个文件。

Step1. 【窗口1】 整理配置文件到一个目录下- myconfig

groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % pwd
/Users/d/develop/redis-6.2.6
groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % ls
00-RELEASENOTES   Makefile          dump6380.rdb      redis6381.log     runtest-sentinel
BUGS              README.md         dump6381.rdb      redis79.conf      sentinel.conf
CONDUCT           TLS.md            redis.conf        redis80.conf      src
CONTRIBUTING      appendonly.aof    redis.conf-bak    redis81.conf      tests
COPYING           deps              redis.log         runtest           utils
INSTALL           dump.rdb          redis6379.log     runtest-cluster
MANIFESTO         dump6379.rdb      redis6380.log     runtest-moduleapi
groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % mkdir myconfig
groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % mv *.conf myconfig
groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % mv redis.conf-bak myconfig
groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % cd myconfig
groupiesm@GroupiesMdeMacBook-Pro myconfig % ls
redis.conf    redis79.conf  redis80.conf  redis81.conf  sentinel.conf
groupiesm@GroupiesMdeMacBook-Pro myconfig % cp sentinel.conf sentinel.conf-bak	# 备份哨兵模式的配置文件
groupiesm@GroupiesMdeMacBook-Pro myconfig % ls
redis.conf        redis80.conf      sentinel.conf
redis79.conf      redis81.conf      sentinel.conf-bak

Step2. 【窗口1】 编辑 sentinel.conf (sentinel monitor <master-name> <ip> <redis-port> <quorum>)

#sentinel monitor <master-name> <ip> <redis-port> <quorum> 是最基本的一项配置,有这项配置就可以启动哨兵了
	# master-name : 主机名称
	# ip:			 ip
	# redis-port:	 端口号
	# quorum:		 只有在至少quorum个哨兵同意,才能发布信息(让master失效、选举新的主机) 
sentinel monitor mymaster 127.0.0.1 6379 2 
改为
sentinel monitor mymaster 127.0.0.1 6379 1

Step3. 【窗口1 哨兵服务】 启动哨兵 redis-sentinel,端口号为26379

groupiesm@GroupiesMdeMacBook-Pro myconfig % cd ..
groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % redis-sentinel myconfig/sentinel.conf	# 启动哨兵
77893:X 14 Mar 2022 18:59:46.335 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
77893:X 14 Mar 2022 18:59:46.335 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=77893, just started
77893:X 14 Mar 2022 18:59:46.335 # Configuration loaded
77893:X 14 Mar 2022 18:59:46.335 * Increased maximum number of open files to 10032 (it was originally set to 256).
77893:X 14 Mar 2022 18:59:46.335 * monotonic clock: POSIX clock_gettime
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 6.2.6 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
 |    `-._   `._    /     _.-'    |     PID: 77893
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           https://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

77893:X 14 Mar 2022 18:59:46.348 # Sentinel ID is a4197b55b71b772e7df2743765e3e591c49928e2
77893:X 14 Mar 2022 18:59:46.348 # +monitor master mymaster 127.0.0.1 6379 quorum 1  	# 监控主机为6379
77893:X 14 Mar 2022 18:59:46.350 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379	# 监控主机的从机1 
77893:X 14 Mar 2022 18:59:46.351 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379	# 监控主机的从机2

3. 哨兵模式 - 测试

主机宕机后,会在从机(slave)中选出新的主机(new master)。且原主机(old master)重启后,会成为新主机(new master)的从机(slave)。

Step1. 【窗口2 主机6379】 手动宕机

groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % pwd
/Users/d/develop/redis-6.2.6
groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % redis-cli -p 6379
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=43308,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=43308,lag=0
master_failover_state:no-failover
master_replid:b2726a2a7554fa1673060cc297fdede7ce0c8662
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:43441
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:43441
127.0.0.1:6379> shutdown
not connected>

Step2. 【窗口1 哨兵服务】 观察日志(等待5-10秒左右)

groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % redis-sentinel myconfig/sentinel.conf
77893:X 14 Mar 2022 18:59:46.335 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
77893:X 14 Mar 2022 18:59:46.335 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=77893, just started
77893:X 14 Mar 2022 18:59:46.335 # Configuration loaded
77893:X 14 Mar 2022 18:59:46.335 * Increased maximum number of open files to 10032 (it was originally set to 256).
77893:X 14 Mar 2022 18:59:46.335 * monotonic clock: POSIX clock_gettime
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 6.2.6 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
 |    `-._   `._    /     _.-'    |     PID: 77893
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           https://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

77893:X 14 Mar 2022 18:59:46.348 # Sentinel ID is a4197b55b71b772e7df2743765e3e591c49928e2
77893:X 14 Mar 2022 18:59:46.348 # +monitor master mymaster 127.0.0.1 6379 quorum 1
77893:X 14 Mar 2022 18:59:46.350 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
77893:X 14 Mar 2022 18:59:46.351 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
77893:X 14 Mar 2022 19:02:47.125 * +fix-slave-config slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379

# ================= 以下内容为主机6379宕机后的日志 =================

77893:X 14 Mar 2022 19:07:20.960 # +sdown master mymaster 127.0.0.1 6379
77893:X 14 Mar 2022 19:07:20.960 # +odown master mymaster 127.0.0.1 6379 #quorum 1/1
77893:X 14 Mar 2022 19:07:20.960 # +new-epoch 1
77893:X 14 Mar 2022 19:07:20.960 # +try-failover master mymaster 127.0.0.1 6379
77893:X 14 Mar 2022 19:07:20.962 # +vote-for-leader a4197b55b71b772e7df2743765e3e591c49928e2 1
77893:X 14 Mar 2022 19:07:20.963 # +elected-leader master mymaster 127.0.0.1 6379
# ================= failover[故障转移]操作 =================
77893:X 14 Mar 2022 19:07:20.963 # +failover-state-select-slave master mymaster 127.0.0.1 6379
77893:X 14 Mar 2022 19:07:21.042 # +selected-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
77893:X 14 Mar 2022 19:07:21.042 * +failover-state-send-slaveof-noone slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
77893:X 14 Mar 2022 19:07:21.099 * +failover-state-wait-promotion slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
77893:X 14 Mar 2022 19:07:21.859 # +promoted-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
77893:X 14 Mar 2022 19:07:21.859 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6379
77893:X 14 Mar 2022 19:07:21.920 * +slave-reconf-sent slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
77893:X 14 Mar 2022 19:07:22.878 * +slave-reconf-inprog slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
77893:X 14 Mar 2022 19:07:22.878 * +slave-reconf-done slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
77893:X 14 Mar 2022 19:07:22.934 # +failover-end master mymaster 127.0.0.1 6379
# ================= switch-master[更换主节点]操作 =================
77893:X 14 Mar 2022 19:07:22.934 # + mymaster 127.0.0.1 6379 127.0.0.1 6381		# 6381成为主机
77893:X 14 Mar 2022 19:07:22.934 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
77893:X 14 Mar 2022 19:07:22.935 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381

Step3. 【窗口3 新主机6381】 查看主从信息 info replication

groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % redis-cli -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=65752,lag=0
master_failover_state:no-failover
master_replid:4e205ac9dee701889f8e9f29a4c3e86464f40261
master_replid2:b2726a2a7554fa1673060cc297fdede7ce0c8662
master_repl_offset:65752
second_repl_offset:43722
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:65752
127.0.0.1:6381> keys *
1) "k1"
127.0.0.1:6381> set k2 v2
OK

Step4. 【窗口4 从机6380】 查看主从信息 info replication

groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % redis-cli -p 6380
127.0.0.1:6380> info replication
# Replication
role:slave					# 角色:从机
master_host:127.0.0.1
master_port:6381			# 主机ip => 6381 ,哨兵刚刚选举出来的新主机
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_read_repl_offset:69855
slave_repl_offset:69855
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:4e205ac9dee701889f8e9f29a4c3e86464f40261
master_replid2:b2726a2a7554fa1673060cc297fdede7ce0c8662
master_repl_offset:69855
second_repl_offset:43722
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:69855

Step5. 【窗口2 原主机6379】 重启服务,连接客户端查,看主从信息 info replication,已经成为从机

groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % redis-server myconfig/redis79.conf
groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % redis-cli -p 6379
127.0.0.1:6379> keys *
1) "k1"
2) "k2"
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:1
master_sync_in_progress:0
slave_read_repl_offset:76122
slave_repl_offset:76122
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:4e205ac9dee701889f8e9f29a4c3e86464f40261
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:76122
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:74875
repl_backlog_histlen:1248
127.0.0.1:6379> set k3 v3
(error) READONLY You can't write against a read only replica.

Step6. 【窗口1 哨兵服务】 观察日志,提示6381新增从机(slave)为6379

groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % redis-sentinel myconfig/sentinel.conf
77893:X 14 Mar 2022 18:59:46.335 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
77893:X 14 Mar 2022 18:59:46.335 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=77893, just started
77893:X 14 Mar 2022 18:59:46.335 # Configuration loaded
77893:X 14 Mar 2022 18:59:46.335 * Increased maximum number of open files to 10032 (it was originally set to 256).
77893:X 14 Mar 2022 18:59:46.335 * monotonic clock: POSIX clock_gettime
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 6.2.6 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
 |    `-._   `._    /     _.-'    |     PID: 77893
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           https://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

77893:X 14 Mar 2022 18:59:46.348 # Sentinel ID is a4197b55b71b772e7df2743765e3e591c49928e2
77893:X 14 Mar 2022 18:59:46.348 # +monitor master mymaster 127.0.0.1 6379 quorum 1
77893:X 14 Mar 2022 18:59:46.350 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
77893:X 14 Mar 2022 18:59:46.351 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
77893:X 14 Mar 2022 19:02:47.125 * +fix-slave-config slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379

# ================= 以下内容为主机6379宕机后的日志 =================

77893:X 14 Mar 2022 19:07:20.960 # +sdown master mymaster 127.0.0.1 6379
77893:X 14 Mar 2022 19:07:20.960 # +odown master mymaster 127.0.0.1 6379 #quorum 1/1
77893:X 14 Mar 2022 19:07:20.960 # +new-epoch 1
77893:X 14 Mar 2022 19:07:20.960 # +try-failover master mymaster 127.0.0.1 6379
77893:X 14 Mar 2022 19:07:20.962 # +vote-for-leader a4197b55b71b772e7df2743765e3e591c49928e2 1
77893:X 14 Mar 2022 19:07:20.963 # +elected-leader master mymaster 127.0.0.1 6379
# ================= failover[故障转移]操作 =================
77893:X 14 Mar 2022 19:07:20.963 # +failover-state-select-slave master mymaster 127.0.0.1 6379
77893:X 14 Mar 2022 19:07:21.042 # +selected-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
77893:X 14 Mar 2022 19:07:21.042 * +failover-state-send-slaveof-noone slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
77893:X 14 Mar 2022 19:07:21.099 * +failover-state-wait-promotion slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
77893:X 14 Mar 2022 19:07:21.859 # +promoted-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
77893:X 14 Mar 2022 19:07:21.859 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6379
77893:X 14 Mar 2022 19:07:21.920 * +slave-reconf-sent slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
77893:X 14 Mar 2022 19:07:22.878 * +slave-reconf-inprog slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
77893:X 14 Mar 2022 19:07:22.878 * +slave-reconf-done slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
77893:X 14 Mar 2022 19:07:22.934 # +failover-end master mymaster 127.0.0.1 6379
# ================= switch-master[更换主节点]操作 =================
77893:X 14 Mar 2022 19:07:22.934 # + mymaster 127.0.0.1 6379 127.0.0.1 6381		# 6381成为主机
77893:X 14 Mar 2022 19:07:22.934 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
77893:X 14 Mar 2022 19:07:22.935 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381

# ================= 以下内容为主机6379重启服务后的日志 =================

77893:X 14 Mar 2022 19:07:52.969 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381
groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % redis-sentinel myconfig/sentinel.conf
77893:X 14 Mar 2022 18:59:46.335 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
77893:X 14 Mar 2022 18:59:46.335 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=77893, just started
77893:X 14 Mar 2022 18:59:46.335 # Configuration loaded
77893:X 14 Mar 2022 18:59:46.335 * Increased maximum number of open files to 10032 (it was originally set to 256).
77893:X 14 Mar 2022 18:59:46.335 * monotonic clock: POSIX clock_gettime
77893:X 14 Mar 2022 19:14:56.561 # -sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381
77893:X 14 Mar 2022 19:15:06.495 * +convert-to-slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381

三. 分片集群 redis cluster

  主从架构中最大的问题在于:master与slave的数据是一样的,而单台服务器master最大缓存是有限的,当需求缓存数据量过大时,一台master就不能满足要求。这是就需要用到分片集群。通过Redis横向扩容,配置多个master。

没有具体搭建测试过程,略


22/03/15

M

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值