前言
本文旨在用最少文字,搭建一个精简的哨兵,希望对你有所帮助!
一、准备工作
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的安装目录,查看列表
可以看到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服务,模拟宕机。
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.
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
5.哨兵通信原理,是发布订阅,看一下redis哨兵在聊什么事儿
127.0.0.1:6381>PSUBSCRIBE * 监控任何通道,回车后,看到哨兵一直在聊天
所有的哨兵,都在监控master,哨兵可以从master中取出从的信息,并通过发布订阅,来发现其他哨兵。
尾言
至此,一个精简的哨兵搭建,演示完毕,如果还是意犹未尽,可以自己在中间环节,在master宕机之前,添加一些数据,等各种实验,来满足自己的好奇心。
哨兵的配置,不只有port和monitor两个选项,还有很多,下面以附注的形式献上。
附注:哨兵参数介绍
1.哨兵默认配置文件sentinel.conf 位置
#cd /usr/src/redis-5.0.4/ && ls 默认配置文件在解压目录的根目录下
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 分钟。