作者:知足幸福_21942 | 来源:互联网 | 2023-09-14 18:48
基于目前烂大街微服务的情况下,Redis在企业中使用非常频繁,比如:缓存服务、分布式锁、分布式原子计数锁、队列等等。本文主要讲解redis-cluster集群搭建,规划模拟6个节点,三主三从。
系统
CentOS 7
CPU
2核
内存
4G
硬盘
50G
Docker
19.03.5(安装)
Docker-compose
1.16.1(与docker版本映射表格)(安装)
Redis
5.0
节点规划
容器名
IP
端口映射
运行模式
redis-master1
172.50.0.2
6391 -> 6391
Master
redis-master2
172.50.0.3
6392 -> 6392
Master
redis-master3
172.50.0.4
6393 -> 6393
Master
redis-slave1
172.50.0.5
6394 -> 6394
Slave
redis-slave2
172.50.0.6
6395 -> 6395
Slave
redis-slave3
172.50.0.7
6396 -> 6396
Slave
准备 redis.conf
创建数据存放目录
# 注意:以下命令均在/mnt/redis/目录下执行
mkdir /mnt/rediscd /redis# data 数据目录,config 配置文件目录
mkdir -p {redis-master1/data,redis-master2/data,redis-master3/data,redis-slave1/data,redis-slave2/data,redis-slave3/data,redis-master1/config,redis-master2/config,redis-master3/config,redis-slave1/config,redis-slave2/config,redis-slave3/config}
获取5.0版本redis.conf文件(坚~单击跳转),对redis.conf内如下配置内容进行修改:
# 修改 可以接受连接的网卡地址,0.0.0.0 接受所有
bind 0.0.0.0
# 端口
port 6391
# 节点超时时间,毫秒
cluster-node-timeout 15000
# 集群内部配置文件
cluster-config-file "nodes-6379.conf"## 设置密码
###1、如果对集群设置密码,那么requirepass和masterauth都需要设置,否则发生主从切换时,就会遇到授权问题,可以模拟并观察日志
###2、各个节点的密码都必须一致,否则Redirected就会失败
###3、设置密码后,操作redis-cli需(redis-cli -c -p 端口)通过auth password进行密码验证
### -c 集群方式登陆客户端程序
masterauth 123456
requirepass 123456
将redis.conf复制6份到对应的config文件夹下:
echo redis-master1 redis-master2 redis-master3 redis-slave1 redis-slave2 redis-slave3 | xargs -n 1 cp -v redis.sh
- -n 1 - 告诉 xargs 命令每个命令行最多使用一个参数,并发送到 cp 命令中。
- cp – 用于复制文件。
- -v – 启用详细模式来显示更多复制细节。
修改redis.conf端口号以及文件名
# 批量修改端口
sed -i 's/port 6391/port 6392/' redis-master2/redis.conf &&
sed -i ‘s/port 6391/port 6393/’ redis-master3/redis.conf &&
sed -i ‘s/port 6391/port 6394/’ redis-slave1/redis.conf &&
sed -i ‘s/port 6391/port 6395/’ redis-slave2/redis.conf &&
sed -i ‘s/port 6391/port 6396/’ redis-slave3/redis.conf
# 批量修改文件名
mv redis-master1/redis.conf redis-master1/nodes-3691.conf &&
mv redis-master2/redis.conf redis-master2/nodes-3692.conf &&
mv redis-master3/redis.conf redis-master3/nodes-3693.conf &&
mv redis-slave1/redis.conf redis-slave1/nodes-3694.conf &&
mv redis-slave2/redis.conf redis-slave2/nodes-3695.conf &&
mv redis-slave3/redis.conf redis-slave3/nodes-3696.conf
编写启动文件
vim redis.sh# 内容:
redis-server /config/nodes-${PORT}.conf
编写 redis-docker-compose.yml
version: "3.3"
services:redis-master1: image: redis:5.0 # 基础镜像container_name: redis-master1 # 容器服务名working_dir: /config # 工作目录environment: # 环境变量- PORT=6391 # 跟 config/nodes-6391.conf 里的配置一样的端口ports: # 映射端口,对外提供服务- "6391:6391" # redis 的服务端口- "16391:16391" # redis 集群监控端口stdin_open: true # 标准输入打开# docker 网络设置networks: redis-cluster:ipv4_address: 172.50.0.2tty: trueprivileged: true # 拥有容器内命令执行的权限# 映射数据卷,配置目录volumes: ["/mnt/redis/redis-master1/data:/data","/mnt/redis/redis-master1/config:/config","/mnt/redis/redis.sh:/config/redis.sh","/etc/localtime:/etc/localtime" # 时间同步] entrypoint: # 设置服务默认的启动程序- /bin/bash- redis.shredis-master2:image: redis:5.0working_dir: /configcontainer_name: redis-master2environment:- PORT=6392networks:redis-cluster:ipv4_address: 172.50.0.3ports:- "6392:6392"- "16392:16392"stdin_open: truetty: trueprivileged: truevolumes: ["/mnt/redis/redis-master2/data:/data","/mnt/redis/redis-master2/config:/config","/mnt/redis/redis.sh:/config/redis.sh","/etc/localtime:/etc/localtime"]entrypoint:- /bin/bash- redis.shredis-master3:image: redis:5.0container_name: redis-master3working_dir: /configenvironment:- PORT=6393networks:redis-cluster:ipv4_address: 172.50.0.4ports:- "6393:6393"- "16393:16393"stdin_open: truetty: trueprivileged: truevolumes: ["/mnt/redis/redis-master3/data:/data","/mnt/redis/redis-master3/config:/config","/mnt/redis/redis.sh:/config/redis.sh","/etc/localtime:/etc/localtime"]entrypoint:- /bin/bash- redis.shredis-slave1:image: redis:5.0container_name: redis-slave1working_dir: /configenvironment:- PORT=6394networks:redis-cluster:ipv4_address: 172.50.0.5ports:- "6394:6394"- "16394:16394"stdin_open: truetty: trueprivileged: truevolumes: ["/mnt/redis/redis-slave1/data:/data","/mnt/redis/redis-slave1/config:/config","/mnt/redis/redis.sh:/config/redis.sh","/etc/localtime:/etc/localtime"]entrypoint:- /bin/bash- redis.shredis-salve2:image: redis:5.0working_dir: /configcontainer_name: redis-salve2environment:- PORT=6395ports:- "6395:6395"- "16395:16395"stdin_open: truenetworks:redis-cluster:ipv4_address: 172.50.0.6tty: trueprivileged: truevolumes: ["/mnt/redis/redis-slave2/data:/data","/mnt/redis/redis-slave2/config:/config","/mnt/redis/redis.sh:/config/redis.sh","/etc/localtime:/etc/localtime"]entrypoint:- /bin/bash- redis.shredis-salve3:image: redis:5.0container_name: redis-slave3working_dir: /configenvironment:- PORT=6396ports:- "6396:6396"- "16396:16396"stdin_open: truenetworks:redis-cluster:ipv4_address: 172.50.0.7tty: trueprivileged: truevolumes: ["/mnt/redis/redis-slave3/data:/data","/mnt/redis/redis-slave3/config:/config","/mnt/redis/redis.sh:/config/redis.sh","/etc/localtime:/etc/localtime"]entrypoint:- /bin/bash- redis.sh
networks:redis-cluster:driver: bridge # 创建一个docker 的桥接网络ipam:driver: defaultconfig:-subnet: 172.50.0.0/16
Docker编排Redis集群
在这里提供一个批量修改文件,设置密码的方式(如果你再最开始已经设置密码,请忽略!!):
sed -i 's/# masterauth /masterauth 123456/g' `grep nodes-63 -rl --include="*.conf" redis/`sed -i 's/# requirepass foobared/requirepass 123456/g' `grep nodes-63 -rl --include="*.conf" redis/`docker-compose -f redis-cluster-docker-compose.yml up -d
集群初始化
# 进入容器内部
docker exec -it redis-master1 bash# 初始化
redis-cli --cluster create 172.50.0.2:6391 172.50.0.3:6392 172.50.0.4:6393 172.50.0.5:6394 172.50.0.6:6395 172.50.0.7:6396 --cluster-replicas 1########################################## 当然你也可以直接这样执行 ##
########################################docker exec -it redis-master1 redis-cli --cluster create 172.50.0.2:6391 172.50.0.3:6392 172.50.0.4:6393 172.50.0.5:6394 172.50.0.6:6395 172.50.0.7:6396 --cluster-replicas 1# 查看一下集群状态信息,设置密码时,不可用docker exec -it redis-master1 redis-cli -p 6391 --cluster-replicas 1 cluster info
验证集群数据一致性
验证手段:我们再redis-master1创建一条数据(key:testKey,value:1),分别在redis-master2、edis-slave3分片查询数据(get testKey)。
你可能会用到的命令:
# 进入容器内部
docker exec -it redis-master1 bash
# 连接客户端
redis-cli -p 6396 -c
# 创建数据
set testKey 1
# 查看数据
get testKey
从上图可以看出,如果在当前分片没有get到数据,集群会自动切换到特定的分片,如果你想了解更多请百度/Google Redis集群路由规则原理。我们无论从那个节点都能get到数据(slave节点只读),因此我们的Redis-Cluster 集群数据具备一致性。