基于Docker搭建Redis集群

在这里插入图片描述

一. 问题背景

研究完关于Redis的架构,现在动手搭建一个Redis集群试一下

参考自:基于Docker搭建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.confnodes-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

解释:

  1. docker create:创建容器,但不启动容器
  2. --net:docker的网络模式,host是指使用宿主机的IP以及端口
  3. -v:挂载数据卷,实现宿主机与docker数据共享
  4. --appendonly:是否开启持久化,选值:yes、no
  5. --cluster-enabled:是否启动集群,选值:yes、no
  6. --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 注意事项

  1. Redis集群必须至少配置3台master,否则创建集群时会报错。
  2. 当总共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

参数解释:

  1. --cluster-slave:人工指定主从
  2. --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 查看管理集群命令的帮助手册

猜你喜欢

转载自blog.csdn.net/qq_40634846/article/details/113797072