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

  1. R1: 127.0.0.1 6378
  2. R2: 127.0.0.1 6379

0. 初始情况下各节点info情况(部分有用信息):

  1. MASTER ->
  2. 'connected_slaves': 1, #可判断slave存活状况
  3. SLAVE ->
  4. 'master_host': '127.0.0.1',
  5. 'master_last_io_seconds_ago': 5,
  6. 'master_link_status': 'up', #可判断master与slave存活状况
  7. 'master_port': 6378

1. 正常读写:

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

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

向slave写入后发现报错

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

3. Master闪断:

Crash掉主节点:

  1. 'master_host': '127.0.0.1',
  2. 'master_last_io_seconds_ago': -1,
  3. 'master_link_down_since_seconds': 4,
  4. 'master_link_status': 'down',
  5. 'master_port': 6378

重启主节点后,slave自动从从新建立连接

  1. 'master_host': '127.0.0.1',
  2. 'master_last_io_seconds_ago': 9,
  3. 'master_link_status': 'up',
  4. 'master_port': 6378,

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

即使master挂掉,slave写入依然报错

  1. SLAVE ->
  2. 'master_host': '127.0.0.1',
  3. 'master_last_io_seconds_ago': -1,
  4. 'master_link_down_since_seconds': 6,
  5. 'master_link_status': 'down',
  6. 'master_port': 6378
  7. In [37]: r2.set('key', 'value')
  8. ReadOnlyError: You can't write against a read only slave.

设置slave为readonly,发现报错

  1. zb@ubuntu:~/codes/test$ redis-cli -h 127.0.0.1 -p 6379 set slave-read-only no
  2. (error) READONLY You can't write against a read only slave.

需要关闭slave的slave特性, 将其升级为主节点

  1. zb@ubuntu:~/codes/test$ redis-cli -h 127.0.0.1 -p 6379 slaveof NO ONE
  2. OK
  3. zb@ubuntu:~/codes/test$ redis-cli -h 127.0.0.1 -p 6379 set slave-read-only no
  4. OK

升级为主节点后,继续向slave写入:

  1. In [38]: r2.set('key', 'value')
  2. Out[38]: True

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

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

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

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

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

向slave写入:

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

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

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

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

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

  1. SLAVE ->
  2. 'master_link_status': 'down'
  3. In [75]: r2.set('key2', 'value')
  4. Out[75]: True

重启Master(此时的master无数据):

  1. In [85]: r2.get('key2')
  2. 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. TODO:macOS编译PHP7.1

    TODO:macOS编译PHP7.1 本文主要介绍在macOS上编译PHP7.1,有兴趣的朋友可以去尝试一下. 1.下载PHP7.1源码,建议到PHP官网下载纯净到源码包php-7.1.0.tar.g ...

  2. 一次修改闭源 Entity Provider 程序集以兼容新 EntityFramework 的过程

    读完本文你会知道,如何在没有源码的情况下,直接修改一个 DLL 以去除 DLL 上的强命名限制,并在该程序集上直接添加你的“友元程序集(一种特殊的 Attribute,将它应用在程序集上,使得程序集内 ...

  3. bootstrap-datetimepicker 进一步跟进~~~开始时间和结束时间的样式显示

    上次简单介绍了一下:05.LoT.UI 前后台通用框架分解系列之——漂亮的时间选择器(http://www.cnblogs.com/dunitian/p/5524019.html) 这次深入再介绍一下 ...

  4. JAVA问题集锦Ⅰ

    1.Java的日期添加: import java.util.Date ; date=new date();//取时间 Calendar calendar = new GregorianCalendar ...

  5. javascript运动系列第一篇——匀速运动

    × 目录 [1]简单运动 [2]定时器管理 [3]分享到效果[4]移入移出[5]运动函数[6]透明度[7]多值[8]多物体[9]回调[10]函数完善[11]最终函数 前面的话 除了拖拽以外,运动也是j ...

  6. [LintCode]——目录

    Yet Another Source Code for LintCode Current Status : 232AC / 289ALL in Language C++, Up to date (20 ...

  7. 纸箱堆叠 bzoj 2253

    纸箱堆叠 (1s 128MB) box [问题描述] P 工厂是一个生产纸箱的工厂.纸箱生产线在人工输入三个参数 n, p, a 之后,即可自动化生产三边边长为 (a mod P, a^2 mod p ...

  8. 餐饮连锁公司IT信息化解决方案一

             从餐饮企业的信息化需求来说,没有哪一种解决方案能满足所有餐饮企业的信息化建设需要.不同的餐饮业态有不同的业务流程,不同业态的信息化解决方案是目前餐饮企业信息化建设急需的,这种一站式整 ...

  9. iOS之应用版本号的设置规则

    版本号的格式:v<主版本号>.<副版本号>.<发布号>  版本号的初始值:v1.0.0 管理规则: 主版本号(Major version) 1.  产品的主体构件进 ...

  10. 笔记:Memory Notification: Library Cache Object loaded into SGA

    笔记:Memory Notification: Library Cache Object loaded into SGA在警告日志中发现一些这样的警告信息:Mon Nov 21 14:24:22 20 ...