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

  • 什么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.mzph.cn/news/730053.shtml

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

相关文章

【保姆级爬虫】微博关键词搜索并获取博文和评论内容(python+selenium+chorme)

微博爬虫记录 写这个主要是为了防止自己忘记以及之后的组内工作交接&#xff0c;至于代码美不美观&#xff0c;写的好不好&#xff0c;统统不考虑&#xff0c;我只能说&#xff0c;能跑就不错了&#xff0c;上学压根没学过python好吧&#xff0c;基本上是crtlc&ctrlv丝滑小…

开启AI绘画新纪元:让创意在指尖绽放

文章目录 一、了解AI绘画的基本原理二、选择合适的AI绘画工具三、掌握AI绘画的基本技巧四、借鉴与创新&#xff1a;从模仿到创作五、参与社区交流&#xff0c;共同成长《AI绘画教程&#xff1a;Midjourney使用方法与技巧从入门到精通》亮点推荐内容简介作者简介目录 在科技日新…

Linux centos 常用的网络负载和网速查看工具和命令

在 CentOS 上查看网络速度和网络负载&#xff0c;可以使用多种工具&#xff0c;以下是一些常用的命令行工具&#xff1a; iftop - 用于实时监视网络带宽使用情况。 安装命令&#xff1a; sudo yum install iftop 使用命令&#xff1a; sudo iftop nload - 一个简单的控制…

Doris-数据分区

数据分区&#xff1a;即将大表划分为小表&#xff0c;数据分区主要有两个级别&#xff1a;Partition和Bucket&#xff08;Tablet&#xff09;。 Partition&#xff1a;逻辑分区&#xff0c;按照一定规则将表按照行进行划分&#xff0c;每个部分就是一个Partition。 Bucket&…

flink重温笔记(十):Flink 高级 API 开发——flink 四大基石之 State(涉及Checkpoint)

Flink学习笔记 前言&#xff1a;今天是学习 flink 的第 10 天啦&#xff01;学习了 flink 四大基石之 State &#xff08;状态&#xff09;&#xff0c;主要是解决大数据领域增量计算的效果&#xff0c;能够保存已经计算过的结果数据状态&#xff01;重点学习了 state 的类型划…

相对于 Linux,Windows Server 存在的意义是什么?

相对于 Linux&#xff0c;Windows Server 存在的意义是什么&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Linux 的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给…

新版AndroidStudio的Gradle窗口显示task list not built 问题解决

在使用新版AndroidStudio时&#xff0c;会出现&#xff0c;Task List not built 的问题。如果你记得task的名字&#xff0c;当然可以 直接通过命令 gradle taskname 或者 ./gradlew taskName直接执行即可&#xff0c;但是若是记不住&#xff0c;还是把这个任务构建处理比较好用…

借助工具优化开发流程,提升开发体验

背景 最近在做一个demo&#xff0c;只有一个html页面&#xff0c;需要开启一个https web server&#xff0c;以此来实现在浏览器中访问。 改造前 改造前&#xff0c;每次修改文件保存后都要刷新一下浏览器。 如果只是短时间&#xff0c;每次修改后手动刷新浏览器也还行。主要…

C++:Stack和Queue的模拟实现

创作不易&#xff0c;感谢三连&#xff01; 一、容器适配器 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结)&#xff0c;该种模式是将一个类的接口转换成客户希望的另外一个接口。 就如同是电源适配器将不适用的交流电…

day04-Maven

一、初识 Maven Maven 是 Apache 旗下的一个开源项目&#xff0c;是一款用于管理和构建 java 项目的工具。 官网&#xff1a;https://maven.apache.org/ Maven的作用 依赖管理&#xff08;方便快捷的管理项目依赖的资源(jar包)&#xff0c;避免版本冲突问题&#xff09;统一项目…

想开发苹果群控软件?先了解这些代码!

随着智能设备的普及&#xff0c;群控软件的需求日益增加&#xff0c;特别是针对苹果设备的群控软件&#xff0c;因其出色的性能和广泛的用户基础&#xff0c;受到了开发者们的青睐。 然而&#xff0c;开发一款功能强大的苹果群控软件并非易事&#xff0c;需要深入了解苹果的开…

获取C语言语句对应的汇编码和机器指令

借助IDE的调试功能 以CodeBlocks为例&#xff0c;先设置断点&#xff0c;然后点击红色三角形调试。 然后选择Debug➡ Debugging Windows➡Disassembly 就可以看到了 使用命令行 在工程文件中&#xff0c;一般可以找到一个.o文件。如果没有&#xff0c;可以先在program.c的目录下…

掌握java中继承

目录 1.概念&#xff1a; 2.使用&#xff1a; 3.super关键字 4.子类构造方法 5.super和this关键字 6.初始化时代码块的执行顺序 7.继承的方式 8.final关键字 1.概念&#xff1a; 是面向对象程序设计代码可以重复使用的重要手段&#xff0c;允许程序员在保持原有类特性的…

git入门到精通

第3章 Git常用命令 3.1 设置用户签名 3.2 初始化本地库 3.3 查看本地 状态 3.3.1 首次查看&#xff08;工作区没有任何文件&#xff09; 3.3.2 新增文件&#xff08;hello.txt&#xff09; 3.3.3 再次查者&#xff08;检測到末追踪的文件&#xff09; 3.4添加暫存区 3…

java常用排序算法——冒泡排序,选择排序概述

前言&#xff1a; 开始接触算法了&#xff0c;记录下心得。打好基础&#xff0c;daydayup! 算法 算法是指解决某个实际问题的过程和方法 排序算法 排序算法指给混乱数组排序的算法。常见的有&#xff1a;冒泡排序&#xff0c;选择排序 冒泡排序&#xff1a; 冒泡排序指在数组…

python界面开发 - Label 提示框

文章目录 1. Label 提示框1.1. 显示文本1.2. 修改Label的文本1.2.1. 方式1&#xff1a;通过label.config()1.2.2. 方式2&#xff1a;通过 label["text"] 属性进行修改 1.3. 设置背景图片 2. Tkinter 开发3. python图形界面开发3.1. Python图形界面开发——Tkinter3.2…

简单认识Linux

今天带大家简单认识一下Linux&#xff0c;它和我们日常用的Windows有什么不同呢&#xff1f; Linux介绍 Linux内核&发行版 Linux内核版本 内核(kernel)是系统的心脏&#xff0c;是运行程序和管理像磁盘和打印机等硬件设备的核心程序&#xff0c;它提供了一个在裸设备与…

基于java+springboot+vue实现的宠物健康咨询系统(文末源码+Lw)23-206

摘 要 本宠物健康咨询系统分为管理员还有用户两个权限&#xff0c;管理员可以管理用户的基本信息内容&#xff0c;可以管理公告信息以及宠物健康知识信息&#xff0c;能够与用户进行相互交流等操作&#xff0c;用户可以查看宠物健康知识信息&#xff0c;可以查看公告以及查看…

说说flexbox(弹性盒布局模型)及适用场景?

文章目录 一、是什么二、属性flex-directionflex-wrapflex-flowjustify-contentalign-itemsalign-contentorderflex-growflex-basisflexalign-self 三、应用场景参考文献 一、是什么 Flexible Box 简称 flex&#xff0c;意为”弹性布局”&#xff0c;可以简便、完整、响应式地…

【Bugs】java: 错误: 不支持发行版本 xx

文章目录 报错场景&#xff1a;报错原因&#xff1a;解决方法&#xff1a; 报错场景&#xff1a; IDEA运行Java项目报错&#xff0c;点击运行之后&#xff0c;IDEA在编译代码的时候就出现报错&#xff1a; 报错类型一&#xff1a;java: 错误: 不支持发行版本 21报错类型二&am…