redis利用哨兵(sentinel)进行主从切换,断断续续,自己终于通过配置验证了一下该功能,其中遇到过一些的问题,也是耗费了大量的时间才解决,接下来分享下配置的过程以及遇到的问题和解决方法。希望对各位有所帮助。
首先说一下实验环境:
redis软件:redis-3.2.1(安装在虚拟机的linux系统中)
宿主主机:window8.1 x64
secureCRT:宿主主机安装此软件来操作linux,这只是个人喜欢,大家可以不装。
对于redis在linux如何安装这里不进行说明,不懂的朋友可以自己百度,相信网上有很多相关的资料。在这里将要搭建的是一个主服务器,两个从服务器以及三个哨兵(sentinel)。其中主服务器用的端口为默认端口6379,两个从服务器的端口分别为6380和6381;三个哨兵(sentinel)的端口分别为26379、26380和26381.
安装好redis之后,我们拷贝三份出来,并且修改名字加以区分,这里分出几个文件夹,是比较清晰一点。如下:
redis-3.2.1:这个文件夹用作主服务器
redis_6380:这个文件夹用作从服务器
redis_6381:这个文件夹用作从服务器
redis_sentinel:这个文件夹用作哨兵配置
几个文件里的文件是一样的,内容如下:
配置主服务器
首先,我们进入到redis-3.2.1文件夹进行主服务器的配置,修改redis.conf文件如下:
1、bind 127.0.0.1 修改为bind 0.0.0.0,这样是允许任何机器都可以访问该服务器
2、daemonize no 修改为daemonize yes ,redis将以守护进程的方式运行,这样可以在redis服务启动的窗口中再可以进行其它操作
3、增加masterauth “redis”,这是设置从服务器和哨兵连接主服务器需要的密码,我这里设置为”redis“
4、增加requirepass “redis”,这是设置redis客户端或者远程机器连接redis服务器需要的密码,这里同样设为“redis”
至此,主服务器就算是配置好了。
配置从服务器
进入到redis_6380文件夹进行从服务器的配置,修改redis.conf文件如下:
1、bind 127.0.0.1 修改为bind 0.0.0.0
2、port 6379 修改为port 6380
3、daemonize no 修改为daemonize yes
4、增加slaveof 192.168.81.129 6379,指定当前服务器是哪个服务器的从服务器,这里指定当前服务器的主服务器是192.168.81.129:6379
5、增加masterauth “redis”,设置连接主服务器的密码
6、增加requirepass “redis”,这是设置redis客户端或者远程机器连接redis服务器需要的密码,这里同样设为“redis”(6381的密码也设为“redis”)
至此,6380这台从服务器的配置文件就修改完成了。
对于6381这台从服务器与修改6380的步骤一样,只是在第二步中记得把端口改为6381
至此,一个主服务器和两个从服务器的配置已经完成了。在这里我们先验证下配置是否正确:
1、首先启动主服务器(按照图中命令顺序输入即可,命令含义不懂自己百度):
通过info replication命令我们可以看到,当前的服务器角色是主服务器(role master),并且没有从服务器(connected_slaves:0)
2、新开一个secureCRT窗口,并进入到6380从服务器文件夹中,启动6380redis服务器:
通过info replication命令我们可以看到,当前服务器的角色是从服务器,并且主服务器是192.168.81.129:6379,这跟我们在配置文件中配置的一致(slaveof 192.168.81.129 6379),所以主从配置是正确的。用同样的方法启动6381的从服务器:
这时候,我们再回到主服务器的窗口运行info replication命令,可以看到已经有两个从服务器已经连上来了:
当我们在主服务器中设置一个键,在从服务器中可以读到这个键的值,并且从服务器不能进行写入操作,这就实现了主写从读的效果(读写分离):
主服务器写:
从服务器读:
从服务器写入被拒绝:
至此,就实现了主从服务器的读写分离,接下来将介绍如何利用哨兵对主从进行自动切换。
首先,另开一个secureCRT窗口,进入到redis_sentinel文件夹中,文件夹里有一个配置文件sentinel.conf。这个配置文件就是哨兵的配置文件,我们对这个文件拷贝出来三份,名字分别为:sentinel_6379.conf、sentinel_6380.conf和sentinel_6381.conf:
编辑sentinel_6379.conf配置文件:
1、添加 bind 0.0.0.0 配置信息,这是为了远程机器可以连接当前哨兵;如果不需要被远程机器连接,可以不配置此选项;
2、添加要监控主机的信息:
对”sentinel monitor mymaster 192.168.81.129 6379 2“解释:
mymaster :为主服务器起的名字;
192.168.81.129 6379:主服务器的ip和端口号
2:代表有2个哨兵认为主服务器主观下线时,则认为主服务器是客观下线了,可以执行主从切换,并进行故障转移操作
对“sentinel auth-pass mymaster redis”解释:
mymaster :为主服务器起的名字;
redis:为连接主服务器需要的密码,即主服务器redis.conf中的masterauth属性的值
至此,一个哨兵的配置就已经完成了。对sentinel_6380.conf和sentinel_6381的修改步骤与sentinel_6379.conf的修改步骤一致。但是sentinel_6380.conf文件里的端口要配为26380:
sentinel_6381.conf文件里的端口要配为26381:
至此,主从配置和哨兵配置的任务就算全部完成了。下面将验证下当主服务器断线时候,哨兵是否能自动进行主从切换和故障转移。
首先我们先启动主服务器并连上客户端:
接着新开一个secureCRT窗口,启动6380的从服务器并启动客户端:
接着新开一个secureCRT窗口,启动6381的从服务器并启动客户端:
接着新开一个secureCRT窗口,进入到redis_sentinel文件夹,启动端口号为26379的哨兵:
从打印的日志我们可以知道,当前哨兵的ID,哨兵监控的主服务器配置以及从服务器配置
用同样的方法启动端口号为26380和26381的哨兵:
至此,我们添加了三个哨兵对主服务器(192.168.81.129 6379)进行监控。
故障演示
回到启动主服务器的secureCRT窗口,并shutdown掉主服务器:
等30秒时间(30秒是在哨兵的配置文件“sentinel down-after-milliseconds mymaster 30000”这一行指定的,当哨兵发通讯消息给主服务器,如果30秒之后没有收到主服务器的回复,则认为主观下线)我们分别看下三个哨兵打印的日志信息:
26379日志信息:
26380日志信息:
26381日志信息:
这三个哨兵打印的信息基本上一致,从日志中我们可以看到,现在主服务器已经切换到192.168.81.129:6380这台redis服务器,我们在6380上通过info replicaiton查看是否已经是正确切换:
从显示的信息中可以知道,6380这台redis服务器确实升级为主服务器了。当我们重新启动6379这台redis服务器,那么它将会被降级为从服务器,成为新的主服务器的从服务器:
可以看到,6379重新启动后确实变成了从服务器,而且主服务器是192.168.81.129:6380。从服务器是只读的,所以我们通过set name “redis”会报错。
至此,利用redis的哨兵(sentinel)对主服务器进行监控,并且当主服务器down掉的时候哨兵能自动进行主从切换就算演示完成了。这整个过程的配置都是我已经试验成功之后的,下面将描述下我在配置过程中遇到的问题:
1、主服务器设置了密码(redis.conf文件中的masterauth有设置),如果在哨兵的配置文件(sentinel_6379.conf、sentinel_6380.conf、sentinel_6381.conf)中没有指定连接主服务器的密码(通过sentinel auth-pass mymaster redis指定),那么哨兵将不能连接主服务器,哨兵就会判断主服务器是主观下线的。例如我们注释掉26381配置连接主服务器的密码那一行:
可以看到主服务器是主观下线,但事实上主服务器并没有下线:
2、如果在外部代码需要获取哨兵信息,必须在哨兵的配置文件中配置bind 0.0.0.0,要不然外部代码连不上哨兵。