Redis主从架构搭建(Centos7+)
![](https://i-blog.csdnimg.cn/blog_migrate/af2e98b2e04823616c045150821ed8fc.png)
gcc安装
yum install -y gcc
下载Redis5.0.3安装包
wget http://download.redis.io/releases/redis‐5.0.3.tar.gz
解压安装包到/usr/local下
tar -zxvf redis‐5.0.3.tar.gz -C /usr/local
mv /usr/local/redis-5.0.3 /usr/local/redis
编译解压的安装包
cd /usr/local/redis
make
master节点配置&启动
修改配置文件
复制redis.conf文件为redis-master.conf,修改redis-master.conf配置文件
daemonize yes #后台启动
protected‐mode no #关闭保护模式,开启的话,只有本机才可以访问redis
# 需要注释掉bind
#bind 127.0.0.1(bind绑定的是自己机器网卡的ip,如果有多块网卡可以配多个ip,代表允许客户端通过机器的哪些网卡ip去访问,内网一般可以不配置bind,注释掉即可)
# 开启AOF
appendonly yes
# The name of the append only file (default: "appendonly.aof")
appendfilename "appendonly.aof"
# 开启混合存储
aof-use-rdb-preamble yes
# slave-1进程号写入pidfile配置文件
pidfile /var/run/redis_master_6379.pid
# 配置master 日志文件
logfile "redis-master-6379.log"
# 指定数据存放目录
dir ./data/master
启动master服务
src/redis-server redis-master.conf
slave-1节点配置&启动
修改配置文件
复制redis.conf文件为redis-slave-1.conf,修改redis-slave-1.conf配置文件
daemonize yes #后台启动
# 配置slave-1端口
port 6380
protected‐mode no #关闭保护模式,开启的话,只有本机才可以访问redis
# 需要注释掉bind
#bind 127.0.0.1(bind绑定的是自己机器网卡的ip,如果有多块网卡可以配多个ip,代表允许客户端通过机器的哪些网卡ip去访问,内网一般可以不配置bind,注释掉即可)
# 开启AOF
appendonly yes
# The name of the append only file (default: "appendonly.aof")
appendfilename "appendonly.aof"
# 开启混合存储
aof-use-rdb-preamble yes
# slave-1进程号写入pidfile配置文件
pidfile /var/run/redis_slave_6380.pid
# 配置slave-1 日志文件
logfile "redis-slave-6380.log"
# 指定数据存放目录
dir ./data/slave-1
# 从本机6379的redis实例复制数据,Redis 5.0之前使用slaveof
replicaof 192.168.68.100 6379
# 配置从节点只读
replica-read-only yes
启动slave-1服务
src/redis-server redis-slave-1.conf
slave-2节点配置&启动
修改配置文件
复制redis.conf文件为redis-slave-2.conf,修改redis-slave-2.conf配置文件
daemonize yes #后台启动
# 配置slave-1端口
port 6381
protected‐mode no #关闭保护模式,开启的话,只有本机才可以访问redis
# 需要注释掉bind
#bind 127.0.0.1(bind绑定的是自己机器网卡的ip,如果有多块网卡可以配多个ip,代表允许客户端通过机器的哪些网卡ip去访问,内网一般可以不配置bind,注释掉即可)
# 开启AOF
appendonly yes
# The name of the append only file (default: "appendonly.aof")
appendfilename "appendonly.aof"
# 开启混合存储
aof-use-rdb-preamble yes
# slave-1进程号写入pidfile配置文件
pidfile /var/run/redis_slave_6381.pid
# 配置slave-2 日志文件
logfile "redis-slave-6381.log"
# 指定数据存放目录
dir ./data/slave-2
# 从本机6379的redis实例复制数据,Redis 5.0之前使用slaveof
replicaof 192.168.68.100 6379
# 配置从节点只读
replica-read-only yes
启动slave-2服务
src/redis-server redis-slave-2.conf
Redis 主从架构工作原理
为master节点配置一个slave节点,slave节点启动后,会发送一个PSYNC命令给master节点请求复制数据,master节点收到PSYNC命令后,会在后台fork一个bgsave子进程生成最新的rbd快照文件,在生成rbd快照文件期间,master节点会继续接受客户端的请求,会把可能修改的数据集缓存到内存中,当完成rbd快照文件生成后,master节点会把这份文件发送给slave节点,slave节点接收到rbd快照文件,把他加载到内存中,之后,master在将之前缓存在内存中的命令发送给slave节点。
![](https://i-blog.csdnimg.cn/blog_migrate/36b73f7f6eb1cec6950c98f1efe07f4f.png)
主从数据部分复制
当master节点和slave节点断开重连后,一般都会对整份数据进行复制同步。从Redis 2.8版本开始,Redis改用可以支持部分数据复制的命令PSYNC去master节点同步数据,slage与master能够在网络连接断开重连后只进行部分数据复制(断点续传)。master会在其内存中创建一个复制数据用的缓存队列,缓存最近一段时间的数据,master和它所有的slave都维护了复制的数据下标offset和master的进程id,因此,当网络连接断开后,slave会请求master继续进行未完成的复制,从所记录的数据下标开始。如果master进程id变化了,或者从节点数据下标offset太旧,已经不在master的缓存队列里了,那么将会进行一次全量数据的复制。
![](https://i-blog.csdnimg.cn/blog_migrate/e131b12ab49c4093afd74110c83a6821.png)
主从复制风暴
主从复制风暴:多个从节点同时复制主节点导致主节点压力过大。
解决方案:让部分从节点与从节点(与主节点同步)同步数据。
![](https://i-blog.csdnimg.cn/blog_migrate/0ef63e7380d638bef537cef90e968b15.png)