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

 更新时间:2024年07月31日 10:51:36   作者:weixin_43053507  
这篇文章主要介绍了三台机器使用Docker部署Redis集群方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

三台机器使用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节点规划:

宿主机器IPredis节点规划redis节点规划
172.15.1.11172.15.1.11:7801172.15.1.11:7804
172.15.1.12172.15.1.12:7802172.15.1.12:7805
172.15.1.13172.15.1.13:7800172.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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Docker制作镜像的完整过程

    Docker制作镜像的完整过程

    本文主要介绍了Docker制作镜像的完整过程,以制作CentOS镜像为例,讲述对镜像自定义,打包以及推送的远程仓库的过程,感兴趣的可以了解一下
    2021-11-11
  • docker容器启动成功外部访问不到的原因分析

    docker容器启动成功外部访问不到的原因分析

    这篇文章主要介绍了docker容器启动成功外部访问不到的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • 如何查看docker-compose.yml所在位置

    如何查看docker-compose.yml所在位置

    这篇文章主要介绍了如何查看docker-compose.yml所在位置问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • docker中使用mysql数据库详解(在局域网访问)

    docker中使用mysql数据库详解(在局域网访问)

    这篇文章主要给大家介绍了在docker中使用mysql数据库,在局域网访问的相关资料,文中通过图文以及示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-06-06
  • docker快速安装使用kibana流程

    docker快速安装使用kibana流程

    这篇文章主要为大家介绍了docker快速安装使用kibana详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Docker如何查看镜像里的文件

    Docker如何查看镜像里的文件

    文章介绍了如何在开发过程中检查Docker镜像中的文件是否符合预期,步骤包括下载镜像、创建并运行临时容器查看内容,以及停止和删除临时容器
    2024-11-11
  • 关于docker安装python3.8镜像的问题

    关于docker安装python3.8镜像的问题

    这篇文章主要介绍了docker安装python3.8镜像的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • docker容器启用ipv6地址的方法流程

    docker容器启用ipv6地址的方法流程

    Docker默认不开启IPv6配置,某些场景我们又需要IPv6网络支持,随着IPv6的普及,以后的使用场景会越来越多,所以本文给大家介绍了docker容器启用ipv6地址方法,用ipv6地址访问容器方法流程、创建一个nginx容器用ipv6地址访问测试流程,需要的朋友可以参考下
    2024-08-08
  • 详解Docker下搭建Jenkins构建环境

    详解Docker下搭建Jenkins构建环境

    这篇文章主要介绍了详解Docker下搭建Jenkins构建环境,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Docker容器时间与宿主机不一致/宿主机时间不同步校验问题

    Docker容器时间与宿主机不一致/宿主机时间不同步校验问题

    在Docker容器中,若未单独配置localtime,可能导致时间与宿主机不一致,例如UTC与CST(东八区)相差8小时,解决方法包括在启动时通过docker run添加时间参数,使用Dockerfile设置,或通过docker-compose配置,对于已运行的容器
    2024-10-10

最新评论