带你 “亲自体验“ Redis主从复制
? Redis系列?:
?Redis安装教程(保姆级详细图文)
?布隆过滤器安装步骤
?小记一手 “Redis持久化机制”
?手把手带你实操 RDB & AOF)
?“Redis哨兵“一撸到底 ,贼爽~
Redis使用默认的异步复制,其特点是低延迟和高性能,是绝大多数 Redis 用例的自然复制模式。
咱们为了方便演示利用
伪集群(跑在同一台机上)
来操作
-
创建3个Redis节点,端口号分别为
6379
、6380
、6381
-
进入Redis源码文件utils目录
此路径为源码安装包解压后存放的Redis路径 ,请看Redis单机安装详细图文教程一文开头有介绍(建议按照教程装一个干净的环境,这样就可以跟着文章节奏一撸到底了,避免中途出现一些本文中没碰到的问题)
cd soft/redis-6.0.6/utils/
-
执行
install_server.sh
脚本./install_server.sh
下方端口号如果不输入则默认为6379
-
重复以上操作直至创建好3个Redis节点
-
在Home目录新建test目录
mkdir testcd test/
-
拷贝Redis所有节点的配置文件到当前目录
cp /etc/redis/* ./
-
修改配置文件
为了方便观看日志,我们需要将Redis设置为前台服务形式,需要将daemonize配置关掉,将日志文件配置关掉,让日志显示在前台
vi 6379.conf
找到
GENERAL
模块,将daemonize yes
改为daemonize no
将
logfile /var/log/redis_6379.log
配置注释掉#logfile /var/log/redis_6379.log
关闭AOF日志 找到
APPEND ONLY MDOE
模块,将appendonly yes
改为appendonly no
⚠️如果你想用远程工具连接用的话那得配置密码
找到
bind 127.0.0.1
将这行注释掉,因为这里的bind指的是只有指定的网段才能访问这个redis 注释掉后,就没有这个限制了或者bind自己需要配置的网段 找到protected-mode
设置为no
在redis3.2.3版本后默认是设置成yes的,防止了远程访问 找到requirepass foobared
将前面#号去掉,并将foobared
改为自己的密码如果设置了密码 那就需要将
REPLICATION
模块中的masterauth
参数配置成主节点实例的密码,比如我们即将把6379实例
做成主节点,6380
节点和6381
节点追加到6379
节点作为从节点,那就在6380.conf
和6381.conf
中将masterauth
参数配置成6379实例
的密码修改完按Esc输入
:wq
保存并退出编辑 -
修改
6380.conf
和6381.conf
重复上面操作修改即可vi 6380.conf vi 6381.conf
-
删除三个节点相应的持久化目录
咱们图省事直接全删掉,然后再创建对应的三个目录即可
rm -rf /var/lib/redis/*mkdir /var/lib/redis/6379mkdir /var/lib/redis/6380mkdir /var/lib/redis/6381
检查一下是否成功清除相关文件,并重新创建对应目录
ls -ll /var/lib/redis/
-
启动三个Redis节点(建议开多个窗口方便观察与后续操作)
redis-server ~/test/6379.confredis-server ~/test/6380.confredis-server ~/test/6381.conf
-
启动3个节点的客户端
再开3个窗口分别启动
6379
、6380
、6381
的客户端如果没有设置密码则直接
redis-cli -p 端口号
即可redis-cli -p 6379 -a 密码redis-cli -p 6380 -a 密码redis-cli -p 6381 -a 密码
-
主备节点设置
先来了解一下
SLAVEOF
指令随便在那个节点的Redis客户端命令行输入
help SLAVEOF
127.0.0.1:6379> help SLAVEOF#v5.0以前用 SLAVEOF 主机 端口SLAVEOF host port#使服务器成为另一个节点的副本,或将其提升为主服务器。从Redis 5开始已弃用。使用REPLICAOF代替。#我们使用的是v6.0.6 那可以用 'REPLICAOF' 指令summary: Make the server a replica of another instance, or promote it as master. Deprecated starting with Redis 5. Use REPLICAOF instead.since: 1.0.0group: server
将
6380节点
追加为6379节点的
从节点127.0.0.1:6380> REPLICAOF localhost 6379OK
查看
6379
节点日志输出内容#副本127.0.0.1:6380请求同步Replica 127.0.0.1:6380 asks for synchronization#启动BGSAVE(后台落RDB)与目标:磁盘同步Starting BGSAVE for SYNC with target: disk#后台保存启动pid 29096Background saving started by pid 29096#DB保存在磁盘上DB saved on disk#RDB:写时拷贝占用4mb内存RDB: 4 MB of memory used by copy-on-write#成功结束后台保存Background saving terminated with success#同步副本127.0.0.1:6380成功Synchronization with replica 127.0.0.1:6380 succeeded
查看
6380
节点日志输出内容#连接到MASTER节点 127.0.0.1:6379Connecting to MASTER 127.0.0.1:6379#主节点开始向从节点同步MASTER <-> REPLICA sync: receiving 175 bytes from master to disk#删除从节点老数据MASTER <-> REPLICA sync: Flushing old data#在内存中加载DBMASTER <-> REPLICA sync: Loading DB in memory#RDB创建时占1.83 Mb内存RDB memory usage when created 1.83 Mb#主从同步成功MASTER <-> REPLICA sync: Finished with success
-
主从同步测试
分别在
6379
和6380
客户端执行keys *
命令目前两个节点中都是空的
127.0.0.1:6379> keys *(empty array)
127.0.0.1:6380> keys *(empty array)
在
6379
客户端进行set操作127.0.0.1:6379> set k1 aaaOK127.0.0.1:6379> keys *1) "k1"127.0.0.1:6379> get k1"aaa"
到
6380
客户端查看是否同步成功127.0.0.1:6380> keys *1) "k1"127.0.0.1:6380> get k1"aaa"
在主从模式下,从节点是禁止写入的,我们尝试在从节点中进行set操作看是否能成功
127.0.0.1:6380> set k2 aaa#不能对只读副本进行写操作(error) READONLY You can't write against a read only replica.
-
验证从节点同步前刷掉老数据
我们还剩一个
6381
节点没有追随6379
节点,我们先在6381
节点中set一条数据127.0.0.1:6381> keys *(empty array)127.0.0.1:6381> set k2 aaaOK127.0.0.1:6381> keys *1) "k2"127.0.0.1:6381> get k2"aaa"
将
6381
节点追随6379
节点127.0.0.1:6381> REPLICAOF 127.0.0.1 6379OK
追随成功后,主节点会将数据同步到从节点,我们再来查看从节点数据,看看k2还在不在
127.0.0.1:6381> keys *1) "k1"127.0.0.1:6381> get k1"aaa"
老的k2数据已经不存在了,说明主从同步发生前,从节点会将老数据刷掉
我们在来思考一个问题,如果这三个节点中,
6381
节点突然挂了,6379
节点还在不断地写数据,在短时间内再将6381
节点修复启动并直接追加为6379
的从节点,会是怎样的结果?会做增量复制吗? -
将
6381
节点停掉模拟挂掉往主节点
6379
中执行一批写操作127.0.0.1:6379> keys *1) "k1"127.0.0.1:6379> set k2 aaaOK127.0.0.1:6379> set k3 aaaOK127.0.0.1:6379> set k4 aaaOK127.0.0.1:6379> set k5 aaaOK127.0.0.1:6379> set k6 aaaOK127.0.0.1:6379> keys *1) "k6"2) "k1"3) "k5"4) "k3"5) "k2"6) "k4"
这时
6380
是能正常同步到主节点的数据的,我们看一下是不是这样的127.0.0.1:6380> keys *1) "k2"2) "k4"3) "k5"4) "k6"5) "k1"6) "k3"
-
将
6381
节点修复启动并直接追加为6379
的从节点redis-server ~/test/6381.conf --replicaof 127.0.0.1 6379
查看
6381
节点是否能同步到增量的数据127.0.0.1:6381> keys *1) "k5"2) "k3"3) "k2"4) "k6"5) "k4"6) "k1"
因此得到结论:从节点服务挂掉后,当从节点之前与主节点有过同步操作并且启动的时候直接追加为主节点的从节点,是可以触发增量复制的
-
怎么切换主节点呢?
假设6379挂了,我现在需要将6381追随到6380,将6380变为主节点
首先6380节点取消追随6379节点
127.0.0.1:6380> REPLICAOF no oneOK
再将6381节点追随到6380节点
127.0.0.1:6381> REPLICAOF 127.0.0.1 6380OK
PS:我们既然可以从主节点那里知道有没有新节点追加进来同步数据,那是不是也可以得到结论:其实是可以从主节点知道有多少个从节点的。