发布时间:2025-11-05 06:00:07 来源:码上建站 作者:数据库

在一台Linux服务器上使用docker搭建一个cluster模式的redis集群。三个master节点,建Rr集三个slave节点,何使六个节点因为在同一台服务器上,建Rr集所以每个节点使用不同的何使端口,端口范围是建Rr集6380到6385。
redis cluster集群具有如下几个特点:
去中心化,何使采用多主多从模式。建Rr集所有节点彼此互联(PING-PONG机制),何使内部使用二进制协议传输。建Rr集客户端不需要连接集群所有节点,何使连接集群中任何一个可用节点即可。建Rr集每一个分区都是何使由一个主节点和多个从节点组成,分片和分片之间平行。建Rr集每一个master节点负责维护一部分槽,何使以及槽所映射的键值数据;集群中每个节点都有全量的槽信息,通过槽每个node都知道具体数据存储到哪个node上。可以选择指定版本的服务器租用redis,本文为了方便演示,使用最新版本
复制docker pull redis1.因为六个节点监听端口不同,所以配置文件也有区别,可以使用如下shell脚本生成对应配置文件(假如命名为createRedisConf.sh):
复制#!/bin/shfor port in $(seq 6380 6385);
domkdir -p ~/redisCluster/node-${port}/conftouch ~/redisCluster/node-${port}/conf/redis.confcat << EOF > ~/redisCluster/node-${port}/conf/redis.conf#节点端口port ${port}
#添加访问认证requirepass luduoxin#如果主节点开启了访问认证,从节点访问主节点需要认证masterauth luduoxin#保护模式,默认值 yes,即开启。开启保护模式以后,需配置 bind ip 或者设置访问密码;关闭保护模式,外部网络可以直接访问protected-mode no#bind 0.0.0.0#是否以守护线程的方式启动(后台启动),默认 nodaemonize no#是否开启 AOF 持久化模式,默认 noappendonly yes#是否开启集群模式,默认 nocluster-enabled yes#集群节点信息文件cluster-config-file nodes.conf#群节点连接超时时间cluster-node-timeout 5000#集群节点 IP,我使用的服务的ip为172.16.3.110,替换为自己的服务器的WordPress模板即可cluster-announce-ip 172.16.3.110#集群节点映射端口cluster-announce-port ${port}
#集群节点总线端口cluster-announce-bus-port 1${port}
EOFdone1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.创建此文件后,先赋予执行权限,然后执行生成配置文件
复制$ chmod 755 ./createRedisConf.sh$ sh ./createRedisConf.sh1.2.可以使用如下shell脚本快速创建出来(createRedis.sh)。
复制#!/bin/sh## 首次创建并运行redis容器if [ "$1" = "create" ]; then for port in $(seq 6380 6385);
do docker run -di --restart always --name redis-${port} --net rediscluster -p ${port}:${port} -p 1${port}:1${port} -v ~/redisCluster/node-${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf -v ~/redisCluster/node-${port}/data:/data redis redis-server /usr/local/etc/redis/redis.conf donefi##停止redis容器if [ "$1" = "stop" ]; then for port in $(seq 6380 6385);
do docker stop redis-${port}
donefi##启动已有的redis容器if [ "$1" = "start" ]; then for port in $(seq 6380 6385);
do docker start redis-${port}
donefi## 删除redis容器if [ "$1" = "rm" ]; then for port in $(seq 6380 6385);
do docker rm redis-${port}
donefi1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.创建此文件后,先赋予执行权限,然后执行创建出redis服务
复制$ chmod 755 ./createRedis.sh$ sh ./createRedis.sh create1.2.创建完成后,可以使用命令 docker ps -a 查看容器。
选择一个redis容器,例如选择redis-6380容器,进入容器。
复制docker exec -it redis-6380 /bin/bash1.在容器里面执行如下命令。
复制redis-cli -a luduoxin --cluster create 172.16.3.110:6380 172.16.3.110:6381 172.16.3.110:6382 172.16.3.110:6383 172.16.3.110:6384 172.16.3.110:6385 --cluster-replicas 11.然后出现如下提示,输入 yes 继续。
复制Can I set the above configuration ? (type yes to accept):1.创建过程如下:
复制# redis-cli -a luduoxin --cluster create 172.16.3.110:6380 172.16.3.110:6381 172.16.3.110:6382 172.16.3.110:6383 172.16.3.110:6384 172.16.3.110:6385 --cluster-replicas 1Warning: Using a password with -a or -u option on the command line interface may not be safe.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460Master[1] -> Slots 5461 - 10922Master[2] -> Slots 10923 - 16383Adding replica 172.16.3.110:6384 to 172.16.3.110:6380Adding replica 172.16.3.110:6385 to 172.16.3.110:6381Adding replica 172.16.3.110:6383 to 172.16.3.110:6382>>> Trying to optimize slaves allocation for anti-affinity[WARNING] Some slaves are in the same host as their masterM: 78891932599b7497c8dd921295ba19eb0f549285 172.16.3.110:6380 slots:[0-5460] (5461 slots) masterM: 43c735f5e5bd1dfd7e4fa80aed467dc6e10a9081 172.16.3.110:6381 slots:[5461-10922] (5462 slots) masterM: 254d130ac0f88ec36be9cda27e59500e04c283cc 172.16.3.110:6382 slots:[10923-16383] (5461 slots) masterS: e2875613c12f0754e485e5eb56d968dd78493bae 172.16.3.110:6383 replicates 78891932599b7497c8dd921295ba19eb0f549285S: a87af69f190a86455864c5ca73fabb60290abd1e 172.16.3.110:6384 replicates 43c735f5e5bd1dfd7e4fa80aed467dc6e10a9081S: 846fa01cecc7fa75fc558eb8fcfb2788abb2a83d 172.16.3.110:6385 replicates 254d130ac0f88ec36be9cda27e59500e04c283ccCan I set the above configuration? (type yes to accept): yes>>> Nodes configuration updated>>> Assign a different config epoch to each node>>> Sending CLUSTER MEET messages to join the clusterWaiting for the cluster to join.
>>> Performing Cluster Check (using node 172.16.3.110:6380)
M: 78891932599b7497c8dd921295ba19eb0f549285 172.16.3.110:6380 slots:[0-5460] (5461 slots) master 1 additional replica(s)
M: 254d130ac0f88ec36be9cda27e59500e04c283cc 172.16.3.110:6382 slots:[10923-16383] (5461 slots) master 1 additional replica(s)
M: 43c735f5e5bd1dfd7e4fa80aed467dc6e10a9081 172.16.3.110:6381 slots:[5461-10922] (5462 slots) master 1 additional replica(s)
S: a87af69f190a86455864c5ca73fabb60290abd1e 172.16.3.110:6384 slots: (0 slots) slave replicates 43c735f5e5bd1dfd7e4fa80aed467dc6e10a9081S: 846fa01cecc7fa75fc558eb8fcfb2788abb2a83d 172.16.3.110:6385 slots: (0 slots) slave replicates 254d130ac0f88ec36be9cda27e59500e04c283ccS: e2875613c12f0754e485e5eb56d968dd78493bae 172.16.3.110:6383 slots: (0 slots) slave replicates 78891932599b7497c8dd921295ba19eb0f549285[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.到这里集群就创建成功了。
检查集群状态。
复制redis-cli -a luduoxin --cluster check 172.16.3.110:63821.连接集群某个节点。
复制$ redis-cli -c -a luduoxin -h 172.16.3.110 -p 6382//查看集群信息172.16.3.110:6381> cluster info//查看集群结点信息172.16.3.110:6381> cluster nodes//查看集群的slot分配区间及对应的主从节点映射关系172.16.3.110:6381> cluster slots1.2.3.4.5.6.7.本文主要讲了如何在一台Linux服务器上使用docker搭建一个cluster模式的redis集群,这种方式搭建的集群主要用于测试用途,不建议在生产环境使用。源码库