今日份主题
Docker环境中Redis集群搭建
(Linux Shell版)
大家如果查找一些资料,很多redis集群的搭建要么是在一台Linux中搭建通过不同的端口搭建,要么是在多个Linux主机中进行的。由于现在在开发中Docker作为容器部署服务非常的普遍。所以我们在这里采用Docker进行Redis集群的搭建,它方便快捷、容易上手。首先我们必须聊聊集群是什么。
集群则是通过提高单位时间内执行的任务数来提升效率。举例说明,小饭店原来只有一个厨师,切菜洗菜备料炒菜全干。后来客人多了,厨房一个厨师忙不过来,又请了个厨师,两个厨师都能炒一样的菜,这两个厨师的关系是集群。
前面在Spring Boot整合Redis中,我们已经 完成了Docker的按照,并拉取了Reids5.0.5镜像。为了方便管理建议大家把Protainer io也按照一个。它可以通过web浏览器对镜像和容器以及Docker中的网络环境进行统一的操作,减少大家通过命令行操作。
1集群原理
在Redis集群中,所以的节点彼此关联,节点内部通过二进制协议优化传输速度和带宽。当一个节点挂掉后,集群超过半数的节点检查失效时该节点才会被认为挂掉。所以基于以上的情况,节点的数量一般都是奇数。一般为了保证安全性,每个节点由一个备份节点。所以最小的集群主节点的个数最少为3,从节点的个数也为3.这样一个集群最少需要6个节点。在做集群规划的时候特别需要注意这点。
Redis集群中内置了16384个哈希槽,当需要在Redis集群中存放一个key/value键值对的时候,redis会有一个算法,先把key使用CRC16算法计算一个结果,然后把结果对16384求余数,这样每个key都会对于一个编号在0-16383之间的哈希槽,redis会根据节点数量大致的均衡的将哈希槽映射到不同的节点。需要注意的是每个哈希槽存储的数据个数不做限制。
2集群规划
现在实验的宿主机的IP为192.168.24.1。自己在Docker中创建网络。
网关是172.18.0.1.
172.18.0.2 7000 172.18.0.3 7001 172.18.0.4 7002
172.18.0.5 7003 172.18.0.6 7004 172.18.0.7 7005
3集群部署
集群的部署可以采用两种方式,一种可以采用Linux Shell脚本,另外一种是使用docker-compose方式,两种方式这里都进行讲解。
Linux Shell脚本方式,步骤如下
A、登录Linux,在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 192.168.21.134
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 192.168.21.134:集群宿主机IP,最后要修改成网卡分配的网络IP.
cluster-announce-port ${PORT}:节点映射端口
cluster-announce-bus-port 1${PORT}:节点总线端口
appendonly yes:开启持久化模式
B、自定义网络,所有节点在一个网络中,方便通信。
docker network create --driver bridge --subnet 172.18.0.0/16 redis-net
C、在/home/redis-cluster下生成conf和data目录,并生成配置信息。这里编写一个Linux Shell脚本createFilePath.sh。注意要进行授权,否则脚本运行。
for port in `seq 7000 7005`
do
mkdir -p ./${port}/conf
&& PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf
&& mkdir -p ./${port}/data;
done
给大家解读一下脚本内容,for循环6次,每次循环存储变量到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个文件夹,从7000到7005,每个文件夹下包含data和conf文件夹,同时conf里面有redis.conf配置文件。
E、编写创建6个Redis容器的脚本
createRedisContainer.sh。并启动Redis.
for port in `seq 7000 7005`
do
docker run -dit -p ${port}:${port} -p 1${port}:1${port}
--privileged=true -v /home/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf
--privileged=true -v /home/redis-cluster/${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 /home/redis-
cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf,意思是授权,-v表示容器挂载,把宿主机/home/redis-cluster/${port}/conf/目录下的redis.conf文件挂载到容器内部的/usr/local/etc/redis的目录中,在容器内部的配置文件名伪redis.conf。
--privileged=true -v /home/redis-
cluster/${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
G、查看网络,根据分配的网络IP修改宿主机的配置文件。
docker network inspect redis-net
打开7000-7005对于的conf目录,修改网络IP
vim /home/redis-cluster/700*/conf/redis.conf
H、任意进入一个节点,并启动集群。注意redis容器启动,并不代表集群启动。
docker exec -it redis-7000 bash
redis-cli --cluster create 172.18.0.2:7000 172.18.0.3:7001 172.18.0.4:7002 172.18.0.5:7003 172.18.0.6:7004 172.18.0.7:7005 --cluster-replicas 1
至此集群搭建完毕。
4集群检测,查看是否成功。进入容器内部,执行
redis-cli -c -p 7000
info replication
cluster nodes