1 . 哨兵模式拓扑 与 简介
本文介绍如何搭建 单主双从 多哨兵模式的搭建
哨兵有12个作用 。通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。
当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。
然而一个哨兵进程对Redis服务器进行监控,可能会出现问题,为此,我们可以使用多个哨兵进行监控。各个哨兵之间还会进行监控,这样就形成了多哨兵模式。
假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover(故障切换)过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象成为主观下线。当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称
2. 搭建过程--主从服务器
2.1 首先要在各个服务器上装上redis服务器
2.2 节点规划
6301:主
6302:从
6303:从
26301:哨兵模式节点一
2.3 切换到redis的根目录 ,建立redis-group
mkdir redis-group
cp redis.conf ./redis-group/redis-6301.conf
cp redis.conf ./redis-group/redis-6302.conf
cp redis.conf ./redis-group/redis-6303.conf
2.4 分别修改配置文件
先修改redis-6301.conf 配置文件 6301是主服务器
vi redis-6301.conf
将参数的值改为以下
daemonize yes
pidfile /var/run/redis6301.pid
port 6301
logfile "/logs/6301.log"
dbfilename dump6301.rdb
requirepass pp123
再修改从服务器 ,redis-6302.conf和redis-6303.conf , 这些选项一般都有, 只需去掉前面的 ‘#’ 即可 。 日志要配置好,这样能使自己更快发现问题
vi redis-6302.conf
daemonize yes
pidfile /var/run/redis6302.pid
port 6302
logfile "/logs/6302.log"
dbfilename dump6302.rdb
slaveof 47.98.0.1 6301
==========================
vi redis-6303.conf
daemonize yes
pidfile /var/run/redis6303.pid
port 6303
logfile "/logs/6303.log"
dbfilename dump6303.rdb
slaveof 47.98.0.1 6301
若主服务器设置了访问密码,还需要设置
masterauth 123456(主服务器的密码)
2.5 启动这些服务器
./redis-server ../redis-group/redis-6301.conf
./redis-server ../redis-group/redis-6302.conf
./redis-server ../redis-group/redis-6303.conf
2.6 验证一下主从关系是否搭建成功
redis-cli -p 6301
redis-cli -p 6302
redis-cli -p 6303
输入 info replication 可以看到相关信息

我们在 6301 里set入一个变量 ,看看6302 和 6302 是否可以get到
> ./redis-cli -p 6301
127.0.0.1:6301> set monkey 123
OK
> ./redis-cli -p 6302
127.0.0.1:6302> get monkey
"123"
> ./redis-cli -p 6303
127.0.0.1:6303> get monkey
"123"
那么可以确定主从关系是已经搭建好了。
3. 哨兵模式
搭建了主从 ,要实现高可用 ,还得建立哨兵模式
3.1 复制 redis根目录下的 sentinel.conf 到 redis-group 下
cp sentinel.conf ./redis-group
3.2 修改和调整以下设置
port 26301
#工作路径,注意路径不要和主重复
dir "/usr/local/redis-6379"
daemonize yes
#关闭保护模式
protected-mode no
# 指明日志文件名
logfile "/logs/sentinel.log"
#哨兵监控的master,主从配置一样,这里只用输入redis主节点的ip/port和法定人数。
sentinel monitor mymaster 47.98.0.1 6301 1
#设置master和slaves验证密码
sentinel auth-pass mymaster 123 (如果redis没设置密码,则不用设置)
#这个配置项指定了需要多少失效时间,一个master才会被这个sentinel主观地认为是不可用的。 单位是毫秒,默认为30秒 ,这里设置为5秒
sentinel down-after-milliseconds mymaster 5000
3.3 启动哨兵
cd src
./redis-sentinel ../redis-group/sentinel.conf
启动后开下日志
tail -f sentinel.log

4 . 可能会遇到的一些问题
4.1 sentinel 不能自动选举出新的master并,出现 failover-abort-no-good-slave 错误
修改redis.conf
三台全部修改为
bind 0.0.0.0 问题解决
4.2 master挂掉后如何恢复
一般挂掉重启后会变成slave ,但是进去后会发现与master的连线是 down的

此时我们需要手动修改 ,在配置文件里加上
slaveof x.x.x.x 6301
masterauth 123456
首先我们要在新的master上save操作
#save
ok
如果我们需要把down掉的master 重新恢复成master 就需要 复制 当前master的 dump.rdb 和 appendonly.aof , 覆盖 down掉的 master 的 dump.rdb 和 appendonly.aof
cp dump.rdb appendonly.aof ../master_redis
然后再重新启动 。
启动请先检查配置文件 ,因为哨兵模式下 ,故障切换过程中,哨兵进程会自动修改配置文件 。
比如 down掉的master 重新启动后 会在配置文件下加上
slaveof x.x.x.x 6302
所以当配置好哨兵模式后最好先备份一下,可以参考这个文章
https://www.cnblogs.com/xiao-xue-di/p/11102315.html
4.3 从机挂了怎么办
直接重启动后 自动数据同步
4.4 从机日志 出现Unable to AUTH to MASTER: -ERR Client sent AUTH, but no password is set , master_link_status: down 怎么办
由于安全模式 protected-mode yes
所以redis规定 主从之间通讯需要设置密码
所以必须在master设置一个密码
requirepass 123456
从机上
masterauth 123456
5. 例子使用 tp6 如何调用
检查本地缓存的 master ip port, 有则connect 下,失败则去轮询哨兵查询正式的主库地址
$redis = new \Redis();
$redis->connect(Config::get('redisset','host'),Config::get('redisset','port'));
$redis->auth('pp123');
$res = $redis->ping();
if($res == '+PONG'){
$redis->set('testname','sanshang');
$redis->close();
}else{
//查询哨兵
$redis->connect(Config::get('redisset','soshost'),Config::get('redisset','port'));
$result = $redis->rawCommand('SENTINEL', 'master', 'mymaster');
$redis->connect($result['3'],$result['5']);
$redis->set('testname','sanshang');
$redis->close();
}