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. day4 liaoxuefeng---模块

    一.模块 二.常用内建模块 三.常用第三方模块

  2. 判断是否是IE;自定义onkeyup事件

    <script> /*onkeyup和onchange事件在IE下冲突,在此做区分*/ if (!!window.ActiveXObject || "ActiveXObject& ...

  3. Linux sort -n 与 -g 排序对比

    公司业务需要,天天用awk统计数值然后排序,出问题了,如下: count.sh 是一个统计脚本,把awk输出的值按占比.条数.类型 在重新输出 awk -F\| '{print $16}' *MQTT ...

  4. 对闭包的理解(closure)

    什么是闭包: 当你声明一个局部变量时,这个局部变量有作用域,通常局部变量值只存在于你定义的Block or Function中: function() { var a = 1; console.log ...

  5. 009.Working with SQL Server LocalDB --【在sql server localdb 上操作数据】

    Working with SQL Server LocalDB 在sql server localdb 上操作数据 2017-3-7 2 分钟阅读时长 本文内容 1.SQL Server Expres ...

  6. c++ public,protected,private

    基类的私有成员被继承后不可见(优先级最高) 公有继承不改变基类成员属性 保护继承(私有继承)把基类成员变为保护成员(私有成员) public 公开的 protected 受保护的 private 私有 ...

  7. C++框架_之Qt的窗口部件系统的详解-上

    C++框架_之Qt的窗口部件系统的详解-上 第一部分概述 第一次建立helloworld程序时,曾看到Qt Creator提供的默认基类只有QMainWindow.QWidget和QDialog三种. ...

  8. 【kmp】 剪花布条 HDU - 2087

    [题意概述] [解题思路] 从左往右找,看有几个匹配的字符串,但要注意例如 aaaaaa  aa的输出是3 而不是5,可以这样理解:画布需要减去,一旦减去也就没有了的 [AC] #include< ...

  9. Bootstrap3 表单-水平排列的表单

    通过为表单添加 .form-horizontal 类,并联合使用 Bootstrap 预置的栅格类,可以将 label 标签和控件组水平并排布局.这样做将改变 .form-group 的行为,使其表现 ...

  10. Android简易实战教程--第四十九话《满屏拖动的控件》

    今天做个有意思的效果吧,控件的拖拽,简单实用,逻辑清晰点3分钟看完. 说的很高大上,其实就是拖动Button按钮跟着鼠标位置满手机屏幕跑罢了. 直接上简单的代码吧: public class Main ...