暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis 复制

lebronchen 2018-09-11
462

在分布式系统中为了解决单点故障的问题,我们通常会把数据复制多个副本部署到不同的机器,满足故障恢复和负载均衡等需求。

Redis也是如此,它为我们提供了复制功能,Redis复制实现了相同数据的多个副本。可以解决单点问题以及分担读写压力。

Redis复制的主从节点:

  • 参与Redis实例复制的节点划分为主节点(master)和从节点(slaver)

  • 默认情况下,Redis节点都是主节点

  • 每个从节点只能有一个主节点,每个主节点可以有多个从节点

  • 复制的数据流从主节点复制到从节点

1.建立复制

配置Redis复制的方式有以下三种:

  • 从节点在配置文件中加入 slaveof {masterHost} {masterPort} 随Redis启动生效

  • 从节点在启动命令后加入 -- slaveof {masterHost} {masterPort} 生效

  • 在Redis节点中使用命令:slaveof {masterHost} {masterPort} 生效

我们现在启动两个Redis节点,一个端口6379,另一个端口6380,现在在6380节点上执行 slaveof 命令:

6380>slaveof 192.168.1.4 6379
"OK"

那么此时6379节点作为master,6380节点作为slave,6380节点从6379节点中复制数据。

2.查看主从关系

info replication 命令可以帮我们查看复制状态信息。

在主节点6379上执行命令:

6379>info replication
"# Replication
role:master
connected_slaves:1
slave0:ip=192.168.1.4,port=6380,state=online,offset=588,lag=1
master_replid:e2e4f7d2758858bb901af41fc77351c115157253
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:588
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:588
"


在从节点6380上执行命令:

6380>info replication
"# Replication
role:slave
master_host:192.168.1.4
master_port:6379
master_link_status:up
master_last_io_seconds_ago:4
master_sync_in_progress:0
slave_repl_offset:630
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:e2e4f7d2758858bb901af41fc77351c115157253
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:630
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:365
repl_backlog_histlen:266
"

通过 info replication 命令我们可以很明确的看出:

  • 6379节点是主节点,并且对应一个子节点

  • 6380节点是从节点,并且显示对应主节点信息

还有一些其他的参数在这里暂时不做介绍。

3.断开复制

可以通过 slaveof no one 命令来断开从节点与主节点的复制关系。

6380>slaveof no one
"OK"
6380:0>info replication
"# Replication
role:master
connected_slaves:0
master_replid:6212e98828ee773207f23742f7b2bfb3a668a7db
master_replid2:e2e4f7d2758858bb901af41fc77351c115157253
master_repl_offset:966
second_repl_offset:967
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:365
repl_backlog_histlen:602
"

通过上面的命令可以看到,在从节点6380上执行 slaveof no one 命令断开与主节点6379的复制关系之后,从节点6380晋升为主节点。

从节点断开复制后并不会抛弃原有数据,只是无法再同步主节点上的数据变化。

4.切主操作

切主操作指的是将从节点对主节点的复制切换到另一个主节点,比如说把6380节点从原先复制6379节点变成复制6381节点,切主流程:

  • 断开节点6380与节点6379的复制关系

  • 节点6380与节点6381建立复制关系

  • 删除节点6380当前所有数据

  • 对新的主节点6381进行复制操作

切主操作会删除节点上的所有数据,所以在线上人工操作时需要小心。

5.安全性

Redis的主从复制通过 slaveof 就可以实现,但是对于安全性高的节点使用这个命令进行复制会显得不够安全,所以Redis还提供了auth命令进行校验。

主节点可以在配置文件中设置 requirepass 参数来进行密码验证,这时从节点配置文件中的 requirepass 参数必须和主节点中的 requirepass 参数一致才能连接到主节点,并且发起复制流程。

6.只读

由于Redis复制只能从主节点同步到从节点,对于从节点的写操作主节点是无法感知到的,所以对于从节点的修改会破坏主从节点的数据一致性。

因此从节点上建议配置:

slave-read-only = yes

7.传输延迟

Redis主从节点传递消息的原理是从节点建立一个socket套接字,接受主节点发送的复制命令。那么主从节点之间一定是存在传输延迟的。

传输延迟和带宽的取舍一直是数据库主从设计上的一个难点,而两者之间的取舍一般不取决于架构,而取决于具体的业务场景,Redis提供了参数 repl-disable-tcp-nodelay 来供我们进行设置:

  • repl-disable-tcp-nodelay=no:主节点产生的命令无论大小都会及时的发送给从节点,这样主从延迟变小,但是会增大网络带宽的消耗

  • repl-disable-tcp-nodelay=yes:主节点会合并较小的TCP数据包来节省带宽。默认发送时间间隔取决于Linux内核,一般不超过40毫秒。这种配置会节约带宽,但是会增大主从之间数据复制的延迟

我们可以根据具体业务场景来配置 repl-disable-tcp-nodelay,数据一致性要求高的场景可以关闭,带宽不足(跨机房)的场景可以开启。repl-disable-tcp-nodelay配置可以让我们在数据一致性和带宽上根据具体业务场景做出自己的选择。



扫码关注,不迷路


文章转载自lebronchen,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论