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 规避复制风暴

单主节点复制风暴,主节点重启,所有从节点复制

原文地址:https://www.cnblogs.com/zhangchaocoming/p/13051168.html