十二、主从复制
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower) ; 数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave以读为主。默认情况下,每台Redis服务器都是主节点 ;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。
主从复制的作用 读写分离:主节点写,从节点读,提高服务器的读写负载能力
数据冗余︰主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
故障恢复︰当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复 ; 实际上是一种服务的冗余。
负载均衡︰在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载 ; 尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
高可用(集群)基石︰除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。
环境配置
只配置从库,不用配置主库。
127.0.0.1:6379> info replication #查看当前库的信息
# Replication
role:master #角色
connected_slaves:0 #连接的从机数量
master_failover_state:no-failover
master_replid:24b0e8a8ed0189f29086fa10ea792ee49495cf41
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
复制三个配置文件,修改对应的信息
1、端口号
2、pid
3、log文件名
4、dump.rdb文件名
修改完成后,启动三个服务,可以通过进程查看
一主二从
**默认情况下,每台Redis服务器都是主节点;**我们一般情况下只用配置从机就好了
主机
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2 #从机的配置
slave0:ip=127.0.0.1,port=6380,state=online,offset=98,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=98,lag=1
master_failover_state:no-failover
master_replid:1daa0646071327bf1d9d0315a823a26dbf23d565
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:98
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:98
从机
127.0.0.1:6381> slaveof 127.0.0.1 6379
OK
127.0.0.1:6381> 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:56
slave_repl_offset:56
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:1daa0646071327bf1d9d0315a823a26dbf23d565
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:56
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:57
repl_backlog_histlen:0
真实的主从配置应该在配置文件中配置,这样是永久的。命令的方式配置下一次启动会失效。
# replicaof <masterip> <masterport>
# If the master is password protected (using the "requirepass" configuration
# directive below) it is possible to tell the replica to authenticate before
# starting the replication synchronization process, otherwise the master will
# refuse the replica request.
#
# masterauth <master-password>
细节
1、主机可以写,从机不能写只能读!主机中的所有信息和数据,都会被从机自动保存
主机写
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set k1 v1
OK
从机读
127.0.0.1:6380> keys *
(empty array)
127.0.0.1:6380> keys *
1) "k1"
127.0.0.1:6380> set k2 v2
(error) READONLY You can't write against a read only replica. #从机不能写
测试
主机断开连接,从机依旧连接到主机的,但是没有写操作,这个时候,如果主机回来了,从机依然可以获取主机写的信息.
如果是使用命令行的方式来配置主从,这个时候如果重启了,从机就会变成主机!只要变为原来的从机就会可以获取原来的值。
复制原理
层层链路 上一个M链接下一个S
这时候可以完成我们的主从复制
如果主机宕机了,能不能自动变成主机呢?
如果主机断开连接了,我们可以手动使用 slaveof on one 让自己变成主机!其他的节点就可以手动连接到最新的这个主节点!如果这个时候原来的主机恢复了,也没有用!
127.0.0.1:6381> slaveof no one #手动变为主机
OK
127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:9a31a312396e4b67bcf625244d399fdb394d94fe
master_replid2:30aea419b13b69533e36b3e015048c31682b118a
master_repl_offset:4389
second_repl_offset:4390
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:57
repl_backlog_histlen:4333
哨兵模式
测试
我们目前的状态是一主二从
1、配置哨兵配置文件 sentinel.conf
#sentinel monitor 被监控的名称 host port 1
sentinel monitor myredis 127.0.0.1 6379 1
后面的这个数字1,代表主机挂了,salve投票看让谁来接替成为主机,票数最多的成为主机
2、启动哨兵
[root@localhost myredis]# redis-sentinel sentinel.conf
3115:X 01 Apr 2023 15:56:15.866 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
3115:X 01 Apr 2023 15:56:15.866 # Redis version=7.0.9, bits=64, commit=00000000, modified=0, pid=3115, just started
3115:X 01 Apr 2023 15:56:15.866 # Configuration loaded
3115:X 01 Apr 2023 15:56:15.867 * Increased maximum number of open files to 10032 (it was originally set to 1024).
3115:X 01 Apr 2023 15:56:15.867 * monotonic clock: POSIX clock_gettime
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 7.0.9 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in sentinel mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 26379
| `-._ `._ / _.-' | PID: 3115
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | https://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
3115:X 01 Apr 2023 15:56:15.868 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
3115:X 01 Apr 2023 15:56:15.870 * Sentinel new configuration saved on disk
3115:X 01 Apr 2023 15:56:15.870 # Sentinel ID is d668cb83f163724817fc63377579187d2e5f0cc3
3115:X 01 Apr 2023 15:56:15.870 # +monitor master myredis 127.0.0.1 6379 quorum 1
3115:X 01 Apr 2023 15:56:15.871 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ myredis 127.0.0.1 6379
3115:X 01 Apr 2023 15:56:15.872 * Sentinel new configuration saved on disk
3115:X 01 Apr 2023 15:56:15.872 * +slave slave 127.0.0.1:6381 127.0.0.1 6381
如果主节点断开了,就会在从机中投票一个服务器
如果主机此时回来了,只能归并到新的主机下,当做从机,这就是哨兵模式规则!
优点
1、哨兵集群,基于主从复制模式,所有的主从配置优点,它全有
2、主从可以切换,故障可以转移,系统的可用性就会更好
3、哨兵模式就是主从复制的升级,手动到自动,更加健壮
缺点
1、Redis不好在线扩容,集群容量一旦达到上线,在线扩容就会十分麻烦
2、实现哨兵模式的配置其实十分麻烦,里面有很多的选择
哨兵模式的全配置