亿万先生官方网站:6379这台M复制数据,注意第②次复制的时候S上边的多寡会被遮住

1.前言

说到分布式高可用,必然少不了复制,一来是为着做个冗余备份制止数据丢失,二来还足以完结疏散来抓牢品质的目标。基本架构:

亿万先生官方网站: 1

下边用M表示Master(主服务器),S表示Slave(从服务器),话不多说,先敲代码

 

1.前言

说到分布式高可用,必然少不了复制,一来是为了做个冗余备份制止数据丢失,二来还是能达到规定的标准疏散来增进品质的指标。基本架构:

亿万先生官方网站: 2

上面用M表示Master(主服务器),S表示Slave(从服务器),话不多说,先敲代码

 

2.配置

slaveof 192.168.1.1 6379

在S端配置slaveof就能够完结复制了,意思是笔者从192.168.1.1
6379那台M复制数据。注意第3次复制的时候S上面包车型客车数据会被遮盖。下边就在自小编的虚拟机上边实际操作一下,配置3台redis,6379是M,6380、6381是S

配置M

$ cp redis.conf redis_6379.conf
$ vi redis_6379.conf
bind 192.168.56.10 #修改ip为本机

配置S

$ cp redis_6379.conf redis_6380.conf
$ vi redis_6380.conf
#修改端口号和pid文件名
port 6380
pidfile /var/run/redis_6380.pid
slaveof 192.168.56.10 6379 #设定复制
#同样拷贝一份配置按照上面的步骤修改6381的配置
$ cp redis_6380.conf redis_6381.conf

启动

$ src/redis-server redis_6379.conf
$ src/redis-server redis_6380.conf
$ src/redis-server redis_6381.conf

测试复制

$ src/redis-cli -h 192.168.56.10 -p 6379
192.168.56.10:6379> set name pigfly
OK
192.168.56.10:6379> quit
$ src/redis-cli -h 192.168.56.10 -p 6380
192.168.56.10:6380> get name
"pigfly" #复制成功
192.168.56.10:6380> quit
$ src/redis-cli -h 192.168.56.10 -p 6379
192.168.56.10:6379> del name
(integer) 1
192.168.56.10:6379> quit
$ src/redis-cli -h 192.168.56.10 -p 6380
192.168.56.10:6380> get name
(nil) #删除同步成功

192.168.56.10:6380> set age 23
#注意S只读,这是默认配置,如果要S可写修改read-only=no
#一般来说不建议这样做,因为复制的时候会把数据覆盖
(error) READONLY You can't write against a read only slave.

192.168.56.10:6380> quit
$ src/redis-cli -h 192.168.56.10 -p 6379
192.168.56.10:6379> setex address 10 xxstreat
OK
192.168.56.10:6379> quit
$ src/redis-cli -h 192.168.56.10 -p 6380
192.168.56.10:6380> get address
(nil) #过期同步成功

 

2.配置

slaveof 192.168.1.1 6379

在S端配置slaveof就能够达成复制了,意思是自家从192.168.1.1
6379那台M复制数据。注意第3次复制的时候S上边的数码会被覆盖。上面就在自家的虚拟机下面实际操作一下,配置3台redis,6379是M,6380、6381是S

配置M

$ cp redis.conf redis_6379.conf
$ vi redis_6379.conf
bind 192.168.56.10 #修改ip为本机

配置S

$ cp redis_6379.conf redis_6380.conf
$ vi redis_6380.conf
#修改端口号和pid文件名
port 6380
pidfile /var/run/redis_6380.pid
slaveof 192.168.56.10 6379 #设定复制
#同样拷贝一份配置按照上面的步骤修改6381的配置
$ cp redis_6380.conf redis_6381.conf

启动

$ src/redis-server redis_6379.conf
$ src/redis-server redis_6380.conf
$ src/redis-server redis_6381.conf

测试复制

$ src/redis-cli -h 192.168.56.10 -p 6379
192.168.56.10:6379> set name pigfly
OK
192.168.56.10:6379> quit
$ src/redis-cli -h 192.168.56.10 -p 6380
192.168.56.10:6380> get name
"pigfly" #复制成功
192.168.56.10:6380> quit
$ src/redis-cli -h 192.168.56.10 -p 6379
192.168.56.10:6379> del name
(integer) 1
192.168.56.10:6379> quit
$ src/redis-cli -h 192.168.56.10 -p 6380
192.168.56.10:6380> get name
(nil) #删除同步成功

192.168.56.10:6380> set age 23
#注意S只读,这是默认配置,如果要S可写修改read-only=no
#一般来说不建议这样做,因为复制的时候会把数据覆盖
(error) READONLY You can't write against a read only slave.

192.168.56.10:6380> quit
$ src/redis-cli -h 192.168.56.10 -p 6379
192.168.56.10:6379> setex address 10 xxstreat
OK
192.168.56.10:6379> quit
$ src/redis-cli -h 192.168.56.10 -p 6380
192.168.56.10:6380> get address
(nil) #过期同步成功

 

3.原理

当M和S连接符合规律时,redis通过命令传播来2只数据,每当M执行贰个写命令,就会把命令发送给S,S执行后,两者达到数据的一致性。当S第1回接二连三大概断线后重连M的时候,复制过程是那样子的:

亿万先生官方网站: 3

其一进程也能够称之为是sync全量复制,每一遍复制,M执行bgsave把全数数据打包成快速照相文件发给S,S再解包载入内部存款和储蓄器。

M执行bgsave消耗CPU、内部存款和储蓄器、磁盘I/O,传输过程消耗网络带宽,借使S是首先次连接M,不可防止会执行上述操作,但借使S是断线重连的情事,就有点不划算了,因为S真正须求复制的多少是断线今后的,倘若全量复制就太浪费财富和岁月了,所以redis2.8之后的版本做了考订,加了psync增量复制,psync(part-sync)跟sync分化的是,psync只发送S真正须求的命令流,大大地增加了打包和传导的频率,那么redis是怎么落到实处增量复制的啊?

replid, offset

种种M和S都有地点那八个属性,replid是M的绝无仅有标识。offset是命令流的字节数,简单的话,只要有写入命令(就算没有S),那几个offset就会追加

亿万先生官方网站: 4

M维护着上海体育场合那样2个固定长度、先进先出的行列来保存近来的命令流

亿万先生官方网站: 5

上海教室就是增量复制的历程,假定S当前offset=offset_s,M当前offset=offset_m:

1.M论断replid是还是不是和投机的replid相等,如若不对等,跳出执行全量复制

2.M检查offset_s是不是还在缓冲队列,假如是,发送从offset_s开始到offset_m的命令流,假如没有了,跳出执行全量复制

3.S进行命令流,更新offset_s = offset_m

 

复制的编制和个性:

当M和S连接优秀时,S定时请求M进行复制,M向S发送命令流来保持同步

redis暗中认可使用高质量的异步复制,S会异步向M确认收到的数码

当M和S由于网络难题仍然逾期导致断开连接,S会尝试重新连接,请求增量复制

不能够增量复制时,执行全量复制

三个M能够有八个S

S也得以复制其余S

复制在M端是非阻塞的,也正是M向S复制的进度中,M的查询不受影响

复制在S端也大致是非阻塞的,初步化同步的时候,S能够提供旧数据来使查询不受影响,载入数据的时候,S将会闭塞连接不提供查询服务(非常大的数据也只供给短短几秒就联合完了),旧数据将会被去除,新数据将会被载入

能够把耗时询问放到S上面来加强主机的天性

能够运用复制来幸免M持久化带来的支付,让四个S来持久化,可是应当幸免M重启,因为M重启之后数据是空的,那时候如若同步的话S的数量也化为空了。就终于用redis的sentinel实现的高可用方案,也毫无把持久化关了,说不定sentinel还没赶趟检查和测试到故障,M就已经宕机然后重启了。为了幸免那种情况,建议M和S都打开持久化,上面就演示数据是哪些丢失的:

  • A,B,C三台redis服务器,A是M,B和C是S
  • 因为一些原因,A宕机了,它实施活动重启机制,那时候因为关闭了持久化,磁盘里是不曾备份数据的,内存里的多寡也因为重启丢失了,所以重启之后数据总体丢了
  • B和C尝试同步,它们也不管A的多少是否空,照常同步过来了,所以B和C的多寡也丢了

 

3.原理

当M和S连接平常时,redis通过命令传播来共同数据,每当M执行一个写命令,就会把命令发送给S,S执行后,两者达到数据的一致性。当S第一回三番五次恐怕断线后重连M的时候,复制进程是那样子的:

亿万先生官方网站: 6

其一进度也可以称作是sync全量复制,每3遍复制,M执行bgsave把拥有数据打包成快速照相文件发给S,S再解包载入内部存款和储蓄器。

M执行bgsave消耗CPU、内部存款和储蓄器、磁盘I/O,传输进度消耗互联网带宽,如若S是首先次连接M,不可制止会执行上述操作,但假若S是断线重连的场所,就有点不划算了,因为S真正供给复制的数额是断线现在的,如果全量复制就太浪费财富和岁月了,所以redis2.8事后的本子做了订正,加了psync增量复制,psync(part-sync)跟sync分裂的是,psync只发送S真正需求的命令流,大大地增强了打包和传导的成效,那么redis是怎么落实增量复制的吧?

replid, offset

种种M和S都有上边这七个属性,replid是M的绝无仅有标识。offset是命令流的字节数,简单的话,只要有写入命令(即使没有S),那几个offset就会扩展

亿万先生官方网站: 7

M维护着上海教室那样2个原则性长度、先进先出的行列来保存方今的命令流

亿万先生官方网站: 8

上海教室便是增量复制的进度,假定S当前offset=offset_s,M当前offset=offset_m:

1.M论断replid是不是和团结的replid相等,倘若不对等,跳出执行全量复制

2.M检查offset_s是或不是还在缓冲队列,即使是,发送从offset_s开始到offset_m的命令流,假如没有了,跳出执行全量复制

3.S实行命令流,更新offset_s = offset_m

 

复制的编写制定和特性:

当M和S连接出色时,S定时请求M进行复制,M向S发送命令流来保持同步

redis私下认可使用高质量的异步复制,S会异步向M确认收到的数目

当M和S由于网络难题照旧逾期导致断开连接,S会尝试重新连接,请求增量复制

不可能增量复制时,执行全量复制

三个M能够有几个S

S也得以复制别的S

复制在M端是非阻塞的,也正是M向S复制的经过中,M的询问不受影响

复制在S端也大约是非阻塞的,早先化同步的时候,S能够提供旧数据来使查询不受影响,载入数据的时候,S将会闭塞连接不提供查询服务(相当的大的多寡也只须求短短几秒就联手完了),旧数据将会被去除,新数据将会被载入

能够把耗费时间询问放到S上边来增加主机的品质

能够使用复制来幸免M持久化带来的支付,让1个S来持久化,不过应当制止M重启,因为M重启之后数据是空的,那时候假如同步的话S的数据也化为空了。就终于用redis的sentinel达成的高可用方案,也无须把持久化关了,说不定sentinel还没赶趟检查和测试到故障,M就已经宕机然后重启了。为了防止那种气象,提议M和S都打开持久化,上边就演示数据是什么丢失的:

  • A,B,C三台redis服务器,A是M,B和C是S
  • 因为有些原因,A宕机了,它实施活动重启机制,那时候因为关闭了持久化,磁盘里是绝非备份数据的,内部存款和储蓄器里的多少也因为重启丢失了,所以重启之后数据总体丢了
  • B和C尝试同步,它们也不管A的数码是否空,照常同步过来了,所以B和C的多少也丢了

 

redis复制怎么着处理过期的缓存?

  1. S不处理,而是等M处理过期后给S发送DEL命令
  2. 当M没有应声发送DEL命令,导致过期的缓存如故存在于S,S将会基于本人的逻辑时钟报告缓存已过期,并且安装为只读
  3. Lua脚本运营的时候,不进行缓存回收
  4. 设若S变身为M,它立刻自己执行缓存回收

 

redis复制怎样处理过期的缓存?

  1. S不处理,而是等M处理过期后给S发送DEL命令
  2. 当M没有马上发送DEL命令,导致过期的缓存如故存在于S,S将会依据自个儿的逻辑时钟报告缓存已过期,并且安装为只读
  3. Lua脚本运维的时候,不实行缓存回收
  4. 就算S变身为M,它马上本身执行缓存回收

 

使用Docker和NAT的气象,怎样安排?

运用端口转载和互连网地址转换的时候,redis复制要专门小心,尤其是利用redis-sentiner,它是基于INFO命令来得到IP地址的,那种景观下得以安顿IP端口映射,来让M获取到S正确的地址:

slave-announce-ip 5.5.5.5
slave-announce-port 1234

  

这么M执行INFO命令看到S的IP便是炫耀过的:

# Replication
role:master
connected_slaves:1
slave0:ip=5.5.5.5,port=1234,state=online,offset=420,lag=1

  

行使Docker和NAT的动静,如何布署?

应用端口转载和互连网地址转换的时候,redis复制要特别小心,特别是应用redis-sentiner,它是依照INFO命令来获得IP地址的,那种情景下能够配备IP端口映射,来让M获取到S正确的地点:

slave-announce-ip 5.5.5.5
slave-announce-port 1234

  

这么M执行INFO命令看到S的IP正是炫耀过的:

# Replication
role:master
connected_slaves:1
slave0:ip=5.5.5.5,port=1234,state=online,offset=420,lag=1

  

INFO命令

透过info命令能够查阅复制的参数和景色

$ src/redis-cli -h 192.168.56.10 -p 6381
192.168.56.10:6381> info
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.56.10,port=6379,state=online,offset=644,lag=1
master_replid:b01608293384f8ea87b5bd0aabe081948f33a3dd
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:644
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:644

  

INFO命令

通过info命令能够查看复制的参数和情况

$ src/redis-cli -h 192.168.56.10 -p 6381
192.168.56.10:6381> info
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.56.10,port=6379,state=online,offset=644,lag=1
master_replid:b01608293384f8ea87b5bd0aabe081948f33a3dd
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:644
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:644

  

4.质量优化

1.调整缓冲队列的尺寸来尽量达到增量复制而幸免全量复制,repl-backlog-size暗中认可1mb

 

4.质量优化

1.调动缓冲队列的大大小小来尽大概达到增量复制而防止全量复制,repl-backlog-size暗许1mb

 

5.参考资料

redis文档

redis实战

redis设计与完毕

5.参考资料

redis文档

redis实战

redis设计与完结

相关文章

网站地图xml地图