redis-集群 原生部署和工具自动部署

news2024/11/6 3:10:05

  • 什么redis集群?

    • redis集群是一个提供在多个redis节点之间共享数据的程序集。它并不像redis主从复制模式那样仅提供一个master节点来提供写服务,而是会提供多个master节点来提供写服务,每个master节点中存储的数据都不一样,这些数据通过数据分片的方式被自动分割到不同的master节点上
  • redis集群介绍:

    • Redis Cluster 是redis的分布式解决方案,当遇到单机、内存、流量等瓶颈时,可以采用cluster架构方式达到负载均衡的目的
  • 数据分布:

    • 分布式数据库首先要解决吧整个数据库集按照分区规则映射到多个节点的问题,即把数据集划分到多个节点上,每个节点负责整体数据的一个子集,需要关注的是数据分片规则,Rredis Cluster采用哈希分片规则。
  • 集群节点之间的通讯方式:

    • 节点之间通过建立TCP连接,使用gossip协议来传播集群的信息。端口为:服务端口+10000
  • Redis Cluster部署的两种方式:

    • 原生安装与官方工具安装

    • 原生安装的步骤:

      • 1.手动配置节点发现
      • 2.meet操作(通知新节点加入)
      • 3.指派槽位
      • 4.分主从
    • 官方工具安装:

      • 如果redis版本为3打头需要手动安装redis-trib.rb工具,新版本无需安装
  • 本章实验环境如下:

    • 环境介绍:

      • 为了使整个集群变得高可用性,我们给每台服务器上开了两个实例 一个为master一个为slave,当master节点故障,则会自动使用slave升级为master节点。
      • 如何知道集群中某个节点故障了呢?
        • 他们之间的通讯方式:每个节点都使用tcp协议相互通讯交流,当某个master出现故障时,所有节点都会知道这个出现故障的master,这时集群会自动把故障下面的salve升级为master
    • 实验操作:

      • 原生安装:

      • 1.三台服务器上部署redis服务:
        • redis1:创建数据目录和安装目录:
          • mkdir -p /opt/redis_cluster/redis_{6380,6381}/{conf,logs,pid}
          • mkdir -p /data/redis_cluster/redis_{6380,6381}
        • 解压安装包到/opt/redis_cluster目录下:
          • tar xf redis-5.0.7.tar.gz -C /opt/redis_cluster/
          • cd /opt/redis_cluster/
          • ln -s redis-5.0.7 redis
          • cd redis
          • make && make install
        • 编辑配置文件:
          • 配置文件解释:

          • cat >/opt/redis_cluster/redis_6380/conf/redis_6380.conf<<EOF
            bind 192.168.8.5
            port 6380
            daemonize yes
            pidfile "/opt/redis_cluster/redis_6380/pid/redis_6380.pid"
            logfile "/opt/redis_cluster/redis_6380/logs/redis_6380.log"
            dbfilename "redis_6380.rdb"
            dir "/data/redis_cluster/redis_6380/"
            cluster-enabled yes
            cluster-config-file nodes_6380.conf
            cluster-node-timeout 15000
            EOF
            cd /opt/redis_cluster/
            cp redis_6380/conf/redis_6380.conf redis_6381/conf/redis_6381.conf
            sed -i 's#6380#6381#g' redis_6381/conf/redis_6381.conf 
            redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf
            redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf
            

        • 将redis1服务器的安装目录和数据目录,远程复制到redis2、redis3服务器上:
          • scp -rp /opt/* root@192.168.8.6:/opt
          • scp -rp /opt/* root@192.168.8.7:/opt
        • redis2 操作:
          • cd /opt/redis_cluster/redis
            make install 
            find /opt/redis_cluster/redis_638* -type f -name "*.conf"|xargs sed -i "s#5#6#g"
            mkdir -p /data/redis_cluster/redis_{6380,6381}
            redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf
            redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf
            

        • redis3 操作:
          • cd /opt/redis_cluster/redis
            make install
            find /opt/redis_cluster/redis_638* -type f -name "*.conf"|xargs sed -i "s#5#7#g"
            mkdir -p /data/redis_cluster/redis_{6380,6381}
            redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf
            redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf
            

        • 查看8.6-7服务器上是否有6380和6381端口:
          • netstat -anpt | grep 638
        • 至此每台服务器上出现此端口,代表三台redis部署启动成功。
      • 开始创建群集:

        • 1.手动配置节点发现:
          • 登录任意一台服务器的redis节点:
            • redis-cli -h 192.168.8.5 -p 6380
            • 登录8.5的6380redis实例后,开始发现其他五个节点:
              • 使用节点发现命令,发现其他五个节点(登录数据库后执行):
                • CLUSTER MEET 192.168.8.5 6381
                  CLUSTER MEET 192.168.8.6 6380
                  CLUSTER MEET 192.168.8.7 6380
                  CLUSTER MEET 192.168.8.6 6381
                  CLUSTER MEET 192.168.8.7 6381
                  

            • 查看集群信息:
              • CLUSTER NODES
            • Redis Cluster 通讯流程:
              • 1)集群中的每一个节点都会单独开辟一个 Tcp 通道,用于节点之间彼此通信,防火墙放行(端口号+10000).
              • 2)每个节点在固定周期内通过特定规则选择结构节点发送 ping 消息
              • 3)接收到 ping 消息的节点用 pong 消息作为响应。集群中每个节点通过一定规则挑选要通信的节点,每个节点可能知道全部节点,也可能仅知道部分节点,
              • 只要这些节点彼此可以正常通信,最终他们会打成一致的状态,当节点出现故障,新节点加入,主从角色变化等,它能够给不断的ping/pong消息,从而达到同步目的。
            • Redis Cluster手动分配槽位:
              • 现在节点之间已经互相发现了,但是此时集群还是不可用的状态,因为并没有给节点分配槽位,而且必须是所有的槽位都分配完毕后整个集群才是可用的状态。
              • 我们虽然是有6个节点,但是真正写入数据的只有三个节点,其他三个节点只是作为主节点的从节点,只需要分配这其中三个主节点的槽位就可以了
              • 分别登录到每个主节点的客户端来执行命令:
                • 在数据库外执行:
                  • redis-cli -h 192.168.8.5 -p 6380 cluster addslots {0..5460}
                    redis-cli -h 192.168.8.6 -p 6380 cluster addslots {5461..10922}
                    redis-cli -h 192.168.8.7 -p 6380 cluster addslots {10923..16383}
                    

              • 再次查看集群信息:
                • 可以看到后面有了刚才分配的槽位,群集状态也是ok的。

            • 手动配置集群高可用:
              • 虽然这时候集群是可以用得了,但是整个集群只要有一台机器坏掉了,那么整个集群都是不可用的。
              • 这时候就需要将另外三个没有槽位的三个节点分别作为现在三个有槽位的主节点的从节点,这样就可以应对集群主节点故障时可以进行自动切换,以保证整个集群的高可用性。
              • 在任意一台redis服务器上远程操作集群其他节点
                • 注意:需要执行命令的是每个服务器的从节点
                  • 注意主从的ID不要搞混了
                  • 主从节点不要在一台服务器上,要交叉分主从
                • redis-cli -h 192.168.8.5 -p 6381 CLUSTER REPLICATE 49cbd0227229494070be11e3bc2a4a383f8d535e  (第二台主机6380的id)id号查看自己的id号
                  redis-cli -h 192.168.8.6 -p 6381 CLUSTER REPLICATE c9f13f78e29245ca993ea635ab27a3e260c6a210(第三台主机6380的id)
                  redis-cli -h 192.168.8.7 -p 6381 CLUSTER REPLICATE 6bb3f91ff8da948fc07d25445992e2161ed741f4	(第一台主机6380的id)
                  

              • 再次查看群集信息:
                • 发现每台主机的6381端口节点,都变成了slave状态(从服务器)

                • 此时手动搭建群集以部署完毕,测试是否可以正常存储数据!!
              • Redis Cluster测试集群:
                • 此时我们使用常规插入redis数据的方式往集群里写数据看看会发生什么
                • redis-cli -h 192.168.8.5 -p 6380 set k1 v1
                • 并没有插入数据到数据库中,这是因为集群后由于数据被分片了,所以并不是说在那台机器上写入数据就会在那台机器的节点上写入。
                • 集群的数据写入和读取就要涉及到另外一个概念,ASK路由。
                • Redis Cluster ASK路由介绍:
                  • 在集群模式下,redis接受任何键相关命令是首选会计算键对应的槽(slot),再根据槽找出所对应的节点,如果节点是自身,则处理键命令;
                  • 否则恢复MOVED重定向错误,通知客户端请求正确的节点,这个过程称为MOVER重定向。
                  • redis-cli客户端提供了-c参数实现自动重定向。
                • 插入数据:redis-cli -c -h 192.168.8.5 -p 6380 set k1 v1
                • 写入后同样需要使用-c选项来读取键值:
                • 读取数据:redis-cli -c -h 192.168.8.5 -p 6380 get k1
              • Redis Cluster模拟故障转移
                • 模拟redis2故障:
                  • redis-cli -h 192.168.8.6 -p 6380 shutdown
                  • redis-cli -h 192.168.8.6 -p 6381 shutdown
                • 查看群集节点状态:
                  • redis-cli -h 192.168.8.5 -p 6380
                    • cluster nodes
                  • 关闭8.6的6380主节点后,8.5的6381从节点自动又主节点切换回了主节点

                • 再次将8.6服务器上的两个节点启动起来:
                  • redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf
                  • redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf
                • 查看群集节点状态:
                  • 8.5的6381切换回了slave。
      • 使用工具自动搭建部署Redis Cluster集群

        • 实验环境还是6个节点与原生安装一样:
          • 部署redis节点过程略与上方一样
        • 开始部署群集:
          • 无需安装redis-trib.rb工具(新版本无需安装),节点部署好后直接创建集群
          • 创建群集:
          • redis-cli --cluster create --cluster-replicas 1 192.168.8.5:6380 192.168.8.6:6380 192.168.8.7:6380 192.168.8.5:6381 192.168.8.6:6381 192.168.8.7:6381
            • (前面三个自动被分配为master,后三个自动被分配为slave)
            • 直接yes即可
          • 检查完整性:redis-cli --cluster check 192.168.8.5:6380
            • 槽位也被自动分配了

          • 当我们节点不够用时,使用redis集群扩容:
            • 1)准备新节点
            • 2)加入集群
            • 3)迁移槽和数据
          • 为了省资源,我们在redis1服务器上再创建两个新节点
            • mkdir -p /opt/redis_cluster/redis_{6390,6391}/{conf,logs,pid}
            • mkdir -p /data/redis_cluster/redis_{6390,6391}
            • cd /opt/redis_cluster/
            • cp redis_6380/conf/redis_6380.conf redis_6390/conf/redis_6390.conf
            • cp redis_6380/conf/redis_6380.conf redis_6391/conf/redis_6391.conf
            • sed -i 's#6380#6390#g' redis_6390/conf/redis_6390.conf
            • sed -i 's#6380#6391#g' redis_6391/conf/redis_6391.conf
            • 启动节点
              • redis-server /opt/redis_cluster/redis_6390/conf/redis_6390.conf
              • redis-server /opt/redis_cluster/redis_6391/conf/redis_6391.conf
            • 发现节点:(将新建的两台节点)
              • redis-cli -c -h 192.168.8.5 -p 6380 cluster meet 192.168.8.5 6390
              • redis-cli -c -h 192.168.8.5 -p 6380 cluster meet 192.168.8.5 6391
            • 从之前的三台master节点服务器上向新的6390节点分配slots槽位
              • redis-cli --cluster reshard 192.168.8.5:6390
            • 将6391顺从于6390:
              • redis-cli -h 192.168.8.5 -p 6391 cluster replicate 6390id
            • 再次检查集群,发现6390有了槽位,6391 没有槽位也是slave
            • 扩展完之后,再将它们收缩:
              • 移除下线节点的槽位:
              • redis-cli --cluster reshard 192.168.8.5:6390
                • 这样重复三次,即可将槽位还回去
                  • 1365 给redis1的6380
                  • 1366 给redis2的6380
                  • 1365 给redis3的6380
              • 移除下线的节点:
                • redis-cli -c -h 192.168.8.5 -p 6380 cluster forget 6f2a812b88aa230e13fadabc1096304ddcbddc17(6390id)
                • redis-cli -c -h 192.168.8.5 -p 6380 cluster forget 547176fc5e7b7a3fb144ea1cb49dd48018d3ff3c(6391id)
          • 至此整章redis集群的原生部署和自动部署环境分别介绍完毕,感谢观看!!
  •  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1505657.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HarmonyOS系统开发基础环境搭建

目录 一 鸿蒙介绍&#xff1a; 1.1 HarmonyOS系统 1.2 HarmonyOS软件编程语言 二 HarmonyOS编程环境搭建 1.1 官网下载地址 1.2搭建开发流程 1.3 创建安装目录 1.4 下载DevEco Studio​编辑 1.5 下载后点击安装 1.6 自动添加桌面快捷和bin路径 ​编辑1.7 安装好运行 …

[Angular 基础] - 表单:模板驱动表单

[Angular 基础] - 表单&#xff1a;模板驱动表单 之前的笔记&#xff1a; [Angular 基础] - routing 路由(上) [Angular 基础] - routing 路由(下) [Angular 基础] - Observable Angular 内置两种表单的支持&#xff0c;这篇写的就是第一种&#xff0c;即模板驱动表单 (Tem…

wps由于找不到krpt.dll,无法继续执行代码的解决方法

遇到由于找不到krpt.dll,无法继续执行代码的问题时&#xff0c;理解如何修复这个问题变得至关重要。本文会教大家krpt.dll的恢复流程&#xff0c;并介绍该DLL文件的相关属性。我们将一步步指导你如何处理缺失文件的情况&#xff0c;让你能够解决阻碍代码正常运行的障碍&#xf…

C语言初学10:typedef

一、作用 为用户定义的数据类型取一个新名字 二、对结构体使用typedef定义新的数据类型名字 #include <stdio.h> #include <string.h>typedef struct Books //使用 typedef 来定义一个新的数据类型名字 {char title[50];} book;int main( ) {//book是typedef定…

背包问题算法

背包问题算法 0-1背包问题二维数组一维数组 完全背包问题二维数组一维数组 多重背包问题一维数组 0-1背包问题 问题&#xff1a;背包的容量为9&#xff0c;有重量分别为[2, 4, 6, 9]的四个物品&#xff0c;价值分别为[3, 4, 5, 6]&#xff0c;求背包能装的物品的最大价值是多少…

LiveNVR监控流媒体Onvif/RTSP功能-支持云端录像监控视频集中存储录像回看录像计划配置NVR硬件设备录像回看

LiveNVR支持云端录像监控视频集中存储录像回看录像计划配置NVR硬件设备录像回看 1、流媒体服务软件2、录像回看3、查看录像3.1、时间轴视图3.2、列表视图 4、如何分享时间轴录像回看&#xff1f;5、iframe集成示例7、录像计划7、相关问题7.1、录像存储位置如何配置&#xff1f;…

【电路】工作于直流4.5V电压的声控小灯

这个声控小灯用于控制4.5V直流供电的小灯泡&#xff0c;可用作学生实验也可用作声控夜光小灯。电路主要由5G555时基集成电路和一些分立元件组成&#xff0c;如下图所示&#xff1a; 工作原理 压电陶瓷片B与晶体三极管VT1&#xff0c;电阻R1&#xff0c;和电阻R2等组成了声控脉…

数据结构之单链表及其实现!

目录 ​编辑 1. 顺序表的问题及思考 2.链表的概念结构和分类 2.1 概念及结构 2.2 分类 3. 单链表的实现 3.1 新节点的创建 3.2 打印单链表 3.3 头插 3.4 头删 3.5 尾插 3.6 尾删 3.7 查找元素X 3.8 在pos位置修改 3.9 在任意位置之前插入 3.10 在任意位置删除…

【Primsjs】vue+代码高亮

效果 括号变色括号鼠标移入高亮效果 代码效果 目录树 在这里插入图片描述 安装 cnpm i primsjs简介 文档&#xff08;点我进去&#xff09; 备用地址-https://prismjs.com/docs/index.html Primsjs使用 导入配置插件 注意&#xff1a;需要什么插件就导入什么插件 码 &l…

Linux centos6安装rz、sz命令

centos6传文件提示command not found # yum install lrzsz 提示错误 wget http://www.ohse.de/uwe/releases/lrzsz-0.12.20.tar.gz 下载离线包 https://www.ohse.de/uwe/software/lrzsz.html 下载最新版本 [rootnode1 ~]# tar -zxvf lrzsz-0.12.20.tar.gz …

PV与PVC知多少?解锁CKA认证考点攻略!

往期精彩文章 : 提升CKA考试胜算&#xff1a;一文带你全面了解RBAC权限控制&#xff01;揭秘高效运维&#xff1a;如何用kubectl top命令实时监控K8s资源使用情况&#xff1f;CKA认证必备&#xff1a;掌握k8s网络策略的关键要点提高CKA认证成功率&#xff0c;CKA真题中的节点维…

蓝桥省赛倒计时 35 天-双指针

双指针介绍 双指针算法是一种常用的算法技巧&#xff0c;它通常用于在数组或字符串中进行快速查找、匹配、排序或移动操作。 pointer 双指针并非真的用指针实现&#xff0c;一般用两个变量来表示下标&#xff08;在后面都用指针来表示&#xff09;。 双指针算法使用两个指针在数…

【Java JVM】Class 文件

Java 的口号 “一次编写, 到处运行 (Write Once, Run Anywhere)” 的基础: JVM 和 所有平台都统一支持的程序存储格式 – 字节码 (Byte Code)。 只要在对应的平台安装对应的 JVM, 将我们编写的源码编译为 Class 文件, 就能达到了一次编写, 导出运行的目标, 中间的所有细节由不同…

0103n阶行列式-行列式-线性代数

文章目录 一 n阶行列式二 三阶行列式三 特殊行列式结语 一 n阶行列式 ∣ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋯ ⋯ ⋯ ⋯ a n 1 a n 2 ⋯ a n n ∣ \begin{vmatrix}a_{11}&a_{12}&\cdots&a_{1n}\\a_{21}&a_{22}&\cdots&a_{2n}\\\cdots&\cdots…

大型房企知识竞赛活动方案

&#xff08;一&#xff09; 线上挑战赛 1、加入团队 个人可以依据自身情况选择加入初始团队&#xff0c;也可创建团队。 2、题库来源 参考权威题库&#xff0c;适当加入公司帮扶贫困县的相关历史数据题目 3、小程序活动专题页 模块包括&#xff1a;党史知识线上挑战赛、活动宣…

Unity 采用自定义通道ShaderGraph实现FullScreen的窗户雨滴效果

效果如下 ShaderGraph实现 N21 随机化 DragLayer分层 将DragLayer分成四层&#xff0c;分别调整每层的缩放和大小 Shader实现的链接&#xff08;Unity 雨水滴到屏幕效果&#xff09; 我也是参考这个实现Shader Graph

Android7.1 ANR error 弹窗处理

Android7.1 ANR error 弹窗处理 问题描述解决方法 郑重声明:本人原创博文&#xff0c;都是实战&#xff0c;均经过实际项目验证出货的 转载请标明出处:攻城狮2015 Platform: Rockchip OS:Android 7.1.2 Kernel: 3.10 问题描述 有时会用到第三方apk&#xff0c;内置到系统中&…

通信-CAN-00 标准概述

总结了下CAN的基本知识&#xff0c;实际CAN的标准&#xff0c;内容&#xff0c;工具使用&#xff0c;上位机开发&#xff0c;下位机开发等&#xff0c;后续会找时间慢慢更新。本文主要介绍CAN标准&#xff0c;并对11898进行了进一步的介绍。 1 CAN概念 CAN-Controller Area N…

C++ 多状态dp

目录 按摩师 打家劫舍 打家劫舍2 删除并获得点数 粉刷房子 按摩师 面试题 17.16. 按摩师 最大值问题 f : 预约此次的最长时间 g &#xff1a;不预约此次的最长时间 出现的错误&#xff1a;return max(f[n - 1]), g[n - 1]); 注意&#xff1a;①题目没给nums的范围&…

软件杯 图像识别-人脸识别与疲劳检测 - python opencv

文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是…