赞
踩
目录
Redis的主节点如果挂了(在公司中,一般会有监控程序来监控各个节点,如果某节点挂了,就会有报警机制),需要人工干预才能恢复。恢复步骤如下:
上述内,但凡是人为的操作,就可能存在操作有误或者是,报警没有及时收到去解决问题~
1.2.1、哨兵——名词解释
1.2.2、哨兵自动恢复主节点故障
我们根据下面的一个Redis Sentinel架构示例来看:
说明:
为什么上述不是使用一个哨兵节点:
所以通常情况下,哨兵节点最好是奇数个,最少3个~
原因一:
首先呢,根据我们上一篇文章,学习的是主从复制,在那边是在云服务器上,启动三个redis服务器来模拟在3个主机上有三个redis服务器,以此实现了redis主从节点,在这当中,我们要复制三个redis配置文件,并且要在三个节点中修改其端口号、配置文件、数据文件等信息,其实在哨兵这里,我们同样,也可以这样实现~
但是在实际工作中,把各个节点放在一台服务器上,是没有意义的;话说回来,我们这里只是为了学习和看到效果,在一台服务器上也可以,但是步骤繁琐,比实际操作要繁琐很多,那使用docker可以有效解决,节省时间,何乐而不为呢~
原因二:
docker类似于是一个“轻量级”的虚拟机(虚拟机大家应该都知道的,就是通过软件在电脑上模拟出另外的一些硬件,简单来说就是构造了另一个虚拟的电脑。那就会有小伙伴说,为什么不使用虚拟机呢?因为虚拟机比较吃配置,一般的小服务器都支撑不起来~)。而docker可以起到像虚拟机这样的隔离效果,但是又没有吃很多的硬件资源,即便是配置比较拉垮(像本博主的这种)的服务器,也能构造出好几个这样的虚拟环境~
docker中有一个概念--->“容器”。我们这里只是简单介绍,就不具体深挖了。简单说,容器我们可以理解这里的容器可以看做是一个轻量级的虚拟机。
docker中的“镜像”又怎么理解呢?我们可以简单理解为镜像就是一个“可执行程序”,这个“可执行程序”可以是自己构建,也可以是直接使用别人构建好的~
docker中“容器”和“镜像”结合来理解:“镜像”就是一个“可执行程序”,“容器”就是一个“进程”,并且一个“可执行程序”可以运行多个“进程”。例如我们我们一个浏览器是一个可执行程序,打开一个页面是一个进程,可同时打开多个页面~这种比喻不是很恰当,因为一个容器内部是一个自己的小天地,可以理解为,一个容器就是一个主机~
下面开始编排各个节点,如果有小伙伴的docker没有安装,自行百度哈~
2.3.1、编排前:
在编排节点前,并且安装了docker的伙伴,准备以下几点:
使用命令:docker images
以上就算是成功了~
2.3.2、编排操作:
我们这里,为了避免麻烦,将Redis数据节点的编排和redis-sentinel节点编排分开了~
Redis数据编排这里:我们是准备创建了三个容器,作为Redis的数据节点——一个主节点,两个从节点~
这样两个目录其实就是为了把数据节点和哨兵节点分隔开~
将以下内容复制到这个yml文件中:
- version: '3.3'
- services:
- master:
- image: 'redis:5.0.9'
- container_name: redis-master
- restart: always
- command: redis-server --appendonly yes
- ports:
- - 6379:6379
- slave1:
- image: 'redis:5.0.9'
- container_name: redis-slave1
- restart: always
- command: redis-server --appendonly yes --slaveof redis-master 6379
- ports:
- - 6380:6379
- slave2:
- image: 'redis:5.0.9'
- container_name: redis-slave2
- restart: always
- command: redis-server --appendonly yes --slaveof redis-master 6379
- ports:
- - 6381:6379
这里需要注意,yml文件对格式要求很严格,缩进不对的,后续会出现问题,所以大家复制后,仔细检查一下缩进是否正确~
说明:
redis哨兵节点是单独的redis服务器进程
2.4.1、编写compose.yml文件
复制以下内容到文件中:
- version: '3.3'
- services:
- sentinel1:
- image: 'redis:5.0.9'
- container_name: redis-sentinel-1
- restart: always
- command: redis-sentinel /etc/redis/sentinel.conf
- volumes:
- - ./sentinel1.conf:/etc/redis/sentinel.conf
- ports:
- - 26379:26379
- sentinel2:
- image: 'redis:5.0.9'
- container_name: redis-sentinel-2
- restart: always
- command: redis-sentinel /etc/redis/sentinel.conf
- volumes:
- - ./sentinel2.conf:/etc/redis/sentinel.conf
- ports:
- - 26380:26379
- sentinel3:
- image: 'redis:5.0.9'
- container_name: redis-sentinel-3
- restart: always
- command: redis-sentinel /etc/redis/sentinel.conf
- volumes:
- - ./sentinel3.conf:/etc/redis/sentinel.conf
- ports:
- - 26381:26379
- networks:
- default:
- external:
- name: redis-data_default
同样的问题,要注意缩进~
说明:
2.4.2、如何查看redis数据节点的局域网名:
命令:docker network ls
这里其实也可以把数据节点和哨兵节点放在一起启动,但配置起来会稍微麻烦一些~
2.4.3、哨兵的配置文件:
创建配置文件目录:
将以下内容复制进去:
- bind 0.0.0.0
- port 26379
- sentinel monitor redis-master redis-master 6379 2
- sentinel down-after-milliseconds redis-master 1000
说明:
我们来复制其他两个哨兵节点的配置文件~
2.4.4、启动哨兵节点:
2.4.5、再次查看哨兵节点的配置文件
以上除了红框以外的,都是自动修改的,并且红框中的ip也自动替换好啦~
能看上图中的主节点已经挂了,进不去了~
具体流程我们来结合根据日志看~
这日志文件中,我们会看到有一个哨兵的日志会明显多余另外的哨兵日志,此时说明,这个哨兵是被选举出作为leader,来负责选一个从节点来作为新主节点~
下面我就根据这个日记文件最多的这个来说~
下面开始正式的重新选取的流程:
哨兵节点通过心跳包,判定redis服务器是否正常工作。如果心跳包没有如约而至,就说明redis服务器挂了~
但是这里不能排除是因为网络波动的影响,因此只能单方面的认为这个redis节点挂了,也就是主观下线~
多个哨兵都认为是主节点挂了(认为主节点挂了的哨兵个数达到法定票数),则哨兵们就认为这个主节点时 客观下线~
如果说出现严重的网络波动,导致多数哨兵都认为主节点挂了,而出现了误判。那这种情况下,恐怕是客户端也连不上redis主节点了~所以说,“挂了”并一定是进程崩了,只要是无法正常访问,都可以视为挂了~
由leader来挑选一个从节点作为新的主节点~
挑选的从节点规则如下:
把新的主节点指定后,leader会控制这个从节点,执行slave no one,成为master;控制其他节点执行slave of {ip} {port},让他们以新的主节点作为master
当原本的主节点修复后,再次启动该节点,会自动补成从节点
好啦,下期见,集群的相关知识~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。