redis主从复制

前言

redis主从复制可以实现读写分离,主角色支持读写,从角色只读。

实现主从复制需要至少两个redis数据库,可以通过两种方案实现。

  1. 准备多个redis.config配置文件,配置不同的端口,通过使用不同的配置文件启动reids实现一机多库。
  2. 准备多台服务器,分别安装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:/.../)

从服务器配置

配置主从复制只需要修改从服务器配置文件即可,主服务器无需配置。

  1. 修改从服务器配置文件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. 重复1中操作对192.168.204.122服务器做同样配置。
  2. 启动主服务查看角色信息
# 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信息

验证主从复制

  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)
  1. 主写,从读
// 主
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"
  1. 主删,从读
// 主
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. 从写失败
// 从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和端口是否正确。

  1. 判断服务器是否在同一个网络里,使用ping和telnet测试ip和端口是否连通。

Q. 服务器间能ping通,且telnet其他端口(比如22)能通,而redis端口(默认6379)连接拒绝。

A. 1. 查看防火墙是否放开6379端口。

  1. 修改redis.config配置文件,将bind 127.0.0.1修改为IP后重启redis服务,再次尝试。

Q. 修改bind后客户端无法连接

A. 客户端默认使用127.0.0.1:6379,修改bind后启动客户端时使用 -h IP参数指定修改后的IP。