相关链接
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 参数,指定主机。
由于没安装虚拟机(不知道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