1同步原理

摘自:http://www.cnblogs.com/stephen-liu74/archive/2012/03/30/2364717.html

“下面的列表清楚的解释了Redis Replication的特点和优势。

1). 同一个Master可以同步多个Slaves。

2). Slave同样可以接受其它Slaves的连接和同步请求,这样可以有效的分载Master的同步压力。因此我们可以将Redis的Replication架构视为图结构。

3). Master Server是以非阻塞的方式为Slaves提供服务。所以在Master-Slave同步期间,客户端仍然可以提交查询或修改请求。

4). Slave Server同样是以非阻塞的方式完成数据同步。在同步期间,如果有客户端提交查询请求,Redis则返回同步之前的数据。

5). 为了分载Master的读操作压力,Slave服务器可以为客户端提供只读操作的服务,写服务仍然必须由Master来完成。即便如此,系统的伸缩性还是得到了很大的提高。

6). Master可以将数据保存操作交给Slaves完成,从而避免了在Master中要有独立的进程来完成此操作。

在Slave启动并连接到Master之后,它将主动发送一个SYNC命令。此后Master将启动后台存盘进程,同时收集所有接收到的用于修改数据集的命令,在后台进程执行完毕后,Master将传送整个数据库文件到Slave,以完成一次完全同步。而Slave服务器在接收到数据库文件数据之后将其存盘并加载到内存中。此后,Master继续将所有已经收集到的修改命令,和新的修改命令依次传送给Slaves,Slave将在本次执行这些数据修改命令,从而达到最终的数据同步。

如果Master和Slave之间的链接出现断连现象,Slave可以自动重连Master,但是在连接成功之后,一次完全同步将被自动执行。”

2主从配置

Redis的主从Replication配置非常简单,只需将原配置文件新拷贝一份后,做少量修改。

cpredis.conf redis-2.conf

viredis-2.conf

默认端口号为6379,修改端口号为6381。

假设Master为本机端口6380上的服务,加入配置:

slaveof 127.0.0.1 6380

这样新建立的6381端口上的服务就作为6380的slave了。

3测试验证

可以在redis-cli中执行info replication来查看Replication信息。下面来测试一下:

在6380上set的键值对会同步到6381上。

但是在6381上执行set命令时会报错,因为slave默认是只读的。

4 RedisHA

4.1手动切换

下面手动实现一下当Master挂机时,从Slave中选举出一个Redis服务切换成Master。

首先再配置一个6382服务,同样将6380作为Master。

杀掉6380服务的进程后,只剩6381和6382两个Slave了。在6381客户端上执行slaveof no one,在6382客户端上执行slaveof 127.0.0.1 6381。这样新的主从关系就建立了。

如果原master恢复服务了,可以在原master上执行slaveof 127.0.0.1 6381,这样原master就变成现在master的slave了。

4.2自动切换

Redis 2.4+自带了一个HA实现Sentinel。下面是简单介绍:

“Redis-sentinel是Redis的作者antirez在今年6月份完成的,因为Redis实例在各个大公司的应用,每个公司都需要一个Redis集群的管理工具,被迫都自己写管理工具来管理Redis集群,antirez考虑到社区的急迫需要(详情),花了几个星期写出了Redis-sentinel。”

首先启动三个Sentinel实例都去监听Master的状态。

sentinel.conf配置文件为:

port 26379

sentinel monitormymaster 127.0.0.1 6380 2

sentinel down-after-milliseconds mymaster 30000

sentinel can-failover mymaster yes

sentinel parallel-syncs mymaster 1

sentinel failover-timeout mymaster 900000

另两个sentinel.conf配置除了port为26479和26579外,其他四项配置完全相同。

选举算法如下:

“每个sentinel实例都持有其他的sentinels信息,在Leader选举过程中(当为leader的sentinel实例失效时,有可能master server并没失效,注意分开理解),sentinel实例将从所有的sentinels集合中去除“can-failover = no”和状态为SDOWN的sentinels,在剩余的sentinels列表中按照runid按照“字典”顺序排序后,取出runid最小的sentinel实例,并将它“投票选举”为Leader,并在其他sentinel发送的“is-master-down-by-addr”指令时将推选的runid追加到响应中。每个sentinel实例都会检测“is-master-down-by-addr”的响应结果,如果“投票选举”的leader为自己,且状态正常的sentinels实例中,“赞同者”的自己的sentinel个数不小于(>=)
50% + 1,且不小与<quorum>,那么此sentinel就会认为选举成功且leader为自己。

在sentinel.conf文件中,我们期望有足够多的sentinel实例配置“can-failoveryes”,这样能够确保当leader失效时,能够选举某个sentinel为leader,以便进行failover。如果leader无法产生,比如较少的sentinels实例有效,那么failover过程将无法继续。

在Leader触发failover之前,首先wait数秒(随即0~5),以便让其他sentinel实例准备和调整(有可能多个leader??),如果一切正常,那么leader就需要开始将一个salve提升为master,此slave必须为状态良好(不能处于SDOWN/ODOWN状态)且权重值最低(redis.conf中)的,当master身份被确认后,开始failover”

可以看到三个Sentinel都监听到Master和Slave,并且三者之间也建立了通信。

现在手动杀掉6380进程,可以看到三个Sentinel实例都监测到了Master挂掉,并通过投票选举出新的Master。

第一个Sentinel的详细输出如下:

[19247] 11 Sep 21:29:37.321 * +sentinelsentinel 127.0.0.1:26479 127.0.0.1 26479 @ mymaster 127.0.0.1 6380

[19247] 11 Sep 21:29:56.603 * +sentinelsentinel 127.0.0.1:26579 127.0.0.1 26579 @ mymaster 127.0.0.1 6380

[19247] 11 Sep 21:31:50.737 # +sdown mastermymaster 127.0.0.1 6380

[19247] 11 Sep 21:31:50.938 # +odown mastermymaster 127.0.0.1 6380 #quorum 3/2

[19247] 11 Sep 21:31:51.041 #+failover-triggered master mymaster 127.0.0.1 6380

[19247] 11 Sep 21:31:51.041 # +failover-state-wait-startmaster mymaster 127.0.0.1 6380 #starting in 7113 milliseconds

[19247] 11 Sep 21:31:58.200 #+failover-state-select-slave master mymaster 127.0.0.1 6380

[19247] 11 Sep 21:31:58.301 #+selected-slave slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380

[19247] 11 Sep 21:31:58.301 *+failover-state-send-slaveof-noone slave 127.0.0.1:6382 127.0.0.1 6382 @mymaster 127.0.0.1 6380

[19247] 11 Sep 21:31:58.403 *+failover-state-wait-promotion slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster127.0.0.1 6380

[19247] 11 Sep 21:31:59.011 #+promoted-slave slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380

[19247] 11 Sep 21:31:59.011 #+failover-state-reconf-slaves master mymaster 127.0.0.1 6380

[19247] 11 Sep 21:31:59.111 * +slave-reconf-sentslave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380

[19247] 11 Sep 21:32:00.019 *+slave-reconf-inprog slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.16380

[19247] 11 Sep 21:32:00.019 *+slave-reconf-done slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.16380

[19247] 11 Sep 21:32:00.117 # +failover-endmaster mymaster 127.0.0.1 6380

[19247] 11 Sep 21:32:00.117 #+switch-master mymaster 127.0.0.1 6380 127.0.0.1 6382

[19247] 11 Sep 21:32:00.219 * +slave slave127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6382

[19247] 11 Sep 21:32:00.828 * +sentinelsentinel 127.0.0.1:26579 127.0.0.1 26579 @ mymaster 127.0.0.1 6382

[19247] 11 Sep 21:32:01.029 * +sentinelsentinel 127.0.0.1:26479 127.0.0.1 26479 @ mymaster 127.0.0.1 6382

现在操作新Master 6382保存键值对,就可以同步到6381了。

参考资料

1 Sentinel官方网址

http://redis.io/topics/sentinel

2 Redis核心解读–集群管理工具(Redis-sentinel)

http://www.wzxue.com/redis%E6%A0%B8%E5%BF%83%E8%A7%A3%E8%AF%BB-%E9%9B%86%E7%BE%A4%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7redis-sentinel/

3 Redis Sentinel:集群Failover解决方案

http://shift-alt-ctrl.iteye.com/blog/1884370

Redis主从和HA配置的更多相关文章

  1. redis主从 以及认证配置

    以前用redis用的很多,各种数据类型用的飞起,算是用得很溜了.不过那都是封装好的方法,自己直接调用.以前的公司比较规范,开发只是开发,很少去做跟运维相关的事情. 换了一份工作,不过这边项目刚开始起步 ...

  2. Redis主从 部署和配置

    目录 一.主从简介 主从介绍 主从原理 二.主从部署 环境介绍 主从配置 临时主从 三.主从测试 一.主从简介 主从介绍 Redis都是主节点.每个从节点只能有一个主节点,而主节点可以同时具有多个从节 ...

  3. Redis 主从 Replication 的配置,主从复制原理

    概述 Redis的replication机制允许slave从master那里通过网络传输拷贝到完整的数据备份.具有以下特点: 异步复制.从2.8版本开始,slave能不时地从master那里获取到数据 ...

  4. redis主从+哨兵 安装配置二

    实验环境: 192.168.2.201 centos7 master sentinel 192.168.2.202 centos7 slave   sentinel 192.168.2.203 cen ...

  5. redis主从+哨兵 安装配置一

    一.目的 实现redis的高可用. 二.同步过程 注意:当Master在后台把数据保存到快照文件完成之后,Master会把这个快照文件传送给Slave,而Slave则把内存清空后,加载该文件到内存中: ...

  6. nopCommerce 3.9 大波浪系列 之 使用Redis主从高可用缓存

    一.概述 nop支持Redis作为缓存,Redis出众的性能在企业中得到了广泛的应用.Redis支持主从复制,HA,集群. 一般来说,只有一台Redis是不可行的,原因如下: 单台Redis服务器会发 ...

  7. Redis主从高可用缓存

    nopCommerce 3.9 大波浪系列 之 使用Redis主从高可用缓存   一.概述 nop支持Redis作为缓存,Redis出众的性能在企业中得到了广泛的应用.Redis支持主从复制,HA,集 ...

  8. Redis哨兵 部署和配置

    目录 一.哨兵简介 哨兵介绍 哨兵原理 二.哨兵部署 环境介绍 哨兵配置 三.使用验证 一.哨兵简介 哨兵介绍 Sentinel(哨兵)是用于监控redis集群中Master状态的工具,其已经被集成在 ...

  9. Redis主从配置及HA方案

    首先说下主从同步Replication的原理 在Slave启动并连接到Master之后,它将主动发送一条SYNC命令.此后Master将启动后台存盘进程,同时收集所有接收到的用于修改数据集的命令,在后 ...

随机推荐

  1. Server-U FTP与AD完美集成方案详解

    最近咱有个任务,那就是把公司的文件服务器.FTP服务器.邮件服务器进行迁移并作相应的整合.登陆后台查看了,公司目前正在使用的方案.FTP服务器使用的是Server-u FTP,验证方式选择的windo ...

  2. Go 实现判断变量是否为合法数字 IsNumeric 算法

    [转] http://www.syyong.com/Go/Go-to-determine-whether-the-variable-is-a-legal-digital-algorithm.html ...

  3. h5的localStorage和sessionStorage

    今天做了个首页的弹窗,要求是打开时显示弹窗,然后点击关闭按钮时弹窗关闭,然后点击不再显示,之后再刷新就不会有弹窗,总结一下需求. 1.弹窗显示隐藏 这个很容易,我们可以用display:none和di ...

  4. linux设置oracle自动启动

    用root用户 在/etc/init.d/目录下创建Oracle的服务文件 cd /etc/init.d vi oracle11g   添加内容如下   #!/bin/bash # chkconfig ...

  5. jquery 实现图片无缝向左滚动

    <script type="text/javascript" src="_pub/Script/jquery.js"></script> ...

  6. Java高新技术第一篇:类加载器详解

    首先来了解一下字节码和class文件的区别: 我们知道,新建一个Java对象的时候,JVM要将这个对象对应的字节码加载到内存中,这个字节码的原始信息存放在classpath(就是我们新建Java工程的 ...

  7. 31. Next Permutation(中等,搞清楚啥是 next permutation)

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  8. VLAN之间单臂路由通信

    实验目的 理解单臂路由的应用场景 掌握路由器子接口的配置方法 掌握子接口封装VLAN的配置方法 理解单臂路由的工作原理 实验原理 单臂路由解决用户需要跨越VLAN实现通信的情况. 原理:通过一台路由器 ...

  9. MAX(字段)加0与不加0的测试

    --max(字段名)中的"字段名"的数据类型是字符型的,"字段名"+ 0后,oracle会隐式的转换成数字型 --测试 )); insert into Test ...

  10. OC基础之推荐一个旋转木马(跑马灯)效果的图片展示Demo

    这个旋转木马(跑马灯)效果的图片展示Demo,包括设定旋转方向,图片倒影,背景设置,旋转速度,开始结束,点击显示选中的图片,彩色的块展示等等功能 效果图:(源码下载:https://github.co ...