安装:
这里对源码编译进行一下说明,本文实例的操作系统是Ubuntu16.04,使用Redis的版本是3.2.0。安装步骤如下:
下载源码包:w g et h tt p:/ /d o wn loa d.redis.io/releases/redis-3.2.0.tar.gz
安装依赖包:sudo apt-get install gcc tcl
解压编译 :
注意:这里很可能会在make test 这步出现一个错误:
[err]: Test replication partial resync: ok psync (diskless: yes, reconnect: 1) in tests/integration/replication-psync.tcl
Expected condition '[s -1 sync_partial_ok] > 0' to be true ([s -1 sync_partial_ok] > 0)
出现这个问题的原因可能是"测试点在配置比较低的机器上会因为超时而过不了",本文的环境是一个lxc的虚拟机。不过有2个方法可以避免:
到此redis编译安装完成。
编译文件的目录里有2个配置:
redis.conf、sentinel.conf,配置文件说明请见这篇文章。
本文测试的环境架构:
3个redis实例1主、2从、3sentinel。M:10.0.3.110、S:10.0.3.92、10.0.3.66,每个redis实例上配置一个sentinel实例。修改配置文件:
redis.conf
View Code
sentinel.conf
配置文件保存在 /etc/redis/目录下,按照配置文件创建相应的目录。和Redis 复制、Sentinel的搭建和原理说明这里不同的是各个redis实例都配置了密码访问的限制(requirepass)。
注意:当一个master配置需要密码才能连接时,客户端和slave在连接时都需要提供密码。master通过requirepass设置自身的密码,不提供密码无法连接到这个master。slave通过masterauth来设置访问master时的密码。客户端需要auth提供密码,但是当使用了sentinel时,由于一个master可能会变成一个slave,一个slave也可能会变成master,所以需要同时设置上述两个配置项,并且sentinel需要连接master和slave,需要设置参数:sentinel auth-pass <master_name> xxxxx。
创建redis用户和组,把配置文件里指定的目录均授权。
开启各个redis实例
注意:开启的时redis的日志会报几个WARNING:
WARNING说明:
建立好复制后(slaveof)开启各个sentinel实例
注意:这里出现一个问题,这个问题罪魁祸首是参数:protected-mode。看下日志:
从日志里可以看到,除了本地的sentinel正常,其他2个sentinel都主观不可用了(SDOWN),时间刚好15秒(down-after-milliseconds 15000),sentinel会向master发送心跳PING来确认master是否存活,如果master在“一定时间范围”内不回应PONG 或者是回复了一个错误消息,那么这个sentinel会主观地(单方面地)认为这个master已经不可用了(subjectively down, 也简称为SDOWN)。而这个down-after-milliseconds就是用来指定这个“一定时间范围”的,单位是毫秒。
通过时间点的判断可以看到,sentinel之间发现不了对方,导致SDOWN(从Redis 复制、Sentinel的搭建和原理说明里介绍的发现机制)。因为没有错误信息,这里找了半天原因都没发现什么问题。最后登陆sentinel上查看一下:
这里看到一大串的信息,总的就是在说redis在没有开启bind和密码的情况下,保护模式被开启。然后Redis的只接受来自环回IPv4和IPv6地址的连接。拒绝外部连接,使用户知道发生了什么错误。其实应该为用户提供了线索,而不是拒绝连接。具体的说明可以看作者的讨论,最后作者给出的建议是关闭保护模式:--portected-mode no。所以最后我们这里的错误信息可以得到解释:由于sentinel没有指定bind和密码访问,所以被开启了protected-mode保护模式,拒绝其他sentinel的连接。导致进入了ODWON。在sentinel.conf里加入:
问题得到解决。portected-mode是3.2被引入,默认开启。具体的信息如下:
开启sentinel,查看日志:(成功开启)
查看状态,验证sentinel是否建立成功。(任意登陆一个sentinel查看)
上面粗体的字说明sentinel开启成功。
测试:
注意:因为上面的虚拟机连不了邮件服务器,所以更换了环境。新环境:版本2.8.4,3个redis实例1主、2从、3sentinel。M:192.168.200.208<6379>、S:192.168.200.199、192.168.200.73,每个redis实例上配置一个sentinel<7379>实例。
① 查看:info
② 验证failover
kill 掉 master,通过日志查看是切换过程的信息:
start 老的master,通过日志查看:
更多的日志信息见上一篇文章。在sentinel里有个选项client-reconfig-script,接下来说明下。
failover脚本:高可用,通过参数 client-reconfig-script 指定脚本:failover发生时候执行的脚本。
该参数的解释:
返回的参数:
脚本的目的是在发生failover之后,发送邮件报警,并且把vip切换到新的master上,有点类似MySQL的MHA,脚本比较简单,没有做其他多余的判断,也可以根据复杂的情况加强这个脚本。实现方法:
①:首先在三台redis实例上建立信任用密码登陆。
这里需要注意:因为测试中的sentinel实例和redis实例是放一起的,要是本地的sentinel要操作(down,up VIP)redis实例,也需要本地也可以访问本地,即自己ssh-keygen创建的公钥也要放到自己的authorized_keys中,最后每个服务器的authorized_keys都相互包含(三行)。
②:第一次执行的时候需要在master上先设置vip,即搭好redis sentinel之后,就需要在master上设置好vip。
③:通过收集日志,取得所需要的ip。
④:发送、记录日志,并且远程执行up、down VIP。
在此之前首先要安装paramiko模块:easy_install paramiko,需要依赖包:apt-get install python-setuptools python-dev build-essential libffi-dev libssl-dev;或则直接执行:apt-get install python-paramiko。
具体脚本如下:
当发生切换时,最终邮件报警的内容如下:
日志里记录的信息如下:
BTW:程序可以直接连vip访问Redis,实现一定的高可用:当vip切换的时候,服务会断开,多久不可用主要看设置的检测时间(down-after-milliseconds:默认30秒,可以设置更低,如5000即5秒)和程序重连的时间。当然也可以直接用java的jedis客户端访问,直接实现高可用(通过sentinel中的信息得到master,再连master)。
本文转自 sshpp 51CTO博客,原文链接:http://blog.51cto.com/12902932/1927047,如需转载请自行联系原作者