前言
redis是一个开源的key-value数据库,拥有极高的性能,支持丰富的数据结构等特点。通常作为中间件使用,是企业级应用不可或缺的一部分。通常,开发的时候,我们一般只在本地搭建一个redis服务作为开发测试使用,但是在线上一般都还是搭建集群,提供稳定可靠的服务。
集群模型
从上图看出,集群最少需要6个节点,3主3从。 redis 的集群是根据它内部的槽(slot)来实现的,redis 有 16384 个槽, 根据 CRC16(key)%1638
可以计算出 key 应该存放在哪个槽中。同时每个节点之间通过 redis 的 Gossip 协议
来传播信息,检查目标节点是否存活等。如果有一个主节点宕机,redis 会选举 出一个新的主节点来替代宕机的主节点,以此来保证服务的可用性。
集群搭建
redis配置文档、数据
在linux目录下创建这样的几个文件夹,并在文件夹中创建相应的redis.conf文件(data文件自动创建)
下面是redis.conf的内容
# 文件名:redis.conf
## 节点端口:7000, 7001, 7002, 7003, 7004, 7005
port 7000
## cluster集群模式
cluster-enabled yes
## 集群配置名
cluster-config-file nodes.conf
## 关闭保护模式
#protected-mode no
## 超时时间
cluster-node-timeout 5000
## 持久化模式
appendonly yes
创建集群的docker网络
# 网络名称redis-cluster,下一步用到,默认使用bridge模式
docker network redis-cluster
docker-compose 配置文件编写
在与上图7000文件夹同级目录创建docker-compose.yml文件,文件内容如下:
# 文件名:docker-compose.yml
redis-7000:
# 基于redis镜像构建
image: redis
# 使用上一步创建的docker网络
net: "redis-cluster"
restart: always
privileged: true
# 对外暴露redis连接端口7000,以及集群间相互通讯的端口17000,通讯端口=连接端口+10000
ports:
- 7000:7000
- 17000:17000
# 映射配置文件和数据存储文件夹到redis节点容器内部
volumes:
- /home/redis_config/7000/redis.conf:/etc/redis/redis.conf
- /home/redis_config/7000/data:/data
# 默认执行命令,使用redis.conf启动redis
command: ["redis-server", "/etc/redis/redis.conf"]
redis-7001:
image: redis
net: "redis-cluster"
restart: always
privileged: true
ports:
- 7001:7001
- 17001:17001
volumes:
- /home/redis_config/7001/redis.conf:/etc/redis/redis.conf
- /home/redis_config/7001/data:/data
command: ["redis-server", "/etc/redis/redis.conf"]
redis-7002:
image: redis
net: "redis-cluster"
restart: always
privileged: true
ports:
- 7002:7002
- 17002:17002
volumes:
- /home/redis_config/7002/redis.conf:/etc/redis/redis.conf
- /home/redis_config/7002/data:/data
command: ["redis-server", "/etc/redis/redis.conf"]
redis-7003:
image: redis
net: "redis-cluster"
restart: always
privileged: true
ports:
- 7003:7003
- 17003:17003
volumes:
- /home/redis_config/7003/redis.conf:/etc/redis/redis.conf
- /home/redis_config/7003/data:/data
command: ["redis-server", "/etc/redis/redis.conf"]
redis-7004:
image: redis
net: "redis-cluster"
restart: always
privileged: true
ports:
- 7004:7004
- 17004:17004
volumes:
- /home/redis_config/7004/redis.conf:/etc/redis/redis.conf
- /home/redis_config/7004/data:/data
command: ["redis-server", "/etc/redis/redis.conf"]
redis-7005:
image: redis
net: "redis-cluster"
restart: always
privileged: true
ports:
- 7005:7005
- 17005:17005
volumes:
- /home/redis_config/7005/redis.conf:/etc/redis/redis.conf
- /home/redis_config/7005/data:/data
command: ["redis-server", "/etc/redis/redis.conf"]
启动docker容器
#在上面创建的docker-compose.yml目录执行下面命令
docker-compose up -d
启动完成后查看容器情况:
查看各个容器的ip及其端口
#记录下来ip、端口,后面会用到
docker network inspect redis-cluster
进入其中的一个redis节点
#进入redis
docker exec -it redis_config_redis-7003_1 /bin/bash
#可以通过执行下面命令看redis是否启动,如果启动会出现下图
redis-cli -p 7003
根据上面查到的IP地址构建集群关联命令,并执行,其中需要输入 yes
进行确认
redis-cli -p 7003 --cluster create 172.18.0.4:7000 172.18.0.2:7001 172.18.0.7:7002 172.18.0.5:7003 172.18.0.6:7004 172.18.0.3:7005 --cluster-replicas 1
测试集群情况
#确认是否搭建成功,如果出现下图说明搭建成功
redis-cli -p 7000 cluster nodes