-
创建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 test
cd 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/6379
mkdir /var/lib/redis/6380
mkdir /var/lib/redis/6381
检查一下是否成功清除相关文件,并重新创建对应目录
ls -ll /var/lib/redis/
-
启动三个Redis节点(建议开多个窗口方便观察与后续操作)
redis-server ~/test/6379.conf
redis-server ~/test/6380.conf
redis-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
SLAVEOF host port
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.0
group: server
将6380节点
追加为6379节点的
从节点
127.0.0.1:6380> REPLICAOF localhost 6379
OK
查看6379
节点日志输出内容
Replica 127.0.0.1:6380 asks for synchronization
Starting BGSAVE for SYNC with target: disk
Background saving started by pid 29096
DB saved on disk
RDB: 4 MB of memory used by copy-on-write
Background saving terminated with success
Synchronization with replica 127.0.0.1:6380 succeeded
查看6380
节点日志输出内容
Connecting to MASTER 127.0.0.1:6379
MASTER <-> REPLICA sync: receiving 175 bytes from master to disk
MASTER <-> REPLICA sync: Flushing old data
MASTER <-> REPLICA sync: Loading DB in memory
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 aaa
OK
127.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 aaa
OK
127.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 6379
OK
追随成功后,主节点会将数据同步到从节点,我们再来查看从节点数据,看看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 aaa
OK
127.0.0.1:6379> set k3 aaa
OK
127.0.0.1:6379> set k4 aaa
OK
127.0.0.1:6379> set k5 aaa
OK
127.0.0.1:6379> set k6 aaa
OK
127.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 one
OK
再将6381节点追随到6380节点
127.0.0.1:6381> REPLICAOF 127.0.0.1 6380
OK