使用Docker在多台物理机上搭建Redis Cluster

使用Docker在多台物理机上搭建Redis Cluster

图片来源: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这台服务器上搭建的是70007001端口的Redis Cluster,所以命令指定的是70007001

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 70037004 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是从:

redis_cluster_01

输入yes后,会提示我们已经建立成功了(如果建立不成功或者一直在join,建议检查一下容器之间能否通讯):

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参数就不需要在不同的服务器上换来换去了。


END

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×