Redis主从复制原理与优化
目录
一 什么是主从复制
机器故障;容量瓶颈;QPS瓶颈
一主一从,一主多从
做读写分离
做数据副本
扩展数据性能
一个master可以有多个slave
一个slave只能有一个master
数据流向是单向的,从master到slave
二 一主一从搭建
2.1 slave 命令
slaveof 0.0.0.0 6379 # 成为6379的从库 也可以在6378的客户端连入以后执行这句话,就跟在主配置文件一样,只不过挂掉要重新执行。
slaveof no one # 配置文件配入此句话或客户端连入直接执行此命令 取消主从复制的关系,不会把之前的数据清除,从库就可以写入了。
slave-read-only yes # 从节点只读,因为可读可写,数据会乱 在从的配置文件添加
# 注意:在设置了主从复制(slaveof 0.0.0.0 6379),从库就不能写入只能读,和mysql的主从有点区别,mysql在从库也能写,同步到主库和其他从库。
2.2 主从的配置文件 (机器安装redis实现主从)
# 我的服务都放在一个独立的文件夹 把redis下载解压编译安装在/soft/redis中了
# 1.主redis 6379端口的配置文件
cp redis.conf redis.conf_back # 做了备份,我们修改备份配置,并在6379端口启动主redis
# -------------------------------------------
daemonize yes
pidfile /var/run/redis.pid
port 6379
dir "/opt/soft/redis/data" # “6379.log”(aof) dump.rdb
logfile “6379.log”
bind 0.0.0.0 # 任何ip都能访问,也可以写自己服务器的公网IP
protected-mode no # 取消保护模式,不然外界访问不到。
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite yes
# ----------------------------------------------
mkdir -p /opt/soft/redis/data # 将redis持久化文件放在 /opt/soft/redis/data
# 2. 从redis 6378端口的配置文件
cp redis.conf re_slave1.conf
# -------------------------------------------------------
# copy的内容只保留以下内容:
daemonize yes
pidfile /var/run/redis.pid
port 6378
dir "/opt/soft/redis/slave1_data" # “6378.log”(aof) dump.rdb
logfile “6378.log”
bind 0.0.0.0
protected-mode no
slaveof 47.92.167.108 6379 # 主从同步,在主redis增删数据,从库同步
slave-read-only yes # 从库只读
# -------------------------------------------------------
mkdir -p /opt/soft/redis/slave1_data # 将从redis持久化文件放在 /opt/soft/redis/slave1_data文件夹内
# 3.启动主从redis 在redis当前文件夹下启动
redis-server ./redis.conf_back # 启动主redis
redis-server ./re_slave1.conf # 启动从redis
# 4.客户端分别连入6379,6378 端口
redis-cli -p 6379
redis-cli -p 6378
# 5. 在主redis客户端写入数据,从库此时就能收到了
127.0.0.1:6379> set sex '男'
OK
127.0.0.1:6379> set talk hello
OK
# ---------------------------------
127.0.0.1:6378> keys *
1) "age"
2) "name"
3) "sex"
127.0.0.1:6378> keys *
1) "age"
2) "name"
3) "talk"
4) "sex"
'''
只要做了从库配置启动从库的服务端,持久化文件就会生成。
如果要做一主多从的主从复制,就只需要将我们的re_slave1.conf文件复制一份修改端口,创建一个配置文件指定的dir再次启动就行了.
cp re_slave1.conf re_slave2.conf
vim re_slave2.conf
------------------------------------------
daemonize yes
pidfile /var/run/redis.pid
port 6377
dir "/opt/soft/redis/slave2_data"
logfile “6377.log”
bind 0.0.0.0
protected-mode no
slaveof 47.92.167.108 6379
slave-read-only yes
--------------------------------------------
redis-server ./re_slave2.conf
[root@sahala redis]# ps -ef |grep redis
root 4298 1 0 00:39 ? 00:00:03 redis-server 0.0.0.0:6379
root 18666 1 0 01:59 ? 00:00:00 redis-server 0.0.0.0:6378
root 21100 1 0 02:21 ? 00:00:00 redis-server 0.0.0.0:6377
root 21617 20669 0 02:21 pts/0 00:00:00 grep --color=auto redis
127.0.0.1:6377> redis-cli -p 6377
127.0.0.1:6377> keys *
1) "talk"
2) "name"
3) "age"
4) "sex"
'''
2.3 主从的配置文件 (机器安装docker拉去redis镜像实现主从)
# 创建主从redis配置(conf)文件夹和持久化(6379.log[类似mysql的binlog日志])文件夹data
mkdir -p redis1/conf redis1/data redis2/conf redis2/data redis3/conf redis3/data
# 启动三个redis 做端口映射 目录挂载 使用redis镜像 加要执行的命令 redis-server /etc/redis/redis.conf
docker run -p 6379:6379 --name redis_6379 -v /home/redis1/conf/redis.conf:/etc/redis/redis.conf -v /home/redis1/data:/data -d redis redis-server /etc/redis/redis.conf
docker run -di -p 6378:6379 --name redis_6378 -v /home/redis2/conf/redis.conf:/etc/redis/redis.conf -v /home/redis2/data:/data redis redis-server /etc/redis/redis.conf
docker run -di -p 6377:6379 --name redis_6377 -v /home/redis3/conf/redis.conf:/etc/redis/redis.conf -v /home/redis3/data:/data redis redis-server /etc/redis/redis.conf
四 故障处理
slave故障
master故障
五 复制常见问题
1 读写分离
读流量分摊到从节点
可能遇到问题:复制数据延迟,读到过期数据,从节点故障
2 主从配置不一致
maxmemory不一致:丢失数据
数据结构优化参数:主节点做了优化,从节点没有设置优化,会出现一些问题
3 规避全量复制
第一次全量复制,不可避免:小主节点,低峰(夜间)
节点运行id不匹配:主节点重启(运行id变化)
复制挤压缓冲区不足:增大复制缓冲区大小,rel_backlog_size
4 规避复制风暴
单主节点复制风暴,主节点重启,所有从节点复制