主从复制配置方法:
- 配置文件中添加 加入 slaveof ip port, 重启生效;
- 启动命令加入–slaveof redis-server --slaveof ip port
- 在命令中 slaveof ip port
查看复制状态:info replication
断开主从复制:在slave节点,执行6380:>slaveof no one
环境准备
参考redis搭建,搭建一个redis服务并启动
查看主redis
127.0.0.1:6379>
127.0.0.1:6379> keys *
1) "count"
2) "test2"
3) "testm"
4) "test_inter"
5) "mylist"
6) "myset:__rand_int__"
7) "test4"
8) "test3"
9) "user"
10) "testm2"
11) "key:__rand_int__"
12) "counter:__rand_int__"
13) "test1"
127.0.0.1:6379>
未配置前从redis
127.0.0.1:6399> keys *
(empty list or set)
127.0.0.1:6399>
配置主从复制:
在从服务器一条命令搞定:
127.0.0.1:6399> SLAVEOF 192.168.137.18 6379
OK
127.0.0.1:6399>
查看从节点keys
127.0.0.1:6399> keys *
1) "count"
2) "key:__rand_int__"
3) "testm2"
4) "test3"
5) "user"
6) "counter:__rand_int__"
7) "myset:__rand_int__"
8) "test_inter"
9) "test2"
10) "test4"
11) "testm"
12) "test1"
13) "mylist"
主节点设置一个key值
127.0.0.1:6379> set salvetest 'this is ok'
OK
127.0.0.1:6379>
从节点获取:
127.0.0.1:6399> get salvetest
"this is ok"
主节点查看信息,可以看到一个slave
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.137.19,port=6399,state=online,offset=139,lag=1
master_repl_offset:139
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:138
从节点停止复制:
127.0.0.1:6399> slaveof no one
OK
主节点查看信息, 显示0个slave
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:209
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:208
127.0.0.1:6379>
从节点查看keys, 发现keys仍然在。
127.0.0.1:6399> keys *
1) "count"
2) "salvetest"
3) "key:__rand_int__"
4) "testm2"
5) "test3"
6) "user"
7) "counter:__rand_int__"
8) "myset:__rand_int__"
9) "test_inter"
10) "test2"
11) "test4"
12) "testm"
13) "test1"
14) "mylist"
127.0.0.1:6399>
场景: 主从切换,
先将从节点slaveof no one
停止完成后
将原来的主节点slaveof ip port (ip为原来从节点ip, port为原来从节点port)
简要介绍及注意点
-
默认情况下从节点使用slave-read-only=yes配置为只读模式, 可以进行读写分离, 减小主节点的压力
-
一个主redis可以有多个从redis
-
一个redis挂多个从redis可能会消耗主redis的带宽, 消耗性能, 可以使用多层的树状结构进行, 也可以指定一个从服务器,然后其他从服务器从第一个从服务器复制
-
参与主从复制的节点都会维护自身复制偏移量, 主节点处理完写入命令后, 会把命令字节长度累加记录,统计在info replication中的master_repl_offset 中, 而从节点slave则上报自身复制偏移量给主节点,主节点会保存丛节点的复制偏移量
-
redis启动都都会动态分配一个运行ID, 主节点重启,id将会变化,从节点基于偏移量复制将是不安全的,因此当ID发生改变,则从节点将会做全量复制
-
如果配置修改。或者其他的优化,重新加载redis 可以使用debug reload进行,这样ID不会变化
-
主从建立成功后,从节点发送ping命令,请求首次通信
-
主从复制连接建立正常通信后, 首次建立的场景, 主节点会将所有数据发送给从节点, 2.8版本之后使新复制命令psync进行复制
-
复制分为,全量同步和部分复制
-
psync 实际上,主节点会保存rdb文件到本地,再将rdb文件发送从节点
在rdb保存及传输过程中主节点的产生的数据,会放入客户端缓冲区中,传输完毕后,发送给从节点, -
主从建立, 主从之间维护着心跳命令
主从复制应用及可能的问题
-
可以进行读写分离,
-
可能读到过期数据 , 这是由于删除策略: 惰性删除和定时删除, 存在一定的延时, 从节点自身不会去删除超时数据,
除非是主节点发送del 命令,由于某些原因导致从节点未及时删除,则可能读到过期数据 -
主从配置不一致
-
避免复制风暴
例如主节点恢复重启后,大量从节点发起全量复制,