观看本文档前,请先了解docker、docker-compose、reids cluser相关知识,为了方便操作,本文档将在一台虚拟机上面通过docker-compose部署6台redis服务器,通过这6台服务器搭建redis cluster服务
1、创建redis服务的配置文件及数据卷
# 创建目录
mkdir -p /usr/local/docker-redis/redis-cluster
# 切换至指定目录
cd /usr/local/docker-redis/redis-cluster/
# 在当前目录下创建6371文件夹,在文件夹下面创建config和data目录
mkdir -p 6371/data 6371/conf
//进入配置文件夹目录,并在目录下创建redis.conf文件,将下面的内容保存在redis.conf配置文件中
cd 6371/conf
vi redis.conf
port 6371
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.40.6
cluster-announce-port 6371
cluster-announce-bus-port 16371
参数解释:
port:节点端口;
protected-mode:保护模式,默认值 yes,即开启。开启保护模式以后,需配置 bind ip 或者设置访问密码;关闭保护模式,外部网络可以直接访问;
daemonize:是否以守护线程的方式启动(后台启动),默认 no;
appendonly:是否开启 AOF 持久化模式,默认 no;
cluster-enabled:是否开启集群模式,默认 no;
cluster-config-file:集群节点信息文件;
cluster-node-timeout:集群节点连接超时时间;
cluster-announce-ip:集群节点 IP,填写宿主机的 IP;
cluster-announce-port:集群节点映射端口;
cluster-announce-bus-port:集群节点总线端口。
# 回到项目跟目录
cd /usr/local/docker-redis/redis-cluster/
# 复制文件夹,并修改将6371修改为对应的端口,如6372文件夹里面redis.conf文件里面的所有的6371都要修改为6372,包括16731也要修改为16372
cp -r 6371/ 6372
cp -r 6371/ 6373
cp -r 6371/ 6374
cp -r 6371/ 6375
cp -r 6371/ 6376
# 自行修改文件夹里面的内容
# 此时这个目录下已经存在6371、6372、6373、6374、6375、6376这几个目录,并且这些目录下所有的配置文件都已经修改为和文件名对应的端口
# 回到项目跟目录
cd /usr/local/docker-redis/redis-cluster/
# 创建docker-compose.yml,文件内容如下
vi docker-compose.yml
# 描述 Compose 文件的版本信息
version: "2"
# 定义服务,可以多个
services:
redis-6371: # 服务名称
image: redis # 创建容器时所需的镜像
container_name: redis-6371 # 容器名称
restart: always # 容器总是重新启动
network_mode: "host" # host 网络模式
volumes: # 数据卷,目录挂载
- /usr/local/docker-redis/redis-cluster/6371/conf/redis.conf:/usr/local/etc/redis/redis.conf
- /usr/local/docker-redis/redis-cluster/6371/data:/data
command: redis-server /usr/local/etc/redis/redis.conf # 覆盖容器启动后默认执行的命令
redis-6372:
image: redis
container_name: redis-6372
network_mode: "host"
volumes:
- /usr/local/docker-redis/redis-cluster/6372/conf/redis.conf:/usr/local/etc/redis/redis.conf
- /usr/local/docker-redis/redis-cluster/6372/data:/data
command: redis-server /usr/local/etc/redis/redis.conf
redis-6373:
image: redis
container_name: redis-6373
network_mode: "host"
volumes:
- /usr/local/docker-redis/redis-cluster/6373/conf/redis.conf:/usr/local/etc/redis/redis.conf
- /usr/local/docker-redis/redis-cluster/6373/data:/data
command: redis-server /usr/local/etc/redis/redis.conf
redis-6374:
image: redis
container_name: redis-6374
network_mode: "host"
volumes:
- /usr/local/docker-redis/redis-cluster/6374/conf/redis.conf:/usr/local/etc/redis/redis.conf
- /usr/local/docker-redis/redis-cluster/6374/data:/data
command: redis-server /usr/local/etc/redis/redis.conf
redis-6375:
image: redis
container_name: redis-6375
network_mode: "host"
volumes:
- /usr/local/docker-redis/redis-cluster/6375/conf/redis.conf:/usr/local/etc/redis/redis.conf
- /usr/local/docker-redis/redis-cluster/6375/data:/data
command: redis-server /usr/local/etc/redis/redis.conf
redis-6376:
image: redis
container_name: redis-6376
network_mode: "host"
volumes:
- /usr/local/docker-redis/redis-cluster/6376/conf/redis.conf:/usr/local/etc/redis/redis.conf
- /usr/local/docker-redis/redis-cluster/6376/data:/data
command: redis-server /usr/local/etc/redis/redis.conf
# 启动redis服务
docker-compose up -d
创建redis集群
# 随便进入一个容器节点,然后进入 /usr/local/bin/
docker exec -it redis-6371 bash
cd /use/local/bin
# 使用redis-cli --cluster help查看集群的使用帮助
# 通过redis-cli create命令实现 Redis Cluster 集群的创建。注意需要将ip:端口换成你自己的ip:端口,
#--cluster-replicas 1 表示集群中主从服务器的比例,此处为1表示一个master服务器跟随一个slave服务器,
# 遇到提示输入yes即可
redis-cli --cluster create 192.168.10.10:6371 192.168.10.10:6372 192.168.10.10:6373 192.168.10.11:6374 192.168.10.11:6375 192.168.10.11:6376 --cluster-replicas 1
至此一个高可用的 Redis Cluster 集群搭建完成,
# 查看集群状态,需要进入redis服务器的/use/local/bin目录下执行
redis-cli --cluster check 192.168.40.6:6371
# 进入集群内部
redis-cli -c -p 6371
# 查看集群节点,需要进入集群内部执行
cluster nodes
# 设置值
set email ganganlee@outlook.com
# 获取值
get email
客户端连接集群中的任意一个节点,不管是master节点或者slave节点都可以操作集群内部的数据
集群的扩容和缩容
扩容
# 扩容步骤
# 1、先准备两台redis服务,可以参考上文的docker-compose方式创建redis服务器
# 2、将服务器加入到集群中
# 随便进入一个redis集群节点的redis内部
docker exec -it redis-6371 bash
# 进入到bin目录下,查看帮助手册获取添加node节点的命令
cd /use/local/bin
# 添加master节点,前面的是需要添加的节点信息,后面是容器中任意一个节点的信息
redis-cli --cluster add-node 192.168.40.5:6377 192.168.40.6:6371
# 添加slave节点,前面的是需要添加的节点信息,后面是容器中任意一个节点的信息,最后一个是前面添加的master节点的id,这个id需要从redis服务器查看,参考上文进入集群内布,查看集群节点找到之前添加的节点id
redis-cli --cluster add-node 192.168.40.5:6378 192.168.40.6:6371 --cluster-slave --cluster-master-id 5176cbb1054871028963af4d88680e075d7f48ce
# 3、分配slot,后面的IP为需要得到slot的IP,后面按照提示输入需要的信息回车即可,最后即可查看节点信息就能看到节点分配到的slot
redis-cli --cluster reshard 192.168.40.5:6377
注意,出现如下错误时,请清空redis数据再添加
[ERR] Node 192.168.40.6:6377 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
缩容
# 缩容步骤
# 1、将需要删除的节点的slot移动到其他节点,参考上文分配节点方法
# 2、删除节点,先删除从节点,再删除主节点,节点IP:port 节点id
redis-cli --cluster del-node 192.168.40.5:6377 5176cbb1054871028963af4d88680e075d7f48ce