Skip to content

Redis 集群

3主3丛的redis单机集群。

使用步骤

创建模板文件 redis-cluster.tmpl

注意,模板文件中所有${}包裹的值均为后续shell命令传递的,请勿在模板文件中修改,其他值则可在模板文件中修改。

yml
# redis端口
port ${PORT}
daemonize no
  # 关闭保护模式
protected-mode no
  # 开启集群
cluster-enabled yes
  # 集群节点配置
cluster-config-file nodes.conf
  # 超时
cluster-node-timeout 5000
  # 集群节点IP host模式为宿主机IP
cluster-announce-ip ${HOST}

  # 集群节点端口 7001 - 7006
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
  # 开启 appendonly 备份模式
appendonly yes
  # 每秒钟备份
appendfsync everysec
  # 对aof文件进行压缩时,是否执行同步操作
no-appendfsync-on-rewrite no
  # 当目前aof文件大小超过上一次重写时的aof文件大小的100%时会再次进行重写
auto-aof-rewrite-percentage 100
  # 重写前AOF文件的大小最小值 默认 64mb
auto-aof-rewrite-min-size 64mb
masterauth ${masterauth}
requirepass ${requirepass}

通过模板文件初始化redis节点文件

创建redis-cluster.tmpl 后,需要在run.sh预先配置masterauth 和 requirepass值,一个是集群通信认证密码,一个是redis集群密码,以及宿主机IP。

bash
HOST="宿主机地址"
masterauth="自定义密码"
requirepass="自定义密码"

#生成Redis结点文件
for port in $(seq 7000 7005); do
    mkdir -p ./${port}/conf &&
        PORT=${port}  HOST=${HOST} masterauth=${masterauth} requirepass=${requirepass} envsubst <./redis-cluster.tmpl >./${port}/conf/redis.conf &&
        mkdir -p ./${port}/data
done

echo "init redis conf file success "

启动集群各个节点

bash
docker compose up -d

创建集群

bash
HOST="宿主机地址,同上"
masterauth="自定义密码,同上"
requirepass="自定义密码,同上"

redis-cli --cluster create $HOST:7000 $HOST:7001 $HOST:7002 $HOST:7003 $HOST:7004 $HOST:7005 --cluster-replicas 1  -a ${requirepass}

多主机节点集群

方案1

注意,此编排文件适用于单机集群,如果你需要将集群部署在多台机器上,请修改生成的节点配置文件,然后将节点配置文件上传到不同的服务器上。注意不同节点需要配置不同的主机地址和端口。

例如生成7001-7005的节点配置文件,可以手动修改每个配置文件的主机地址,假设3台主机的主机地址分别为:

172.123.123.121 172.123.123.122 172.123.123.122

可以将7000和7001的节点配置文件的主机地址修改为172.123.123.121,7002和7003的主机地址修改为172.123.123.122,7004和7005的主机地址修改为172.123.123.123

然后将docker-compose编排文件中的service2个一组,重新编排为3个compose文件,在不同的主机上启动即可。

之后创建集群即可。

bash
redis-cli --cluster create 172.123.123.121:7000 172.123.123.121:7001 172.123.123.122:7002 172.123.123.122:7003
172.123.123.123:7004 172.123.123.123:7005 --cluster-replicas 1 -a ${requirepass}

方案2

使用单机版本的redis编排文件,使用指定配置文件(可直接使用redis-cluster.tmpl重命名为redis.conf)方式在不同的机器上启动redis容器。 ,在compose文件需要暴露集群通讯端口,然后使用redis-cli --cluster create命令创建集群即可。

redis.conf 文件示例

conf
daemonize no
  # 关闭保护模式
protected-mode no
  # 开启集群
cluster-enabled yes
  # 集群节点配置
cluster-config-file nodes.conf
  # 超时
cluster-node-timeout 5000

  # 开启 appendonly 备份模式
appendonly yes
  # 每秒钟备份
appendfsync everysec
  # 对aof文件进行压缩时,是否执行同步操作
no-appendfsync-on-rewrite no
  # 当目前aof文件大小超过上一次重写时的aof文件大小的100%时会再次进行重写
auto-aof-rewrite-percentage 100
  # 重写前AOF文件的大小最小值 默认 64mb
auto-aof-rewrite-min-size 64mb

  # 集群节点IP host模式为宿主机IP  需要配置主机IP
cluster-announce-ip ${HOST}
  # redis端口
port 6379
  # 集群节点端口 
cluster-announce-port 6379
cluster-announce-bus-port 16379
  #需要配置密码 
masterauth ${masterauth}
  #需要配置密码 
requirepass ${requirepass}
yaml

services:
  redis:
    # 镜像名称以及版本号
    image: redis
    # 失败后总是重启
    restart: always
    # 自定义容器名
    container_name: redis-6379
    # 文件夹以及文件映射
    volumes:
      - $PWD/data:/data
      - $PWD/logs:/logs
      - $PWD/redis.conf:/usr/local/etc/redis/redis.conf
    command: [ "redis-server", "/usr/local/etc/redis/redis.conf" ]
    ports:
      # 端口号
      - "6379:6379"
      - "16379:16379"