Redis 主从复制的原理请参看:快来学Redis | 主从复制的原理及简单验证
Redis 配置主从架构的两种方式
第一种方式
在redis.conf
中设置 slaveof:slaveof <masterip> <masterport>
第二种方式
使用redis-cli
客户端连接到 Redis 服务,执行slaveof
命令:slaveof <masterip> <masterport>
注意:第二种方式在重启后将失去主从复制关系。
为了方便,我们这里使用第二种方式设置主从。
主从架构
Redis主从架构拓扑图结构
主从结构搭建
Redis 集群不用安装多个 Redis,只需复制多个配置文件,修改即可。(即启动多个实例)
Redis 的安装请参看:快来学Redis | Linux下的安装
安装好 Redis 后,复制三份配置文件:
[root@peipei3514 /]# cp /usr/local/redis/redis.conf /usr/local/redis/redis6379.conf
[root@peipei3514 /]# cp /usr/local/redis/redis.conf /usr/local/redis/redis6380.conf
[root@peipei3514 /]# cp /usr/local/redis/redis.conf /usr/local/redis/redis6381.conf
分别修改配置文件:
[root@peipei3514 /]# vim /usr/local/redis/redis6379.conf
# 设置可访问的子网
bind 127.0.0.1 192.168.1.128
# 修改监听端口为6379
port 6379
# 修改pidfile指向路径
pidfile /var/run/redis_6379.pid
# 设置日志级别为 verbose,方便观看日志信息
loglevel verbose
# 设置日志文件
logfile /usr/local/redis/logs/redis6379.log
# The filename where to dump the DB
dbfilename dump6379.rdb
# 设置从节点的优先级。设置成不同的优先级
slave-priority 100
以此类推,修改端口 6380 及 6381 的配置。
分别启动三个Redis实例
[root@peipei3514 /]# /usr/local/redis/bin/redis-server /usr/local/redis/redis6379.conf
[root@peipei3514 /]# /usr/local/redis/bin/redis-server /usr/local/redis/redis6380.conf
[root@peipei3514 /]# /usr/local/redis/bin/redis-server /usr/local/redis/redis6381.conf
[root@peipei3514 /]# ps -ef | grep redis-server
root 1582 1 0 16:31 ? 00:00:00 /usr/local/redis/bin/redis-server 127.0.0.1:6379
root 1588 1 0 16:31 ? 00:00:00 /usr/local/redis/bin/redis-server 127.0.0.1:6380
root 1593 1 0 16:31 ? 00:00:00 /usr/local/redis/bin/redis-server 127.0.0.1:6381
root 1600 1297 0 16:32 pts/0 00:00:00 grep --color=auto redis-server
设置主从
# 使用Redis客户端连接上6380端口
[root@peipei3514 /]# /usr/local/redis/bin/redis-cli -h 192.168.1.128 -p 6380
# 设置6380端口Redis为6379的从
192.168.1.128:6380> slaveof 192.168.1.128 6379
OK
192.168.1.128:6380>
# 使用Redis客户端连接上6381端口
[root@peipei3514 /]# /usr/local/redis/bin/redis-cli -h 192.168.1.128 -p 6381
# 设置6381端口Redis为6379的从
192.168.1.128:6381> slaveof 192.168.1.128 6379
OK
查看 Redis 主从关系
[root@peipei3514 /]# /usr/local/redis/bin/redis-cli -h 192.168.1.128 -p 6379
192.168.1.128:6379> info replication
# Replication
role:master # 主节点
connected_slaves:2 # 从库的数量
slave0:ip=127.0.0.1,port=6380,state=online,offset=616,lag=0 # 从库信息
slave1:ip=127.0.0.1,port=6381,state=online,offset=616,lag=0 # 从库信息
master_replid:a49137c1d3f3f7707e1ac5d51a8fba3fd549f301
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:616
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:616
测试
# 在主库写入数据
[root@peipei3514 /]# /usr/local/redis/bin/redis-cli -h 192.168.1.128 -p 6379
192.168.1.128:6379> set lpf liupeifeng
OK
# 在从库读取数据
[root@peipei3514 /]# /usr/local/redis/bin/redis-cli -h 192.168.1.128 -p 6380
192.168.1.128:6380> get lpf
"liupeifeng"
192.168.1.128:6380>
主从从架构
Redis 主从从架构拓扑图结构
主从从架构搭建
Redis 的主从架构的缺点是所有的 slave 节点数据的复制和同步都由 master 节点来处理,会造成 master 节点压力太大,所以我们使用主从从结构来处理。
前面步骤同主从架构一致,只是在设置主从结构时,设置 6380 为 6379 的从,6381 为 6380 的从。
设置主从
[root@peipei3514 /]# /usr/local/redis/bin/redis-cli -h 192.168.1.128 -p 6380
192.168.1.128:6380> slaveof 192.168.1.128 6379
OK
[root@peipei3514 /]# /usr/local/redis/bin/redis-cli -h 192.168.1.128 -p 6381
192.168.1.128:6381> slaveof 192.168.1.128 6380
OK
查看主从从架构信息
[root@peipei3514 /]# /usr/local/redis/bin/redis-cli -h 192.168.1.128 -p 6379
192.168.1.128:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=84,lag=1
master_replid:1773b4b399bed6c3bf53b1504f51e52a11dbdedc
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:84
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:84
[root@peipei3514 /]# /usr/local/redis/bin/redis-cli -h 192.168.1.128 -p 6380
192.168.1.128:6380> info replication
# Replication
role:slave
master_host:192.168.1.128
master_port:6379
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_repl_offset:84
slave_priority:10
slave_read_only:1
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=84,lag=1
master_replid:1773b4b399bed6c3bf53b1504f51e52a11dbdedc
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:84
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:84
测试
# 在主库写入数据
[root@peipei3514 /]# /usr/local/redis/bin/redis-cli -h 192.168.1.128 -p 6379
192.168.1.128:6379> set lpf01 liupeifeng01
OK
# 在从库读取数据
[root@peipei3514 /]# /usr/local/redis/bin/redis-cli -h 192.168.1.128 -p 6380
192.168.1.128:6380> get lpf01
"liupeifeng01"
# 在从库读取数据
[root@peipei3514 /]# /usr/local/redis/bin/redis-cli -h 192.168.1.128 -p 6381
192.168.1.128:6381> get lpf01
"liupeifeng01"
注意事项
事项一
默认情况下 Redis 数据库充当 slave 角色时是只读的,不能进行写操作。可以在配置文件中开启非只读:slave-read-only no
事项二
通过前面的《快来学Redis | 主从复制的原理及简单验证》复制过程我们了解到,主库接收到SYNC
的命令时会执行RDB
过程,即使在配置文件中禁用RDB
持久化也会生成,那么如果主库所在的服务器磁盘IO性能较差,那么这个复制过程就会出现瓶颈,庆幸的是,Redis在2.8.18版本开始实现了无磁盘复制功能(不过该功能还是处于试验阶段)。
原理:Redis 在与从数据库进行复制初始化时将不会将快照存储到磁盘,而是直接通过网络发送给从数据库,避免了IO性能差问题。
开启无磁盘复制:repl-diskless-sync yes
事项三
如果要取消 Redis 主从关系,可以在对应的从库执行SLAVEOF NO ONE
命令,取消主从关系。
参考文章: