CentOS8 单机搭建 Docker Redis Cluster
本文教大家如何用Docker搭建Redis集群。
一、准备工具(如果需要)
1.1 安装Docker
#卸载老版本(如果有)
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
#安装所需的软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
#设置稳定的存储库(阿里云)
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装docker ce(docker社区版) 。nobest参数用于解决containerd.io版本问题
sudo yum install docker-ce --nobest
#启动docker
sudo systemctl start docker
#加入开机启动
systemctl enable docker
#重新加载服务
systemctl daemon-reload
1.2 安装Docker Compose
#下载最新版本(目前1.27.3)至指定目录
curl -L "https://github.com/docker/compose/releases/download/1.27.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#文件夹授权
chmod +x /usr/local/bin/docker-compose
#查看版本
docker-compose --version
1.3 在docker库获取redis镜像
docker pull redis
#查看拉下来的镜像
docker images
二、集群搭建
2.1 创建Redis配置模板文件(redis-cluster-template.conf)
#创建目录
mkdir /usr/local/redis-cluster
#切换至指定目录(以下的操作都在此目录下执行)
cd /usr/local/redis-cluster
#新建文件
vim redis-cluster-template.conf
redis-cluster-template.conf文件内容
requirepass ${PWD} ##添加访问认证
masterauth ${PWD} ##如果主节点开启了访问认证,从节点访问主节点需要认证
port ${PORT} ##节点端口
protected-mode no ##保护模式,默认值 yes,即开启。开启保护模式以后,需配置 bind ip 或者设置访问密码;关闭保护模式,外部网络可以直接访问
daemonize no ##是否以守护线程的方式启动(后台启动),默认 no
appendonly yes ##是否开启 AOF 持久化模式,默认 no
cluster-enabled yes ##是否开启集群模式,默认 no
cluster-config-file nodes.conf ##集群节点信息文件
cluster-node-timeout 15000 ##集群节点连接超时时间
cluster-announce-ip ${IP} ##集群节点 IP,填写宿主机的 IP
cluster-announce-port ${PORT} ##集群节点映射端口
cluster-announce-bus-port 1${PORT} ##集群节点总线端口(节点端口前面加1)
每个 Redis 集群节点都需要打开两个 TCP 连接。一个用于为客户端提供服务的正常 Redis TCP 端口,例如 6379。还有一个基于 6379 端口加 10000 的端口,比如 16379。第二个端口用于集群总线,这是一个使用二进制协议的节点到节点通信通道。节点使用集群总线进行故障检测、配置更新、故障转移授权等等。客户端永远不要尝试与集群总线端口通信,与正常的 Redis 命令端口通信即可,但是请确保防火墙中的这两个端口都已经打开,否则 Redis 集群节点将无法通信
2.2 创建目录与文件
#删除配置文件,数据文件夹(如果有)
rm -rf 700*
#创建配置文件,数据文件夹
for port in `seq 7001 7006`; do mkdir -p ./${port}/conf && PORT=${port} IP=公网IP PWD=密码 envsubst < ./redis-cluster-template.conf > ./${port}/conf/redis.conf && mkdir -p ./${port}/data; done
#查看文件夹的树目录来验证是否正确生成
tree
2.3 创建Redis容器
- 方式一 使用Docker
#Docker运行Redis容器(host网络)
for port in `seq 7001 7006`; \
do \
docker run -d -ti -p ${port}:${port} -p 1${port}:1${port} -v /usr/local/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf -v /usr/local/redis-cluster/${port}/data:/data --restart always --name redis-${port} --network=host --sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf; \
done
Docker命令解析:docker run 运行
-d 守护进程模式
--restart always 保持容器启动
--name redis-${port} 容器起名
--network=host 容器使用host网络模式
-p ${port}:${port} 指定宿主机器与容器端口映射
-p 1${port}:1${port} 指定宿主机与容器redis总线端口映射
--v /usr/local/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf 挂载配置文件
-v /usr/local/redis-cluster/${port}/data:/data 挂载数据文件夹
--sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf 容器根据挂载的配置文件启动 redis服务端
按照 Redis 官网:https://redis.io/topics/cluster-tutorial 的提示,为了使 Docker 与 Redis Cluster 兼容,您需要使用 Docker 的 host 网络模式。
host 网络模式需要在创建容器时通过参数 --net host 或者 --network host 指定,host 网络模式可以让容器共享宿主机网络栈,容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口
- 方式二 使用Docker Compose
编写 Docker Compose 模板文件(docker-compose.yml)
vim docker-compose.yml
## docker-compose.yml
# 描述 Compose 文件的版本信息
version: "3.9"
# 定义服务,可以多个
services:
redis-7001: # 服务名称
image: redis # 创建容器时所需的镜像
container_name: redis-7001 # 容器名称
restart: always # 容器总是重新启动
ports:
- "7001:7001"
- "17001:17001"
network_mode: "host" # host 网络模式
volumes: # 数据卷,目录挂载
- /usr/local/redis-cluster/7001/conf/redis.conf:/usr/local/etc/redis/redis.conf
- /usr/local/redis-cluster/7001/data:/data
command: redis-server /usr/local/etc/redis/redis.conf # 覆盖容器启动后默认执行的命令
redis-7002: # 服务名称
image: redis # 创建容器时所需的镜像
container_name: redis-7002 # 容器名称
restart: always # 容器总是重新启动
ports:
- "7002:7002"
- "17002:17002"
network_mode: "host" # host 网络模式
volumes: # 数据卷,目录挂载
- /usr/local/redis-cluster/7002/conf/redis.conf:/usr/local/etc/redis/redis.conf
- /usr/local/redis-cluster/7002/data:/data
command: redis-server /usr/local/etc/redis/redis.conf # 覆盖容器启动后默认执行的命令
redis-7003: # 服务名称
image: redis # 创建容器时所需的镜像
container_name: redis-7003 # 容器名称
restart: always # 容器总是重新启动
ports:
- "7003:7003"
- "17003:17003"
network_mode: "host" # host 网络模式
volumes: # 数据卷,目录挂载
- /usr/local/redis-cluster/7003/conf/redis.conf:/usr/local/etc/redis/redis.conf
- /usr/local/redis-cluster/7003/data:/data
command: redis-server /usr/local/etc/redis/redis.conf # 覆盖容器启动后默认执行的命令
redis-7004: # 服务名称
image: redis # 创建容器时所需的镜像
container_name: redis-7004 # 容器名称
restart: always # 容器总是重新启动
ports:
- "7004:7004"
- "17004:17004"
network_mode: "host" # host 网络模式
volumes: # 数据卷,目录挂载
- /usr/local/redis-cluster/7004/conf/redis.conf:/usr/local/etc/redis/redis.conf
- /usr/local/redis-cluster/7004/data:/data
command: redis-server /usr/local/etc/redis/redis.conf # 覆盖容器启动后默认执行的命令
redis-7005: # 服务名称
image: redis # 创建容器时所需的镜像
container_name: redis-7005 # 容器名称
restart: always # 容器总是重新启动
ports:
- "7005:7005"
- "17005:17005"
network_mode: "host" # host 网络模式
volumes: # 数据卷,目录挂载
- /usr/local/redis-cluster/7005/conf/redis.conf:/usr/local/etc/redis/redis.conf
- /usr/local/redis-cluster/7005/data:/data
command: redis-server /usr/local/etc/redis/redis.conf # 覆盖容器启动后默认执行的命令
redis-7006: # 服务名称
image: redis # 创建容器时所需的镜像
container_name: redis-7006 # 容器名称
restart: always # 容器总是重新启动
ports:
- "7006:7006"
- "17006:17006"
network_mode: "host" # host 网络模式
volumes: # 数据卷,目录挂载
- /usr/local/redis-cluster/7006/conf/redis.conf:/usr/local/etc/redis/redis.conf
- /usr/local/redis-cluster/7006/data:/data
command: redis-server /usr/local/etc/redis/redis.conf # 覆盖容器启动后默认执行的命令
创建并启用所有容器
docker-compose up -d
4. 启动Redis集群
#进入一个节点
docker exec -it redis-7001 bash
#创建Redis集群(共用IP)
redis-cli -a Redis@2020 --cluster create 公网IP:7001 公网IP:7002 公网IP:7003 公网IP:7004 公网IP:7005 公网IP:7006 --cluster-replicas 1
5.宿主主机对外开放ip端口
#开启防火墙
systemctl start firewalld
#开放端口
for port in `seq 7001 7006`; do firewall-cmd --zone=public --add-port=${port}/tcp --permanent && firewall-cmd --zone=public --add-port=1${port}/tcp --permanent; done
#重启防火墙
firewall-cmd --reload
如果是云服务器,还需要在安全组规则放行 7001~7006,17001~17006 端口

本文介绍在CentOS8单机上用Docker搭建Redis集群的方法。先准备工具,包括安装Docker、Docker Compose,获取redis镜像;接着进行集群搭建,创建配置模板文件、目录与文件,可用Docker或Docker Compose创建Redis容器,最后启动集群并开放相关端口。

450

被折叠的 条评论
为什么被折叠?



