1 前期需要了解的一些知识
1.1 redis在Mac下的安装
简单来说就一个命令 brew install redis,具体如何安装请参考 http://www.jianshu.com/p/6b5eca8d908b
1.2 redis 的启动
redis 启动分为服务器启动和客户端启动。
1.2.1redis服务器的启动:
redis-server + 【对应的配置文件】 +【&】 后台启动
1.2.2 redis客户端的启动:
redis-cli + 【host】 + 【port】
1.3 为什么需要复制?怎么才能产生复制?
因为有单点问题,所有需要主从,有了主从就需要数据的同步,所有就有了复制。需要注意的是主从不能保证高可用,思考如何实现高可用?
产生复制很简单,也是一个命令slaveof
其他的主从关系可以通过修改配置文件:http://www.cnblogs.com/liuling/p/2014-4-19-02.html
前期准备已经完事了,直奔主题了。
2 redis 复制
首先,要讲的是redis版本为2.8以前的复制功能。redis2.8以前的复制主要包括两个步骤:
2.1 sync
sync的操作主要是:
sync演示:
2.2 命令传播
sync之后主从服务器确实能够达到一致状态,但是有一个问题达到一致状态之后,如果主服务器执行了一个删除命令,此时就会再次造成主从服务器不一致的情况,如何解决这个问题呢?就需要命令传播机制了,主服务器将自己执行的写操作命令发送给从服务器,使得主从再次达到一致状态。
旧版本的复制功能有什么问题呢?
当旧版本的复制时候出现了断电或者网络超时等情况,效率会很低下,原因是这样的。
主要是因为旧版本复制在执行完sync之后,会执行命令传播,然而在命令传播的过程中如果发生了网络中断等情况的时候,
就需要重新执行sync,sync命令是很耗内存和CPU的,就相当于没有记录网络中断的点,因此效率很低下。
3 新版本的部分同步功能
3.1 为了解决旧版本同步效率低下,引入psync,在pync之前,需要了解三个概念
3.1.1 offset 偏移量
表示主服务器的复制偏移量和从服务器的复制偏移量,简单理解就是记录每次复制的起点位置,当主服务器每次向从服务器传播n个字节的数据时,就将自己的复制偏移量加n,从服务器接受到主服务器发送过来的n个字节就将自己的偏移量也移动n个位置,但是这里也有一个问题是,如果我们的某一台从服务器断线了,主服务器如何重新同步自己的数据给从服务器呢?
3.1.2 复制积压缓冲器
复制积压缓冲器是一个长度固定的先进先出的队里,并且这个队列的长度是固定(默认为1m),每次当主服务器给从服务器发送命令的时候也会给自己的复制积压缓冲器写一份数据,并且复制积压缓冲区会把offset记录下来。这个复制积压缓冲区需要根据每秒写的数量和断开重连的时间来设置 当某一次复制断开以后,从服务器发送psync和自己的offset之后,主服务会根据偏移量去复制积压缓存区找,如果存在的话,回复从服务器开始部分同步模式。因为从服务可能不止一个,因此在同步的时候我们需要引入另外一个东西,机器号,根据机器号可以进行主从服务器的匹配。
3.1.3 机器号 runid
服务器运行的机器号,因为新版同步的时候,主服务器会将自己的机器号发给从服务器,当断线之后从服务器再次向主服务器请求同步的时候会带着主服务器给他的主服务器的机器号。从这个角度也能推算出这次同步是sync还是psync.