一,搭建主从架构
1.1 主从集群结构
单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。
主从集群架构如图:
1.2 准备实例和配置
在一台虚拟机开启3个实例,实例信息如下
| IP | port | 角色 |
|---|---|---|
| 192.168.150.101 | 7001 | master |
| 192.168.150.102 | 7002 | slave |
| 192.168.150.103 | 7003 | slave |
-
创建三个文件夹,用来存放三个redis的配置文件,数据存储文件,日志文件
mkdir 7001 7002 7003 cd 7001 mkdir conf data logs cd 7002 mkdir conf data logs cd 7003 mkdir conf data logs -
将redis.conf文件拷贝三份到三个目录里面
cp redis.conf 7001/conf cp redis.conf 7002/conf cp redis.conf 7003/conf -
修改每个配置文件里面的端口,工作目录,日志存放目录,关闭里面的AOF开启RDB
-
修改每个实例的声明ip
因为虚拟机本身有多个IP,为了防止混乱,我们需要在
redis.conf文件中指定每一个实例的绑定ip信息,格式如下# redis实例声明ip replica-announce-ip 192.168.150.101
1.3 启动
redis-server 7001/redis.conf
redis-server 7002/redis.conf
redis-server 7003/redis.conf
1.4 开启主从关系
现在三个实例还没有任何的关系,要配置主从可以使用replicaof或者slaveof(5.0以前)命令
有临时和永久两种模式:
-
修改配置文件(永久生效)
在从节点中的
redis.conf中添加一行:slaveof <masterIp><masterPort> -
使用redis-cli客户端执行
slaveof命令(重启后失效)slaveof masterIp masterPort
注意:在5.0以后新增replicaof效果和slaveof一样
1.5 测试
在7001主节点上的redis客户端执行
Info replication
即可查看是否链接成功
二,主从数据库同步原理
2.1 全量同步
master如何判断slave是不是第一次来同步数据?这里会用到两个很重要的概念:
- Replicationld:简称replid,是数据集的标记,id一致则说明是同一数据集。每一个master都有唯一的replid,slave则会继承master节点的replid
- offset:偏移量,随着记录在repl_baklog中的数据增多而逐渐增大。slave完成同步时也会记录当前同步的offset。如果slave的offset小于master的offset,说明slave数据落后于master,需要更新。
因此Slave做数据同步,必须向master声明自己的replication id和offset,master才可以判断到底需要同步哪些数据。
2.2 增量同步
可以从以下几个方面来优化Redis主从就集群:
- 在master中配置
repl-diskless-syncyes启用无磁盘复制,避免全量同步时的磁盘IO - Redis单节点上的内存占用不要太大,减少RDB导致的过多磁盘IO
- 适当提高repl_baklog的太小,发现slave宕机时尽快实现故障恢复,尽可能避免全量同步
- 限制一个master上的slave节点数量,如果实在是太多slave,则可以采用主-从-从链式结构,减少master压力