Redis Cluster 集群三主三从高可用环境搭建
前言
Redis 是我们目前大规模使用的缓存中间件,由于它强大高效而又便捷的功能,得到了广泛的使用。
Window环境下载地址:https://github.com/tporadowski/redis/releases
Redis Cluster设计要点
redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。
那么redis 是如何合理分配这些节点和数据的呢?
Redis 集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽 (hash slot)
的方式来分配的。redis cluster 默认分配了 16384 个slot,当我们set一个key 时,会用CRC16
算法来取模得到所属的slot
,然后将这个key 分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384
。
注意的是:必须要3个以后
的主节点,否则在创建集群时会失败,我们在后续会实践到。
所以,我们假设现在有3个节点已经组成了集群,分别是:A, B, C 三个节点,它们可以是一台机器上的三个端口,也可以是三台不同的服务器。那么,采用哈希槽 (hash slot)
的方式来分配16384个slot 的话,它们三个节点分别承担的slot 区间是:
- 节点A覆盖0-5460;
- 节点B覆盖5461-10922;
- 节点C覆盖10923-16383.
Redis Cluster主从模式
redis cluster 为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从节点,主节点提供数据存取,从节点则是从主节点拉取数据备份,当这个主节点挂掉后,就会有这个从节点选取一个来充当主节点,从而保证集群不会挂掉。
假设集群有ABC三个主节点, 如果这3个节点都没有加入从节点,如果B挂掉了,我们就无法访问整个集群了。A和C的slot也无法访问。
所以我们在集群建立的时候,一定要为每个主节点都添加了从节点, 比如像这样, 集群包含主节点A、B、C, 以及从节点A1、B1、C1, 那么即使B挂掉系统也可以继续正确工作。
B1节点替代了B节点,所以Redis集群将会选择B1节点作为新的主节点,集群将会继续正确地提供服务。 当B重新开启后,它就会变成B1的从节点。
不过需要注意,如果节点B和B1同时挂了,Redis集群就无法继续正确地提供服务了。
话不多说下面以windows环境下在一个机器上模拟这样一个3主3从的集群
Redis Cluster 实践
1.下载Redis3.2 https://github.com/tporadowski/redis/releases 下载后解压可以看到已经内容
三主三从需要启动6个Redis服务端,我们本别定义端口为 7000,7001,7002,7003,7004,7005
为了方便区分配置文件同样以端口新建6个文件夹如下
把Redis目录下的redis.windows.conf 分别复制到下面的文件夹中,然后修改配置文件中的端口
配置文件修改好了之后,我们新建一个批处理文件开快速将Redis 以Windows服务的方式启动起来
打开服务查看是否正常运行
看到全部正在运行说明Redis服务器已经启动成功了,接下来我们就开始构建集群了,
搭建集群需要使用个工具Ruby 官方下载地址:https://www.ruby-lang.org/zh_cn/ 下载后安装,创建集群需要使 redis-trib.rb 这个文件可以从下面下载
链接:https://pan.baidu.com/s/1VmvYiE9D46YCIxcyUZlpOQ&shfl=sharepset
提取码:04xq
下载后将这个文件放在配置文件的目录同级
运行cmd 查看Ruby安装是否正常
安装 Ruby 连接Redis插件
然后cmd到 redis-trib.rb 所在的目录我们开始创建集群
redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
到这里我们的集群已经创建成功了,检查集群信息
我们打开一个客户端测试下
我们可以关掉其中的任意一个主节点来测试,看是否会自动从节点切换为主节点....
若遇到创建失败等问题,检查防火墙的端口是否打开.
Redis Cluster主从模式
原文地址:https://www.cnblogs.com/bob-zb/p/11720077.html
- STL中的nth_element()方法的使用
- C++queue容器学习(详解)
- 牛客面经 |这可能不只是一篇面经
- 图的基本算法(BFS和DFS)
- C++STL中set的使用策略(详解)
- Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2)(A.思维题,B.思维题)
- 设计模式六大原则(1):单一职责原则
- 设计模式六大原则(2):里氏替换原则
- Selenium2+python自动化72-logging日志使用
- Codeforces Round #395 (Div. 2)(A.思维,B,水)
- php实现图形计算器
- Selenium2+python自动化73-定位的坑:class属性有空格
- 华中农业大学第五届程序设计大赛网络同步赛题解
- Java构造方法与析构方法实例剖析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- php遍历目录&删除指定文件中指定内容
- pow函数问题
- 字节序列操作函数
- 3分钟短文:Laravel是怎么发出一封电子邮件的?
- Elasticsearch 设计模式
- Spring 的 WebSecurityConfigurerAdapter 过滤器
- 03.视频播放器Api说明
- Postfix配置Gmail中继发信
- 使用Syncthing自建私有同步盘
- 05.视频播放器内核切换封装
- sklearn做特征选择
- ResilioSync:公私兼备的同步盘
- 面向对象语言的三大特征: 封装 继承 多态(二)——继承
- 教你如何设置宝塔面板 Brotli压缩
- Message: session not created: This version of ChromeDriver only supports Chrome version 83