主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave);
数据的复制是单向的,只能由主节点到从节点。
默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。
数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
mkdir myredis
cd myredis
cp redis.conf /myredis/redis.conf
vi redis6379.conf
#写入配置
#引入公共部分
include ./redis.conf
#写入PID的文件位置
pidfile /var/run/redis_6379.pid
#修改端口号
port 6379
#设置rdb文件名
dbfilename dump6379.rdb
#---------------------------------------------
vi redis6380.conf
#写入配置
#引入公共部分
include ./redis.conf
#写入PID的文件位置
pidfile /var/run/redis_6380.pid
#修改端口号
port 6380
#设置rdb文件名
dbfilename dump6380.rdb
#---------------------------------------------
vi redis6381.conf
#写入配置
#引入公共部分
include ./redis.conf
#写入PID的文件位置
pidfile /var/run/redis_6381.pid
#修改端口号
port 6381
#设置rdb文件名
dbfilename dump6381.rdb
#启动服务
redis-server redis6379.conf
redis-server redis6380.conf
redis-server redis6381.conf
#检查服务
ps -ef | grep redis
redis-cli -p 6379
info replication
# Replication
#当前角色状态 master主机 slave从机
role:master
#当前主机下从机个数
connected_slaves:0
#以下是一些基本信息
master_failover_state:no-failover
master_replid:6b80d4afb42ed598e2b40ecc2c5c0090370e71e1
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
master_port:6379
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
#从机信息
slave_read_repl_offset:168
slave_repl_offset:168
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:6903e709b5c5d7c093a4da5209e4a037395e54cf
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:168
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:168
127.0.0.1 6381 > slaveof 127.0.0.1 6379
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=112,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=112,lag=1
master_failover_state:no-failover
···
#主机写入
127.0.0.1 > 6379 set a a
OK
127.0.0.1 > 6379 set b b
OK
#------------------------------------------
#从机读取
127.0.0.1 > 6380 keys *
a
b
127.0.0.1 > 6381 get a
a
#------------------------------------------
#需要注意的是 从机不能进行写操作 如果进行写操作则会报错
127.0.0.1 > 6381 set c c
(error) READONLY You can't write against a read only replica.
1.当从服务器宕机重启以后,从服务器并不会直接恢复成从服务器,而是变成一台不相关的主服务器。
2.当从服务器从主服务器手动变成从服务器的时,他会自动同步主服务器中的数据。
#这里演示把6381模拟宕机
127.0.0.1 > 6381 shutdown
#主服务器打印信息
127.0.0.1:6379 > info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=3717,lag=1
master_failover_state:no-failover
...
#主服务器添加新数据 用于测试新的从服务器是否会自动同步数据
127.0.0.1:6379 > set newa newa
OK
#重新启动从服务器6381查看状态
redis-server redis6381.conf
redis-cli -p 6381
127.0.0.1:6381 > info replication
# Replication 我们可以看到重启以后 6381变为了主服务器
role:master
connected_slaves:0
...
#重新设置6381为 6379的从服务器 并且查看数据
127.0.0.1 6381 > slaveof 127.0.0.1 6379
127.0.0.1 6381 > keys *
a
b
newa
#读取宕机期间添加的数据成功
3.当主服务器宕机以后,对应的从服务器还是从服务器隶属于主服务器。
#模拟主服务器宕机
127.0.0.1:6379 > shutdown
127.0.01.:6380 > info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
#这里我们可以看到从服务器依然是6379的从服务器只是主机状态断开
master_link_status:down
...
#此时我们恢复主服务器 发现从服务器依然存在
redis-server redis6379.conf
redis-cli -p 6379
127.0.0.1:6379 >
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6381,state=online,offset=42,lag=0
slave1:ip=127.0.0.1,port=6380,state=online,offset=42,lag=1
薪火相传:主服务器的从服务器作为另一个服务器的主服务器依次传递下去。
比如在这个例子中: 6379作为6380的主服务器,6381又作为6380的从服务器。但是6379只拥有6380这一个从服务器,至于6381是隶属于6380的从服务器。就类似于我附庸的附庸不是我的附庸。
反客为主:当主服务器挂掉以后,这里模拟6379挂掉,如果不进行任何操作那么如6380依然标记为从服务器。此时使用命令 slaveof no one
127.0.0.1 > 6379 : shutdown
127.0.0.1 > 6380 : info replication
# Replication
role:slave
...
127.0.0.1:6380> slaveof no one
OK
127.0.0.1:6380> info replication
# Replication
role:master
...
此时,我们可以看到当一台主服务器挂掉以后,需要手动输入命令去对服务器进行重启,在现实场景中不可能有人一直监控服务器状态,所以此时我们就需要服务器进行自动监控,当主服务器挂掉以后他的从服务器自动晋升为主服务器。这个就是接下来要说的哨兵模式。
哨兵模式其实就是反客为主的自动版
首先在myredis这个目录创建 sentinel.conf 这个文件,注意名字不能错。
cd myredis
vi sentinel.conf
#里面只用输入这一句话 sentinel哨兵 monitor监控 mymaster给监控对象起的一个名称 1表示至少有多少个哨兵同意迁移的数量。就比如 如果我的6379挂了 6380 和 6381这两个哨兵 只要有一个同意就可以切换主服务器
sentinel monitor mymaster 127.0.0.1 6379 1
:wq
#启动哨兵
redis-sentinel sentinel.conf
24584:X 21 Dec 2021 20:09:47.295 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
24584:X 21 Dec 2021 20:09:47.295 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=24584, just started
24584:X 21 Dec 2021 20:09:47.295 # Configuration loaded
24584:X 21 Dec 2021 20:09:47.296 * monotonic clock: POSIX clock_gettime
Redis 6.2.6 (00000000/0) 64 bit
Running in sentinel mode
Port: 26379
PID: 24584
24584:X 21 Dec 2021 20:09:47.303 # Sentinel ID is 8ce4e8ae646ab13525a0e3ffc64bb1565c7469f9
#这里就是提示当前设置的哨兵监控的信息
24584:X 21 Dec 2021 20:09:47.303 # +monitor master mymaster 127.0.0.1 6379 quorum 1
#当主机挂掉以后选择下面两个从机进行切换 至于具体根据什么切换后面会说到
24584:X 21 Dec 2021 20:09:47.304 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
24584:X 21 Dec 2021 20:09:47.309 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
现在我们关闭主机 6379 然后等待哨兵反馈
127.0.0.1:6379> shutdown
not connected> exit
sentinel
# 检测到 6379挂掉了
24584:X 21 Dec 2021 20:18:03.146 # +sdown master mymaster 127.0.0.1 6379
...
# 选择 6380作为新的主服务器 此时 6381也变为6380的从服务器
24584:X 21 Dec 2021 20:18:03.254 # +selected-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
....
#此处配置是为了当6379 恢复连接的时候 会成为6380的从服务器
24584:X 21 Dec 2021 20:18:05.264 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380
24584:X 21 Dec 2021 20:18:35.273 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380
可以这样理解 6379是皇帝 6380 和6381都是皇子,当皇帝驾崩,以后传位给6380了 那6381只能当6380的下属,如果6379皇帝他突然又复活了 但是不可能有两个皇帝,也只能当背后的幕僚实际上作为6380的下属了。
根据优先级:redis.conf配置文件中的 replica-priority 0 或者 此处不同版本可能有所差异
slave-priority 0 此处值越小优先级越高 默认为100。
根据偏移量:如果其他服务器的优先级相同,则根据偏移量进行选择,偏移量就是因为主从服务器配置中,主服务器给从服务器传递数据的时候实际上需要一定的时间。此处的偏移量就是指从服务器中
和主服务器数据最接近的哪一个。
根据runid:选择runid更小的那一个。
redis在每次启动的时候会随机生成一个40位的runid。