Redis的主从复制

目录

主从简介

实验

配置主从

永久建立

 

主从简介

配置多台Redis服务器,以主机和备机的身份分开。主机数据更新后,根据配置和策略,自动同步到备机的master/salver机制,Master以写为主,Slave以读为主,二者之间自动同步数据。

目的:读写分离提高Redis性能;避免单点故障,容灾快速恢复。

原理:

 每次从机联通后,都会给主机发送sync指令,主机立刻进行存盘操作,发送RDB文件,从机从机收到RDB文件后,进行全盘加载。之后每次主机的写操作,都会立刻发送给从机,从机执行相同的命令

实验

根据以下的模板,定义一下三个配置文件,分别是6379.conf 6380.conf 6381.conf

[root@hadoop103 bin]# vim 6379.conf
[root@hadoop103 bin]# cp 6379.conf 6380.conf
[root@hadoop103 bin]# vim 6380.conf
[root@hadoop103 bin]# cp 6379.conf 6381.conf
[root@hadoop103 bin]# vim 6381.conf



include /usr/local/redis/bin/redis.conf 
port 6379
pidfile /var/run/redis_6379.pid
dbfilename dump_6379.rdb

查看这些配置文件是否创建成功,分别启动这些服务器:

[root@hadoop103 bin]# ll
总用量 26420
-rw-r--r--. 1 root root     109 10月 23 19:46 6379.conf
-rw-r--r--. 1 root root     109 10月 23 19:47 6380.conf
-rw-r--r--. 1 root root     109 10月 23 19:48 6381.conf
-rw-r--r--. 1 root root     191 10月 23 19:11 appendonly.aof
-rw-r--r--. 1 root root     116 10月 23 19:12 dump.rdb
-rw-r--r--. 1 root root     123 10月 23 18:36 dump.rdb_backup
-rwxr-xr-x. 1 root root 5580327 10月 22 11:30 redis-benchmark
-rwxr-xr-x. 1 root root   22217 10月 22 11:30 redis-check-aof
-rwxr-xr-x. 1 root root 7829866 10月 22 11:30 redis-check-rdb
-rwxr-xr-x. 1 root root 5709195 10月 22 11:30 redis-cli
-rw-r--r--. 1 root root   46688 10月 23 18:58 redis.conf
lrwxrwxrwx. 1 root root      12 10月 22 11:30 redis-sentinel -> redis-server
-rwxr-xr-x. 1 root root 7829866 10月 22 11:30 redis-server
[root@hadoop103 bin]# ./redis-server ./6379.conf
[root@hadoop103 bin]# ./redis-server ./6380.conf
[root@hadoop103 bin]# ./redis-server ./6381.conf

然后开启三个窗口,来分别连接这三个服务器并查看该服务器下是否主服务器还是从服务器:

[root@hadoop103 bin]# ./redis-cli -p 6379
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6379> 



[root@hadoop103 bin]# ./redis-cli -p 6380
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6380> 


[root@hadoop103 bin]# ./redis-cli -p 6381
127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6381> 

配置主从

有两种配置方式,第一种方式是临时配置,第二种是永久配置:

原则配从不配主

临时配置:分别在6380 和 6381 这两台机器上执行如下的操作:

127.0.0.1:6380> slaveof 127.0.0.1 6379

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_repl_offset:165
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

查看master的info信息,在master中添加数据,后在slaver中读取数据,并尝试在salve中添加数据的结果如下:

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6381,state=online,offset=949,lag=0
slave1:ip=127.0.0.1,port=6380,state=online,offset=949,lag=0
master_repl_offset:963
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:962
127.0.0.1:6379> 


127.0.0.1:6379> set s1 v1
OK

127.0.0.1:6380> get s1
"v1"


127.0.0.1:6381> set s2 v2
(error) READONLY You can't write against a read only slave.

如果主机宕机,那么从机会一直等待主机:

127.0.0.1:6379> shutdown
not connected> 
[root@hadoop103 bin]# 



127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:1397
master_link_down_since_seconds:14
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

如果一个从机不想再做从机,可以执行一下命令:

127.0.0.1:6381> slaveof no one
OK
127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:1159
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

如果从机宕机之后,这个从机会变成主机,且这个主机可以读取从之前的主机获取的数据,但是不能获取之前的主机新增的数据,证明如下:

127.0.0.1:6380> shutdown
not connected> 
[root@hadoop103 bin]# ./redis-server ./6380.conf 
[root@hadoop103 bin]# ./redis-cli -p 6380
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6380> 


127.0.0.1:6379> set k2 v2
OK

127.0.0.1:6380> keys *
1) "s1"
127.0.0.1:6380> get k2
(nil)

从机实际上读取的是rdb文件

永久建立

在从机的配置文件中,编写slaveof属性配置!

在从机6380和6381的配置文件中:

[root@hadoop103 bin]# vim 6380.conf
[root@hadoop103 bin]# vim 6381.conf

slaveof 127.0.0.1 6379

然后分别启动对应的服务器,打开对应的客户端,对master执行添加操作,再在slave上测试获取数据,然后关闭从服务器,在重新开启,尝试获取并info replication:

 127.0.0.1:6379> set s3 v3
OK
127.0.0.1:6379> keys *
1) "s1"
2) "k2"
3) "s3"


127.0.0.1:6380> shutdown
not connected> 
[root@hadoop103 bin]# ./redis-server ./6380.conf 
[root@hadoop103 bin]# ./redis-cli -p 6380
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:1
master_sync_in_progress:0
slave_repl_offset:473
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6380> get s3
"v3"
127.0.0.1:6380> keys *
1) "s3"
2) "k2"
3) "s1"

可以发现,从机宕机之后,还是从机,并且依然能够获取主机新增的数据。

现在测试一台主机只有一台从机的情况,将6380 设置为6379的从机,将6381设置为6381的从机。直接对6381临时设置。

127.0.0.1:6381> slaveof 127.0.0.1 6380
OK
127.0.0.1:6381> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6380
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:29
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

那么此时,6380已经有从机,是否可以写入呢?

127.0.0.1:6380> set s4 v4
(error) READONLY You can't write against a read only slave.

从机宕机后,重启,宕机期间主机的新增记录,丛机是否会顺利复制?答:顺利复制

其中一台从机down后重启,能否重认旧主? 答:不一定,看配置文件中是否配置了slaveof # slaveof 127.0.0.1 6379

如果两台从机都从主机同步数据,此时主机的IO压力会增大,如何解决? 答:按照主---从(主)---从模式配置![薪火相传]

主机shutdown后,从机是上位还是原地待命?答:原地待命

从机是从头开始复制主机的信息,还是只复制切入以后的信息?答:从头开始复制,即完全复制。实际上是读取主机的rdb

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值