1. 准备reids镜像
docker pull redis
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 87c26977fd90 3 weeks ago 113MB
2. 创建自定义网络
为方便各redis容器之间的通信连接,可以使用自定义网络:
docker network create redisnet --subnet 172.18.0.0/16
7c54ac31eab5af3166ff83d72a8f15d79a5ef89cd64cb46441b953779b588662
docker network ls
NETWORK ID NAME DRIVER SCOPE
6e0195b65225 bridge bridge local
62cd016ed66a host host local
fc650e2a675e none null local
7c54ac31eab5 redisnet bridge local
3. 创建redis集群目录,或者编写脚本创建
目录和ip记得修改成自己的!
参数解析:
参数名 | 含义 | 参数值 |
port | redis 端口号 | 端口号,6379 |
bind | ip 访问白名单 | ip , 0.0.0.0表示任意ip |
cluster-enabled | 是否开启集群模式 | yes/no |
cluster-config-file | 请注意,尽管有此选项的名称,但这不是用户可编辑的配置文件,而是Redis群集节点每次发生更改时自动保留群集配置(基本上为状态)的文件,以便能够 在启动时重新读取它。总之就是照着写,不用管,是redis自己用的 | nodes.conf |
cluster-node-timeout | Redis群集节点可以不可用的最长时间,而不会将其视为失败。 如果主节点超过指定的时间不可达,它将由其从属设备进行故障切换 | 毫秒数 |
cluster-announce-ip | redis | 端口号 |
bind | 集群节点的ip。个人理解是,集群中的node信息,存的就是这个ip。客户端就是在选择好目标节点后会根据这个ip向目标节点发送命令。所以,如果要公网访问,那这里的ip要填写成公网IP地址。如果是局域网访问,那就填局域网ip即可。总之,就是要填写客户端能够到达的ip | ip地址 |
cluster-announce-port | 集群节点的端口号 | 端口号 |
cluster-announce-bus-port | Redis集群通过总线进行节点间的数据交换,每个Redis节点都会开辟一个额外端口与总线进行TCP连接,以二进制形式进行数据交换 | 一般是Redis port加上10000 |
appendonly | 是否开启redis的持久化 | yes/no |
每个节点的redis.conf都得添加,对应配置文件如下:
# ip,redis端口和集群端口改成自己的!
cat redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.18.0.11
cluster-announce-port 6381
cluster-announce-bus-port 16381
appendonly yes
自己本地创建的目录结构如下,3个主节点3个从节点共6个文件目录,红框框住的是redis集群运行起来后自动添加的文件(还会生成 dump.rdb 文件,由于时间关系没等到生成该文件),这些文件不用管,只需要配置好redis.conf 即可。
4. 启动redis镜像,创建docker容器
docker run -p 6381:6379 -p 16381:16379 --name redis01 -v /opt/redis/redis-cluster/redis81/data:/data -v /opt/redis/redis-cluster/redis81/conf/redis.conf:/etc/redis/redis.conf -d -it --net redisnet --ip 172.18.0.11 redis redis-server /etc/redis/redis.conf;
docker run -p 6382:6379 -p 16382:16379 --name redis02 -v /opt/redis/redis-cluster/redis82/data:/data -v /opt/redis/redis-cluster/redis82/conf/redis.conf:/etc/redis/redis.conf -d -it --net redisnet --ip 172.18.0.12 redis redis-server /etc/redis/redis.conf;
docker run -p 6383:6379 -p 16383:16379 --name redis03 -v /opt/redis/redis-cluster/redis83/data:/data -v /opt/redis/redis-cluster/redis83/conf/redis.conf:/etc/redis/redis.conf -d -it --net redisnet --ip 172.18.0.13 redis redis-server /etc/redis/redis.conf;
docker run -p 6384:6379 -p 16384:16379 --name redis04 -v /opt/redis/redis-cluster/redis84/data:/data -v /opt/redis/redis-cluster/redis84/conf/redis.conf:/etc/redis/redis.conf -d -it --net redisnet --ip 172.18.0.14 redis redis-server /etc/redis/redis.conf;
docker run -p 6385:6379 -p 16385:16379 --name redis05 -v /opt/redis/redis-cluster/redis85/data:/data -v /opt/redis/redis-cluster/redis85/conf/redis.conf:/etc/redis/redis.conf -d -it --net redisnet --ip 172.18.0.15 redis redis-server /etc/redis/redis.conf;
docker run -p 6386:6379 -p 16386:16379 --name redis06 -v /opt/redis/redis-cluster/redis86/data:/data -v /opt/redis/redis-cluster/redis86/conf/redis.conf:/etc/redis/redis.conf -d -it --net redisnet --ip 172.18.0.16 redis redis-server /etc/redis/redis.conf;
5. 创建redis集群
redis-cli --cluster create 172.18.0.11:6379 172.18.0.12:6379 172.18.0.13:6379 172.18.0.14:6379 172.18.0.15:6379 172.18.0.16:6379 --cluster-replicas 1
6. 进入到容器内,连接redis集群,正常使用
# 先进入容器
docker exec -it redis01 /bin/bash
# 在连接redis集群, "-c" 表示连接集群
redis-cli -c -h 172.18.0.11 -p 6379
# 查看集群信息,三种都可以
172.18.0.11:6379> cluster info
172.18.0.11:6379> cluster nodes
172.18.0.11:6379> info replication
# 使用redis
172.18.0.11:6379> keys *
(empty array)
7. 如何删除已创建的redis集群?
7.1 直接停止并删除redis容器
docker rm $(docker ps -aq)
7.2 删除宿主机的所有redis节点下的appendonly.aof 文件、dump.rdb 文件以及nodes.conf 文件
7.3 重新拉起redis容器,并创建集群