背景介绍
由于最近在做一个缓存项目,这个项目中把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 ./KaTeX parse error: Undefined control sequence: \ at position 13: {port}/conf \̲ ̲ && PORT={port} envsubst < ./redis-cluster.template> ./KaTeX parse error: Undefined control sequence: \ at position 24: …onf/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
p
o
r
t
:
{port}:
port:{port} -p 1
p
o
r
t
:
1
{port}:1
port:1{port}
-v /data/redis/KaTeX parse error: Undefined control sequence: \ at position 56: …dis/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是从:
redis_cluster_01
redis_cluster_01
输入yes后,会提示我们已经建立成功了(如果建立不成功或者一直在join,建议检查一下容器之间能否通讯):
redis_cluster_02
redis_cluster_02
接下来之后只要测试一下,能否进行数据的存储即可:
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参数就不需要在不同的服务器上换来换去了。