目录
前言
配置文件
启动服务
配置主从关系
两种配置方式
slaveof
配置文件
补充
缺点
认证
复制原理
全量同步
增量同步
前言
单机的 redis 的性能虽然已经很强大了,但是随着业务的扩展,总有一天会遇到性能瓶颈,针对高并发带来的性能问题,解决的思路其实就是将请求分散,用多个 redis 来处理请求。
具体的操作其实就是搭建一个简单的 redis 主从复制集群。使用 redis 主从复制集群,master 节点用来处理写请求,slave 节点用来处理读请求,当master数据变化时,自动将新的数据异步同步到slave节点上,实现读写分离。根据并发量的大小,动态扩展集群里的 slave 节点,实现水平化扩容
本文演示搭建一个 redis 主从复制集群(一主二从)的基本流程。
图方便省事,就在一台服务器上直接启动三个 redis 服务。
配置文件
创建 redis-replication 文件夹
mkdir redis-replication
将默认配置文件 redis.conf 放入 redis-replication,并修改其中几项配置
daemonize no 改为 daemonize yes
protected-mode yes 改为 protected-mode no 关闭保护模式
bind 127.0.0.1 直接注释掉,否则影响远程IP连接
创建 redis-7000.conf,写入以下内容
include redis.conf
pidfile /var/run/redis_7000.pid
port 7000
dbfilename dump_7000.rdb
appendfilename appendonly_7000.aof
replica-priority 90#logfile logs/access_7000.log
同理,创建 redis-7001.conf 和 redis-7002.conf,然后写入以上内容,将 7000 分别修改为 7001 和 7002,修改后文件夹如下所示
启动服务
在 redis-replication 目录下,依次启动服务
redis-server ./redis-7000.conf
redis-server ./redis-7001.conf
redis-server ./redis-7002.conf
配置主从关系
这里选择将 7000 端口的 redis 作为 master 节点
分别用三个终端,使用 redis-cli 连接 7000 7001 7002 的 redis
redis-cli -h 127.0.01 -p 7000
redis-cli -h 127.0.01 -p 7001
redis-cli -h 127.0.01 -p 7002
在 7001 和 7002 上使用 slaveof 命令,配置为 master 的 slave 节点
slaveof 127.0.0.1 7000
在 7000 上查看 slave 信息
info replication
这样一个一主二从的主从复制集群就搭建完成了
两种配置方式
slaveof
文中所示,启动服务后,使用 slaveof 命令来配置当前 redis 为指定 master 的从节点。这种配置方式当次生效,下次启动时则需要再次配置
#配置当前redis为指定master的slave节点
slaveof -h master地址 -p 端口
#升级为主机
slaveof no one
配置文件
在配置文件中配置 repllicaof,这种方式永久有效,不用每次启动都去配置主从关系
replicaof master主机地址 端口
补充
缺点
主从复制存在延迟,会出现数据不一致现象
master 节点宕机,不会自动选举 master 节点,需要人工干预
认证
如果为了安全,连接 redis 需要密码,那么在配置文件中也需要配置连接主机密码
节点各自的配置文件添加以下配置项
requirepass "此redis的密码"
masterauth "主节点的密码,如果为主节点,就是填自己的密码"
复制原理
全量同步
- Replication Id:每一个master都有唯一的replid,slave会继承master节点的replid
- offset:偏移量,如果slave的offset小于master的offset,说明slave数据落后与master,需要更新
plantuml
@startuml 'https://plantuml.com/sequence-diagram autonumber slave -> master: slaveof,建立连接 slave -> master: sync,请求同步数据 master -> slave: 第一次同步,返回master的数据版本(replid 和 offset) master -> master: bgsave,生成rdb master -> master: 同时记录rdb期间的所有命令(repl_backlog) master -> slave: 发送rdb文件 slave -> slave: 清空本地数据,加载rdb文件 master -> slave: 发送repl_baklog中的命令 slave -> slave: 执行接受到的命令 @enduml
时序图
增量同步
注意:repl_baklog大小有上限,写满后会覆盖最早的数据,如果slave断开时间过久,导致尚未备份的数据被覆盖,则无法基于log做增量同步,只能再次全量同步
plantuml
@startuml 'https://plantuml.com/sequence-diagram autonumber slave -> master: 发送replid与offset master -> master: 判断replid是否一致 master -> slave: 一致返回continue master -> slave: 发送repl_baklog中offset后的命令 slave -> slave: 执行接受到的命令 @enduml
时序图