CentOS8 单机搭建 Docker Redis Cluster

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

 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 端口
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值