前言

在开发环境中,大家应该都用的是redis单点吧,但是在生产环境中我相信没有人敢用单点的,应该都是用的cluster,因为万一单点挂掉的话,我们的应用也就自然而然的ConnectionException。那么,接下来我就记录一下我自己用docker搭建redis-cluster吧!

基本概念

每个Redis集群中的节点都需要打开两个TCP连接。一个连接用于正常的给Client提供服务,比如6379,还有一个额外的端口(通过在这个端口号上加10000)作为数据端口,比如16379。第二个端口(本例中就是16379)用于集群总线,这是一个用二进制协议的点对点通信信道。这个集群总线(Cluster bus)用于节点的失败侦测、配置更新、故障转移授权,等等。客户端从来都不应该尝试和这些集群总线端口通信,它们只应该和正常的Redis命令端口进行通信。注意,确保在你的防火墙中开放着两个端口,否则,Redis集群节点之间将无法通信。命令端口和集群总线端口的偏移量总是10000。
        Redis集群不同一致性哈希,它用一种不同的分片形式,在这种形式中,每个key都是一个概念性(hash slot)的一部分。Redis集群中的每个节点负责一部分hash slots,并允许添加和删除集群节点。比如,如果你想增加一个新的节点D,那么久需要从A、B、C节点上删除一些hash slot给到D。同样地,如果你想从集群中删除节点A,那么会将A上面的hash slots移动到B和C,当节点A上是空的时候就可以将其从集群中完全删除。因为将hash slots从一个节点移动到另一个节点并不需要停止其它的操作,添加、删除节点以及更改节点所维护的hash slots的百分比都不需要任何停机时间。也就是说,移动hash slots是并行的,移动hash slots不会影响其它操作。
        为了保持可用,Redis集群用一个master-slave模式,这样的话每个hash slot就有1到N个副本。而redis-cluster规定,至少需要3个master和3个slave,即3个master-slave对。当我们给每个master节点添加一个slave节点以后,我们的集群最终会变成由A、B、C三个master节点和A1、B1、C1三个slave节点组成,这个时候如果B失败了,系统仍然可用。节点B1是B的副本,如果B失败了,集群会将B1提升为新的master,从而继续提供服务。然而,如果B和B1同时失败了,那么整个集群将不可用。
        Redis集群不能保证强一致性。换句话说,Redis集群可能会丢失一些写操作,原因是因为它用异步复制。为了使用redis-cluster,需要配置以下几个参数:

  • cluster-enabled <yes/no>: 如果是yes,表示启用集群,否则以单例模式启动
  • cluster-config-file <filename>: 可选,这不是一个用户可编辑的配置文件,这个文件是Redis集群节点自动持久化每次配置的改变,为了在启动的时候重新读取它。
  • cluster-node-timeout <milliseconds>: 超时时间,集群节点不可用的最大时间。如果一个master节点不可到达超过了指定时间,则认为它失败了。注意,每一个在指定时间内不能到达大多数master节点的节点将停止接受查询请求。
  • cluster-slave-validity-factor <factor>: 如果设置为0,则一个slave将总是尝试故障转移一个master。如果设置为一个正数,那么最大失去连接的时间是node timeout乘以这个factor。
  • cluster-migration-barrier <count>: 一个master和slave保持连接的最小数量(即:最少与多少个slave保持连接),也就是说至少与其它多少slave保持连接的slave才有资格成为master。
  • cluster-require-full-coverage <yes/no>: 如果设置为yes,这也是默认值,如果key space没有达到百分之多少时停止接受写请求。如果设置为no,将仍然接受查询请求,即使它只是请求部分key。 

基础环境信息

CentOS 7.6 64bit
Docker version 20.10.12

yum -y install docker-ce
docker pull redis(5.x)

第一步,创建虚拟网卡,创建redis网络。

docker network create redis --subnet 172.18.0.0/16 --gateway 172.18.0.1
查看redis虚拟网卡网关ip:
docker network inspect redis | grep "Gateway" | grep --color=auto -P '(\d{1,3}.){3}\d{1,3}' -o

查看创建是否成功


第二步,编写脚本 (备注:在home/redis下循环创建6个文件并写入配置文件)

for port in $(seq 1 6); \
do \
mkdir -p /home/redis/node-${port}/conf
touch /home/redis/node-${port}/conf/redis.conf
cat << EOF >/home/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.18.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
masterauth mypassword
requirepass mypassword
EOF
done

第二步,启动redis,确认挂载文件路径与上面脚本生成的一致,网络为刚刚创建的redis网络

docker run -p 6371:6379 -p 16371:16379 --name redis-1     -v /home/redis/node-1/data:/data     -v /home/redis/node-1/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 172.18.0.11 redis redis-server /etc/redis/redis.conf


第三步,继续启动redis,修改端口号、挂载文件、自定义网络、名称

docker run -p 6372:6379 -p 16372:16379 --name redis-2     -v /home/redis/node-2/data:/data     -v /home/redis/node-2/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 172.18.0.12 redis redis-server /etc/redis/redis.conf


第四步,重复第三步启动6个镜像(因为配置文件我们生成6个),完成后查看镜像。

docker run -p 6373:6379 -p 16373:16379 --name redis-3 -v /home/redis/node-3/data:/data -v /home/redis/node-3/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 172.18.0.13 redis redis-server /etc/redis/redis.conf docker run -p 6374:6379 -p 16374:16379 --name redis-4 -v /home/redis/node-4/data:/data -v /home/redis/node-4/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 172.18.0.14 redis redis-server /etc/redis/redis.conf docker run -p 6375:6379 -p 16375:16379 --name redis-5 -v /home/redis/node-5/data:/data -v /home/redis/node-5/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 172.18.0.15 redis redis-server /etc/redis/redis.conf docker run -p 6376:6379 -p 16376:16379 --name redis-6 -v /home/redis/node-6/data:/data -v /home/redis/node-6/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 172.18.0.16 redis redis-server /etc/redis/redis.conf

脚本:
for port in $(seq 1 6); \
do \
docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \
-v /home/redis/node-${port}/data:/data \
-v /home/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d --network redis --ip 172.18.0.1${port} redis redis-server /etc/redis/redis.conf
done

查看容器分配ip
docker network inspect redis


没问题启动成功。

第五步,随便进入一个容器内


创建集群

redis-cli -a admin --cluster create 172.18.0.11:6379 172.18.0.12:6379 172.18.0.13:6379  172.18.0.14:6379  172.18.0.15:6379  172.18.0.16:6379 --cluster-replicas 1
提示:-a表示指定连接集群的密码,--cluster create 表示创建集群,后面跟要加入集群的各节点ip地址和端口(包括master和slave);--cluster replicas 用来指定集群master对应的副本(slave)数量;它会根据我们指定的数量,去创建master和slave,并把16384个槽位平均分配给对应的master节点,并且会自动关联master和slave的关系;

问是否设置以上配置,输入yes即可


M为主,S为从。完成后查看集群

redis-cli -c

第五步,存值测试,成功会返回当前处理的节点是哪一个。

set a b

将当前处理的节点镜像关闭


重新连接redis,获取刚刚存入的值,因为主服务已经关闭,子服务会将刚刚存入的值返回。

到这就 了

进入容器:docker exec -it redis-6 /bin/sh
进入redis:redis-cli -c
查看集群:cluster nodes
移除集群:cluster forget ID
添加集群节点:redis-cli --cluster add-node 172.18.0.15:6379 172.18.0.11:6379
删除集群节点:redis-cli --cluster del-node 172.18.0.15:6379 d2831eb681fe156ce4a741be1da39c7fa2332479

一键搭建集群脚本:https://pan.baidu.com/s/1UZr-8S44DFu2-vOZD_aDjA?pwd=kycz 提取码: kycz

一键脚本搭建docker redis 集群(cluster)相关推荐

  1. 入门K8s:一键脚本搭建Linux服务器集群

    前言 好久没有写系列博客了,本文主要是对网上文章的总结篇,主要是将安装和运行代码做了一次真机实验,亲测可用.文章内包含的脚本和代码,多来自于网络,也有我自己的调整和配置,文章末尾对参考的文献做了列举, ...

  2. 本地连接服务器搭建的 Redis 集群

    本地连接服务器搭建的 Redis 集群 在实际运行测试中,存在两个问题 安全组或防火墙开放端口 主要开放+10000端口. 如果要连接 Redis集群的应用服务不和 Redis集群在一个局域网下,会出 ...

  3. 手把手搭建一个redis集群

    文章目录 前言 安装的含义 安装redis redis编译安装 redis集群 redis集群的使用 C++工程连接使用redis-cluster hiredis-cluster 总结 前言 所谓&q ...

  4. Docker——阿里云搭建Docker Swarm集群

    阿里云搭建Docker Swarm集群 Docker Swarm概念 环境部署 Swarm集群搭建 安装Docker 配置阿里云镜像加速 搭建集群 Raft一致性算法 Swarm集群弹性创建服务(扩缩 ...

  5. docker redis集群搭建_Redis集群模式搭建

    前言 本文主要介绍如何搭建redis集群环境 原理简介 - Redis 集群是一个提供在多个Redis间节点间共享数据的程序集,集群节点共同构建了一个去中心化的网络,集群中的每个节点拥有平等的身份,节 ...

  6. docker Redis集群

    文章目录 1. 创建redis网卡 2. 创建redis配置 3. 启动redis集群 4. 创建集群 5. 记录与调试 6. 故障转移 1. 创建redis网卡 # 删除容器 docker rm - ...

  7. 分布式Redis集群--Cluster架构

    Cluster架构 Redis哨兵与Cluster集群模式对比 1. 哨兵模式 Redis3.0之前一般是通过哨兵工具来监测master节点的状态,若master节点宕机,则哨兵集群会进行主从切换,从 ...

  8. Redis集群Cluster部署

    这篇Redis 集群部署笔记参考的书籍资料是: <Redis入门指南>第二版,作者:李子骅 第8章 <Redis开发与运维> 作者:付磊 第10章 以下是学习笔记,记录了Red ...

  9. Redis集群cluster环境(快速搭建过程10分钟)

    安装环境CentOS Linux release 7.5.1804 (Core) 如果服务器没有连接网络,请按步骤自行百度其离线方式 话不多说,开整!!! 一.安装redis #下载至/home/in ...

最新文章

  1. python使用matplotlib可视化、使用英文单次或者缩写指定使用的颜色、使用16进制的RGB字符串指定颜色、使用RGB或者RGBA数字元组指定颜色
  2. python创建文件夹_Python学习第71课-本地建立repository仓库
  3. 分类器评价与在R中的实现:混淆矩阵
  4. 13、HTML <meta>标签
  5. Fiori launchpad里Enter Group name这个tile是怎么配置出来的
  6. android 短信注册,Android注冊短信验证码功能
  7. php终止符,关于php中嵌入html代码时结束符“?”位置为什么这样放置?
  8. HTML、JS、字符串的简单加密与解密
  9. Python3 解释器
  10. css3中的文字效果
  11. MSP430G2333下位机乘法运算需要注意的一个问题
  12. 电商网站开发设计方案、电商网站开发重要性
  13. html中倒计时函数,关于倒计时的函数
  14. 31页智慧文旅云服务平台建设方案【附下载】
  15. lecture9-提高模型泛化能力的方法
  16. 【OpenCV 例程300篇】48. 直方图处理之彩色直方图匹配
  17. 五 IP核行业潜在投资方向和机会
  18. traceroute不通的解决
  19. 学会了这些!你就是天下间的美容高手
  20. 德乐生 java_【Senior Java Developer怎么样】德乐生软件2021年Senior Java Developer前景怎么样-看准网...

热门文章

  1. html标志着html文档的开始,html标记标志着HTML文档的开始,/html标记标志着HTML文档的结束。...
  2. 小学教师听课体会 计算机,小学教师听课心得体会
  3. 攻防世界 Crypto高手进阶区 3分题 wtc_rsa_bbq
  4. json批量转换成label图像
  5. 易盾php,GitHub - yidun/antispam-php-demo: 易盾反垃圾php演示
  6. 2021年起重机械指挥考试技巧及起重机械指挥考试试题
  7. c语言函数变量的作用域与生存期
  8. C++静态库和动态库的导入导出
  9. 独木舟上的旅行(船问题贪心)
  10. python re正则匹配_python—RE正则表达式