Redis(14) -- Redis的主从复制

Redis6

十一)Redis的主从复制

11.1)简介

主机数据更新后根据配置和策略, 自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主

11.2)用途

  1. 读写分离,性能扩展:主机用来写,从机用来读;

  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)总结

  1. 当从机服务挂了后,重新启动后会成为和之前主机毫无关系的另一台主机,需要手动重新设置为从机;

  2. 当重新设置为从机后,会将主机当前的数据从头开始全部复制到该从机上;

  3. 主机服务挂了后,从机仍然是从机,并且会知道主机的状态挂了,当主机服务正常后,仍然是主机,从机并不会升级为主机

11.4.1.2)主从复制原理

  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

上述修改仍然需要手动进行修改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值