redis主从复制
前言
redis主从复制可以实现读写分离,主角色支持读写,从角色只读。
实现主从复制需要至少两个redis数据库,可以通过两种方案实现。
- 准备多个redis.config配置文件,配置不同的端口,通过使用不同的配置文件启动reids实现一机多库。
- 准备多台服务器,分别安装redis。
本次采用第二种方式,工作中基本也都是第二种方式,第一种方式的集群没有意义。
准备工作
- 使用虚拟机创建3台服务器(这里使用配置为centos7.3-x64),使用物理主机或者云服务器均可。
- 三台主机IP分别指定为
- 192.168.204.121(主)
- 192.168.204.122(从1)
- 192.168.204.123(从2)
- 分别为三台服务器安装redis(也可以通过scp命令将主服务器安装好的文件夹复制到从服务器,scp /.../redis-5.0.5 ip:/.../)
从服务器配置
配置主从复制只需要修改从服务器配置文件即可,主服务器无需配置。
- 修改从服务器配置文件
redis.config
[root@vm123 bin]# vim ../etc/redis.conf
// 追加以下配置 slaveof masterIP masterPort 保存并退出
slaveof 192.168.204.121 6379
// 启动从服务
[root@vm123 bin]# ./redis-server ../etc/redis.conf
45496:C 07 Aug 2020 00:03:15.162 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
45496:C 07 Aug 2020 00:03:15.162 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=45496, just started
45496:C 07 Aug 2020 00:03:15.162 # Configuration loaded
// 启动客户端,使用info查看角色,出现如下信息
[root@vm123 bin]# ./redis-cli -h 192.168.204.123
# Replication
role:slave // 角色:从
master_host:192.168.204.121 // 主IP
master_port:6379 // 主端口
- 重复1中操作对192.168.204.122服务器做同样配置。
- 启动主服务查看角色信息
# Replication
role:master // 角色:主
connected_slaves:2 // 从连接数:2
slave0:ip=192.168.204.122,port=6379,state=online,offset=1929,lag=1 // 从0信息
slave1:ip=192.168.204.123,port=6379,state=online,offset=1929,lag=0 // 从1信息
验证主从复制
- 初始化为空
// 主为空
192.168.204.121:6379> keys *
(empty list or set)
// 从1为空
192.168.204.122:6379> keys *
(empty list or set)
// 从2为空
192.168.204.123:6379> keys *
(empty list or set)
- 主写,从读
// 主
192.168.204.121:6379> set name zmc
OK
192.168.204.121:6379> get name
"zmc"
// 从1
192.168.204.122:6379> get name
"zmc"
// 从2
192.168.204.123:6379> get name
"zmc"
- 主删,从读
// 主
192.168.204.121:6379> del name
(integer) 1
192.168.204.121:6379> get name
(nil)
// 从1
192.168.204.122:6379> get name
(nil)
// 从2
192.168.204.123:6379> get name
(nil)
- 从写失败
// 从1
192.168.204.122:6379> set age 18
(error) READONLY You can't write against a read only replica.
// 从2
192.168.204.123:6379> set age 18
(error) READONLY You can't write against a read only replica.
Q&A
redis主从复制的配置很简单,抛开redis本身的问题,服务器之间通讯可能会发生以下问题,提供解决思路。
Q. 从服务器配置后,主服务器显示从服务器连接数为0.
A. 1. 查看从服务器指定IP和端口是否正确。
- 判断服务器是否在同一个网络里,使用ping和telnet测试ip和端口是否连通。
Q. 服务器间能ping通,且telnet其他端口(比如22)能通,而redis端口(默认6379)连接拒绝。
A. 1. 查看防火墙是否放开6379端口。
- 修改
redis.config
配置文件,将bind 127.0.0.1修改为IP后重启redis服务,再次尝试。
Q. 修改bind后客户端无法连接
A. 客户端默认使用127.0.0.1:6379,修改bind后启动客户端时使用 -h IP参数指定修改后的IP。