上篇文章成功部署redis集群,但也会存在一些问题,比如说主服务器A突然挂掉,这时候我们的技术方案只能是把从服务器手动切换为主服务器,这样的方式费时费力,并且还会造成服务器在一定时间内不可用。我们更希望的是当有主服务挂掉以后,redis自动帮我们在部署的从服务器中随机找一个切换为主服务器,这时候我们优先考虑的就是哨兵模式。哨兵模式是一种特殊的模式,哨兵是一个独立的进程,作为进程,它会独立运行。
Sentinel 哨兵的概念:
Sentinel(哨兵)是Redis的高可用性解决方案:由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。
在这里哨兵的作用是发布命令,让服务器返回其监控状态,包括主服务器与从服务器,当哨兵发现主服务器宕(master)机以后,会自动在该主服务器下的从服务器中(slave)随机选择一个从服务器切换为主服务器(master)。然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。
其实在部署哨兵的时候并不是只部署一个哨兵,而是通过多个哨兵共同监测部署的redis集群,这样可以避免单个哨兵在监测的时候出现的一个问题,所以,主服务器宕机切换主从服务器并不是一个哨兵决定(单哨兵模式除外)。而是同选举的方式模式,当超过半数的决定由某个从服务器切换为主服务,则该从服务器切换为主服务器。
主服务器宕机切换过程:
假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象成为主观下线。当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线。这样对于客户端而言,一切都是透明的。
宕机图裂过程:
图1:
图2:
图3:
下面通过redis配置哨兵模式:
此次配置哨兵模式是一主二从三个哨兵,首先配置一主二从:
1、在/usr/local/目录下创建一个redis-colony文件夹
命令:mkdir redis-colony
2、在新建的redis-colony目录下新建redis-1000、redis-1001、redis-1002三个文件夹:
命令:mkdir redis-1000 redis-1001 redis-1002
3、将虚拟机上安装的redis下的所有所有文件拷贝到redis-1000 redis-1001 redis-1002这三个文件夹
命令:cp -r /usr/local/redis/* /usr/local/redis-colony/redis-1000
拷贝完成,其余的两个文件夹用相同的方法拷贝到对应的文件夹中。
到此,基本的准备工作完成,前面的操作都是很简单,就是一些简单的创建、复制、粘贴而已。下面,通过redis的配置文件:redis.conf进行一主二从的配置
这里之前创建了三个文件夹,分别是redis-1000、redis-1001、redis-1002三个文件夹,在此,默认使用redis-1000里面的redis作为主服务器。
现在进行配置:
首先进入到redis-1000文件夹中,通过命令:vi redis-conf打开配置文件,修改以下配置项:
配置主服务器的ip地址:
(1)在配置文件69行,配置主服务器的ip
配置主服务器端口:
(2)在配置文件92行,配置主服务器的端口
开启后台运行模式:
(3)在配置文件136行,修改daemonize的参数no为yes
批注:其实主可以不做任何修改,默认也行,这里只是为了测试,同时也是为了方便做的修改。
下面配置从:
此次测试,默认使用redis-1001与redis-1002两个redis做从,下面是配置选项:
相同,进入到对应的文件夹中,通过命令:vi redis.conf打开redis配置文件进行修改。
redis-1001的配置文件修改内容:
#注释掉只允许本地连接
#开启后台运行模式
#修改端口号
#新增从配置
注:192.168.1.88表示主的ip;1000表示主的ip
现在redis-1001中的redis已配置完成,下面进行redis-1002的redis配置
相同,进入到redis-1002目录下,通过vi redis.conf命令打开配置文件
下面是配置选项:
#注释掉bind,让其任意访问
#配置端口
#开启后台启动模式
#配置主从关系
保存退出后,关于一主二从的配置就已经修改完成,下面只需要把三个redis按照顺序(主——从)启动即可:
首先启动主:
启动两个从:
现在所有的redis都已经成功启动,现在看看启动的结果:
通过查看可以知晓,一主二从已经成功启动,现在我们随便连接一个redis,看看之前配置的结果是否生效,这里我选择连接主服务器:
连接成功后,通过info 可以看到关于此时这个连接的redis信息:
从此信息可以看出当前连接的redis角色是主,有2个从,分别是端口为1001与1002的两个redis,现在进行测试:首先,在主中存入一个键值对,然后连接从去看看是否能够获取,并且在从中也进行存储操作,看看是什么结果:
存储成功,通过ctrl+c退出
连接从,进行获取:
可以看出,在主中存入的数据,在从里面可以进行获取,当在从中进行存储操作的时候出现以下结果:
可以看到,当前连接的redis是没有写权限,只有读的权限
现在,一主二从配置完成,下面进行哨兵的配置,这也是重点;其实配置哨兵还是比较简单的,在这里我选择配置三个哨兵,主从个一个,这里有两个从,所以我选择的是配置三个哨兵,首先配置的是主的哨兵:
进入到redis-1000文件夹,编辑哨兵的配置文件sentinel.conf,修改或添加一下选项:
#配置ip
#配置端口
#开启后台启动模式
#配置日志文件
#配置日志文件存在的文件夹
#配置哨兵
说明:
mymaster :master-name 可以自己命名的主节点名字 只能由字母A-z、数字0-9 、这三个字符".-_"组成。
192.168.1.88 : 这个是主的ip,因为我们配置哨兵只需要检测主即可。
2 : 哨兵容错机制,在哨兵模式中,如果有2个哨兵认为某个节点失联,则这是客观的认为这个节点失联。
#配置密码
#当在Redis实例中开启了requirepass foobared 授权密码 这样所有连Redis实例的客户端都要提供密码
# 设置哨兵sentinel 连接主从的密码 注意必须为主从设置一样的验证密码
这是自己玩,没有设置密码,生产上必须设置密码。
#指定哨兵客观认为节点失联时间,默认是30秒,也就是说30秒之后哨兵没有
#收到某节点信息,则客观认为该节点失联
#故障转移的超时时间 failover-timeout 可以用在以下这些方面:
# 1. 同一个sentinel对同一个master两次failover之间的间隔时间。
# 2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。
# 3.当想要取消一个正在进行的failover所需要的时间。
# 4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了
# 默认三分钟
如果只是自己测试,只需要配置前六项即可,如果是生产环境,则根据自己的需要进行配置文件的参数进行配置,后面的配置选项仅供参考。
哨兵配置文件参数项主从都差不多,前六项内容中,ip根据需求配置,端口每个哨兵必不能相同,日志文件可以统一都配一个,比我这里三个哨兵的配置文件都是1000.log,也可以不相同,每个哨兵配置一个都行。后面的dir配置后需要自己根据配置文件中的路径在虚拟机中创建文件夹。
当三个哨兵的配置文件都配置完成以后,我们只需要把哨兵启动即可,虽然我们配置了三个,但是我们也可以启动一个或者两个或者全部启动。
启动命令:/usr/local/redis/src/redis-server /usr/local/redis-colony/redis-1000/sentinel.conf --sentinel
我这里选择3个全部启动,当我们进行查看的是,可以看到多了三个线程,分别是端口21000/21001/21002,证明之前配置的哨兵配置成功,现在进行测试,将默认的主节点挂掉,看是否从节点中能有一个节点切换为主节点。
通过杀死线程的方式让1000端口挂掉,现在连接其他的从节点看其状态
此时已连接到了1001端口,通过info可以看到1001端口的角色是从节点,目前的主节点端口是1002,状态是切换完成,现在连接到1002端口,看看该端口是否是主节点。
通过连接1002端口可以看出,当前1002端口的角色是主节点,并且有一个从节点,端口是1001。
到此,关于redis的哨兵模式配置成功,通过测试,当1000端口被启动时,会自动成为从节点,如果主节点挂掉,则会在1000端口与1001端口中随机选择一个节点切换为主节点,如果当前主节点下只有一个从节点,则该主节点挂掉,从节点切换为主节点;如果当前主节点下没有节点,主节点被挂掉,这个节点肯定就废了。
redis集群哨兵完成,在此记录学习编程的第N天,2020-10-22.