硬件:三台主机
172.50.2.40
172.50.2.41
172.50.2.42
需求:不想让它随机分配主从关系。想指定主从关系,如下:
主节点:172.50.2.40:6379,从节点172.50.2.41:6378
主节点:172.50.2.41:6379,从节点172.50.2.42:6378
主节点:172.50.2.42:6379,从节点172.50.2.40:6378
一、创建目录(命令多执行模式)
# 创建主节点目录
mkdir -p /docker/redis-cluster/redis-1/data
chmod 777 /docker/redis-cluster/redis-1/data
# 创建从节点目录
mkdir -p /docker/redis-cluster/redis-2/data
chmod 777 /docker/redis-cluster/redis-2/data
二、redis.conf
主节点redis.conf (/docker/redis-cluster/redis-1) 三份相同的
# 配置持久划文件存储路径
dir /redis/data
# 开启集群
cluster-enabled yes
# 集群配置文件
cluster-config-file nodes.conf
# 集群节点多少时间未响应视为该节点丢失
cluster-node-timeout 5000
appendonly yes
# 文件名
appendfilename "appendonly.aof"
# 持久化策略,no:不同步,everysec:每秒一次,always:总是同步,速度比较慢
appendfsync everysec
#每个节点的端口,主节点6379,从节点6380
port 6379
#设置master节点密码
masterauth passwd123
#设置密码
requirepass passwd123
从节点redis.conf (/docker/redis-cluster/redis-2) 三份相同的
# 配置持久划文件存储路径
dir /redis/data
# 开启集群
cluster-enabled yes
# 集群配置文件
cluster-config-file nodes.conf
# 集群节点多少时间未响应视为该节点丢失
cluster-node-timeout 5000
appendonly yes
# 文件名
appendfilename "appendonly.aof"
# 持久化策略,no:不同步,everysec:每秒一次,always:总是同步,速度比较慢
appendfsync everysec
#每个节点的端口,主节点6379,从节点6380
port 6380
#设置master节点密码
masterauth passwd123
#设置密码
requirepass passwd123
三、docker-compose.yml
主节点docker-ompose.yml 三份相同的
version: "3.9"
services:
redis-1:
image: redis:6.2.7
container_name: redis-1
ports:
- "6379:6379"
- "16379:16379" #集群总线端口 默认就是redis端口加1000,每个节点都要打开
environment:
# 时区上海
TZ: Asia/Shanghai
volumes:
# 配置文件
- /docker/redis-cluster/redis-1/redis.conf:/redis/redis.conf
# 数据文件
- /docker/redis-cluster/redis-1/data/:/redis/data/
command: "redis-server /redis/redis.conf"
privileged: true
network_mode: "host"
从节点docker-compose.yml 三份相同的
version: "3.9"
services:
redis-2:
image: redis:6.2.7
container_name: redis-2
ports:
- "6380:6380"
- "16380:16380" #集群总线端口 默认就是redis端口加1000,每个节点都要打开
environment:
# 时区上海
TZ: Asia/Shanghai
volumes:
# 配置文件
- /docker/redis-cluster/redis-2/redis.conf:/redis/redis.conf
# 数据文件
- /docker/redis-cluster/redis-2/data/:/redis/data/
command: "redis-server /redis/redis.conf"
privileged: true
network_mode: "host"
四、启动
docker-compose up -d
五、启动成功验证
开端口
firewall-cmd --permanent --add-port=6379/tcp --add-port=6380/tcp --add-port=16379/tcp --add-port=16380/tcp
六、动态指定主从节点
1、进入容器(三台机子都要进入)
jing
docker exec -it redis-1 /bin/bash
2、执行命令:指定主节点,零副本 (三台机子都要执行)
注意:如果前面加了masterauth认证,需要加 -a passwd123参数,不然执行命令会爆错
[ERR] Node 172.50.2.40:6379 NOAUTH Authentication required
redis-cli --cluster create 172.50.2.40:6379 172.50.2.41:6379 172.50.2.42:6379 --cluster-replicas 0 -a passwd123
3、普通登录
#可能直接进入读主机,存储数据时,会出现MOVED重定向操作。所以,应该以集群方式登录。
redis-cli -p 6379 -a passwd123
#-c 采用集群策略连接,设置数据会自动切换到相应的写主机
redis-cli -c -p 6379 -a passwd123
4、查看结点信息,主要是为了查看cluster-master-id
cluster nodes
5、指定从节点 (先退出登录)
注意:一定要把-a passwd123加上。不想加就把redis.conf的masterauth参数去掉
# 第一个从节点
redis-cli --cluster add-node 172.50.2.40:6380 172.50.2.41:6379 -a passwd123 --cluster-slave --cluster-master-id 8db81cfd7e7d32d80b5c165456a212ae6eb10e03
# 第二个从节点
redis-cli --cluster add-node 172.50.2.41:6380 172.50.2.42:6379 -a passwd123 --cluster-slave --cluster-master-id 4d6a3d00583d5b8974c987ce08274a65d46923d3
# 第三个从节点
redis-cli --cluster add-node 172.50.2.42:6380 172.50.2.40:6379 -a passwd123 --cluster-slave --cluster-master-id 33fbad41abf1225b932e50d3ae1df8128f1a8840
以上命令直接在一个容器里执行就是了
其中:
- slave 表示要添加从节点
- cluster-master-id 要添加到哪一个主节点,id是*****
- 172.50.2.40:6380 要添加的从节点
- 172.50.2.41:6379 原集群中任意节点
最后展示:
最终架构图
7、测试
127.0.0.1:6379> set test 'hello world'
-> Redirected to slot [6918] located at 172.50.2.41:6379
OK
172.50.2.41:6379> set test1 'hello world1'
-> Redirected to slot [4768] located at 172.50.2.40:6379
OK
172.50.2.40:6379> set test2 'hello world2'
-> Redirected to slot [8899] located at 172.50.2.41:6379
OK
172.50.2.41:6379> set test3 'hello world3'
-> Redirected to slot [13026] located at 172.50.2.42:6379
OK
172.50.2.42:6379> get test2
-> Redirected to slot [8899] located at 172.50.2.41:6379
"hello world2"
172.50.2.41:6379> get test3
-> Redirected to slot [13026] located at 172.50.2.42:6379
"hello world3"
172.50.2.42:6379>