Redis系列 Redis主从同步,读写分离

  • Redis系列 Redis主从同步,读写分离
  • 1. Redis主从同步
  • 2. 配置主从同步
  • 2.1 配置Mater,Slave
  • 2.3 Slave升级为Master
  • 2.4 Health Check
  • 2.5 设置Master的写行为
  • 3. Redis HA管理工具
  • 3.1 设定Master,Slave
  • 3.2 Master上设定Sentinel
  • 3.3 Slave上设定Sentinel
  • 3.4 动作确认
  • 3.5 Sentinel命令
  • SLAVEOF
  • SLAVEOF host port


Redis系列 Redis主从同步,读写分离

1. Redis主从同步

Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,同步使用的是发布/订阅机制。

2. 配置主从同步

Mater Slave的模式,从Slave向Master发起SYNC命令。

可以是1 Master 多Slave,可以分层,Slave下可以再接Slave,可扩展成树状结构。

2.1 配置Mater,Slave

配置非常简单,只需在slave的设定文件中指定master的ip和port

Master: test166

修改设定文件,服务绑定到ip上

# vi /etc/redis.conf
bind 10.86.255.166

重启Redis

# systemctl restart redis

# less /etc/redis.conf
Slave: test167

修改设定文件,指定Master

slaveof <masterip> <masterport> 指定master的ip和port
masterauth <master-password> master有验证的情况下
slave-read-only yes 设置slave为只读模式
也可以用命令行设定:

redis 127.0.0.1:9999> slaveof localhost 6379
OK

2.2 同期情况确认
Master:

127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:1
slave0:ip=10.86.255.167,port=6379,state=online,offset=309,lag=1
……

Slave:

127.0.0.1:6379> INFO replication
# Replication
role:slave
master_host:10.86.255.166
master_port:6379
master_link_status:up
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_repl_offset:365
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

同期正常时:

master_link_status:up

master_repl_offset和slave_repl_offset相等,

master_last_io_seconds_ago在10秒内。

2.3 Slave升级为Master

Master不可用的情况下,停止Master,将Slave的设定无效化后,Slave升级为Master

redis 127.0.0.1:9999> SLAVEOF NO ONE
 OK

redis 127.0.0.1:9999> info
......
role:master
......

2.4 Health Check

Slave按照repl-ping-slave-period的间隔(默认10秒),向Master发送ping。

如果主从间的链接中断后,再次连接的时候,2.8以前按照full sync再同期。2.8以后,因为有backlog的设定,backlog存在master的内存里,重新连接之前,如果redis没有重启,并且offset在backlog保存的范围内,可以实现从断开地方同期,不符合这个条件,还是full sync

用monitor命令,可以看到slave在发送ping

127.0.0.1:6379> monitor
OK
1448515184.249169 [0 10.86.255.166:6379] "PING"

2.5 设置Master的写行为

2.8以后,可以在设定文件中设置,Master只有当有N个Slave处于连接状态时,接受写操作

min-slaves-to-write 3
min-slaves-max-lag 10

3. Redis HA管理工具

redis-sentinel 能监视同期的状态,发现Master down的时候,会进行failover,将Slave升级为Master,启动后会自动更新sentinel设定文件,发生failover时,会自动修改sentinel和redis的设定文件

环境:

Master: 10.86.255.167 :6379    sentinel:26379

Slave1: 10.86.255.166 :6379    sentinel:26379

Slave2: 10.86.255.167 :7379    sentinel:36379

Sentinel的设定文件在/etc/redis-sentinel.conf,对failover的动作等可以进行一些定义,本次主要验证Sentinel的动作,设定文件可以根据具体情况自行调整

3.1 设定Master,Slave

参照上文设定Master,Slave,并确认Mater和2个Slave的同期状态正常

3.2 Master上设定Sentinel

# vi /etc/redis-sentinel.conf
daemonize yes
sentinel monitor mymaster <master ip> 6379 2

启动sentinel

# redis-sentinel /etc/redis-sentinel.conf

# redis-server /etc/redis-sentinel.conf --sentinel

确认

# redis-cli -p 26379
127.0.0.1:26379> INFO sentinel

确认Master信息

127.0.0.1:26379> sentinel masters

确认Slave信息

127.0.0.1:26379> sentinel slaves mymaster

3.3 Slave上设定Sentinel

在slave1上设定sentinel

# vi /etc/redis-sentinel.conf
daemonize yes
sentinel monitor mymaster <master ip> 6379 2

启动slave1

# redis-sentinel /etc/redis-sentinel.conf

在slave2上设定sentinel

# less /etc/redis-sentinel_36379.conf
daemonize yes
port 36379
sentinel monitor mymaster <master ip> 6379 2

启动slave2

# redis-sentinel /etc/redis-sentinel_36379.conf

3.4 动作确认

停止Master

127.0.0.1:6379> SHUTDOWN

确认日志发生fail over

# tail /var/log/redis/sentinel.log

确认Slave2变成Master,Slave1是Slave

test167:7379> info replication


test166:6379> info replication

启动刚才停掉的Master,确认变为Slave

10.86.255.167:6379> info replication

3.5 Sentinel命令

127.0.0.1:26379> sentinel masters
127.0.0.1:26379> sentinel slaves mymaster
127.0.0.1:26379> SENTINEL get-master-addr-by-name mymaster
127.0.0.1:26379> SENTINEL reset mymaster
127.0.0.1:26379> SENTINEL failover mymaster
127.0.0.1:26379> SENTINEL flushconfig mymaster

本文介绍了Redis主从同步,读写分离,及HA

java项目中配置redis读写分离 哨兵模式 redis实现读写分离_缓存

SLAVEOF

SLAVEOF host port

SLAVEOF 命令用于在 Redis 运行时动态地修改复制(replication)功能的行为。

通过执行 SLAVEOF host port 命令,可以将当前服务器转变为指定服务器的从属服务器(slave server)。

如果当前服务器已经是某个主服务器(master server)的从属服务器,那么执行 SLAVEOF host port 将使当前服务器停止对旧主服务器的同步,丢弃旧数据集,转而开始对新主服务器进行同步。

另外,对一个从属服务器执行命令 SLAVEOF NO ONE 将使得这个从属服务器关闭复制功能,并从从属服务器转变回主服务器,原来同步所得的数据集不会被丢弃。

利用『 SLAVEOF NO ONE 不会丢弃同步所得数据集』这个特性,可以在主服务器失败的时候,将从属服务器用作新的主服务器,从而实现无间断运行。

可用版本:

>= 1.0.0

时间复杂度:
SLAVEOF host port ,O(N), N 为要同步的数据数量。
SLAVEOF NO ONE , O(1)
返回值:
总是返回 OK 。

redis> SLAVEOF 127.0.0.1 6379
OK

redis> SLAVEOF NO ONE
OK