Redis集群在保证主从加哨兵的基本功能之外,还能够提升Redis存储数据的能力。
集群down的条件
1、有大多数的主机存活,则集群还有可能通过投票断定那个或那些主机已经fail。
2、 fail的主机至少还有一个slave存活,则可以将其启动,继续接管对应的槽。
一、创建文件夹 redis0904,所有文件和操作均在此文件夹下进行
docker-compose.yml
# docker-compose.yml
version: "3.1"
services:
redis1:
image: 10.0.134.175:5000/redis:5.0.9
restart: always
container_name: redis1
environment:
- TZ=Asia/Shanghai
ports:
- 7001:7001
- 17001:17001
volumes:
#当前目录下的conf目录下redis1.conf对应容器中的redis.conf
- ./conf/redis1.conf:/usr/local/redis/redis.conf
command: ["redis-server","/usr/local/redis/redis.conf"]
redis2:
image: 10.0.134.175:5000/redis:5.0.9
restart: always
container_name: redis2
environment:
- TZ=Asia/Shanghai
ports:
- 7002:7002
- 17002:17002
volumes:
- ./conf/redis2.conf:/usr/local/redis/redis.conf
command: ["redis-server","/usr/local/redis/redis.conf"]
redis3:
image: 10.0.134.175:5000/redis:5.0.9
restart: always
container_name: redis3
environment:
- TZ=Asia/Shanghai
ports:
- 7003:7003
- 17003:17003
volumes:
- ./conf/redis3.conf:/usr/local/redis/redis.conf
command: ["redis-server","/usr/local/redis/redis.conf"]
redis4:
image: 10.0.134.175:5000/redis:5.0.9
restart: always
container_name: redis4
environment:
- TZ=Asia/Shanghai
ports:
- 7004:7004
- 17004:17004
volumes:
- ./conf/redis4.conf:/usr/local/redis/redis.conf
command: ["redis-server","/usr/local/redis/redis.conf"]
redis5:
image: 10.0.134.175:5000/redis:5.0.9
restart: always
container_name: redis5
environment:
- TZ=Asia/Shanghai
ports:
- 7005:7005
- 17005:17005
volumes:
- ./conf/redis5.conf:/usr/local/redis/redis.conf
command: ["redis-server","/usr/local/redis/redis.conf"]
redis6:
image: 10.0.134.175:5000/redis:5.0.9
restart: always
container_name: redis6
environment:
- TZ=Asia/Shanghai
ports:
- 7006:7006
- 17006:17006
volumes:
- ./conf/redis6.conf:/usr/local/redis/redis.conf
command: ["redis-server","/usr/local/redis/redis.conf"]
二、创建了redis1-6文件
实例redis1文件:
# 指定redis的端口号
port 7001
# 开启Redis集群
cluster-enabled yes
# 集群信息的文件
cluster-config-file nodes-7001.conf
# 集群的对外ip地址
cluster-announce-ip 10.0.138.96
# 集群的对外port
cluster-announce-port 7001
# 集群的总线端口
cluster-announce-bus-port 17001
redis2.conf示例
# 指定redis的端口号
port 7002
# 开启Redis集群
cluster-enabled yes
# 集群信息的文件
cluster-config-file nodes-7002.conf
# 集群的对外ip地址
cluster-announce-ip 10.0.138.96
# 集群的对外port
cluster-announce-port 7002
# 集群的总线端口
cluster-announce-bus-port 17002
其他3-6同样,改一下即可
三、启动了6个Redis的节点
随便跳转到一个容器内部,使用redis-cli管理集群
启动完后检查一下,是否都处于up状态,docker ps,如果有状态是restarting,那就是conf文件有问题,检查一下,port等有没有错误
#开启容器
docker-compose up -d
#进入容器,进入哪个都可以
docker exec -it redis1 bash
#开启容器,并指定每个容器至少有1个从
redis-cli --cluster create 10.0.138.96:7001 10.0.138.96:7002 10.0.138.96:7003 10.0.138.96:7004 10.0.138.96:7005 10.0.138.96:7006 --cluster-replicas 1
这里有3个master,3个slave
7001的从是7006,7002的从是7004,7003的从是7005
四、进入主容器操作
#一定要加-c 代表是集群,不加就是私用
redis-cli -p 7001 -c
#进入后存、取值即可,如果redis.conf不是相同的host,需要加上 -h 127.0.0.1本机操作 redis-cli -p 7001 -h 127.0.0.1 -c
set name zs
set age 18
set gender true
这里有一个槽的概念,最开始的图有介绍,Redis默认有16384个槽,当存数据时,它会经过某个函数的的处理,然后对16384进行取余,看他的值,然后放在哪个槽中。
我们这里有3个主,所有会均分3个槽,根据图可以看到系统的分配
7001,是0-5460, 7002是5461-10922,7003是10923-16383
关于系统处理的个人猜想:系统会根据key的hash值,对16384取余,根据余数把它放在对应的容器内。16384换算成二进制是:0100 0000 0000 0000,他应该是进行位运算。
五、 取值
六、测试down一个,看哨兵是否能上位
#停掉redis1
docker stop redis1
#进入redis2
docker exec -it redis2 bash
#查看redis2的nodes.conf文件
more nodes.conf
根据图可以看到,redis6已结成功上位
我们进入redis6进行验证,看它是否有写的权限
docker exec -it redis6 bash
set class java
写入成功,证明redis6已经成功上位,成了主。
七、重启redis1,看能否恢复
#开启redis1
docker start redis1
#进入redis6
docker exec -it redis1 bash
#一定要加-c 代表是集群,不加就是私用
redis-cli -p 7001 -c
set sex male
我们也可以通过nodes.conf文件查看
redis6还是master,redis1是slave
说明redis1想上位,还要等redis1故障down掉