Redis6
十一)Redis的主从复制
11.1)简介
主机数据更新后根据配置和策略, 自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主
11.2)用途
-
读写分离,性能扩展:主机用来写,从机用来读;
-
容灾快速恢复:有一个从机挂了,迅速切换到下一台从机继续提供服务
11.3)模拟主从复制步骤
首先将配置文件redis.conf中的appendonly设置为 no
appendonly no
11.3.1)创建myredis文件夹
[root@VM-20-6-centos ~]# mkdir myredis
11.3.2)复制redis.conf配置文件到myredis文件夹
[root@VM-20-6-centos myredis]# cp /root/redis/redis-6.2.6/redis.conf /root/myredis/redis.conf
11.3.3)在myredis文件夹中创建三个配置文件
创建 redis11079.conf
include /root/myredis/redis.conf
pidfile /var/run/redis_11079.pid
port 11079
dbfilename dump11079.rdb
同上创建 redis11080.conf 和 redis11081.conf
11.3.4)启动上述配置文件对应的服务
[root@VM-20-6-centos myredis]# redis-server redis11079.conf
[root@VM-20-6-centos myredis]# redis-server redis11080.conf
[root@VM-20-6-centos myredis]# redis-server redis11081.conf
[root@VM-20-6-centos myredis]# ps -ef | grep redis-server
root 14603 1 0 21:55 ? 00:00:00 redis-server *:11080
root 24915 1 0 21:58 ? 00:00:00 redis-server *:11079
root 24923 1 0 21:58 ? 00:00:00 redis-server *:11081
11.3.5)查看服务的运行状况
# 主机查看连接信息
127.0.0.1:11079> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:c9cdcd2a4ad944ae472ebb33119a7d3263cddf6c
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设置从机信息 11080
127.0.0.1:11080> slaveof 127.0.0.1 11079
OK
# 从机2设置从机信息 11081
127.0.0.1:11081> slaveof 127.0.0.1 11079
OK
# 主机再次查看连接信息
127.0.0.1:11079> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=11081,state=online,offset=28,lag=0
slave1:ip=127.0.0.1,port=11080,state=online,offset=28,lag=1
master_failover_state:no-failover
master_replid:15e8d1cdfdecaff829768c661826871d4f3bbbb7
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:28
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:28
11.3.6)测试
# 主机添加信息
127.0.0.1:11079> keys *
(empty array)
127.0.0.1:11079> set a1 v1
OK
127.0.0.1:11079> keys *
1) "a1"
# 从机1查看信息 11080
127.0.0.1:11080> keys *
1) "a1"
# 从机2查看信息 11081
127.0.0.1:11081> keys *
1) "a1"
#从机1添加信息报错
127.0.0.1:11080> set a2 v2
(error) READONLY You can't write against a read only replica.
11.4)常用3种模式
11.4.1)一主二仆
正如上面所演示的那样,当其中一台从机挂了,停止从机2,演示如下:
127.0.0.1:11081> shutdown
not connected> exit
继续在主机添加信息:
127.0.0.1:11079> set a2 v2
OK
127.0.0.1:11079> set a3 v3
OK
127.0.0.1:11079> keys *
1) "a3"
2) "a1"
3) "a2"
在从机1 -- 11080上也可以看到
127.0.0.1:11080> keys *
1) "a3"
2) "a2"
3) "a1"
再次启动从机2--11081
[root@VM-20-6-centos myredis]# redis-server redis11081.conf
[root@VM-20-6-centos myredis]# redis-cli -p 11081
127.0.0.1:11081> info replication
# Replication
role:master
发现重启的从机2已经不再是从机了,而是和主机11079毫无关系的另一台主机
再次设置11081为从机
127.0.0.1:11081> slaveof 127.0.0.1 11079
OK
127.0.0.1:11081> info replication
# Replication
role:slave
127.0.0.1:11081> keys *
1) "a1"
2) "a3"
3) "a2"
发现上述重新设置为从机后,之前服务停止时加入到主机11079中的数据,也已经复制到了从机11081上,会将主机上的所有数据都复制到从机
当主机服务挂了,停止主机,演示如下:
127.0.0.1:11079> shutdown not connected> exit
从机查看服务信息:
127.0.0.1:11080> info replication # Replication role:slave master_host:127.0.0.1 master_port:11079 master_link_status:down
从机仍然是从机,并且已经知道主机的状态是 down了
再次重新启动主机
[root@VM-20-6-centos myredis]# redis-server redis11079.conf
[root@VM-20-6-centos myredis]# redis-cli -p 11079
127.0.0.1:11079> info replication
# Replication
role:master
主机重启后仍然是主机,不会升级为主机
11.4.1.1)总结
-
当从机服务挂了后,重新启动后会成为和之前主机毫无关系的另一台主机,需要手动重新设置为从机;
-
当重新设置为从机后,会将主机当前的数据从头开始全部复制到该从机上;
-
主机服务挂了后,从机仍然是从机,并且会知道主机的状态挂了,当主机服务正常后,仍然是主机,从机并不会升级为主机
11.4.1.2)主从复制原理
-
从机启动成功连接到主机后会发送一个要进行数据同步的命令;
-
主机接到从机发送的同步命令,将主机的数据进行持久化保存到RDB文件,将RDB文件发送给从机,从机回去到RDB文件进行数据读取
全量复制:从机在接收到数据库文件数据后,将其存盘并加载到内存中;
增量复制:主机继续将新的所有收集到的修改命令依次传给从机完成同步,但是只要是重新连接主机,一次完全同步(全量复制)将被自动执行。
11.4.2)薪火相传
上一个从机(Slave)可以是下一个从机的主机(Master),从机同样可以接收其他从机的连接和同步请求,那么该从机作为了链条中下一个的主机(Master), 可以有效减轻主机(Master)的写压力,去中心化降低风险。
命令: slaveof <ip><port>
演示:停止从机2,重启后将其设置为从机1的从机
127.0.0.1:11081> shutdown
not connected> exit
[root@VM-20-6-centos myredis]# redis-server redis11081.conf
[root@VM-20-6-centos myredis]# redis-cli -p 11081
127.0.0.1:11081> slaveof 127.0.0.1 11080
OK
查看从机1的服务信息
127.0.0.1:11080> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:11079
master_link_status:up
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_read_repl_offset:1624
slave_repl_offset:1624
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:1
slave0:ip=127.0.0.1,port=11081,state=online,offset=1624,lag=1
master_failover_state:no-failover
master_replid:71cfb51805684217dcc56803ed19797b85b701e5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1624
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1624
主机服务挂了后,从机仍然是从机,并且会知道主机的状态挂了,当主机服务正常后,仍然是主机,从机并不会升级为主机
中途变更转向:会清除之前的数据,重新建立拷贝最新的
风险:一旦某个从机(Slave)宕机,后面的从机(Slave)都没法备份;
主机挂了,从机仍然是从机,无法写数据了
11.4.3)反客为主
当一个主机(master)宕机后,后面的从机(slave)可以立刻升为主机(master),其后面的从机(slave)不用做任何修改;用 slaveof no one 将从机变为主机。
停止主机服务:
127.0.0.1:11079> shutdown
not connected> exit
将从机1变为主机主机服务:
127.0.0.1:11080> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:11079
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_read_repl_offset:2156
slave_repl_offset:2156
master_link_down_since_seconds:9
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:1
slave0:ip=127.0.0.1,port=11081,state=online,offset=2156,lag=1
master_failover_state:no-failover
master_replid:71cfb51805684217dcc56803ed19797b85b701e5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2156
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2156
127.0.0.1:11080> slaveof no one
OK
# 从机变为主机
127.0.0.1:11080> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=11081,state=online,offset=2156,lag=1
master_failover_state:no-failover
master_replid:aa8983018fe311b09163d1b5af6fe70c6d9fa207
master_replid2:71cfb51805684217dcc56803ed19797b85b701e5
master_repl_offset:2170
second_repl_offset:2157
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2170
上述修改仍然需要手动进行修改