基于 docker 在我们云服务器上搭建出一个 redis 集群出来

当前节点,主要是因为我们只有一个云服务器,搞分布式系统,就比较麻烦。实际工作中,一般是通过多个主机的方式,来搭建集群
9 个 docker 容器,来模拟 9 台服务器此处我们创建
11个redis节点,其中前9个用来演示集群的搭建,后2个用来演示集群扩容
一定要记得,把以前启动的 redis 容器给停掉
切换到对应目录下后,输入:
# 查看有哪些容器正在运行
docker ps -a
# 关闭此目录下的容器
docker-compose down切换到 Cluster 目录后
touch docker-compose.yml
touch generate.sh
Linux 上,以 .sh 后缀结尾的文件,称为“shell 脚本” Linux 的时候,都是通过一些命令来进行操作的。使用命令操作,就非常适合把命令给写到一个文件中,批量化执行11 个 redis 节点,这些 redis 的配置文件内容,大同小异,此时就可以使用脚本来批量生成(也可以不使用脚本,手动一个一个改)shell 脚本:
for port in $(seq 1 9); \
do \
mkdir -p redis${port}/
touch redis${port}/redis.conf
cat << EOF > redis${port}/redis.conf
port 6379
bind 0.0.0.0
protected-mode no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.30.0.10${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
EOF
done
# 注意 cluster-announce-ip 的值有变化.
for port in $(seq 10 11); \
do \
mkdir -p redis${port}/
touch redis${port}/redis.conf
cat << EOF > redis${port}/redis.conf
port 6379
bind 0.0.0.0
protected-mode no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.30.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
EOF
donefor port in $(seq 1 9); \:基于范围的循环。类似与 Java 的 for each seq 就是一个 Linux 命令,后面俩参数就是从哪到哪,能生成 [1, 9] 这个区间
do 和 done:在 shell 脚本里面,{} 用来表示变量,不是表示代码块。对于 for 来说,就是使用 do 和 done 来表示代码块开始和结束\:是续行符,把下一行的内容和当前行,合并成一行。shell 默认情况下,要求把所有的代码都写到一行里,所以可以使用续行符来换行预期效果:得到 11 个目录,每个目录里面都有一个配置文件,配置文件中,ip 地址各不相同
执行命令: 通过命令:
bash generate.sh
随后可以看到目录里面:

version: '3.7'
networks:
mynet:
ipam:
config:
- subnet: 172.30.0.0/24
services:
redis1:
image: 'redis:5.0.9'
container_name: redis1
restart: always
volumes:
- ./redis1/:/etc/redis/
ports:
- 6371:6379
- 16371:16379
command:
redis-server /etc/redis/redis.conf
networks:
mynet:
ipv4_address: 172.30.0.101
// 剩余10个容器,格式和这个一样,将名字、端口号、ip地址递增即可networks:此处为了后续创建静态 ip,此时要先手动创建出网络,同时给这个网段也分配 ip ip 地址 = 网络号 + 主机号。使用子网掩码的方式来区分网络号和主机号/24 就代表子网掩码左边 24 位都是 1 ,右边 8 位是 0,255.255.255.0,网络号就是 172.30.0 ip 是内网 ipifconfig)ports:此处不进行端口映射,也是可以的,映射一下目的是为了在容器外面通过客户端直接进行访问1-255,保证不重复),按照之前在配置文件中写的 101-111 这 11 台主机进行上述配置的时候,一定要保证前后一致性(第一步和第二部相关部分,端口号、ip 地址)
version: '3.7'
networks:
mynet:
ipam:
config:
- subnet: 172.30.0.0/24
services:
redis1:
image: 'redis:5.0.9'
container_name: redis1
restart: always
volumes:
- ./redis1/:/etc/redis/
ports:
- 6371:6379
- 16371:16379
command:
redis-server /etc/redis/redis.conf
networks:
mynet:
ipv4_address: 172.30.0.101
redis2:
image: 'redis:5.0.9'
container_name: redis2
restart: always
volumes:
- ./redis2/:/etc/redis/
ports:
- 6372:6379
- 16372:16379
command:
redis-server /etc/redis/redis.conf
networks:
mynet:
ipv4_address: 172.30.0.102
redis3:
image: 'redis:5.0.9'
container_name: redis3
restart: always
volumes:
- ./redis3/:/etc/redis/
ports:
- 6373:6379
- 16373:16379
command:
redis-server /etc/redis/redis.conf
networks:
mynet:
ipv4_address: 172.30.0.103
redis4:
image: 'redis:5.0.9'
container_name: redis4
restart: always
volumes:
- ./redis4/:/etc/redis/
ports:
- 6374:6379
- 16374:16379
command:
redis-server /etc/redis/redis.conf
networks:
mynet:
ipv4_address: 172.30.0.104
redis5:
image: 'redis:5.0.9'
container_name: redis5
restart: always
volumes:
- ./redis5/:/etc/redis/
ports:
- 6375:6379
- 16375:16379
command:
redis-server /etc/redis/redis.conf
networks:
mynet:
ipv4_address: 172.30.0.105
redis6:
image: 'redis:5.0.9'
container_name: redis6
restart: always
volumes:
- ./redis6/:/etc/redis/
ports:
- 6376:6379
- 16376:16379
command:
redis-server /etc/redis/redis.conf
networks:
mynet:
ipv4_address: 172.30.0.106
redis7:
image: 'redis:5.0.9'
container_name: redis7
restart: always
volumes:
- ./redis7/:/etc/redis/
ports:
- 6377:6379
- 16377:16379
command:
redis-server /etc/redis/redis.conf
networks:
mynet:
ipv4_address: 172.30.0.107
redis8:
image: 'redis:5.0.9'
container_name: redis8
restart: always
volumes:
- ./redis8/:/etc/redis/
ports:
- 6378:6379
- 16378:16379
command:
redis-server /etc/redis/redis.conf
networks:
mynet:
ipv4_address: 172.30.0.108
redis9:
image: 'redis:5.0.9'
container_name: redis9
restart: always
volumes:
- ./redis9/:/etc/redis/
ports:
- 6379:6379
- 16379:16379
command:
redis-server /etc/redis/redis.conf
networks:
mynet:
ipv4_address: 172.30.0.109
redis10:
image: 'redis:5.0.9'
container_name: redis10
restart: always
volumes:
- ./redis10/:/etc/redis/
ports:
- 6380:6379
- 16380:16379
command:
redis-server /etc/redis/redis.conf
networks:
mynet:
ipv4_address: 172.30.0.110
redis11:
image: 'redis:5.0.9'
container_name: redis11
restart: always
volumes:
- ./redis11/:/etc/redis/
ports:
- 6381:6379
- 16381:16379
command:
redis-server /etc/redis/redis.conf
networks:
mynet:
ipv4_address: 172.30.0.111启动之前,一定要把之前已经运行的 redis 相关东西都干掉!否则就可能因为端口冲突等原因,导致现在的启动失败

通过下面命令启动
docker-compose up -d

此处把前
9个主机构建成集群,3主6从,后2个主机暂时不用
相关命令:
redis-cli --cluster create 172.30.0.101:6379 172.30.0.102:6379 172.30.0.103:6379 172.30.0.104:6379 172.30.0.105:6379 172.30.0.106:6379 172.30.0.107:6379 172.30.0.108:6379 172.30.0.109:6379 --cluster-replicas 2--cluster create:建立集群,后面填写每个节点的 ip 和地址--cluster-replicas 2:表示每个主节点要两个从节点备份 redis 就知道了,3 个节点是一伙的,一共 3 个分片redis 在构建集群的时候,谁是主节点,谁是从节点,谁和谁是一个分片,都是不固定的
命令执行完之后

yes”进行构建如果在输入构建命令连接不上,超时,就需要进行一步处理
在进行构建集群操作之前,需要先让这个命令在任意一个 redis 容器中进行
redis 容器都是在同一个局域网内,但是此时这个宿主机却不在,想要进行后续操作,就必须要保证都在同一个局域网内执行命令
docker exec -it ce /bin/bashdocker exec:在一个已经运行中的 docker 容器内执行命令-it: -i:表示以交互模式运行,让能够保持输入流打开-t:分配一个“伪终端”(TTY),这样你可以像在普通终端中一样与容器交互ce:容器的名字或容器 ID,表示要进入的容器bin/bash:表示在容器内部启动一个 Bash shell,通常用于容器内操作在集群构建完毕之后,输入 exit 就可以退出容器
redis 节点的配置文件docker 创建出 11 个 redis 节点,并且启动容器redis-cli 执行构建集群命令