您的位置:首页 > 数据库 > Redis

Redis集群:redis主从配置

2015-08-30 22:39 686 查看
转载地址:http://www.2cto.com/database/201502/377069.html

Redis主从配置(Master-Slave)

一、 Redis Replication的特点:
1):一个Master可以同步多个Slave
2):不仅Master可以同步多个Slave,Slave也可以同步其它Slave,可以构成一个图形结构,同时还能分担Master的同步压力
3):Redis Replication使用的是异步复制。从2.8开始,Slave会周期性发起一个Ack确认replication stream被处理进度
4):复制在Master Server是以非阻塞模式完成数据同步。即使多个Master-Slave同时同步,Master Server仍然可以提供查询或修改
5):复制在Slave Server也是以非阻塞的方式完成数据同步。在同步期间,Slave Server可以提供数据查询,但返回的是同步之前的数据,同时还能配置当Master与Slave失去联系时,让Slave返回客户端一个错误提示
6):Slave Server可以为客户端提供只读操作的服务,但写服务仍然必须由Master来完成,这样可以分载Master的读操作压力,在分压的同时还供了数据冗余,同时还可以通过增加Slave进行只读操作来提升扩展性
7):可以通过修改Master Server的redis.config配置文件来将持久化操作交给Slave Server去操作
注:Slave是只读的,只可以读取数据,而不能写入数据

二、Redis Replication工作原理:
1):Slave启动后,无论是第一次连接还是重连到Master,它都会主动发出一个SYNC命令
2):当Master收到SYNC命令之后,将会执行BGSAVE(后台存盘进程),即在后台保存数据到磁盘(rdb快照文件),同时收集所有新收到的写入和修改数据集的命令存入缓冲区(非查询类)
3):Master在后台把数据保存到快照文件完成后,会传送整个数据库文件到Slave
4):Slave接收到数据库文件后,会把内存清空,然后加载该文件到内存中以完成一次完全同步
5):然后Master会把之前收集到缓冲区中的命令和新的修改命令依次传送给Slave
6):Slave接受到之后在本地执行这些数据修改命令,从而达到最终的数据同步
7):之后Master与Slave之间将会不断的通过异步方式进行命令的同步,从而保证数据的时时同步
8):如果Master和Slave之间的链接出现断连,Slave可以自动重连Master。根据版本的不同,断连后同步的方式也不同:
2.8之前:重连成功之后,一次全量同步操作将被自动执行
2.8之后:重连成功之后,进行部分同步操作

部分同步:
从2.8开始,当Master和Slave之间的连接断开重连后,他们之间可以采用持续复制处理方式替代完全重同步操作。部分重同步会用到PSYNC的命令,2.8之后的版本才有此命令,之前的只有SYNC命令。只要Slave是2.8或以上的版本,Slave就会根据Master的版本来决定到底是使用PSYNC还是SYNC

部分同步工作原理如下:
1):Master为被发送的复制流创建一个内存缓冲区(in-memory backlog),记录最近发送的复制流命令
2):Master和Slave之间都记录一个复制偏移量(replication offset)和当前Master ID(Master run id)
3):当出现网络断开,Slave会重新连接,并且向Master请求继续执行原来的复制进程
4):如果Slave中断网前的MasterID和当前要连的MasterID相同,并且从断开时到当前时刻Slave记录的偏移量所指定的数据仍然保存在Master的复制流缓冲区里面,则Master会向Slave发送缺失的那部分数据,Slave执行后复制工作可以继续执行
5):否则Slave就执行完整重同步操作

三、配置:

系统环境:CentOS 6.5 mini
软件版本:redis-2.8.19

IP地址:
节点1:192.168.100.211
节点2:192.168.100.212
节点3:192.168.100.213

1:指定Slave(在Slave节点配置)
# vi /main/redis/redis.conf
slaveof 192.168.100.211 6379
#注:有这一行表示为Slave,没有则表示为Master。这里的IP地址为Master的IP地址,后面的端口号也是为Master的端口号

2:设置认证密码(三个节点)
可以设置,也可以不设置
# vi /main/redis/redis.conf
masterauth 1234567890
requirepass 1234567890
#注:如果Master端通过requirepass设置了密码,则Slave需要通过masterauth配置密码
到此配置就完毕了

四、测试:
1:在命令行界面进行查看(三个节点):
# /main/redis/src/redis-cli
127.0.0.1:6379> info replication

节点1显示如下(master):
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.100.212,port=6379,state=online,offset=41663,lag=1
slave1:ip=192.168.100.213,port=6379,state=online,offset=41663,lag=1
master_repl_offset:41963
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:41962

节点2显示如下(slave1):
# Replication
role:slave
master_host:192.168.100.211
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:41520
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

节点3显示如下(slave2):
# Replication
role:slave
master_host:192.168.100.211
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:42106
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
2:数据测试
Master
# /main/redis/src/redis-cli -a 1234567890 set hello doiido

Slave1
# /main/redis/src/redis-cli -a 1234567890 get hello
"doiido"

Slave2
# /main/redis/src/redis-cli -a 1234567890 get hello
"doiido"

Slave2
# /main/redis/src/redis-cli -a 1234567890 set hello2 doiido2
(error) READONLY You can't write against a read only slave.

从上面的操作中可以看出,从Master中写入数据后,Slave是会同步数据的,而在Slave中是无法写入数据的

到这里Redis的主从配置完毕,但是这个时候是不会自动切换的。想要其自动切换,需要进行Sentinel配置
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: