Redis 主从复制各种环境下测试

本文详细记录了在Linux环境下使用Redis进行主从配置的测试过程,包括正常读写、主备连接、主节点崩溃后的影响及修复、复制dump数据到新主节点、配置slave读写限制等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

测试环境:
Linux ubuntu 3.11.0-12-generic
2GB Mem
1 core of Intel(R) Core(TM) i5-3470 CPU @ 3.20GHz
Redis 2.6.13
以下 R1 表示master, R2表示slave
配置采用运维组标准配置,默认主从配置一样,在从节点启动后设置为slave

R1: 127.0.0.1 6378
R2: 127.0.0.1 6379
0. 初始情况下各节点info情况(部分有用信息):
MASTER ->
'connected_slaves': 1, #可判断slave存活状况
SLAVE ->
'master_host': '127.0.0.1',
'master_last_io_seconds_ago': 5,
'master_link_status': 'up', #可判断master与slave存活状况
'master_port': 6378
[b]1. 正常读写:[/b]
In [32]: r1.set('key', 'value')
Out[32]: True

In [34]: r2.get('key')
Out[34]: 'value'
[b]2. 主备正常连接下, 默认slave(不配置slave-read-only on)[/b]
向slave写入后发现报错

In [35]: r2.set('key2', 'value')
ReadOnlyError: You can't write against a read only slave
[b]3. Master闪断:[/b]
Crash掉主节点:

'master_host': '127.0.0.1',
'master_last_io_seconds_ago': -1,
'master_link_down_since_seconds': 4,
'master_link_status': 'down',
'master_port': 6378
重启主节点后,slave自动从从新建立连接

'master_host': '127.0.0.1',
'master_last_io_seconds_ago': 9,
'master_link_status': 'up',
'master_port': 6378,
[b]4. Crash掉主节点,slave默认(不配置slave-read-only on 情况)[/b]
即使master挂掉,slave写入依然报错

SLAVE ->
'master_host': '127.0.0.1',
'master_last_io_seconds_ago': -1,
'master_link_down_since_seconds': 6,
'master_link_status': 'down',
'master_port': 6378

In [37]: r2.set('key', 'value')
ReadOnlyError: You can't write against a read only slave.
设置slave为readonly,发现报错

zb@ubuntu:~/codes/test$ redis-cli -h 127.0.0.1 -p 6379 set slave-read-only no
(error) READONLY You can't write against a read only slave.
需要关闭slave的slave特性, 将其升级为主节点

zb@ubuntu:~/codes/test$ redis-cli -h 127.0.0.1 -p 6379 slaveof NO ONE
OK
zb@ubuntu:~/codes/test$ redis-cli -h 127.0.0.1 -p 6379 set slave-read-only no
OK
升级为主节点后,继续向slave写入:

In [38]: r2.set('key', 'value')
Out[38]: True
[b]5. 重启master, 如果将slave升级为master, 此时master与slave已经隔离, 都作为主节点存在(注意此时的主节点是没有数据的)[/b]
In [41]: r1.get('key')

In [42]:
[b]6. 拷贝R2的dump数据到R1后重启:[/b]
In [43]: r1.get('key')
Out[43]: 'value'
[b]7. 从新将R2设置为R1的slave(slave默认配置):[/b]
向slave写入:

In [45]: r2.set('key2', 'value')
ReadOnlyError: You can't write against a read only slave.
[b]8. 如果将slave-read-only 属性写到配置文件中:[/b]
可以向slave写入数据,但是不会同步到master

In [50]: r2.set('key2', 'value')
Out[50]: True
[b]9. Crash掉R1,往R2写数据(关掉slave-read-only):[/b]
SLAVE ->
'master_link_status': 'down'

In [75]: r2.set('key2', 'value')
Out[75]: True
重启Master(此时的master无数据):

In [85]: r2.get('key2')

In [86]: r2.get('key3')
可以看到,重启了Master后,slave同步了master状态,由于master没有数据,slave的数据同时被删除

[b]总结(部分测试未写出来):[/b]

slave 配置为slave-read-only on需要升级为主节点或者写入配置文件中, 而不能在默认slave情况下直接设置
master与slave断开后会检测心跳, 从新建立连接.
可以直接copy DUMP文件从新重启master
在Master为空以后,slave同步数据会抹掉全部数据.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值