docker部署redis-cluster集群

Posted by 杨一 on 2020-06-07

docker部署redis-cluster集群

主机环境

  • 阿里云服务器 ECS ,2核4G,系统:Centos_7_05_64
  • Redis 5.0.0 以上
  • docker 社区版 version 18.09.0

安装docker

  • 安装所需的软件包
1
2
3
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
  • 使用以下命令来设置稳定的存储库
1
2
3
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
  • 安装docker ce(docker社区版-必须-版本会新一点)

    • docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 docker 。
      通过 uname -r 命令查看你当前的内核版本
    • 移除旧的版本:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    sudo yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-selinux \
    docker-engine-selinux \
    docker-engine
    • 更新 yum
    1
    yum update
    • 安装 docker-ce:
    1
    yum -y install docker-ce
    • 启动 docker 后台服务
    1
    systemctl start docker
    • 设置docker 开机自启
    1
    systemctl enable docker
    • 查看防火墙状态
    1
    systemctl status firewalld
    • 若当前状态时dead状态,则需要开启防火墙;
    1
    2
    3
    systemctl start firewalld
    systemctl status firewalld 查看firewalld状态,显示running即已开启了
    systemctl stop firewalld 关闭防火墙
    • 开放需要的端口
    1
    2
    3
    4
    firewall-cmd --permanent --zone=public --add-port=7001-7006/tcp
    firewall-cmd --permanent --zone=public --add-port=17001-17006/tcp
    firewall-cmd --reload //重新加载配置
    firewall-cmd --permanent --zone=public --list-ports //查看开放端口
    • 获取 redis 镜像
    1
    2
    docker pull redis
    docker images 查看镜像

创建 redis 容器

  • 创建 redis 的配置文件
    在 /home 下新建 redis-cluster 文件夹,然后创建 redis-cluster.tmpl 文件,文件内容如下:
1
2
3
4
5
6
7
8
9
port ${PORT}  //redis运行端口号
protected-mode no //
cluster-enabled yes //集群模式
cluster-config-file nodes.conf //redis集群自己维护节点信息
cluster-node-timeout 5000 //超时时间
cluster-announce-ip 37.56.*.* //自己的ip
cluster-announce-port ${PORT} //节点映射端口
cluster-announce-bus-port 1${PORT} //节点通信端口
appendonly yes
  • 命令查看配置:
1
cat /home/redis-cluster/redis-cluster.tmpl
  • 在/home/redis-cluster下生成conf和data目标,并生成配置信息
    共生成6个文件夹,从7001到7006,每个文件夹下包含data和conf文件夹,同时conf里面有redis.conf配置文件
1
2
3
4
5
for port in `seq 7001 7006`; do \
mkdir -p ./${port}/conf \
&& PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf \
&& mkdir -p ./${port}/data; \
done
  • 创建6个redis容器
    这里使用 host 网络方式启动容器
1
2
3
4
5
6
7
for port in `seq 7001 7006`; do \
docker run -d -ti \
-v /home/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /home/redis-cluster/${port}/data:/data \
--restart always --name redis-${port} --net host \
--sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf; \
done
  • docker ps 查看容器
  • 其他命令
1
2
3
docker stop name/id
docker rm -f name/id
rm -f 文件夹名

集群(redis 5.0 安装集群方法)

  • 进入一个已运行的容器
1
docker exec -it redis-7001 bash
  • 在容器中执行集群命令
1
2
3
4
5
6
7
8
/usr/local/bin/redis-cli --cluster create \
37.56.*.*:7001 \
37.56.*.*:7002 \
37.56.*.*:7003 \
37.56.*.*:7004 \
37.56.*.*:7005 \
37.56.*.*:7006 \
--cluster-replicas 1 // "1" 代表主从比例1:1,前三个为主,后三个为从。
  • 连接成功

进行测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 docker exec -it redis-7001 bash   进入7001容器
redis-cli -h 47.*.*.* -p 7001 进入7001 redis
...进行指令操作
cluster info 进行集群状态查看
cluster nodes 进行节点查看

docker stop redis-7001 进行宕机实验
docker exec -it redis-7002 bash 进入7002容器
redis-cli -h 47.*.*.* -p 7002 进入7002 redis
会发现从7001的节点变成主节点


docker start redis-7001 再次启动redis7001
会发现redis-7001变成了从节点