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

测试环境:

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

1. 正常读写:

In [32]: r1.set('key', 'value')
Out[32]: True In [34]: r2.get('key')
Out[34]: 'value'

2. 主备正常连接下, 默认slave(不配置slave-read-only on)

向slave写入后发现报错

In [35]: r2.set('key2', 'value')
ReadOnlyError: You can't write against a read only slave

3. Master闪断:

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,

4. Crash掉主节点,slave默认(不配置slave-read-only on 情况)

即使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

5. 重启master, 如果将slave升级为master, 此时master与slave已经隔离, 都作为主节点存在(注意此时的主节点是没有数据的)

In [41]: r1.get('key')

In [42]:

6. 拷贝R2的dump数据到R1后重启:

In [43]: r1.get('key')
Out[43]: 'value'

7. 从新将R2设置为R1的slave(slave默认配置):

向slave写入:

In [45]: r2.set('key2', 'value')
ReadOnlyError: You can't write against a read only slave.

8. 如果将slave-read-only 属性写到配置文件中:

可以向slave写入数据,但是不会同步到master

In [50]: r2.set('key2', 'value')
Out[50]: True

9. Crash掉R1,往R2写数据(关掉slave-read-only):

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的数据同时被删除

总结(部分测试未写出来):

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

[原]Redis主从复制各种环境下测试的更多相关文章

  1. Redis在windows环境下ThinkPHP的安装和使用

    1.Redis概述: 2.Redis在windows环境下的安装: 下载地址:https://github.com/dmajkic/redis/downloads,选取其中一个zip压缩包:

  2. Shiro权限管理框架(二):Shiro结合Redis实现分布式环境下的Session共享

    首发地址:https://www.guitu18.com/post/2019/07/28/44.html 本篇是Shiro系列第二篇,使用Shiro基于Redis实现分布式环境下的Session共享. ...

  3. linux环境下测试环境搭建

    一.linux环境下测试环境搭建过程简述: 1.前端后台代码未分离情况下: 主要步骤为:安装jdk,安装mysql,安装tomcat,将项目代码部署到tomcat/webapps/下. 2.前端后台代 ...

  4. [原]我在Windows环境下的首个Libevent测试实例

    libevent对Windows环境也有很好的支持,不过初次学习和编译libevent简单实例,总是有一些陌生感的,只有成功编译并测试了一个实例,才会有恍然大悟的感觉.下面将要讲到的一个实例是我从网上 ...

  5. Redis在.net 环境下的使用

    Redis概念 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,和Memcached类似,它支持存储的value类型相对更多,包括st ...

  6. Redis在Windows环境下搭建

    1.  下载Redis-Windows版本 Redis官网下载页面: http://redis.io/download Windows下Redis项目: https://github.com/MSOp ...

  7. 基础--Redis在Linux环境下的安装

    1. 安装redis服务 1.1 检查安装依赖程序 yum install gcc-c++yum install -y tclyum install wget 1.1.1 下载redis安装包 (或者 ...

  8. 【swoole】如何在docker+swoole环境下测试udp服务

    前面几篇文章讲了使用 docker+swoole 环境来测试tcp服务以及如何测试,但是当我开始学习udp服务那块的时候,发现使用原来的方式在 docker+swoole 环境下行不通啦,后来发现如果 ...

  9. Redis学习——Windows环境下Redis的安装(二)

    一.说明 之前介绍了Linux环境下Redis的安装,这次介绍一下Windows环境下Redis的安装,首先要讲的是,Redis官方只支持Linux,还好 Microsoft Open Tech gr ...

随机推荐

  1. 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑

    阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...

  2. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  3. 阿里巴巴直播内容风险防控中的AI力量

    直播作为近来新兴的互动形态和今年阿里巴巴双十一的一大亮点,其内容风险监控是一个全新的课题,技术的挑战非常大,管控难点主要包括业界缺乏成熟方案和标准.主播行为.直播内容不可控.峰值期间数千路高并发处理. ...

  4. css元素水平居中和垂直居中的方式

    关于居中的问题,一直处于疑惑不解的状态,知道的几种方法好像也不是每一次都会起到作用,所以更加迷惑.主要是不清楚该 在什么情况下采用哪种解决方法,所以,整理了一些方法,梳理一下思路,做一个总结. 1. ...

  5. 深入学习jQuery自定义插件

    原文地址:jQuery自定义插件学习 1.定义插件的方法 对象级别的插件扩展,即为jQuery类的实例增加方法, 调用:$(选择器).函数名(参数);      $(‘#id’).myPlugin(o ...

  6. [原创]java使用JDBC向MySQL数据库批次插入10W条数据测试效率

    使用JDBC连接MySQL数据库进行数据插入的时候,特别是大批量数据连续插入(100000),如何提高效率呢?在JDBC编程接口中Statement 有两个方法特别值得注意:通过使用addBatch( ...

  7. celery使用的一些小坑和技巧(非从无到有的过程)

    纯粹是记录一下自己在刚开始使用的时候遇到的一些坑,以及自己是怎样通过配合redis来解决问题的.文章分为三个部分,一是怎样跑起来,并且怎样监控相关的队列和任务:二是遇到的几个坑:三是给一些自己配合re ...

  8. Node.js使用PM2的集群将变得更加容易

    介绍 众所周知,Node.js运行在Chrome的JavaScript运行时平台上,我们把该平台优雅地称之为V8引擎.不论是V8引擎,还是之后的Node.js,都是以单线程的方式运行的,因此,在多核心 ...

  9. SAP CRM 用户界面对象类型和设计对象

    在CRM中的用户界面对象类型的帮助下,我们可以做这些工作: 进行不同的视图配置 创建动态导航 从设计层控制字段标签.值帮助 控制BOL对象的属性的可视性 从导航栏访问自定义组件 一个用户界面对象类型之 ...

  10. 易用BPM时代,企业如何轻松驾驭H3?

    众所周知,BPM作为企业发展的推动力,能敏捷高效的融合业务流程和信息资源.通过综合考虑流程的成本.效率.质量等方面因素,用IT系统将调整后的流程固化下来,从而降低企业管理成本,提高内部运营效率,提升企 ...