三台机器使用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

三台机器使用Docker部署Redis集群相关推荐

  1. 手把手教你实现 Docker 部署 Redis 集群

    作者:我为什么要写这个 cnblogs.com/cxbhakim/p/9151720.html 摘要 接触docker以来,似乎养成了一种习惯,安装什么应用软件都想往docker方向做,今天就想来尝试 ...

  2. 2万字好文!手把手教你实现 Docker 部署 Redis 集群

    点击上方 "程序员小乐"关注, 星标或置顶一起成长 后台回复"大礼包"有惊喜礼包! 关注订阅号「程序员小乐」,收看更多精彩内容 每日英文 Life is not ...

  3. docker部署redis集群实现动态扩缩容

    目录 思考 分布式存储的解决方案 哈希取余分区 一致性哈希算法分区 哈希槽分区 采用哈希槽分区 部署三主三从(docker) 准备工作 创建3主3从redis实例 进入容器中,构建主从关系 主从容错切 ...

  4. docker部署redis集群_Docker部署Redis集群----第九节(docker-redis哨兵集群“轮询分流”篇实例一)...

    到此,我们的 Redis 哨兵集群就结束了,本篇章是第九篇章,也是使用集群方式的实例一来实现php的轮询分流. 1.准备工作: 在我们上一篇章实现redis 哨兵集群的基础上开始,在服务器上部署php ...

  5. docker部署redis集群_Docker部署Redis集群----第六节(docker-redis-sentinel集群的机制)...

    通过前面的三个篇章的认知学习与实践,相信大家搭建自己的docker redis主从应该是没有任何问题了.普通的主从复制到此就结束了,下面我们要来分析讲解,普通主从复制的升级版"哨兵集群&qu ...

  6. 【Linux部署】借助Docker部署Redis集群(Docker网卡创建+6个Redis集群搭建shell脚本)

    话不多说,直接上代码- # 创建桥接 网卡 docker network create redis --subnet 172.38.0.0/16 # 查看所有 网卡 docker network ls ...

  7. Centos6.6部署Redis集群

    Centos6.6部署Redis集群 1 环境准备 1 环境安装redis 1 安装ruby 2 配置redis主从环境 3 部署redis sentinel服务器 5 集群使用 13 当前集群环境说 ...

  8. docker 完成 redis集群搭建

    [Docker那些事]系列文章 docker 安装 与 卸载 centos Dockerfile 文件结构.docker镜像构建过程详细介绍 Dockerfile文件中CMD指令与ENTRYPOINT ...

  9. k8s部署redis集群

    K8S部署Redis Cluster集群 kubernetes部署单节点redis: https://www.cnblogs.com/zisefeizhu/p/14282299.html Redis ...

最新文章

  1. Linux设备中文件系统位置,【linux之设备,分区,文件系统】
  2. 搜索专题: HDU1428漫步校园
  3. RabbitMQ操作代码封装
  4. 对于全连接层的理解 全连接层的推导
  5. Linux C语言操作MySQL
  6. php 7.0 特性,PHP 7.3比PHP 7.0快22% 即将进入特性冻结阶段
  7. 用mysql语句备份_MySql常用备份及恢复语句
  8. c 陷阱与缺陷 摘录
  9. python爬虫练习2:取道指成分股数据
  10. 什么是telemetry
  11. 网络管理维护(SNMP、RMON)期末考试大纲总结
  12. java之空指针异常处理
  13. 统计学中数据分析方法汇总
  14. c语言求斐波那契数列n项以及前n项和
  15. VREP(Coppeliarobotics)仿真介绍
  16. Dependency check配置Mysql数据库存储nvd数据
  17. 极限中0除以常数_干货分享高数 | 极限的计算
  18. 织梦DedeCMS华丽蓝色后台管理界面模板
  19. (正则表达式三行) 假设有一段英文,其中有单词中间的字母i误写为I,请编写程序进行纠正。
  20. 5分钟了解搜索引擎Lucene的原理

热门文章

  1. C#:if (!IsPostBack)作用
  2. Mysql性能优化、Mysql参数优化、Mysql配置优化
  3. 关于京东的“全名抢拍”
  4. LTE学习-RACH(3)
  5. 运营商大数据到底有什么意义?
  6. linux中wps默认安装目录,在Linux中安装和使用wps
  7. 学做网站有哪些注意事项(下)
  8. js两行代码获取ip地址
  9. 移动端1px 图片
  10. 数据结构--数组和广义表