前言

本文旨在用最少文字,搭建一个精简的哨兵,希望对你有所帮助!

一、准备工作

1.安装6379/6380/6381三个实例

#cd /usr/src/redis-5.0.4/utils/ && ls 切换到解压目录下面的utils目录
#./install_server.sh   运行redis实例安装命令后,首行指定端口,然后一路回车即可


2.分别配置redis的conf文件,让redis服务在前台界面阻塞运行

#cd && mkdir test && cd test    在根目录下,创建test目录,并切换到test目录
#cp /etc/redis/*   ./    拷贝redis下的redis的三个实例的配置文件,到当前test目录

分别vim编辑test目录下的三个配置文件,仅修改3处即可

#vi 6379.conf  进入配置文件,调整日志信息(注释掉,启用日志)

appendonly yes  是否开启AOF,yes修改为no,暂时关掉AOF日志
daemonize yes   后台守护进程是否开启,yes修改为no,让其在前台阻塞运行
#logfile /var/log/redis_6379.log 注释掉日志记录,让其在前台打印

同理,分别参考上面的配置,对test目录下的 6380.conf 和 6381.conf修改并保存。

3.分别配置redis的三个哨兵文件

1.配置哨兵26379的配置

#cd && cd test
#vim 26379.conf  文件名称起一个有意义的,便于记忆区分,且统一的名称即可

配置文件中写入如下内容(精简版) 

port 23679
sentinel monitor mymaster 127.0.0.1 6379 2

配置释义:
port 配置哨兵的端口号
mymaster 是哨兵所在分组的名称
后面的IP+端口 是master的IP和端口
最后的2 ,意思是master被认为的宕机,需要选举新的master时,至少要争取到2票的赞同,否则故障不会自动转移

2.同理分别编辑另外两个哨兵的配置文件,26380和26381

#cp 23679.conf 23680.conf
#cp 23679.conf 23681.conf

#vi 23680.conf 编辑配置文件 把里面的端口号修改为23680
port 23680
sentinel monitor mymaster 127.0.0.1 6379 2

 #vi 23681.conf 编辑配置文件 把里面的端口号修改为23681
port 23681
sentinel monitor mymaster 127.0.0.1 6379 2

4.分别Ctrl+C关闭掉三个redis服务(重要准备工作)

如果,redis-server服务端界面已打开,可以直接Ctrl+C停掉各个服务。

如果,看不到运行界面可以用下面命令分别关闭,关闭时被提示已关闭(则忽略提示即可)

#service redis_6379 stop
#service redis_6380 stop
#service redis_6381 stop

5.主从复制务必会用的3个命令

1.slaveof 设置主从关系(v5.0之前)

127.0.0.1:6381> slaveof 127.0.0.1 6379  该命令可以在redis客户端启动后,在客户端使用
也可以单独在redis.conf中使用(一般会配置在各实例的配置文件中,如6380.conf)

2.replicaof 设置主从关系(v5.0之后)

1.在redis.conf配置文件中使用,比如6380.conf

replicaof 127.0.0.1 6379  

2.在redis客户端使用

127.0.0.1:6381> replicaof 127.0.0.1 6379    让6381归从于6379

 3.在redis-server服务端启动时,就指定主从关系

#redis-server /etc/redis/6381.conf --replicaof 127.0.0.1 6379  启动6381时就指定master6379

 3.slaveof no one 去除主从关系

127.0.0.1:6380>slaveof no one 去除主从关系后,从节点会重新变成主节点

4.info replication查看主从信息 

127.0.0.1:6381> info replication

5.info sentinel查看哨兵信息

#redis-cli -p 26379  查看哨兵信息,登录redis-cli客户端时,端口应该是哨兵的
127.0.0.1:26379>info sentinel

6. 哨兵的两种启动方式(都要指定哨兵配置文件位置)

#ll /usr/local/redis5/bin/  进入redis的安装目录,查看列表

Linux下的Redis主从配置 redis主从命令_配置文件

  

可以看到redis-sentinel哨兵服务,是redis-server服务的一个软链接,而,
redis-server命令本身,默认是启动redis服务的。
如果
redis-server佩带了 --sentinel,就不再是启动redis服务了,是纯粹的启动哨兵,格式如下: 

1.方式一:redis-server --sentinel 命令启动哨兵
#redis-server /path/to/sentinel.conf --sentinel
2.方式二:redis-sentinel命令启动哨兵
#redis-sentinel /path/to/sentinel.conf

二、分别在不同窗口启动三个redis server和sentinel

1.分别在不同窗口启动redis6379、6380、6381的服务端,并指定6379为master

#redis-server /root/test/6379.conf  启动master6379
#redis-server /root/test/6380.conf --replicaof 127.0.0.1 6379  启动slave 6380 
#redis-server /root/test/6381.conf --replicaof 127.0.0.1 6379  启动slave 6381

启动redis时,指明redis服务的配套配置文件,并指明所归属的master.

2.在三个新窗口,分别启动三个哨兵服务

#redis-server /root/test/26379.conf --serntinel 方法一启动哨兵26379
#redis-sentinel /root/test/26380.conf  方法二启动哨兵26380
#redis-sentinel /root/test/26381.conf  方法二启动哨兵26381

注:为了体现两种方式都可以启动哨兵,这里采用了两种方式,其运行结果都是一样的(redis-sentinel命令的本质也是redis-server命令)。

三、实验环节

1.模拟master6379宕机

界面切换到redis6379-server界面后,Ctrl+C停掉redis6379的server服务,模拟宕机。

Linux下的Redis主从配置 redis主从命令_数据库_02

 2.切回26379哨兵界面,查看master6379宕机后哨兵的通信情况

可以很清楚的看到哨兵的通信情况,如下:

6101:X 09 Nov 2021 07:44:01.695 # +sdown master mymaster 127.0.0.1 6379

 哨兵首次发现6379宕机了

6101:X 09 Nov 2021 07:44:01.763 # +odown master mymaster 127.0.0.1 6379 #quorum 2/2

已有两票认为6379宕机

6101:X 09 Nov 2021 07:44:01.763 # +try-failover master mymaster 127.0.0.1 6379

6101:X 09 Nov 2021 07:44:02.815 # +config-update-from sentinel e77f7ae3840b4b89e2cb5845276e32de2750346c 127.0.0.1 26380 @ mymaster 
127.0.0.1 6379

哨兵26380配置文件更新 

6101:X 09 Nov 2021 07:44:02.815 # +switch-master mymaster 127.0.0.1 6379 127.0.0.1 6380

新的master已被推选出来,是6380,master由原来的6379切换为6380 

6101:X 09 Nov 2021 07:44:02.815 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
6101:X 09 Nov 2021 07:44:02.816 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380
6101:X 09 Nov 2021 07:44:32.832 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380

让6381和6379追随新的master6380,并指明6379是sdown 状态。
注:如果手动启动6379server服务后,6379会自动关联6380.

Linux下的Redis主从配置 redis主从命令_数据库_03

3.哨兵经过内部一番讨论,推举6380为新的master

1.开启6380客户端,设置新的key,看6381能否收到

#redis-cli -p 6380
127.0.0.1:6380> keys *
1) "k1"
127.0.0.1:6380> set k2 aaa
OK
127.0.0.1:6380>

2.新打开一个窗口,开启6381客户端

#redis-cli -p 6381
127.0.0.1:6381> keys *
1) "k1"
2) "k2"
127.0.0.1:6381> get k2  很明显,新的maser6380的数据同步给了6381
"aaa"
127.0.0.1:6381>

4.新开窗口,看26379.conf,发现哨兵会自动更新配置文件

#cd && cd test && ls 切换到位置文件所在目录 
#vim 26379.conf 查看26379哨兵的配置文件

26379.conf初始配置内容只有2行,6379宕机后,哨兵会自动更新配置内容,并指定新的master 

Linux下的Redis主从配置 redis主从命令_Linux下的Redis主从配置_04

 5.哨兵通信原理,是发布订阅,看一下redis哨兵在聊什么事儿

127.0.0.1:6381>PSUBSCRIBE * 监控任何通道,回车后,看到哨兵一直在聊天

Linux下的Redis主从配置 redis主从命令_数据库_05

所有的哨兵,都在监控master,哨兵可以从master中取出从的信息,并通过发布订阅,来发现其他哨兵。

尾言

至此,一个精简的哨兵搭建,演示完毕,如果还是意犹未尽,可以自己在中间环节,在master宕机之前,添加一些数据,等各种实验,来满足自己的好奇心。
哨兵的配置,不只有port和monitor两个选项,还有很多,下面以附注的形式献上。

附注:哨兵参数介绍 

1.哨兵默认配置文件sentinel.conf 位置

#cd /usr/src/redis-5.0.4/ && ls  默认配置文件在解压目录的根目录下

Linux下的Redis主从配置 redis主从命令_配置文件_06

2.哨兵配置关键参数 

1.port 26379:对外服务端口号

2.daemonize no 是否后台阻塞运行

daemonize no
yes 则代表,后台运行,打印信息保存到日志中
no 代表前台阻塞运行,所有运行信息都打印到前台界面控制台

3.dir /tmp:存储哨兵的工作信息

4.sentinel monitor 哨兵的监控对象的名称、IP、端口 以及需要被动下台的票数

sentinel monitor mymaster 127.0.0.1 6379 2
监控的是谁,名字(mymaster)可以自定义,后边的 2 代表的是,如果有俩个哨兵判断这个主节点挂了那这个主节点就挂了,通常设置为哨兵个数一半加一。

5.sentinel down-after-milliseconds 设置主节点多长时间没有响应就代表挂了

sentinel down-after-milliseconds mymaster 30000:哨兵连接主节点多长时间没有响应就代表挂了。后边 30000 是毫秒,也就是 30 秒。

6.sentinel parallel-syncs 故障转移时,最多有多少个从节点对新的主节点进行同步

sentinel parallel-syncs mymaster 1:这个配置项是指在故障转移时,最多有多少个从节点对新的主节点进行同步。

这个值越小完成故障转移的时间就越长,这个值越大就意味着越多的从节点因为同步数据而不可用。

7.sentinel failover-timeout 同步的过程中,多长时间完成算有效

sentinel failover-timeout mymaster 180000:在进行同步的过程中,多长时间完成算有效,系统默认值是 3 分钟。