Redis集群部署
前言
本篇文章为了记录学习过程,方便回溯
参考文章地址:基于Docker-Compose搭建Redis集群模式
环境准备
-
操作系统:Centos7.9
-
docker安装
-
查看系统中docker版本
docker -v
-
卸载老版本
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
-
安装yum工具包
sudo yum install -y yum-utils
-
配置仓库源
#1. 默认使用国外源,非常慢! sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo #2. 推荐用国内源 sudo yum-config-manager \ --add-repo \ https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
-
安装docker engine
sudo yum install docker-ce docker-ce-cli containerd.io
-
启动docker
sudo systemctl enable docker sudo systemctl start docker
-
-
docker-compose 安装,本次部署使用版本2.18.1(后续部署也可以选择使用docker run启动多个实例)
-
下载方式一:
使用wget下载
wget https://github.com/docker/compose/releases/download/v2.15.1/docker-compose-linux-x86_64(版本自己选择)
-
下载方式二:
前往github tag寻找资源手动下载,官方网址:https://github.com/docker/compose/releases/tag
上述两种方式下载后,需要将下载文件移动到服务器【/usr/local/bin】目录下
之后切换目录到【/usr/local/bin】执行一下命令:
# 重命名 sudo mv docker-compose-linux-x86_64 docker-compose # 将可执行权限应用于二进制文件 sudo chmod +x /usr/local/bin/docker-compose #测试版本号 docker-compose -v
-
-
redis镜像下载(本次使用7.2.4版本,也就是latest,这一步可以省略,后续执行docker-compose没有镜像也会自动下载)
#拉去镜像包 docker pull redis:latest/docker pull redis:7.2.4 #查看下载的镜像包 docker images
开始部署
-
编写redis-cluster配置文件
因为本次配的是三主三从,所以后续会启动六个容器,需要六份配置文件,以下列举一份端口为7001模板:
# 端口(7001 ~ 7006) port 7001 # 可以连接的ip bind 0.0.0.0 # 密码认证,这里your-redis-password 自己设置 requirepass your-redis-password # 设置连接到主节点的密码(通常与requirepass相同),这里your-redis-password 自己设置 masterauth your-redis-password # 开启保护模式 protected-mode yes # 启动集群模式 cluster-enabled yes # 配置文件名称(nodes7001.conf ~ nodes7006.conf) cluster-config-file nodes7001.conf # 节点超时时间 cluster-node-timeout 5000 # 当前节点ip(本次配置的是虚拟机的ip,也就是容器的宿主机ip) cluster-announce-ip 192.168.163.130 # 指定集群节点向其他节点宣布的 TCP 端口号(7001 ~ 7006) cluster-announce-port 7001 # 集群之间通信的端口号(17001 ~ 17006) cluster-announce-bus-port 17001 # 启用AOF持久化 appendonly yes
仿照上面的配置复制五份,依次命名为redis-cluster7002.conf ~ redis-cluster7006.conf,把文件中所有出现7001的地方改成对应的端口号,文件放置目录根据下面docker-compose yml文件中的 volumes配置决定。
-
编写docker-compose yml文件
此处yml文件命名为compose-redis-clusterversion: '3' services: redis-node1: # 服务名 image: redis:latest # 使用的镜像 container_name: redis-node1 # docker启动的容器名 ports: # 映射的端口 7001是redis server使用,17001是集群之间节点通信使用,都必须开放映射,如果不指定17001端口映射的话,创建集群的时候节点之间不能通信,集群会创建失败 - "7001:7001" - "17001:17001" volumes: # 映射的容器卷 - /mydata/redis/conf/redis-cluster7001.conf:/usr/local/etc/redis/redis.conf - /mydata/redis/data:/data command: bash -c "redis-server /usr/local/etc/redis/redis.conf" networks: # 指定使用网络插件名称 - redis-net redis-node2: image: redis:latest container_name: redis-node2 ports: - "7002:7002" - "17002:17002" volumes: - /mydata/redis/conf/redis-cluster7002.conf:/usr/local/etc/redis/redis.conf - /mydata/redis/data:/data command: redis-server /usr/local/etc/redis/redis.conf networks: - redis-net redis-node3: image: redis:latest container_name: redis-node3 ports: - "7003:7003" - "17003:17003" volumes: - /mydata/redis/conf/redis-cluster7003.conf:/usr/local/etc/redis/redis.conf - /mydata/redis/data:/data command: redis-server /usr/local/etc/redis/redis.conf networks: - redis-net redis-node4: image: redis:latest container_name: redis-node4 ports: - "7004:7004" - "17004:17004" volumes: - /mydata/redis/conf/redis-cluster7004.conf:/usr/local/etc/redis/redis.conf - /mydata/redis/data:/data command: redis-server /usr/local/etc/redis/redis.conf networks: - redis-net redis-node5: image: redis:latest container_name: redis-node5 ports: - "7005:7005" - "17005:17005" volumes: - /mydata/redis/conf/redis-cluster7005.conf:/usr/local/etc/redis/redis.conf - /mydata/redis/data:/data command: redis-server /usr/local/etc/redis/redis.conf networks: - redis-net redis-node6: image: redis:latest container_name: redis-node6 ports: - "7006:7006" - "17006:17006" volumes: - /mydata/redis/conf/redis-cluster7006.conf:/usr/local/etc/redis/redis.conf - /mydata/redis/data:/data command: redis-server /usr/local/etc/redis/redis.conf networks: - redis-net redis-cluster-init: # redis-cli服务,作用是在上面六个redis节点启动成功之后,执行集群创建的命令 image: redis:latest container_name: redis-cluster-init depends_on: # 设置依赖顺序,在上面六个节点启动成功之后启动 - redis-node1 - redis-node2 - redis-node3 - redis-node4 - redis-node5 - redis-node6 command: bash -c "redis-cli -a your-redis-password --cluster create 192.168.163.130:7001 192.168.163.130:7002 192.168.163.130:7003 192.168.163.130:7004 192.168.163.130:7005 192.168.163.130:7006 --cluster-replicas 1 --cluster-yes && exit 0" # 执行集群初始化的命令, --cluster-yes 是指定在创建集群的时候需要输入一个参数这里设置为yes也就是代表输入yes,exit0 代表该服务启动成功之后自动退出, -a your-redis-password 是之前conf文件中配置的密码 networks: - redis-net restart: "no" # 因为该服务只是用来执行Redis集群初始化的命令,所以服务关闭之后不需要重启 networks: redis-net: driver: bridge
-
执行yml文件,启动容器
docker-compose -f compose-redis-cluster.yml up -d
#dockps查看容器内容 docker ps
-
查看redis集群信息
-
连接redis-node1
docker exec -it redis-node1 redis-cli -p 7001 -a bingo -c
-
查看集群状态
cluster info
-
查看节点信息
cluster nodes
-
查看主从映射信息
-
exit 退出当前容器客户端连接,退回系统bash
-
进入容器
#redis-node2为容器名称 docker exec -it redis-node2 /bin/bash
-
查询映射
# bingo 是之前在conf里配置的连接密码 redis-cli -a bingo --cluster check 192.168.146.130:7002
-
-
验证故障自动转移
-
停掉一台master主机
docker stop redis-node1 #查看正在运行的容器是不是变成5台 docker ps
-
查看主从映射
#进入容器内部后执行一下代码,ip端口按照conf中写 redis-cli -a bingo --cluster check 192.168.146.130:7002
如果还是还是三台master主机,就表明故障自动转移成功,本例中7004端口的实例从从机转为了主机。 -
检查集群状态
#进入容器后,连接客户端,bingo为密码,7002为端口 redis-cli -a bingo -p 7002 -c #查看集群状态,状态为ok表示集群没有问题 cluster info
-
重启关掉的master主机
docker start redis-node1 docker ps
redis-node1启动成功 -
查看是否加入集群
#进入容器后执行以下代码 redis-cli -a bingo --cluster check 192.168.146.130:7002
可以看到目前是六个实例,7001重新加入集群转变为7004的从机
部署过程故障处理
-
自动故障转移失败
首先检查转移失败的从机日志
#这里以redis-node4举例 docker logs redis-node4
从日志中,可以看到Redis从服务器(replica)在尝试与主服务器(master)进行同步时遇到了认证问题。主服务器要求从服务器进行身份验证,但从服务器似乎没有提供正确的认证信息。
错误消息-NOAUTH Authentication required
表明主服务器配置了密码保护(通过requirepass
参数),但从服务器在尝试同步时没有提供正确的密码。
要解决此问题,需要确保从服务器的配置中包含了正确的masterauth
参数,该参数的值应与主服务器requirepass
参数设置的值相同。这样,在从服务器尝试与主服务器同步时,它会使用这个密码进行身份验证。# 各台服务器 conf文件加入masterauth masterauth yourmasterpassword
-
设置key建失败
出现这个问题是因为忽略了连接方式 用下面的就可以了连接客户端一个 -c参数 这个就表示 用集群的方式连接 这样就不会报上面那个 MOVED的错误了。
redis-cli -a bingo -p 7002 -c