docker搭建redis集群:
1、创建一个docker网络:
docker network create --driver=bridge --gateway=192.165.0.1 --subnet=192.165.0.0/16 myredis(网络名)
2、使用docker创建一个3主3从的redis集群
#删除此文件夹
rm -rf /mycontainerdata/
#创建6个redis配置文件
for port in $(seq 1 6); \
do \
mkdir -p /mycontainerdata/redis/node-${port}/conf
touch /mycontainerdata/redis/node-${port}/conf/redis.conf
cat << EOF >/mycontainerdata/redis/node-${port}/conf/redis.conf
#port:节点端口;
port 6379
#0.0.0.0在服务器的环境中,指的就是服务器上所有的ipv4地址,如果机器上有2个ip 192.168.30.10 和 10.0.2.15,redis在配置中,如果配置监听在0.0.0.0这个地址上,那么,通过这2个ip地址都是能够到达这个redis服务的。同时呢,访问本地的127.0.0.1也是能够访问到redis服务的。
bind 0.0.0.0
#cluster-enabled:是否开启集群模式,默认 no;
cluster-enabled yes
#cluster-config-file:集群节点信息文件;
cluster-config-file nodes.conf
#cluster-node-timeout:集群节点连接超时时间;
cluster-node-timeout 5000
#cluster-announce-ip:集群节点 IP,填写宿主机的 IP;启动docker时固定的ip(docker run --ip x.x.x.x)
cluster-announce-ip 192.165.0.1${port}
#cluster-announce-port:集群节点映射端口;
cluster-announce-port 6379
#cluster-announce-bus-port:集群节点总线端口。
cluster-announce-bus-port 16379
#appendonly:是否开启 AOF 持久化模式,默认 no;
appendonly yes
EOF
done
#移除所有容器
docker rm -f $(docker ps -aq)
#运行redis容器
for port in $(seq 1 6); \
do \
docker run -dit -p 637${port}:6379 -p 1637${port}:16379 --name=redis-${port} \
-v /mycontainerdata/redis/node-${port}/data:/data \
-v /mycontainerdata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
--net myredis --ip 192.165.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf; \
done
#排查配置文件是否正确
docker run -it -p 6371:6379 -p 16371:16379 --name=redis-1 \
-v /mycontainerdata/redis/node-1/data:/data \
-v /mycontainerdata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
--net myredis --ip 192.165.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf;
#进入redis-1容器
docker exec -it redis-1 /bin/sh
#创建集群(进入容器后执行)
redis-cli --cluster create 192.165.0.11:6379 192.165.0.12:6379 192.165.0.13:6379 192.165.0.14:6379 192.165.0.15:6379 192.165.0.16:6379 --cluster-replicas 1
#--cluster-replicas集群副本数
注:每个 Redis 集群节点都需要打开两个 TCP 连接。一个用于为客户端提供服务的正常 Redis TCP 端口,例如 6379。还有一个基于 6379 端口加 10000 的端口,比如 16379。
第二个端口用于集群总线,这是一个使用二进制协议的节点到节点通信通道。节点使用集群总线进行故障检测、配置更新、故障转移授权等等。客户端永远不要尝试与集群总线端口通信,与正常的 Redis 命令端口通信即可,但是请确保防火墙中的这两个端口都已经打开,否则 Redis 集群节点将无法通信。
https://www.cnblogs.com/mrhelloworld/p/docker12.html
3、使用docker-compose创建一个3主3从的redis集群
所需的集群配置文件:
#此处任然使用之前的myredis网络
#配置文件:
for port in $(seq 1 6); \
do \
mkdir -p /mycontainerdata/redis/node-${port}/conf
touch /mycontainerdata/redis/node-${port}/conf/redis.conf
cat << EOF >/mycontainerdata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.165.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
docker-compose.yml
#指定本 yml 依从的 compose 哪个版本制定的
version: "3"
#服务编排
services:
#服务名:
redis-1:
#指定容器运行的镜像
image: redis:5.0.9-alpine3.11
#指定自定义容器名称
container_name: redis-1
#设置网络模式
networks:
myredis:
ipv4_address: 192.165.0.11
#容器和主机绑定到暴露的端口
ports:
- 6371:6379
- 16371:16379
#将主机的数据卷或着文件挂载到容器里
volumes:
#主机的配置文件挂载到容器中的配置文件
- /mycontainerdata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf
#主机的数据文件挂载到容器中的持久化文件
- /mycontainerdata/redis/node-1/data:/data
#覆盖容器启动的默认命令,启动redis服务
command: /bin/sh -c "redis-server /etc/redis/redis.conf"
#添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保YML解析器不会将其转换为 True或False
environment:
# 设置时区为上海,否则时间会有问题
- TZ=Asia/Shanghai
redis-2:
image: redis:5.0.9-alpine3.11
container_name: redis-2
networks:
myredis:
ipv4_address: 192.165.0.12
ports:
- 6372:6379
- 16372:16379
volumes:
- /mycontainerdata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf
- /mycontainerdata/redis/node-2/data:/data
command: /bin/sh -c "redis-server /etc/redis/redis.conf"
environment:
- TZ=Asia/Shanghai
redis-3:
image: redis:5.0.9-alpine3.11
container_name: redis-3
networks:
myredis:
ipv4_address: 192.165.0.13
ports:
- 6373:6379
- 16373:16379
volumes:
- /mycontainerdata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf
- /mycontainerdata/redis/node-3/data:/data
command: /bin/sh -c "redis-server /etc/redis/redis.conf"
environment:
- TZ=Asia/Shanghai
redis-4:
image: redis:5.0.9-alpine3.11
container_name: redis-4
networks:
myredis:
ipv4_address: 192.165.0.14
ports:
- 6374:6379
- 16374:16379
volumes:
- /mycontainerdata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf
- /mycontainerdata/redis/node-4/data:/data
command: /bin/sh -c "redis-server /etc/redis/redis.conf"
environment:
- TZ=Asia/Shanghai
redis-5:
image: redis:5.0.9-alpine3.11
container_name: redis-5
networks:
myredis:
ipv4_address: 192.165.0.15
ports:
- 6375:6379
- 16375:16379
volumes:
- /mycontainerdata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf
- /mycontainerdata/redis/node-5/data:/data
command: /bin/sh -c "redis-server /etc/redis/redis.conf"
environment:
- TZ=Asia/Shanghai
redis-6:
image: redis:5.0.9-alpine3.11
container_name: redis-6
networks:
myredis:
ipv4_address: 192.165.0.16
ports:
- 6376:6379
- 16376:16379
volumes:
- /mycontainerdata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf
- /mycontainerdata/redis/node-6/data:/data
command: /bin/sh -c "redis-server /etc/redis/redis.conf"
environment:
- TZ=Asia/Shanghai
networks:
myredis:
external:
name: myredis
创建redis集群
#进入redis-1容器
docker exec -it redis-1 /bin/sh
#创建集群(进入容器后执行)
redis-cli --cluster create 192.165.0.11:6379 192.165.0.12:6379 192.165.0.13:6379 192.165.0.14:6379 192.165.0.15:6379 192.165.0.16:6379 --cluster-replicas 1
#--cluster-replicas集群副本数
edis-1 /bin/sh
#创建集群(进入容器后执行)
redis-cli --cluster create 192.165.0.11:6379 192.165.0.12:6379 192.165.0.13:6379 192.165.0.14:6379 192.165.0.15:6379 192.165.0.16:6379 --cluster-replicas 1
#–cluster-replicas集群副本数