redis 公网 安全_峰哥说技术系列-21 .Docker环境中Redis集群搭建(Linux Shell版)

63f15fb83a8070b73009a8a413ed33c3.png

今日份主题

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值