docekr-compose搭建redis集群(三主三从)

硬件:三台主机

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

docekr-compose搭建redis集群(三主三从)_第1张图片

 二、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

五、启动成功验证

docekr-compose搭建redis集群(三主三从)_第2张图片

 开端口

firewall-cmd --permanent --add-port=6379/tcp --add-port=6380/tcp --add-port=16379/tcp  --add-port=16380/tcp

docekr-compose搭建redis集群(三主三从)_第3张图片

六、动态指定主从节点

 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> 

你可能感兴趣的:(redis,数据库,缓存,redis集群)