给自己企业怎么做网站,如何做百万格子网站,如何做一名网站编辑,临沂h5建站为了解决主节点故障#xff0c;需要人工操作切换主从的情况#xff1b;因此需要一种方法可以自动化的切换#xff1a;哨兵的引入大大改变这种情况。
哨兵的基本概念 自动切换主从节点 哨兵架构 1、当一个哨兵节点发现主节点挂了的时候#xff0c;还需要其他节点也去检测一… 为了解决主节点故障需要人工操作切换主从的情况因此需要一种方法可以自动化的切换哨兵的引入大大改变这种情况。
哨兵的基本概念 自动切换主从节点 哨兵架构 1、当一个哨兵节点发现主节点挂了的时候还需要其他节点也去检测一下这个主节点到底是不是真的挂了防止误判。 2、发现是真的挂了之后哨兵 节点推举一个leader之后选一个slave作为新的主节点。 3、挑选新的主节点之后哨兵节点自动的将从节点slave no one 脱离主节点的控制并且控制其他的从节点归附到这个新的主节点身上。 4、哨兵节点会自动通知客户端告知新的主节点是谁并且后续客户端进行写操作就是针对新的主节点了。 因此 redis 哨兵核心功能 : 1.监控 2.自动的故障转移 3.通知
搭建哨兵 准备工作基于docker
docker可以认为是一个轻量级的虚拟机隔离环境不吃硬件资源
docker-compose管理一组docker容器
镜像docker中的镜像和容器类似于 可执行程序 和 进程 的关系
镜像Mirroring是一种文件存储形式一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本即为镜像。
容器 Container 泛指任何可以用于容纳其它物品的工具可以部分或完全封闭被用于容纳、储存、运输物品。
在云原生技术中容器就是将软件镜像打包成标准化单元以用于开发、交付和部署。
容器可以是镜像的一个实例镜像是文件容器是进程镜像为静态而容器可能为动态
镜像准备好之后拉取的镜像里面包含了一个精简的Linux操作系统并且上面安装了redis基于镜像创建容器跑起来即可。
搭建redis哨兵环境
创建数据节点 修改配置文件
version: 3.7
services:master:image: redis:5.0.9 //基于哪个镜像container_name: redis-masterrestart: alwayscommand: redis-server --appendonly yesports: - 6379:6379 //端口映射slave1:image: redis:5.0.9container_name: redis-slave1restart: alwayscommand: redis-server --appendonly yes --slaveof redis-master 6379ports:- 6380:6379slave2:image: redis:5.0.9container_name: redis-slave2restart: alwayscommand: redis-server --appendonly yes --slaveof redis-master 6379ports:- 6381:6379 redis -cli -p进行验证
创建哨兵节点
version: 3.7
services:sentinel1:image: redis:5.0.9container_name: redis-sentinel-1restart: alwayscommand: redis-sentinel /etc/redis/sentinel.confvolumes:- ./sentinel1.conf:/etc/redis/sentinel.confports:- 26379:26379sentinel2:image: redis:5.0.9container_name: redis-sentinel-2restart: alwayscommand: redis-sentinel /etc/redis/sentinel.confvolumes:- ./sentinel2.conf:/etc/redis/sentinel.confports:- 26380:26379sentinel3:image: redis:5.0.9container_name: redis-sentinel-3restart: alwayscommand: redis-sentinel /etc/redis/sentinel.confvolumes:- ./sentinel3.conf:/etc/redis/sentinel.confports:- 26381:26379
networks:default:external:name: redis-data_default
创建sentinel1.conf sentinel2.conf sentinel3.conf 三份⽂件的内容是完全相同的. 都放到 /root/redis-sentinel/ ⽬录中.
bind 0.0.0.0
port 26379
sentinel monitor redis-master redis-master 6379 2
sentinel down-after-milliseconds redis-master 1000 启动哨兵节点
docker-compose up -d
但要注意的是docker-compose启动多个容器处于同一个局域网中可以使这个容器相互访问当时哨兵节点配置文件中的sentinel monitor注明的是另一个局域网三个redis-server节点是一个局域网并不能访问
docker network ls
列出当前docker中的局域网
修改配置文件即可达成修改局域网
networks:default:external:name: redis-data_default
name的获取从 列出当前docker中的局域网docker network ls 获取到 查看日志
docker-compose logs
重新选举
手动干掉主节点后观察日志 确定主节点挂了之后就需要选拔新的主节点
redis-master重启之后
docker start redis-master Redis主节点如果宕机,会把其中的⼀个从节点,提拔成主节点. 当之前的Redis主节点重启之后,这个主节点被加⼊到哨兵的监控中,但是只会被作为从节点使⽤. 主从切换的具体流程
1.主观下线
哨兵节点通过心跳包判定redis服务器是否正常工作如果没有心跳包了说明redis节点挂了但是此时不能排除网络波动影响只能单方面认为该节点挂了
2.客观下线
多个哨兵认为主节点挂了认为挂了的哨兵节点数目达到法定票数哨兵们就认为该主节点客观下线
3.要让多个哨兵节点选举一个leader由这个leader负责选一个从节点作为新的主节点。
示例 此时一号哨兵成为leader 每个哨兵只有一票当哨兵1发现当前主节点客观下线之后就立即给自己投一票并且告诉了23哨兵节点当他们没有投票的时候收到投票请求就会投出去如果总的票数超过了哨兵总数的一半选举完成哨兵总数常设为奇数 4.此时leader选举完毕leader需要挑选一个从节点作为主节点
a.优先级每个redis数据节点都会在配置文件中有一个优先级设置slave-priority优先级高的节点会win
b.offset 优先级相同比较offsetoffset从节点从主节点同步数据的进度挑选offset大的节点作为主节点
c.run id 每个redis节点启动的时候随机生成的一串数字此时选谁都行随机挑一个。看run id 更小
5.新的主节点选好之后leader会控制这个节点执行slave no one成为master。并且控制其他节点执行slave of让这些其他节点 “认主” 。