docker-compose搭建redis集群
一、简介
部署环境:
组件 | 版本 | 备注 |
---|---|---|
docker | 19.03.6 | build 369ce74a3c |
docker-compose | 1.27.4 | build 40524192 |
ubuntu | 18.04 | server版 X86_64 |
redis | 6.0.4 |
二、部署步骤
2.1 集群配置
- 3主+3从
由于仅用于测试,故我这里只用1台服务器进行模拟。
- redis列表
redis | IP+port | 备注 |
---|---|---|
redis1 | 192.168.1.4:6379 | |
redis2 | 192.168.1.4:6380 | |
redis3 | 192.168.1.4:6381 | |
redis4 | 192.168.1.4:6382 | |
redis5 | 192.168.1.4:6383 | |
redis6 | 192.168.1.4:6384 |
2.2 编写redis.conf
在server_1
上创建一个目录用于存放redis集群部署文件。这里我放的路径为/root/redis-cluster
。
# 创建/root/redis-cluster目录
mkdir -p /root/redis-cluster
在/root/redis-cluster
目录下创建redis-1
,redis2
,redis-3
,redis-4
,redis-5
,redis-6
文件夹
# 创建redis-1~redis-6文件夹
mkdir /root/redis-cluster/redis-1 \
/root/redis-cluster/redis-2 \
/root/redis-cluster/redis-3 \
/root/redis-cluster/redis-4 \
/root/redis-cluster/redis-5 \
/root/redis-cluster/redis-6
在每个redis-*
文件夹下创建redis.conf
文件,并写入如下内容:
cluster-enabled yes # 开启集群
cluster-config-file nodes.conf # 集群配置文件
cluster-node-timeout 5000 # 集群节点多少时间未响应视为该节点丢失
appendonly yes
port 6379 # redis监听端口
注意:port值不能都为6379,根据上面redis列表设置的端口号,依次给redis-1 ~ redis-6设置6379~6384端口号
2.3 编写docker-compose.yml文件
这里直接使用daocloud提供的redis镜像地址daocloud.io/library/redis:6.0.4
。
在/root/redis-cluster
文件夹下创建docker-compose.yml
文件。
docker-compose.yml
文件内容如下:
version: '3.1'
services:
# redis1配置
redis1:
image: daocloud.io/library/redis:6.0.4
container_name: redis-1
restart: always
network_mode: "host"
volumes:
- ./redis-1/redis.conf:/usr/local/etc/redis/redis.conf
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
# redis2配置
redis2:
image: daocloud.io/library/redis:6.0.4
container_name: redis-2
restart: always
network_mode: "host"
volumes:
- ./redis-2/redis.conf:/usr/local/etc/redis/redis.conf
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
# redis3配置
redis3:
image: daocloud.io/library/redis:6.0.4
container_name: redis-3
restart: always
network_mode: "host"
volumes:
- ./redis-3/redis.conf:/usr/local/etc/redis/redis.conf
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
# redis4配置
redis4:
image: daocloud.io/library/redis:6.0.4
container_name: redis-4
restart: always
network_mode: "host"
volumes:
- ./redis-4/redis.conf:/usr/local/etc/redis/redis.conf
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
# redis5配置
redis5:
image: daocloud.io/library/redis:6.0.4
container_name: redis-5
restart: always
network_mode: "host"
volumes:
- ./redis-5/redis.conf:/usr/local/etc/redis/redis.conf
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
# redis6配置
redis6:
image: daocloud.io/library/redis:6.0.4
container_name: redis-6
restart: always
network_mode: "host"
volumes:
- ./redis-6/redis.conf:/usr/local/etc/redis/redis.conf
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
2.4 启动容器
在/root/redis-cluster
文件夹下,执行如下命令,启动redis容器。
docker-compose up -d
2.5 查看容器启动状态
输入如下命令查看容器启动状态
docker ps
如果显示如图所示,即为启动成功。最主要查看容器的STATUS
属性,有Up ***
即为容器已经启动多长时间。
2.6 开启集群
随便找一个容器进入,这里我选择redis-1
进入。
docker exec -it redis-1 bash
在进入容器后,输入如下命令开启集群
redis-cli --cluster create 192.168.1.4:6379 \
192.168.1.4:6380 \
192.168.1.4:6381 \
192.168.1.4:6382 \
192.168.1.4:6383 \
192.168.1.4:6384 \
--cluster-replicas 1
会出现如下图所示:
此时输入yes
即可
出现下图即为成功。
三、测试
使用redis-cli
命令,连接集群中任意节点。(随便找一台能ping通集群所在IP的电脑,这里我用的本机进行测试)
3.1 查看节点属性
- 连接节点
redis-cli -c -h 192.168.1.4 -p 6379
- 查看集群状态
192.168.1.4:6379> cluster info
显示如下图所示即为集群状态健康
- 查看节点信息
192.168.1.4:6379> cluster nodes
显示如图所示
注意看图中的slave
,master
,myself
等关键字。
关键字 | 说明 |
---|---|
slave | 该节点为备份节点 |
master | 该节点为主节点 |
myself | 该节点为当前连接的节点 |
3.2 插入一个值
- 插入一个值
192.168.1.4:6379> set test 'hello world'
注意:这里根据切片自动切换到了该数据分片所在的节点上,所以下面可以看到连接的节点变为了192.168.1.4:6380
- 获取该值
192.168.1.4:6380> get test
这里因为就是在该数据所在分片上进行的查询,所以连接节点没有改变。
四、添加密码
4.1 编辑redis.conf文件
为redis.conf
文件添加如下配置。这里设置密码为123456
masterauth 123456
requirepass 123456
4.2 编辑docker-compose.yml文件
为docker-compose.yml
中每个容器添加如下配置:
environment:
- REDISCLI_AUTH=123456
4.3 连接集群
在使用redis-cli
连接集群的时候,不能像连接单点redis那样连接之后再使用auth
命令进行认证了。此时需要在连接命令中指定密码。
redis-cli -c -h 192.168.1.4 -p 6379 -a 123456
添加-a
参数,即可完成认证。