在M1版MacBook上测试Docker并部署Redis主从集群+哨兵模式
今年11月份苹果发布arm架构M1芯片版MacBook,Docker官方随即表示已着手适配工作,现在第7个技术预览版已经开始公测。这速度....然而晴天霹雳,kubernetes宣布即将弃用Docker...
M1 芯片软件适配进度可以在这里查看
先随便配张图来假装图文并茂...
正文
大致步骤
Docker的下载与安装省略300字
需要注意的是
- 最好配置国内加速源
- 根据宿主机内存调整Docker内存大小
- 知悉Docker官方发布的目前已知问题(免得到时遇到坑还以为是自己的问题)
配置加速源
国内源
Docker中国区官方镜像
https://registry.docker-cn.comustc
https://docker.mirrors.ustc.edu.cn中国科技大学
https://docker.mirrors.ustc.edu.cn阿里云容器 服务
https://cr.console.aliyun.com/
调整内存
Docker官方目前已知问题
拉取portainer镜像
- portainer有什么用?
- 快速部署(配合yaml配置文件)
- 容器编排
- 镜像管理
- Swarm集群管理
- 权限管理(针对多运维)
- 日志审计
进入终端
docker pull --platform=linux/arm64 portainer/portainer-ce@sha256:e5694c14b8a4c72e609e57c307b9346d0128ec5150bf4e87a4485b459d5089f0 #arm64版本
这串sha256可以在这里找到,其他镜像同理
可能有些人觉得奇怪,docker pull 镜像名 不就完事了吗,为啥还有sha256:xxxxxxxxxxxx这一串
原因是因为我们需要arm版镜像,指定DIGEST,这样下载下来体积相对小点。
然后把刚刚拉取的镜像跑起来
docker volume create portainer_data #创建一个挂载文件夹docker run -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data -d portainer/portainer-ce
#这句就把portainer镜像跑起来了,注意这里是9000端口,左边9000端口可以改为你喜欢并未使用的端口。简单介绍一下参数意思,-p 映射宿主机和容器内的端口,-v 映射宿主机和容器的目录 -d 是后台运行,「-v /var/run/docker.sock:/var/run/docker.sock」这段简单理解为portainer把Docker管理权拿到手。
然后打开portianer后台管理
portainer介绍完毕下面开始Redis部分
拉取Redis镜像
docker pull redis@sha256:0b23dbaf740ab5e25623f853ece6e2473efef2a3becbac44fa46c53bf669d645
docker tag 镜像id redis:my #标记镜像,待会yaml配置要用,镜像id可以通过 docker images 查看
编写主从docker-compose.yml配置(一主两从)
version: '2'
services:
#redis主库
redis_7001_master:
image: $image #$image环境变量,下面同理
container_name: redis_7001_Master
restart: always
network_mode: bridge
ports:
- 7001:6379
command: redis-server --replica-announce-ip $ip --replica-announce-port 7001 #$ip环境变量,下面同理
#redis从库
redis_7002_slave:
image: $image
container_name: redis_7002_slave
restart: always
network_mode: bridge
depends_on:
- redis_7001_master
ports:
- 7002:6379
command: redis-server --slaveof $ip 7001 --replica-announce-ip $ip --replica-announce-port 7002
#redis从库
redis_7003_slave:
image: $image
container_name: redis_7003_slave
restart: always
network_mode: bridge
depends_on:
- redis_7001_master
ports:
- 7003:6379
command: redis-server --slaveof $ip 7001 --replica-announce-ip $ip --replica-announce-port 7003
点击 Deploy the stack
点进去查看主库日志
从库同步数据成功
主从搭建完成,单纯主从集群是非常不可靠的,因为从库是只读的,主库掉线就没法写了。所以需要引入哨兵模式来监控和执行故障转移。
哨兵模式
作用
完成后的是这样
当然,也可以把哨兵部署在从库所在的服务器上。
哨兵们会根据主库给出的信息自动发现从库地址和端口,所以只需要监控主库就可以了。
配置文件:
sentinel.conf
port 26379 #哨兵容器内端口
sentinel announce-ip 172.20.10.2 #强制声明IP
sentinel announce-port 7004 #强制指定对外公开的端口
dir "/data" #工作目录
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 172.20.10.2 7001 2 # 宿主机内网IP,端口,quorum(quorum个哨兵哨兵达成一致的情况下才会判断主库客观掉线(+odown))
sentinel down-after-milliseconds mymaster 3000 #3秒内主库没有正确给哨兵响应心跳,哨兵即认为主库主观掉线(+sdown)
sentinel failover-timeout mymaster 5000 #指定故障转移超时(以毫秒为单位)当进行failover时,配置所有slaves指向新的master所需的最大时间。
以上announce-port不一样,一式三份
哨兵 docker-compose.yml
version: "2"
services:
redis_sentinel7004:
image: redis:my
container_name: redis_sentinel7004
network_mode: bridge
ports:
- 7004:26379
volumes:
- /Users/cyy/own/Dev/sentinel/s7004:/usr/local/etc/redis/
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
redis_sentinel7005:
image: redis:my
container_name: redis_sentinel7005
network_mode: bridge
ports:
- 7005:26379
volumes:
- /Users/cyy/own/Dev/sentinel/s7005:/usr/local/etc/redis/
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
redis_sentinel7006:
image: redis:my
container_name: redis_sentinel7006
network_mode: bridge
ports:
- 7006:26379
volumes:
- /Users/cyy/own/Dev/sentinel/s7006:/usr/local/etc/redis/
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
目录结构是这样(文件夹名是s+端口)
又回到portianer
点击Deploy the stack
哨兵已经成功监控主库并发现了两个从库和另外两个哨兵。
测试故障转移
redis-cli -h 172.20.10.2 -p 7001 DEBUG sleep 30 #在宿主机上进入终端,连上主库睡眠30秒(模拟宕机)
大功告成,哨兵已经把端口为7002的从库成功切换成主库了
写得有点乱,见谅。
给大家拜个早年!祝大家写代码永无bug🙏!