环境
- docker desktop for windows 4.23.0
- redis 7.2
目标
搭建如下图分片+主从集群。
一、前提准备
1. 文件夹结构
因为Redis 7.2 docker
镜像里面没有配置文件,所以需要去redis
官网下载一个复制里面的redis.conf
博主这里用的是7.2.3
版本的redis.conf
,这个文件就在解压后第一层文件夹里。
然后构建如下文件夹结构。
language-txt1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| sharding/ ├── docker-compose.yaml ├── master1 │ └── conf │ └── redis.conf ├── master2 │ └── conf │ └── redis.conf ├── master3 │ └── conf │ └── redis.conf ├── replica1 │ └── conf │ └── redis.conf ├── replica2 │ └── conf │ └── redis.conf └── replica3 └── conf └── redis.conf
|
二、配置文件
1. redis.conf
对每个redis.conf
都做以下修改。分片集群的redis
主从的redis.conf
目前都是一样的。
language-bash1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| port 6379 # 开启集群功能 cluster-enabled yes # 集群的配置文件名称,不需要我们创建,由redis自己维护 cluster-config-file /data/nodes.conf # 节点心跳失败的超时时间 cluster-node-timeout 5000 # 持久化文件存放目录 dir /data # 绑定地址 bind 0.0.0.0 # 让redis后台运行 daemonize no # 保护模式 protected-mode no # 数据库数量 databases 1 # 日志 logfile /data/run.log
|
2. docker-compose文件
language-yaml1 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 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
| version: '3.8'
networks: redis-sharding: driver: bridge ipam: driver: default config: - subnet: 172.30.2.0/24
services: master1: container_name: master1 image: redis:7.2 volumes: - ./master1/conf:/usr/local/etc/redis ports: - "7001:6379" command: ["redis-server", "/usr/local/etc/redis/redis.conf"] networks: redis-sharding: ipv4_address: 172.30.2.11
master2: container_name: master2 image: redis:7.2 volumes: - ./master2/conf:/usr/local/etc/redis ports: - "7002:6379" command: [ "redis-server", "/usr/local/etc/redis/redis.conf" ] networks: redis-sharding: ipv4_address: 172.30.2.12
master3: container_name: master3 image: redis:7.2 volumes: - ./master3/conf:/usr/local/etc/redis ports: - "7003:6379" command: [ "redis-server", "/usr/local/etc/redis/redis.conf" ] networks: redis-sharding: ipv4_address: 172.30.2.13
replica1: container_name: replica1 image: redis:7.2 volumes: - ./replica1/conf:/usr/local/etc/redis ports: - "8001:6379" command: [ "redis-server", "/usr/local/etc/redis/redis.conf" ] networks: redis-sharding: ipv4_address: 172.30.2.21
replica2: container_name: replica2 image: redis:7.2 volumes: - ./replica2/conf:/usr/local/etc/redis ports: - "8002:6379" command: [ "redis-server", "/usr/local/etc/redis/redis.conf" ] networks: redis-sharding: ipv4_address: 172.30.2.22
replica3: container_name: replica3 image: redis:7.2 volumes: - ./replica3/conf:/usr/local/etc/redis ports: - "8003:6379" command: [ "redis-server", "/usr/local/etc/redis/redis.conf" ] networks: redis-sharding: ipv4_address: 172.30.2.23
|
需要注意以下几点
- 这里自定义了
bridge
子网并限定了范围,如果该范围已经被使用,请更换。
- 这里没有对
data
进行-v
挂载,如果要挂载,请注意宿主机对应文件夹权限问题。
随后运行
language-bash1
| docker-compose -p redis-sharding up -d
|
三、构建集群
接下来所有命令都在master1
容器的命令行执行
1. 自动分配主从关系
这个命令会创建了一个集群,包括三个主节点和三个从节点,每个主节点分配一个从节点作为副本,前3个ip
为主节点,后3个为从节点,主节点的从节点随机分配。
language-bash1
| redis-cli --cluster create 172.30.2.11:6379 172.30.2.12:6379 172.30.2.13:6379 172.30.2.21:6379 172.30.2.22:6379 172.30.2.23:6379 --cluster-replicas 1
|
如果希望手动指定主从关系,看下面,否则你可以跳过这一章节了。
2.1 构建3 master集群
language-bash1
| redis-cli --cluster create 172.30.2.11:6379 172.30.2.12:6379 172.30.2.13:6379 --cluster-replicas 0
|
2.2 手动配置从节点
查看3个主节点的ID
language-bash1
| redis-cli -h 172.30.2.11 -p 6379 cluster nodes
|
下面3个命令会将3个从节点加入集群中,其中172.30.2.11
可以是三个主节点的任意一个。
language-bash1 2 3
| redis-cli -h 172.30.2.21 -p 6379 cluster meet 172.30.2.11 6379 redis-cli -h 172.30.2.22 -p 6379 cluster meet 172.30.2.11 6379 redis-cli -h 172.30.2.23 -p 6379 cluster meet 172.30.2.11 6379
|
然后为每个从节点指定主节点。
language-bash1 2 3
| redis-cli -h 172.30.2.21 -p 6379 cluster replicate <master-ID> redis-cli -h 172.30.2.22 -p 6379 cluster replicate <master-ID> redis-cli -h 172.30.2.23 -p 6379 cluster replicate <master-ID>
|
四、测试
1. 集群结构
可以通过以下命令查看集群中每个节点的id、角色、ip、port、插槽范围
等信息
language-bash1
| redis-cli -h 172.30.2.11 -p 6379 cluster nodes
|
2. 分片测试
往集群存入4个键值
language-bash1 2 3 4
| redis-cli -c -h 172.30.2.11 -p 6379 set key1 value1 redis-cli -c -h 172.30.2.11 -p 6379 set key2 value2 redis-cli -c -h 172.30.2.11 -p 6379 set key3 value3 redis-cli -c -h 172.30.2.11 -p 6379 set key4 value4
|
查看每个主节点现有的键值,会发现每个节点只有一部分键值。
language-bash1 2 3
| redis-cli -h 172.30.2.11 -p 6379 --scan redis-cli -h 172.30.2.12 -p 6379 --scan redis-cli -h 172.30.2.13 -p 6379 --scan
|