三台机器使用Docker部署Redis集群

我们这里采用Docker在三台服务器上面进行Redis集群的搭建,它方便快捷、容易上手。

1.集群原理

在Redis集群中,所以的节点彼此关联,节点内部通过二进制协议优化传输速度和带宽。当一个节点挂掉后,集群超过半数的节点检查失效时该节点才会被认为挂掉。所以基于以上的情况,节点的数量一般都是奇数。一般为了保证安全性,每个节点由一个备份节点。所以最小的集群主节点的个数最少为3,从节点的个数也为3.这样一个集群最少需要6个节点。在做集群规划的时候特别需要注意这点。
Redis集群中内置了16384个哈希槽,当需要在Redis集群中存放一个key/value键值对的时候,redis会有一个算法,先把key使用CRC16算法计算一个结果,然后把结果对16384求余数,这样每个key都会对于一个编号在0-16383之间的哈希槽,redis会根据节点数量大致的均衡的将哈希槽映射到不同的节点。需要注意的是每个哈希槽存储的数据个数不做限制。

2.集群规划

三台宿主机的IP和redis节点规划:

宿主机器IP

redis节点规划

redis节点规划

172.15.1.11

172.15.1.11:7801

172.15.1.11:7804

172.15.1.12

172.15.1.12:7802

172.15.1.12:7805

172.15.1.13

172.15.1.13:7800

172.15.1.13:7803

3.集群部署

集群的部署采用Linux Shell脚本的方式,步骤如下

A、创建模板文件

登录三台机器,在home目录下创建redis-cluster文件夹,编写文件redis-cluster.tmpl,文件的作用是用来创建Redis配置文件的模板文件。

port ${PORT}
protected-mode no
cluster-enabled yes
cluster-config-file redis.conf
cluster-node-timeout 5000
cluster-announce-ip 172.15.1.11  #另外两台ip分别为172.15.1.12、172.15.1.13
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
appendonly yes

port ${PORT}: 是自定义端口号
protected-mode no:是关闭保护模式,否则可能造成无法通过公网访问。
cluster-enabled yes:启动集群。必须配置为yes
cluster-config-file redis.conf:集群节点配置文件的名字,一般我们都会取名redis.conf
cluster-node-timeout 5000:超时时间,单位是毫秒
cluster-announce-ip 172.15.1.11:集群宿主机IP
cluster-announce-port ${PORT}:节点映射端口
cluster-announce-bus-port 1${PORT}:节点总线端口
appendonly yes:开启持久化模式

B、自定义网络

所有节点在一个网络中,方便通信。
在Docker中创建网络。(三台机器在docker swarm集群,创建overlay网络)

docker network create -d overlay --attachable redis_net

C、创建配置生成脚本

在三台机器/home/redis-cluster下生成conf和data目录,并生成配置信息。这里编写一个Linux Shell脚本createFilePath.sh。注意要进行授权,否则脚本运行。

for port in 7801 7804  #另外两台的port分别修改为7802 7805、7800 7803
do
mkdir -p ./${port}/conf \
&& PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf \
&& mkdir -p ./${port}/data; \
done

给大家解读一下脚本内容,for循环2次,每次循环存储变量到port变量。然后循环创建目录,命令是mkdir -p ./{port}/conf\,意思是在当前目录下面以端口后为目录名,下面创建子目录conf.后面的\是连接符,表示连接后面的语句。PORT=${port} envsubst < ./redis-cluster.tmpl >意思是将循环变量port的值复制给PORT,envsubst 是赋值给文件redis-cluster.tmpl.然后将该文件复制到端口号目录\conf文件夹中,名字是redis.conf; mkdir -p ./${port}/data; 表示继续创建在端口目录\data目录。

D、执行创建配置生成脚本

授权createFilePath.sh。让该文件具备可执行权限,并执行该文件

chmod +x ./createFilePath.sh
./createFilePath.sh

在三台机器共生成6个文件夹,从7800到7805,每个文件夹下包含data和conf文件夹,同时conf里面有redis.conf配置文件。

E、创建容器生成脚本

在三台机器编写创建Redis容器的脚本createRedisContainer.sh。

current_dir=`pwd`
for port in 7801 7804  #另外两台的port分别修改为7802 7805、7800 7803
do
docker run -dit -p ${port}:${port} -p 1${port}:1${port} \
--privileged=true -v $current_dir/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
--privileged=true -v $current_dir/${port}/data:/data \
--restart always --name redis-${port} --net redis_net \
--sysctl net.core.somaxconn=1024 redis:5.0.5 redis-server /usr/local/etc/redis/redis.conf
done

docker run -dit -p ${port}: ${port} -p 1${port}:1${port},意思是启动容器.-d表示后台启动;-i 表示开启交互模式。-t表示伪终端。这三个参数可以简写成-dit。${port}: ${port}表示把宿主机端口映射到容器端口。1${port}:1${port} 表示把宿主机和容器的总线端口映射。
–privileged=true -v $current_dir/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf,privileged意思是授权,-v表示容器挂载,把宿主机/home/redis-cluster/${port}/conf/目录下的redis.conf文件挂载到容器内部的/usr/local/etc/redis的目录中,在容器内部的配置文件名为redis.conf。
–privileged=true -v $current_dir/${port}/data:/data,同样授权将宿主机data目录挂载到容器的data目录。
–restart always:表示Docker重启时,容器自动重启。
–name redis-${port} 表示容器的自定的容器名字是redis-端口号
–net redis_net:表示容器工作的网络是redis_net
–sysctl net.core.somaxconn=1024表示修改somaxconn的值,内核大小为1024M,一把来说负载很大的程序的时候,往往由于内存不够,会启动失败。
redis:5.0.5表示镜像的版本。至此容器创建完毕。
redis-server /usr/local/etc/redis/redis.conf表示启动Redis服务端。必须指定配置文件。

F、执行容器生成脚本

授权createFilePath.sh。让该文件具备可执行权限,并执行该文件

chmod +x ./createRedisContainer.sh
./createRedisContainer.sh

在三台机器共生成6个容器,redis-7800到redis-7805,
使用命令来确认:docker ps -a|grep redis-780

G、配置redis集群

任意进入一个节点,并启动集群。注意redis容器启动,并不代表集群启动。

docker exec -it redis-7801 bash
redis-cli --cluster create 172.15.1.13:7800 172.15.1.11:7801 172.15.1.12:7802 172.15.1.13:7803 172.15.1.11:7804 172.15.1.12:7805 --cluster-replicas

至此集群搭建完毕。

4.集群检测

验证集群状态,进入容器内部,执行

docker exec -it redis-7801 bash
redis-cli -c -p 7801
info replication
cluster nodes
cluster info