三台机器使用Docker部署Redis集群方式
作者:weixin_43053507
三台机器使用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
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。