平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“redis主从复制配置文件怎么写?三个redis实例搭建教程”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
1.什么是复制
在这个场景下,单个redis的最大读同时发量为11万,最大写并发量为8.1万,但如果超过此上限怎么办?这是就需采取redis的复制策略
官网说明如下所示

在这个场景下,也就是我们常说的主从复制,主机更新后会根据设置和策略,自动同步到备用机的机制
2.作用
落到代码里,作用主要有两个,首先是读写分离,让写的操作在主机(Master)上执行(也能够读),让读的操作在从机(Slave)上执行(不能写)。
第二个作用是容灾(主从机保存的信息是一样的)
3.如何采用
理解这一步时,首先我们要准备多个redis,也就是准备多个启动redis的设置文件,这里准备三个设置文件来做实验
6379(主机)的设置文件:
# 端口号
port 6379
# 允许访问的ip地址
bind 0.0.0.0
# 是否设置为后台线程启动
daemonize yes
# rdb持久化策略
save 900 1
# 持久化文件的名称
dbfilename dump6379.rdb
# 持久化文件路径
dir ./
pidfile /var/run/redis_6379.pid
6380(从机)的设置文件:
port 6380
bind 0.0.0.0
daemonize yes
save 900 1
dbfilename dump6380.rdb
dir ./
pidfile /var/run/redis_6380.pid
# 设置为6379的从机
slaveof 127.0.0.1 6379
6381(从机)的设置文件:
port 6381
bind 0.0.0.0
daemonize yes
save 900 1
dbfilename dump6381.rdb
dir ./
pidfile /var/run/redis_6381.pid
# 设置为6379的从机
slaveof 127.0.0.1 6379
设置文件完成之后,我们来到bin目录下启动三个redis
./redis-server ../conf/redis-6379.conf
./redis-server ../conf/redis-6380.conf
./redis-server ../conf/redis-6381.conf

查看进程,至此我们已经成功设置完成主从复制
下面我们开始测试,我们进入6379主机,采用role命令查看主从关系

理解这一步时,能够看到6379的角色信息为master,同时且有两个从机6380和6381
我们在6379中写入一些信息
然后退出,来到6380和6381查看信息
6380:
6381:

能够看到,我们在主机中写入的数据也出现在了从机中,复制功能得以实现
现在,我们尝试在从机中读取数据与写入数据
能够看到,我们在从机中只能将数据读出,并不能将数据写入
我们还能够取消掉主从关系,将设置文件中的slaveof属性改为
SLAVEOF no one
即可实现
4.主从复制的原理
在这个场景下,在从机启动连接到主机后,会向主机发送一个sync命令,主机接收到此命令之后会启动后台的存盘进程,同事手机所有接收到的用来修改数据的命令,在后台进程执行完毕之后,主机会将整个数据文件发送给从机,至此完成一次全量复制;从机在接收到此文将之后,会将此文件存盘同时加载到内存中
后续的增量复制:主机会继续将所有收集到的修改命令传送给从机,继续完成同步。
从机一旦重新连接主机,一次全量复制就会立即执行

5.哨兵模式
在这个场景下,主从复制的一个作用就是用来容灾,但是在主机崩溃之后,虽然从机有备份,但是也就没有从机继续写入数据了,于是就有了这个哨兵模式
从实现思路看,哨兵模式下,如果主机崩溃了,就会让从机中的一个成为主机,从而保证读写功能的完整
6.实现哨兵模式
首先我们要定一个个哨兵的设置文件,文件名必须为sentinel.conf
# sentinel monitor 被监控主机名字(自己起名字) 主机ip 主机端口号 哨兵投票数
sentinel monitor host 127.0.0.1 6379 1
# 设置为后台进程
daemonize yes
在这个场景下,最后的哨兵投票数表示在有多少哨兵监视此主机的情况下,要有多少个哨兵认为此主机挂掉了,才,才会将从机切换为主机,此次试验只设置一个哨兵,故此处设置为1
设置文件完成之后我们在bin目录中采用redis-sentinel + 设置文件路径启动哨兵

理解这一步时,随后我们将主机6379干掉,模拟主机崩溃的情况,之后我们进入6380,采用role命令查看主从关系

结合项目来看,此时我们发现6380从原来的从机变成了主机,6381成为了6380的从机
此时我们查看设置文件
6380:

6381:
结合项目来看,我们发现6380的设置文件中没有了从机设置这一行,6381从机设置这一行被修改为了主机为6380
现在我们重启6379并进入,来查看一下效果

实际处理时,我们发现此时采用role查看角色,6379变成了6380的从机,同时且设置文件内容也变成了如下所示

理解这一步时,由此可得知,之前的主机崩溃之后,从机变为新的主机,原来的主机回来之后同时不会发生主机冲突,而是以从机的身份开启
总结
在这个场景下,总的来说,redis主从复制适合结合实际项目边做边理解。先抓住核心思路,再逐步补上细节和边界处理,最后效果会更稳定,也更容易复用。
