图片来源:pexels.com
背景介绍
由于最近在做一个缓存项目,这个项目中把Redis当作缓存,因为单机Redis性能不够的原因,就想要把单机Redis改成Redis Cluster。
至于Redis Cluster原理这块,本文只是用来介绍如何使用Docker来搭建Redis Cluster,就不会很具体很深入的去介绍了。
开始行动
首先需要的是在服务器上安装Docker,如果已经安装了Docker,可以选择跳过这一步。
安装Docker
在安装Docker之前,首先要确定服务器上是否之前有安装Docker,有的话需要卸载掉它们:
卸载Docker以及删除残留文件
Centos/REHL
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
如果感觉还没有删除干净,可以使用命令查看一下:
yum list installed | grep docker
比如我的是这样:
[root@server-1 ~]# yum list installed|grep docker
docker-ce-cli.x86_64 1:19.03.8-3.el7 @docker-ce-stable
再使用命令去卸载它:
[root@server-1 ~]# yum -y remove docker-ce-cli.x86_64
Ubuntu/Debian
sudo apt-get remove docker docker-engine
或者:
sudo apt-get remove docker-ce docker-ce-cli
根据官方文档的提示,/var/lib/docker/目录下会保留原Docker的镜像、网络、存储卷等文件。如果需要全新安装Docker需删除/var/lib/docker/目录:
rm -fr /var/lib/docker/
使用脚本一键安装
为了方便和快速安装,这里使用的是Docker提供的一键安装脚本,来安装Docker:
curl -sSL https://get.docker.com/ | sh
如果你是非root用户安装,想要运行Docker建议执行下面的命令:
sudo usermod -aG docker your-user
脚本提示安装完后,为了确保Docker是正常可用的,使用Docker运行一个Hello-World,来测一下:
配置镜像加速器(中科大):
我使用的是阿里云的镜像加速,你们需要的话,可以去阿里云搜索 容器镜像服务 找到镜像加速那一列
CentOS
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Ubuntu/Debian
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
启动Hello World:
docker run hello-world
运行结果:
[root@server-1 ~]# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:f9dfddf63636d84ef479d645ab5885156ae030f611a56f3a7ac7f2fdd86d7e4e
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
以下内容省略....
如果运行正常,接下来就是开始搭建Redis Cluster了。
搭建Redis Cluster
这里我一共有三台服务器,用来搭建三主三从,它们分别如下:
- 192.168.11.176
- 192.168.11.161
- 192.168.11.164
这三台服务器用来搭建三主三从,也就是需要六个节点,给它们分配的端口如下:
- 192.168.11.176:7000
- 192.168.11.176:7001
- 192.168.11.161:7002
- 192.168.11.161:7003
- 192.168.11.164:7004
- 192.168.11.164:7005
为了方便管理和使用,Docker搭建Redis Cluster时,就需要将配置文件挂载;配置文件挂载目录/data/redis
。
配置文件模板:
# 端口
port ${PORT}
# 关闭保护模式
protected-mode no
# 以集群的方式启动
cluster-enabled yes
# 集群节点配置文件
cluster-config-file nodes.conf
# 节点访问超时 毫秒数
cluster-node-timeout 5000
# 节点静态IP;Docker容器需要指定这个IP,比如192.168.11.176,否则节点无法被发现
cluster-announce-ip 192.168.XX.XX
# 节点映射端口
cluster-announce-port ${PORT}
# 节点通讯端口
cluster-announce-bus-port 1${PORT}
# AOF持久化
appendonly yes
# 实例密码
requirepass 123456
# 主从密码
masterauth 123456
# 日志文件
logfile access.log
把模板放在/data/redis
目录,文件名为redis-cluster.template
。
修改好模板后,分别在不同服务器上生成相关的目录和文件。
生成目录和配置文件
由于我的三主三从,是在三台服务器上搭建的,一台服务器分别有一主和一从,所以需要命令来自动生成。
比如,我在192.168.11.176
这台服务器上搭建的是7000
、7001
端口的Redis Cluster,所以命令指定的是7000
到7001
:
for port in `seq 7000 7001`; do \
mkdir -p ./${port}/conf \
&& PORT=${port} envsubst < ./redis-cluster.template> ./${port}/conf/redis.conf \
&& mkdir -p ./${port}/data; \
done
创建好192.168.11.176服务器上的配置文件后,再去创建192.168.11.161、192.168.11.164。它们对应的端口是7002 7003
、7004 7005
,所以上面的命令在不同
服务器上执行时也要改的。
创建完后,记得查看一下配置文件的内容是否正确
创建Redis Cluster容器
在三台服务器上都执行完上面的命令后,再通过下面的命令创建容器:
拉取Redis镜像:
docker pull redis
创建容器:
for port in `seq 7000 7001`; do \
docker run -d -ti -p ${port}:${port} -p 1${port}:1${port} \
-v /data/redis/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /data/redis/${port}/data:/data \
--restart always --name redis-${port} \
--sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf; \
done
分别在不同的服务器上创建完容器,并启动后,接下来就是建立集群之间的关系了。
建立集群
想要建立集群之间的关系,首先进入一个容器(哪个都行,我当前进如的是redis-7000这个容器):
docker exec -it redis-7000 bash
进去之后,再执行创建集群的命令:
redis-cli -c -h 192.168.11.176 -p 7000 -a 123456 \
--cluster create 192.168.11.176:7000 192.168.11.176:7001 \
192.168.11.161:7002 192.168.11.161:7003 192.168.11.164:7004 \
192.168.11.164:7005 --cluster-replicas 1
执行之后,Redis Cluster会自动分配哪些Redis主,哪些Redis是从:
输入yes后,会提示我们已经建立成功了(如果建立不成功或者一直在join,建议检查一下容器之间能否通讯):
接下来之后只要测试一下,能否进行数据的存储即可:
root@05ca62be4abd:/data# redis-cli -h 192.168.11.176 -p 7000
192.168.11.176:7000> auth 123456
OK
192.168.11.176:7000> set mykey1 v1
OK
192.168.11.176:7000> set mykey2 v2
(error) MOVED 14119 192.168.11.164:7004
192.168.11.176:7000>
可以看到,我设置mykey1的时候是成功的,设置mykey2时会提示我,这个key的slot被分配到了192.168.11.164:7004
这台Redis上,需要去这一台Redis才能进行设置。
这时只需要去192.168.11.164:7004
这台服务器,执行设置命令即可:
root@pi-1:/data/redis# docker exec -it redis-7004 bash
rroot@ed351bd4f15c:/data# redis-cli -h 192.168.11.164 -p 7004
192.168.11.164:7004> auth 123456
OK
192.168.11.164:7004> set mykey2 v2
OK
192.168.11.164:7004>
当然,你不想麻烦的话,也可以在使用redis-cli连接服务器时,加上-c
参数就不需要在不同的服务器上换来换去了。
END