高可用如何搭建Redis哨兵机制

2019年04月03日 15:04

963

概述

哨兵机制的简介

有了主从复制的实现以后,如果想对主服务器进行监控,那么在redis2.6以后提供了一个"哨兵"的机制。顾名思义,哨兵的含义就是监控Redis系统的运行状态。可以启动多个哨兵,去监控Redis数据库的运行状态。其主要功能有两点:

1、监控主数据库和从数据库是否正常运行。

2、主数据库出现故障时,可以自动将从数据库转换为主数据库,实现自动切换。

一、架构图

一丶下载

首页地址:http://redis.io/

最新稳定版下载地址:http://download.redis.io/releases/redis-3.2.9.tar.gz

二、命令

三、配置

四、启动

五、查看

六、Sentinel(哨兵)配置

vi sentinel.conf

启动前:

port 26379

dir "/var/lib/redis/tmp" ###定义目录存放

sentinel auth-passmymaster vhreal ##密码

sentinel monitor mymaster 192.168.65.128 6379 2 ###监控mymaster(可自定义-但只能包括A-z 0-9和”._-”)

sentinel down-after-milliseconds mymaster 30000 ###mymaster多久不响应认为SDOWN

sentinel parallel-syncs mymaster 1 ###指定最大同时同步新maser配置的salve数量

sentinel failover-timeout mymaster 180000 ###2次failover切换时间

启动后(redis.con配置文件完全由sentinel控制,请不要再随意手动改动):

port 26379

dir "/var/lib/redis/tmp"

sentinel monitor mymaster 192.168.65.128 6379 2

sentinel config-epoch mymaster 18 ###确认mymater SDOWN时长

sentinel leader-epoch mymaster 18 ###同时一时间最多18个slave可同时更新配置,建议数字不要太大,以免影响正常对外提供服务

sentinel known-slave mymaster 192.168.65.129 6379 ###已知的slave

sentinel known-slave mymaster 192.168.65.130 6379 ###已知的slave

sentinel known-sentinel mymaster 192.168.65.130 26379 be964e6330ee1eaa9a6b5a97417e866448c0ae40 ###已知slave的唯一id

sentinel known-sentinel mymaster 192.168.65.129 26379 3e468037d5dda0bbd86adc3e47b29c04f2afe9e6 ###已知slave的唯一id

sentinel current-epoch 18 ####当前可同时同步的salve数最大同步阀值

开启sentinel

开启sentinel后会后redis.conf会由sentinel进行管理

# redis-server /etc/redis/sentinel.conf --sentinel &> /var/log/redis/sentinel.log &

七、常用命令

redis-cli

redis-server

auth

set key value

get key

八、问题解决

1、Redis主从配置异常解决:Error condition on socket for SYNC: Connection refused

Redis主从集群时,从服务器上的redis日志报错:

32677:S08Feb16:14:38.947*ConnectingtoMASTER172.168.10.70:637932677:S08Feb16:14:38.948*MASTER

解决方案:

在redis主服务器上的redis.conf中修改bind字段,将

bind 127.0.0.1

修改为

bind 0.0.0.0

又或者直接注释掉bind字段

# bind 127.0.0.1

原因:

如果redis主服务器绑定了127.0.0.1,那么跨服务器IP的访问就会失败,从服务器用IP和端口访问主的时候,主服务器发现本机6379端口绑在了127.0.0.1上,也就是只能本机才能访问,外部请求会被过滤,这是Linux的网络安全策略管理的。如果bind的IP地址是172.168.10.70,那么本机通过localhost和127.0.0.1、或者直接输入命令redis-cli登录本机redis也就会失败了。只能加上本机ip才能访问到。

所以,在研发、测试环境可以考虑bind 0.0.0.0,线上生产环境建议绑定IP地址。

2、(DENIED Redis is running in protected mode)

Java程序中使用JedisSentinelPool建立redis连接池

Set sentinels = new HashSet();

sentinels.add("172.17.16.7:26379");

sentinels.add("172.17.16.8:26379");

sentinels.add("172.17.16.9:26379");

JedisSentinelPool sentinelPool = new JedisSentinelPool("mymaster", sentinels, "123456");

报错:

DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients.......

使用redis-cli -h 127.0.0.1 -p 26379连接sentinel可以执行命令,而使用redis-cli -h 172.17.16.7 -p 26379连接sentinel执行命令则会报同上的错误。

查遍了网上没有找到相关的问题分析和解决的案例,所以只能自己猜测和排查,初步怀疑是通过172.17.16.7访问sentinel时受限。

由于此错误和redis server的protect-mode为yes的访问错误颇为相似,官方在redis.conf的注释说明中有protected-mode这一配置项,但sentinel.conf的注释中完全没有提到过该配置项,我很疑惑,但还是尝试在sentinel.conf中加入

protected-mode no

之后保存并重新启动sentinel,之后用Java程序建立连接池,没有报错,且可以对redis server进行数据处理,问题解决。


更多图灵学院Java高级架构师教程免费试听地址:https://ke.qq.com/course/230866?flowToken=1024841

加群即可领取图灵学院最新Java高级架构师教程资料学习包 群号:720856355