文章目录
一. 问题背景
研究完关于Redis的架构,现在动手搭建一个Redis集群试一下
二. 前言
Linux:CentOS 7
Redis:5.0
Docker:19.03.13
Redis集群:在一台Linux上开6个Redis,算是伪集群吧
三. 集群地址
192.168.199.130是Linux的ip地址,启动redis容器的时候是以host的docker网络模式启动的,因此redis容器的ip与Linux的ip一致
容器名 | ip | 端口 |
---|---|---|
redis-node1 | 192.168.199.130 | 6379 |
redis-node2 | 192.168.199.130 | 6380 |
redis-node3 | 192.168.199.130 | 6381 |
redis-node4 | 192.168.199.130 | 6382 |
redis-node5 | 192.168.199.130 | 6383 |
redis-node6 | 192.168.199.130 | 6384 |
四. 部署Redis
4.1 拉取Redis镜像
Redis的版本建议是5.x版本,比如5.0.4,5.0.6:
docker pull redis:5.0
4.2 准备配置文件
4.2.1 创建数据卷路径
后面将会以指定配置文件来启动容器,因此需要先准备好数据卷路径
mkdir -p /mydata/redis-cluster/node1/conf /mydata/redis-cluster/node1/data
mkdir -p /mydata/redis-cluster/node2/conf /mydata/redis-cluster/node2/data
mkdir -p /mydata/redis-cluster/node3/conf /mydata/redis-cluster/node3/data
mkdir -p /mydata/redis-cluster/node4/conf /mydata/redis-cluster/node4/data
mkdir -p /mydata/redis-cluster/node5/conf /mydata/redis-cluster/node5/data
mkdir -p /mydata/redis-cluster/node6/conf /mydata/redis-cluster/node6/data
4.2.2 修改redis.conf配置文件
先去官网下载redis.conf,然后将文件重命名为
nodes-6379.conf
,其余5台Redis也分别修改为nodes-6380.conf
、nodes-6381.conf
等等,以此类推
然后修改配置文件中的配置,如下:
扫描二维码关注公众号,回复: 12478482 查看本文章
- 将此行
bind 127.0.0.1
注释 - 将
daemonize yes
改成no
- 将
protected-mode
改成no
- 设置开启集群,
cluster-enabled yes
- 设置节点超时时间,单位毫秒,
cluster-node-timeout 15000
- 设置集群的配置文件,
cluster-config-file nodes-6379.conf
,其中nodes-6379.conf
是redis对应的配置文件,如果是192.168.199.130:6380这台redis,则为nodes-6380.conf
4.2.3 上传配置文件
将修改好的配置文件分别上传到对应的文件夹,比如
nodes-6379.conf
上传到/mydata/redis-cluster/node1/conf/
文件夹下。如下:
4.3 创建容器
建议将如下命令都放在一个shell脚本里面,这样方便下次重复使用,执行shell脚本前需要给shell脚本添加执行权限,例如:
chmod +x ./xxxx.sh
docker create --name redis-node1 --net host -v /mydata/redis-cluster/node1/data:/data -v /mydata/redis-cluster/node1/conf/nodes-6379.conf:/etc/redis/nodes-6379.conf redis:5.0 --appendonly yes --cluster-enabled yes --cluster-config-file nodes-6379.conf --port 6379
docker create --name redis-node2 --net host -v /mydata/redis-cluster/node2/data:/data -v /mydata/redis-cluster/node2/conf/nodes-6380.conf:/etc/redis/nodes-6380.conf redis:5.0 --appendonly yes --cluster-enabled yes --cluster-config-file nodes-6380.conf --port 6380
docker create --name redis-node3 --net host -v /mydata/redis-cluster/node3/data:/data -v /mydata/redis-cluster/node3/conf/nodes-6381.conf:/etc/redis/nodes-6381.conf redis:5.0 --appendonly yes --cluster-enabled yes --cluster-config-file nodes-6381.conf --port 6381
docker create --name redis-node4 --net host -v /mydata/redis-cluster/node4/data:/data -v /mydata/redis-cluster/node4/conf/nodes-6382.conf:/etc/redis/nodes-6382.conf redis:5.0 --appendonly yes --cluster-enabled yes --cluster-config-file nodes-6382.conf --port 6382
docker create --name redis-node5 --net host -v /mydata/redis-cluster/node5/data:/data -v /mydata/redis-cluster/node5/conf/nodes-6383.conf:/etc/redis/nodes-6383.conf redis:5.0 --appendonly yes --cluster-enabled yes --cluster-config-file nodes-6383.conf --port 6383
docker create --name redis-node6 --net host -v /mydata/redis-cluster/node6/data:/data -v /mydata/redis-cluster/node6/conf/nodes-6384.conf:/etc/redis/nodes-6384.conf redis:5.0 --appendonly yes --cluster-enabled yes --cluster-config-file nodes-6384.conf --port 6384
解释:
docker create
:创建容器,但不启动容器--net
:docker的网络模式,host是指使用宿主机的IP以及端口-v
:挂载数据卷,实现宿主机与docker数据共享--appendonly
:是否开启持久化,选值:yes、no--cluster-enabled
:是否启动集群,选值:yes、no--cluster-config-file
:指定节点信息,自动生成
4.5 启动容器
启动上面创建的容器,也是可以自行创建一个shell脚本填入下面命令:
docker start redis-node1 redis-node2 redis-node3 redis-node4 redis-node5 redis-node6
五. 部署集群
5.1 进入容器
前面已经将6台Redis部署好了,但是他们之间还不知道其他人的信息,即此时还不是一个集群,现在创建集群:
# 随便进入一台redis容器,这里以redis-node1为例
docker exec -it redis-node1 bash
5.2 创建集群
输入下面命令创建集群,随后会询问是否可以设置以上的配置信息?需要手动输入
yes
# 192.168.199.130是linux的ip
redis-cli --cluster create 192.168.199.130:6379 192.168.199.130:6380 192.168.199.130:6381 192.168.199.130:6382 192.168.199.130:6383 192.168.199.130:6384 --cluster-replicas 1
参数解释:
--cluster-replicas 1
,表示1台redis master配置多少台slave从机,如果是--cluster-replicas 2
,则表示1台master配置2台slave从机。如果所有Redis加起来不够分配主从,会出现报错,无法创建集群。本博客搭建了6台Redis,如果1台master配置2台slave从机,则会报错,因为6台不够分配,需要加多3台。
5.3 注意事项
- Redis集群必须至少配置3台master,否则创建集群时会报错。
- 当总共6台Redis,我要配置4台master是可以的,此时就是4台master,剩余2台由自己手动配置为哪台master的slave
5.3.1 手动配置主从
情况:当总共有6台Redis,我想要4台master,2台slave,那么就用
--cluster-replicas 0
手动创建集群:
# 创建master --cluster-replicas 0
redis-cli --cluster create 192.168.199.130:6379 192.168.199.130:6380 192.168.199.130:6381 192.168.199.130:6382 --cluster-replicas 0
# 手动添加slave
# 跟随6379这台master
redis-cli --cluster add-node 192.168.199.130:6383 192.168.199.130:6379 --cluster-slave --cluster-master-id 要跟随的master容器的id
# 跟随6379这台master
redis-cli --cluster add-node 192.168.199.130:6384 192.168.199.130:6379 --cluster-slave --cluster-master-id 要跟随的master容器的id
参数解释:
--cluster-slave
:人工指定主从--cluster-master-id
:master容器的id
下图是cluster nodes的信息:
六. 测试Redis集群
向master写入数据,去slave获取是否有数据
# 随便进入一台redis容器
docker exec -it redis-node1 bash
必须以集群的方式登入Redis的客户端,命令为
redis-cli -c
,如下:
# 登入redis客户端,指定登入6380
redis-cli -c -h 192.168.199.130 -p 6380
向Redis写数据:
set k1 v1
获取数据:
get k1
会发现有时写、读数据,会被重定向到某台Redis上,其实原理是Redis对key做了一个哈希,根据哈希值放到对应的slot上,每一天Redis有属于自己的一段slot,这段slot由若干个slot组成。但是根据三张图秒懂Redis集群设计原理说的原理,读数据的时候不应该出现重定向到对应的slot所属的Redis上。有待研究这点。
七. Redis集群的某些常用操作命令
命令 | 作用 |
---|---|
redis-cli |
登录Redis客户端,-c表示以集群方式登入,-h指定ip,-p指定端口 |
cluster nodes |
在Redis客户端,输入此命令可以显示集群的各个节点信息 |
info replication |
在Redis客户端,输入此命令可以显示集群的节点信息 |
redis-cli -h |
查看redis-cli 命令帮助手册 |
redis-cli --cluster help |
查看管理集群命令的帮助手册 |