首页 > 技术文章 > Docker搭建Redis5.0伪集群带密码

Lenbrother 2020-12-03 11:01 原文

Docker搭建Redis5.0伪集群

前言

我的集群文件都在/data/docker/redis-cluster 目录下,下面的操作都是在/data/docker/redis-cluster目录下进行的。
Docker安装教程请看官网:https://docs.docker.com/engine/install/

环境介绍

操作平台:腾讯云
操作系统:CentOS Linux release 7.7.1908 (Core)
内核版本:5.4.13-1.el7.elrepo.x86_64
Docker版本信息:19.03.6

创建默认配置文件

创建模版配置文件

sudo vim /data/docker/redis-cluster/redis-cluster.tmpl

将下面的配置内容复制到redis-cluster.tmpl
注意:1. 要将下面的127.0.0.1替换成你的外网IP; 2. 请不要手动添加密码设置相关配置,因为那在后面不在配置文件中了。

# redis端口
port ${PORT}

# 关闭保护模式
protected-mode no

# 开启集群
cluster-enabled yes

# 集群节点配置
cluster-config-file nodes.conf

# 超时
cluster-node-timeout 5000

# 集群节点IP host模式为宿主机IP
cluster-announce-ip 127.0.0.1

# 集群节点端口 7000 - 7005
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 5120mb

# 关闭快照备份
save ""


生成配置文件和数据存放目录(直接执行一下命令):

for port in `seq 7001 7006`; do \
  mkdir -p ./${port}/conf \
  && PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis${port}.conf \
  && mkdir -p ./${port}/data; \
done

这一段的意思就是:创建7001-7006目录以及下面的conf和data目录,并将redis-cluster.tmpl中的${port}替换为7001-7006分别复制到各自的conf下的redis7001.conf到redis7006.conf中。
注意:如果报错Permission denied,那么先看下你的父级目录是不是的拥有者是不是当前用户。如果你是用sudo创建的话,使用sudo chown -R 当前用户:当前用户组 ./命令将当前目录所有人变更到当前用户。不知道当前用户所属组的话,可以使用groups命令查看

创建网络桥接网卡

创建桥接网卡,网卡名叫:redis-cluster-network-bridge,网卡使用桥接模式
root用户:

docker network create --driver bridge redis-cluster-network-bridge

非root用户:

sudo docker network create --driver bridge redis-cluster-network-bridge

创建docker-redis容器

创建7001-7006一共6个容器(直接执行命令,非root用户需要在docker前面加上sudo ):

for port in `seq 7001 7006`; do \
  docker run -d -it --memory=1G \
  -p ${port}:${port} -p 1${port}:1${port} \
  -v /data/docker/redis-cluster/${port}/conf/redis${port}.conf:/usr/local/etc/redis/redis.conf \
  -v /data/docker/redis-cluster/${port}/data:/data \
  --restart always --name redis-cluster-${port} --net redis-cluster-network-bridge \
  --sysctl net.core.somaxconn=1024 redis:5.0 redis-server /usr/local/etc/redis/redis.conf; \
done

这一段的意思就是:创建名称为redis-cluster-7001到redis-cluster--7006这6个容器, 每个容器的最大内存为1G超过会被进程杀死 (运行时可能会出现...Memory limited without swap...这个警告,可以忽略。如不需要限制内存,可以去掉--memeory参数), 端口分别为7001-7006, 集群端口分别为17001-17006, 将硬盘上的 /data/docker/redis-cluster/7001/conf/redis7001.conf 文件映射为容器 redis-cluster-7001/usr/local/etc/redis/redis.conf 文件 (redis-cluster-7002redis-cluster-7006 相同), 将 /data/docker/redis-cluster/7001/data 目录映射为容器 redis-cluster-7001/data目录(redis-cluster-7002redis-cluster-7006 相同), 容器伴随 docker 启动, 使用 redis-cluster-network-bridge 做为网络连接方式, 最大连接数支持1024, 使用redis:5.0镜像做为容器默认启动, 使用容器中的/usr/local/etc/redis/redis.conf文件做为默认启动文件

此时可以使用sudo docker ps -a查看刚才创建的容器是否已启动完成。

搭建集群

打开任何一个容器的bash命令行:sudo docker exec -it redis-cluster-7001 bash

注意:1. 要将下面的127.0.0.1替换成你的外网IP;

特别注意:一定要将你的服务器的外网7001-7006端口和17001-17006端口放开,否则下面一定是"Waiting for the cluster to join.....",当你看到一堆省略号的时候,不用等待了,做下面三件事:

  1. 关闭集群中的所有实例 for port in `seq 7001 7006`; do docker stop redis-cluster-${port}; done ;
  2. 于此同时删除掉每个节点文件下的 demp.rdb和nodes.conf文件 rm -rf 700*/data/* ;
  3. 然后开放你redis实例端口号+10000的端口,这就需要你去配置安全策略了。

    搭建集群(直接执行命令):
redis-cli --cluster create  127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1

注意:搭建集群只需要在其中任意一台执行上面这条语句就可以了,不要每台都去执行。
exit退出容器即可。

此时你就可以使用这个集群了,但是现在是没有密码的,下面我们还需要添加密码。

配置密码

授权允许访问每个容器对应的conf配置文件:

for port in `seq 7001 7006`; do \
  chmod a+w /data/docker/redis-cluster/${port}/conf/redis${port}.conf; \
done

进入每一个容器的bash命令行: docker exec -it redis-cluster-7001 redis-cli -c -p 7001
执行如下命令设置每个容器中Redis密码(设置密码为123456):

config set masterauth 123456
config set requirepass 123456
auth 123456
config rewrite

注意:这儿是要进入redis-cluster-7001到redis-cluster-7006全部都要执行一遍的,不是只在其中一台执行。

删除容器

如果你在其中任何一个步骤出错,可以使用下面的命令删除容器

for port in `seq 7001 7006`; do \
  docker stop redis-cluster-${port}; \
  docker rm redis-cluster-${port}; \
done

推荐阅读