Redis 主从复制

来源:互联网 发布:python base64 编辑:程序博客网 时间:2024/06/05 03:31
redis与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
一、redis主从复制特点
1.master可以拥有多个slave
2.多个slave可以连接同一个master外,还可以连接到其他slave
3.主从复制不会阻塞master,在同步数据时,master可以继续处理client请求
4.提高系统的伸缩性
5.可以在master禁用数据持久化,注释掉master配置文件中的所有save配置,只需在slave上配置数据持久化
:当设置maxmemory项后,redis有6种内存过期策略,通过maxmemory-policy修改,一般使用默认值或allkeys-lru:
volatile-lru:只对设置了过期时间的key进行LRU(默认值)
allkeys-lru : 是从所有key里 删除 不经常使用的key
volatile-random:随机删除即将过期key
allkeys-random:随机删除
volatile-ttl : 删除即将过期的
noeviction : 永不过期,返回错误
二、redis主从复制过程
1.如果设置了一个Slave,无论是第一次连接还是重连到Master,它都会发出一个SYNC命令;
2.当Master收到SYNC命令之后,会做两件事:
a)Master执行BGSAVE,即在后台保存数据到磁盘(rdb快照文件);
b)Master同时将新收到的写入和修改数据集的命令存入缓冲区(非查询类);
3.当Master在后台把数据保存到快照文件完成之后,Master会把这个快照文件传送给Slave,而Slave则把内存清空后,加载该文件到内存中;
4.而Master也会把此前收集到缓冲区中的命令,通过Reids命令协议形式转发给Slave,Slave执行这些命令,实现和Master的同步;
5.Master/Slave此后会不断通过异步方式进行命令的同步,达到最终数据的同步一致;
6.需要注意的是Master和Slave之间一旦发生重连都会引发全量同步操作。但在2.8之后版本,也可能是部分同步操作。
部分复制
2.8开始,当Master和Slave之间的连接断开之后,他们之间可以采用持续复制处理方式代替采用全量同步。
Master端为复制流维护一个内存缓冲区(in-memory backlog),记录最近发送的复制流命令;同时,Master和Slave之间都维护一个复制偏移量(replication offset)和当前Master服务器ID(Master run id)。当网络断开,Slave尝试重连时:
a.如果MasterID相同(即仍是断网前的Master服务器),并且从断开时到当前时刻的历史命令依然在Master的内存缓冲区中存在,则Master会将缺失的这段时间的所有命令发送给Slave执行,然后复制工作就可以继续执行了;
b.否则,依然需要全量复制操作;
Redis 2.8 的这个部分重同步特性会用到一个新增的 PSYNC 内部命令, 而 Redis 2.8 以前的旧版本只有 SYNC 命令, 不过, 只要从服务器是 Redis 2.8 或以上的版本, 它就会根据主服务器的版本来决定到底是使用 PSYNC 还是 SYNC :
如果主服务器是 Redis 2.8 或以上版本,那么从服务器使用 PSYNC 命令来进行同步。
如果主服务器是 Redis 2.8 之前的版本,那么从服务器使用 SYNC 命令来进行同步。
三、安装测试
1.安装redis略,参考:http://blog.csdn.net/zhu_tianwei/article/details/44890579
2.修改redis配置
主配置:

daemonize  yespidfile /home/slim/redis/data/redis.pidport 6379bind 192.168.100.90unixsocket /home/slim/redis/data/redis.sockunixsocketperm 700timeout 300tcp-keepalive 60loglevel verboselogfile /home/slim/redis/logs/redis.logdatabases 16save 900 1save 300 10save 60 10000dbfilename dump.rdbdir /home/slim/redis/data/
从配置:
daemonize  yespidfile /home/slim/redis/data/redis.pidport 6379bind 192.168.110.71 unixsocket /home/slim/redis/data/redis.sockunixsocketperm 700timeout 300tcp-keepalive 60loglevel verboselogfile /home/slim/redis/logs/redis.logdatabases 16save 900 1save 300 10save 60 10000dbfilename dump.rdbdir /home/slim/redis/data/slaveof 192.168.100.90 6379
主要区别是从服务器多一个slaveof配置,指向主服务器。
3.启动服务
在主从执行如下命令启动并查看日志
./bin/redis-server conf/redis.conf ;tail -f logs/redis.log
4.测试
在主服务器添加数据
 redis-cli -h 192.168.100.90 -p 6379
redis 192.168.100.90:6379> set key abc
OK
redis 192.168.100.90:6379> get key
"abc"
查看从服务器
 redis-cli -h 192.168.110.71 -p 6379
redis 192.168.110.71:6379> get key
"abc"
可以看到数据已经同步,可以尝试一下将从服务器关闭,添加主服务器数据,再启动从服务器,数据依然正常同步。

注:在工作中可以使用keepalive来实现主的故障转移功能,实现高可用性集群。redis无法实现主主服务,若在从服务器执行添加数据会报如下错误:
(error) READONLY You can't write against a read only slave.

参考文章:
http://www.cnblogs.com/weafer/archive/2011/09/20/2182750.html
http://www.cnblogs.com/Xrinehart/p/3501372.html
0 0
原创粉丝点击