文章目录

  • 一、前言
  • 二、集群配置
    • 2.1 说明
    • 2.2 配置
    • 2.3 启动redis
    • 2.4 集群操作
    • 2.5 验证集群
      • 2.5.1 springboot配置文件
      • 2.5.2 代码测试
      • 2.5.3 集群原理分析
      • 2.5.4 槽位定位算法
      • 2.5.5 跳转重定位
  • 三、集群问题
    • 3.1 脑裂问题
    • 3.2 集群服务问题
    • 3.3 集群批量操作命令问题
  • 四、Redis集群水平扩展
    • 4.1 模拟新机器加入集群
    • 4.2 将新节点添加到集群
      • 4.2.1 命令帮助
      • 4.2.2 添加集群新节点
      • 4.2.3 分配数据槽位(slot)给新节点
      • 4.2.4 为新节点添加从节点(达到集群中的1主2从)

一、前言

redis集群是一个由多个主从节点群组成的分布式服务器群,它具有复制、高可用和分片特性。Redis集群不需 要sentinel哨兵∙也能完成节点移除和故障转移的功能。需要将每个节点设置成集群模式,这种集群模式没有中 心节点,可水平扩展,据官方文档称可以线性扩展到上万个节点(官方推荐不超过1000个节点)。redis集群的 性能和高可用性均优于之前版本的哨兵模式。

二、集群配置

2.1 说明

redis集群需要至少三个master节点,我们这里搭建三个master节点,并且给每个master再搭建两个个slave节 点,总共9个redis节点,这里用三台机器部署9个redis实例,每台机器一主两从。每个机器上面的redis端口都是6379 6380 6381三个端口(方便复制而已,可自行选择),下方前两步为个人习惯,可自行更改。搭建集群的步骤如下。

2.2 配置

1 在每台机器的redis目录创建redis-cluster文件夹。mkdir redis-cluster
2 在redis-cluster文件夹下创建对应的端口号文件夹 这里我都创建 mkdir 6379 6380 6381
3 更改配置 daemonize yes 代表让redis 可后台启动
4 分别更改配置文件的端口号 port 6379 6380 6381
5 更改pid进程号pidfile /var/run/redis_6379.pid # 把pid进程号写入pidfile配置的文件
6 更改启动模式 cluster-enabled yes 代表集群模式启动
7 更改集群节点信息 cluster-config-file nodes-6379.conf 这里的6379最好和port对应上
8 注释掉 bind 127.0.0.1
9 protected-mode no 关闭保护模式
10 appendonly yes 开启aof持久化
如果需要设置访问密码 增加如下配置(建议配置文件里面的密码都一样,方便访问)
11 requirepass ljs redis访问密码
12 masterauth ljs 集群节点间访问密码
以上是配置一台机器的三个redis的配置文件,配置好后直接复制到另外两个机器即可,因为端口号都是一样,所以不用更改内容
关闭linux防火墙,因为redis集群节点采用gossip通信,端口号是默认的当前redis端口+10000。如果不关闭防火墙需要先开启对应的gossip通信端口。这里我采用的是直接关闭防火墙,因为自身测试并没有其他安全考虑
systemctl stop firewalld 关闭防火墙命令
systemctl disable firewalld 禁止开机启动

2.3 启动redis

命令 ./bin/redis-server ./redis-cluster/6379/redis6379.conf 分三次 启动三个redis。启动效果如下

启动的进程后面车险[cluster] 代表该redis是集群模式下启动。(集群尚未成功)

2.4 集群操作

使用redis-cli创建集群 ./bin/redis-cli -a ljs --cluster create --cluster-replicas 2 192.168.100.200:6379 192.168.100.200:6380 192.168.100.200:6381 192.168.100.201:6379 192.168.100.201:6380 192.168.100.201:6381 192.168.100.202:6379 192.168.100.202:6380 192.168.100.202:6381
-a 代表带密码 后面的 ljs 就是配置文件件里面requirepass 内容。 ip前面的数据2 代表 此次集群为个master创建两个从节点。
描述:下面集群信息中已经给我们描述除了那些是主节点那些是从节点。
1 第一个红色框内容代表分配的数据槽位。Redis Cluster会将我们的整个集群信息分为16384个slots(槽位)。在初始化集群的时候它会将这个16384个槽位较为均匀的分给所有master节点。
2 第二个红色框的内容代表将 前面那个redis地址作为后面那个redis地址的副本,其实从这里就可以看出那个是主节点
3 第三个红色框内容是代表,第二步操作位完毕后出现的整体集群信息。最前面写的M 代表是master节点, 写的S代表是从节点。这里是最终确认主节点地址的地方

上面集群信息显示完毕后会出现输入yes的地方,上面这个图yes后面还有些不用管它,因为我在不小心复制了东西,结果又没办法删掉。回车后集群还是成功。输入yes后才代表cluster开始根据上面的信息进行集群操作。出现下图内容代表集群成功

2.5 验证集群

2.5.1 springboot配置文件

2.5.2 代码测试

能获取到值代表数据存入和获取成功。

下面我们查看服务器,确定刚才的数据储存到了哪一个节点上面。我首先进入了IP地址是192.168.100.201:6379这个主节点上。发现没有数据,请转移到了200这台机器上节点去访问。

转移到200这台机器后,发现能获取到数据。

2.5.3 集群原理分析

上面信息也说了,这里重复一下。Redis Cluster会将我们整个集群的数据内容分为16384个slots,可以理解成是数据槽位。当 Redis Cluster 的客户端来连接集群时,它也会得到一份集群的槽位配置信息并将其缓存在客户端本地。这 样当客户端要查找某个 key 时,可以直接定位到目标节点。同时因为槽位的信息可能会存在客户端与服务器不 一致的情况,还需要纠正机制来实现槽位信息的校验调整。

2.5.4 槽位定位算法

Cluster 默认会对 key 值使用 crc16 算法进行 hash 得到一个整数值,然后用这个整数值对 16384 进行取模 来得到具体槽位。 HASH_SLOT = CRC16(key) mod 16384

2.5.5 跳转重定位

在客户端输入一个set命令。 如果你的key经过crc16算法进行hash得到一个整数值,不在你当前这个节点的槽位值里面,会自动跳转到它实际会储存槽位的客户端里面去。

三、集群问题

3.1 脑裂问题

网络分区(比如其中一个master节点的网络出现问题,slave节点无法取得联系,但是客户端可以取得联系,那么slave在无法联系master一段时间后就会告诉集群,我需要重新选举主节点)导致脑裂后多个主节点对外提供写服务,一旦网络分区恢复, 会将其中一个主节点变为从节点,这时会有大量数据丢失。
规避方法:min‐replicas‐to‐write 1 在redis.conf里面添加前面这个配置。写数据成功最少同步的slave数量。这个配置在一定程度上会影响集群的可用性,比如slave要是少于1个,这个集群就算leader正常也不能 提供服务了,需要具体场景权衡选择

3.2 集群服务问题

当redis.conf的配置cluster-require-full-coverage为no时,表示当负责一个插槽的主库下线且没有相应的从 库进行故障恢复时,集群仍然可用,如果为yes则集群不可用

3.3 集群批量操作命令问题

对于类似mset,mget这样的多个key的原生批量操作命令,redis集群只支持所有key落在同一slot的情况,如 果有多个key一定要用mset命令在redis集群上操作,则可以在key的前面加上{XX},这样参数数据分片hash计 算的只会是大括号里的值,这样能确保不同的key能落到同一slot里去
mset {user133}:1:name ljs {user133}:1:age 18
mset {user134}:1:name ljs2 {user134}:1:age 18
假设name和age计算的hash slot值不一样,但是这条命令在集群下执行,redis只会用大括号里的 user1 做 hash slot计算,所以算出来的slot值肯定相同,最后都能落在同一slot

四、Redis集群水平扩展

4.1 模拟新机器加入集群

添加一台新虚拟机 192.168.100.203。同样安装redis5.x版本。然后复制另外已启动的虚拟机中的redis配置文件到新虚拟机下。没有bin目录的自己创建一个即可。 我的就是自己创建的,将src下面的redis-server和redis-cli复制到该文件夹下。
复制过去后 记得要新建data文件夹,data文件夹里面的接口和你几个redis里面配置的文件路径结构一直。 我这里的结构是 data/redis-cluster/ 这里面放有6379 6380 6381三个文件夹。

创建号后 启动三个redis
./bin/redis-server ./redis-cluster/6379/redis6379.conf
./bin/redis-server ./redis-cluster/6380/redis6380.conf
./bin/redis-server ./redis-cluster/6381/redis6381.conf
启动后查看进程, 后面带有[cluster]代表集群模式启动成功

4.2 将新节点添加到集群

4.2.1 命令帮助

有点熟悉redis的同学可以先看一下帮助文档,我们将采用add-node添加一个新的集群节点

1.create:创建一个集群环境host1:port1 … hostN:portN
2.reshard :指定任意一个主节点 进行重新分片
3.call:可以执行redis命令
4.add-node:将一个节点添加到集群里,第一个参数为新节点的ip:port,第二个参数为集群中任意一个已经存在的节点的ip:port
5.del-node:移除一个节点
6.reshard:重新分片
7.check:检查集群状态

4.2.2 添加集群新节点

命令:./bin/redis-cli -a ljs --cluster add-node 192.168.100.203:6379 192.168.100.200:6379

4.2.3 分配数据槽位(slot)给新节点

./bin/redis-cli -a ljs --cluster reshard 192.168.100.203:6379

这里会提示让你输入你希望分配多少个数据槽位给新节点, 这里我自己输入500个,输入后会让你再次输入集群节点的 ID 这个ID就是上面红色框里面的一长串字符串 复制过来输入进去就行了。如果中途填写错误,再退出重新执行 分片命令即可。
输入all 代表从所有集群节点中抽取600个槽位。

输入yes然后回车,确认开始执行分片计划。执行完毕后自动退出到该状态,代表集群添加一个节点成功。数据槽位也已经分配成功。注意,分配槽位的同时会将原本该槽位的数据一同带入到新节点中。下次客户端请求的时候再获取这个槽位的数据会自动定位到新节点上获取。

查看节点信息。这里可以看到 我们的203IP的新节点获得了新的数据槽位,因为我们上面输入的all 所以是从三个节点中抽取的数据槽位, 所以这里我们会有3个数据槽位信息。这里可以确认我们的新节点已经集群成功并成为主节点,并且可以吞吐数据
9

4.2.4 为新节点添加从节点(达到集群中的1主2从)

1.添加两个新节点到集群中
./bin/redis-cli -a ljs --cluster add-node 192.168.100.203:6381 192.168.100.200:6379
与上面的 4.2.2一样。只是我们不需要分配数据槽位。添加后集群信息里面出现了3个203IP的redis。而且三个都是master,但是不用担心这样会产生数据乱入。因为除了刚才分配的了数据槽位的那个redis以外其余的的节点是没有数据槽位,这样也就不会储存数据

2.我们需要执行replicate 命令来指定当前添加节点的主节点ID是那个。
./bin/redis-cli -a ljs -c -h 192.168.100.203 -p 6380进入到 新虚拟机的6380redsi 然后执行下面命令。
注意下面命令中的 长传字符串是集群中的节点ID,这个ID对应的你当前这个节点的主节点IP,我们是为192.168.100.200:6379添加从节点,所以我们选择它的ID。
cluster replicate 2126fdf84a7b23c83e7cdfc5cb3bd1366d4f7601

执行完毕后可以看到,192.168.100.203:6380已经成为了从节点, 直接里面的myself不用管它,因为我当前就是进入的就是这个端口节点, 这里的myself是代表当前我正在这个节点内。同样的我们进入到192.168.100.203:6381里面执行相同的命令即可。
随便进入集群中的任意一个节点 输入cluster nodes 查看集群信息

可以看出这里192.168.100.203中的redis全部都已经到了集群中也区分好了主从关系,到这里redis集群扩展就结束。 欢迎大佬指教留言。
如果该文章对您产生了帮助效果,请麻烦点个赞,谢谢

Redis高可用集群部署和集群扩展相关推荐

  1. 2.redis高可用-持久化-主从复制-哨兵-cluster集群概述与部署,内容依旧多看完直接通透!

    文章目录 一,Redis 高可用 1.持久化 2.主从复制 3.哨兵 4.集群(cluster) 二,Redis 持久化方式 1.持久化的功能 2.持久化的方式 三, RDB 持久化 1.触发条件 2 ...

  2. Redis 高可用原理及部署方法

    一.Redis 的高可用原理 其实 Memcached 在性能上要稍微比 Redis 好,但在易用性和可用性上,Redis 要大大超过Memcached . 先说易用性.Redis 有五种数据类型:l ...

  3. 部署Redis高可用集群

    目录 部署Redis高可用集群 Redis集群环境 拓扑结构 IP地址 环境准备 工作原理 创建Redis集群 部署管理主机 redis-trib.rb脚本 redis服务器开启集群功能 管理主机创建 ...

  4. Redis practise(二)使用Docker部署Redis高可用,分布式集群

    思路 鉴于之间学习过的Docker一些基础知识,这次准备部署一个简单的分布式,高可用的redis集群,如下的拓扑 tuopu.png 下面介绍下,对于这张拓扑图而言,需要了解的一些基础概念. Redi ...

  5. K8s-K8s部署Redis高可用主从集群+哨兵模式+动态持久化数据

    文章目录 1.引 2.文件结构 3.配置清单 1)`1-ns.yaml` 2)`2-configmap-redis.yaml` 3)`3-configmap-probe.yaml` 4)`4-svc- ...

  6. Redis高可用之集群配置(六)

    0.Redis目录结构 1)Redis介绍及部署在CentOS7上(一) 2)Redis指令与数据结构(二) 3)Redis客户端连接以及持久化数据(三) 4)Redis高可用之主从复制实践(四) 5 ...

  7. 【❤️万字长文总结❤️】一篇学会Redis高可用✔集群✔搭建详细教程

    大家好,我是Lex 喜欢欺负超人那个Lex 擅长领域:python开发.网络安全渗透.Windows域控Exchange架构 今日重点:今天总结一下Redis集群高可用的搭建流程 [惊喜推荐+优质资源 ...

  8. redis 高可用(持久化、主从复制、哨兵、集群)以及集群的三种模式

    Redis高可用定义 在web服务器中,高可用代表服务器可以正常访问的时间,一般使用百分比来衡量多长时间内可以提供正常服务 但是在redis中,高可用的定义还要更广泛一点,除了提供正常的服务(如主从分 ...

  9. Redis高可用集群-哨兵模式(Redis-Sentinel)搭建配置教程【Windows环境】

    ================================================= 人工智能教程.零基础!通俗易懂!风趣幽默!大家可以看看是否对自己有帮助! 点击查看高清无码教程 == ...

  10. Redis高可用——主从复制、哨兵模式、集群

    文章目录 一.Redis高可用 1.什么是高可用 2.Redis的高可用技术 二.Redis主从复制 1.Redis主从复制的作用 2.主从复制的流程 三.主从复制的搭建 实验准备 1.所有主机安装R ...

最新文章

  1. CentOS 7 VNC 配置
  2. mac全选文字的快捷键_在mac上写作必须知道的四组快捷键
  3. Java Web学习(七)HttpServletResponse(客户端响应)
  4. 职称考试取消英语和计算机,强烈建议取消所谓的英语职称和计算机考试
  5. 阿里云黄海宇:窄带高清2.0——让直播更惊艳的魔术
  6. jenkins集成gitlab
  7. 开源项目面试重要吗_年度最重要的开源新闻
  8. pytorch torch.zeros
  9. oracle函数 power(x,y)
  10. IdentityServer4支持的授权类型以及组合
  11. PE格式第八讲,TLS表(线程局部存储)
  12. 软件观念革命:交互设计精髓_2021年中国传媒大学设计学考研招生分析、参考书目、复试线、真题回忆、考研经验指南篇...
  13. 罪恶都市联机器无法显示服务器,《GTA:罪恶都市》多人联机!你的童年又回来了,梦想成真了!...
  14. 【C++沉思录】代理类
  15. sql数据库中毒,扩展名被改为.supporthelpgood​,.666decrypt666​​​​​​,.xxxxx,.dom,勒索病毒加密该如何恢复数据
  16. uart硬件一些小知识
  17. 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
  18. HTTP VS HTTPS
  19. 【深度学习之美】LSTM长短记,长序依赖可追忆(入门系列之十四)
  20. 使用WinDbg —— .NET篇 (一)

热门文章

  1. 前端jquery日期插件
  2. 一篇带你揭开 go mod 的面纱
  3. python 批量修改图片大小
  4. 跟着团子学SAP PS:项目报价解决方案(上)
  5. ios 原生语音识别,百度翻译API使用,原生文字转语音播报
  6. Android studio 读取sd卡mp3 播放音乐
  7. 谷歌翻译用不了的解决方案
  8. 追梦算法----数字找朋友
  9. IP-Guard加密安全网关安装部署使用手册
  10. 无需远程注入DLL,几行代码实现War3魔兽地图全开