nosql----redis三主三从集群部署

news2024/11/15 10:32:09

 💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

推荐:Linux运维老纪的首页,持续学习,不断总结,共同进步,活到老学到老
导航剑指大厂系列:全面总结 运维核心技术:系统基础、数据库、网路技术、系统安全、自动化运维、容器技术、监控工具、脚本编程、云服务等。
常用运维工具系列:常用的运维开发工具, zabbix、nagios、docker、k8s、puppet、ansible等
数据库系列:详细总结了常用数据库 mysql、Redis、MongoDB、oracle 技术点,以及工作中遇到的 mysql 问题等
懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

nosql---Redis三主三从集群部​​​​​


一、案例概述
1.1 单节点Redis服务器带来的问题

    单点故障,服务不可用
    无法处理大量的并发数据请求
    数据丢书一大灾难

1.2 解决方法

    搭建Redis集群

二、案例前置知识点
2.1 Redis集群介绍

    Redis集群是一个提供在多个Redis间节点间共享数据的程序集(路由)
    Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误
    Redis集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下可继续处理命令

2.2 Redis集群的优势

    自动分割数据到不同的节点上
    整个集群的部分节点失败或者不可达的情况下能够继续处理命令

2.3 Redis集群的实现方法

    有客户端分片
    在这里插入图片描述

    代理分片
    在这里插入图片描述

    服务器端分片
    在这里插入图片描述
    Redis群集:去中心化模式——>区块链用的多

2.4 Redis-Cluster数据分片

    Redis集群没有使用一致性hash,而是引入了哈希槽概念

    Redis集群有16384个哈希槽

    每个key通过CRC16校验后对16384取模来决定放置槽

    集群的每个节点负责一部分哈希槽

    以3个节点组成的集群为例
        节点A包含0到5500号到哈希槽
        节点B包含5501到11000号哈希槽
        节点C包含11001到16384号哈希槽

    支持添加或者删除节点
        添加删除节点无需停止服务
        例如
        如果想新添加节点D,需要移动节点A、B、C中的部分槽到D上
        如果想移除节点A,需要将A中的槽移到B和C节点上,再将没有任何槽的A节点从集群中移除

2.5 Redis-Cluster的主从复制模型

    集群中具有A、B、C三个节点,如果节点B失败了,整个集群就会缺少5501-11000这个范围的槽而不可用
    为每个节点添加一个从节点A1,B1,C1,整个集群便有三个master节点和三个slave节点组成,在节点B失败后,集群便会选举B1成为新的主节点继续服务
    当B和B1都失败后,集群将不可用

三.redis集群部署

安装依赖包

yum -y install gcc gcc-c++

解压安装包并进入

make  MALLOC=libc

make  install  PREFIX=/usr/local/redis

在安装目录下创建配置文件目录

mkdir /usr/local/redis/etc

cp /tools/redis-5.0.0/redis.conf  /usr/local/redis/etc

为了后续redis的配置,可将/tools/redis-5.0.0/src/下的可执行脚本复制到/usr/local/redis/bin下面

配置  redis.conf

开机自启动

daemonize yes

允许远程连接

这里bind的意思是,允许从本地的那个接口来接入redis,假如是127.0.0.1,那当然就只有本地能接入了。但是假设服务器有三个ip,这里写入ip1的话,就表示可以通过这个ip来连接redis

因此,这里的意思并不是说开放哪个网段可以连接进来,而是允许外部通过本地的那个接口进来。假如在这里配置一个非本服务器的ip,那么很遗憾,redis连启动都启动不了,他会报错。

注释掉bind

#bind   127.0.0.1

关闭保护模式  

protected-mode  no

开发防火墙

firewall-cmd  --add-port=6379/tcp  --permanent

firewall-cmd  --reload

配置环境变量

vim  /etc/profile

PATH=$PATH:/usr/local/redis/bin
export PATH

启动redis

redis-server  /usr/local/redis/etc/redis.conf

测试连接

redis-cli -h 127.0.0.1 -p 6379 ping

进入redis

redis-cli -h 127.0.0.1 -p 6379

停止redis

redis-cli -h 127.0.0.1 -p 6379 shutdown    又或者你可暴力杀掉 

redis集群部署 

环境:

master1:172.16.1.31:8000

master2:172.16.1.32:8000

master3:172.16.1.33:8000

slave1:172.16.1.34:8000

slave2:172.16.1.35:8000

slave3:172.16.1.36:8000

官方推荐redis集群至少拥有6个节点  3主3从

集群建立后,往集群插入数据的时候,会经过插槽运算去给数据分配一个插槽(slots),其插槽可以是集群上插槽的任意一个,也就是说,可能是在三台主redis的任意一台上的一个插槽。

备份redis会备份好主redis上的数据,当主redis故障或者down机的时候,备redis就是将自身状态切换到主redis。

配置redis(所有节点)

vim  /usr/local/redis/etc/redis.conf

port  8000                                               #启动端口

pidfile  /var/run/redis_8000.pid               #pid文件

dir     /usr/local/redis/etc/                        #生产文件默认路径

cluster-enabled  yes                               #开启集群

cluster-config-file  nodes_8000.conf      #集群节点配置文件

appendonly  yes                                     #开启AOF持久化

requirepass tqw961110                           #设置密码

masterauth tqw961110                             #这个配置需要在从服务器上加上,不然当主redis坏掉的时候,slave不能自动切换成master

旧版本会使用redis-trib.rb这个脚本,但是新版本将该脚本的命令全部移动到redis-cli下面了

格式为redis-cli  --cluster  加上下图的参数

redis-cli --cluster help  可以看到--cluster参数的所有用法

--cluster-replicas 1   的意思是集群中一个主对于一个从

./redis-cli --cluster create 172.16.1.31:8000 172.16.1.32:8000 172.16.1.33:8000  172.16.1.34:8000 172.16.1.35:8000 172.16.1.36:8000  --cluster-replicas 1  -a  tqw961110

执行命令后如果出现 Waiting for the cluster to join 并一直处于等待状态没有反应。

redis集群不仅需要开通redis客户端连接的端口,而且需要开通集群总线端口
集群总线端口为redis客户端连接的端口 + 10000
如redis端口为8000
则集群总线端口为18000


故,所有服务器的点需要开通redis的客户端连接端口和集群总线端口

firewall-cmd  --add-port=8000/tcp  --permanent

firewall-cmd  --add-port=18000/tcp  --permanent

firewall-cmd  --reload

查看集群状态
redis-cli -c -p 8000  -a  tqw961110 cluster nodes 

测试
建立集群后,必须通过集群模式连接redis,也就是加入-c参数,不然后报错。
在31上插入数据
redis-cli  -c -h 172.16.1.31 -p 8000   -a  tqw961110
>set   name1 aaaa

 可以看到数据插入到12933这个slots里面,对应的主redis是33节点的redis
在32上插入数据
redis-cli  -c -h 172.16.1.32 -p 8000   -a  tqw961110
>set   name2 bbbb

 可以看到数据插入到742这个slots里面,对应的主redis是31节点的redis
由此可见,证明了上文所述的,插入数据时候,会根据插槽算法去分配数据究竟分配在哪个slots里面。
在31节点上查看数据
redis-cli  -c -h 172.16.1.31 -p 8000
>get  name1
>get  name2

可以看到,31节点上的redis可以查询到刚才在32上插入的数据,证明集群的建立是成功的。
而查询数据是根据对应的slots去匹配的。

增加集群节点
增加主节点
redis-cli --cluster add-node 172.16.1.37:8000 172.16.1.31:8000 -a tqw961110   (增加节点ip:端口    已有节点ip:端口)

系统提示节点已经添加成功。
查看一下集群的状态。

可以发现37节点目前还没有分配slots,因此他现在还不能插入数据。
因此需要从别的节点上迁移数据过来。
我们从33节点上将数据迁移过来
redis-cli --cluster reshard  127.0.0.1:8000  --cluster-from  3839342e9a6e6a2a024f2dde98de3f0058279f26  -a tqw961110

他会问需要迁移多少个,我们选择2000个

他会询问这些数据需要那个节点来接收,这里我们输入37节点的id
然后会询问是否按照原本的计划迁移数据,这里我们选择yes即可。

短暂的等待后,数据迁移完毕,这时查看集群的状态。

可以看到37节点上已经有2000个slots,这个时候就可以插入数据。
增加从节点
在增加完主节点后,我们还需要为其增加一个从节点,以实现高可用。
redis-cli --cluster add-node 172.16.1.38:8000 172.16.1.37:8000 --cluster-slave --cluster-master-id f837c6db1a6d96d7db719010b78078360ee1ee29 -a tqw961110   (知道添加的节点为从节点,并且知道其master的id。)
再查看一下集群的状态

可以看到,37、38两个节点已经添加进集群中,并处于主从同步状态。
删除集群节点
 redis-cli   --cluster del-node    ip:端口    node_id    -a  密码
对于从节点,可以直接用上述命令删除,但是对于主节点,必须要先把主节点上的数据迁移到别的节点上,不然会报下列错误

因此,我们可以按下列步骤把数据迁移到其他节点
查看主节点当前状态,查看其对应的id和分配到的slots的数量
redis-cli --cluster check 172.16.1.33:8000 -a tqw961110

迁移数据
 redis-cli --cluster  reshard 127.0.0.1:8000 --cluster-from  删除数据的节点的id -a tqw961110

这里问我们要迁移多少个slot,我们上面看到当前节点一共有5461个slots,因此这里我们输入5461。

然后系统会问我们获取接受这些slots的节点id,这里我们选择本地节点的id。

这里选择yes
当slots数量比较多的时候,这里可能需要等一两分钟。
redis-cli --cluster  check 172.16.1.33:8000 -a tqw961110

可以看到,33节点上的slots数量已经变成0
这时候就可以删除节点了
redis-cli --cluster del-node 172.16.1.33:8000 60bb940881a1297e0be5391ba1220bc0c3ba7f1f -a tqw961110

查看集群中是否还有该节点

已经只剩下本地的节点了
这个时候还没完,因为集群建立的时候会在本地新建.aof,.rdb,还有集群对应的.conf文件。
先把redis停掉,再把这三个文件删除,然后重启,这样才算完全清除了集群配置。

故障测试
测试一下一台master故障的down掉的时候,他对应的从服务器是否会自动切换到master的角色。

上图32节点为主redis,35为其对应的slave,先把32的redis停掉。

一定的时间后,可以看到32节点已经退出集群,并且经过·选举,35成为了新的master。
这个时候我们可以对32服务器的redis进行抢救
抢救完成后,先把它的集群配置文件备份然后删掉。
这是由于业务的数据已经增加了,所以32的redis需要作为slave从新加进集群里面,这样就可以同步到主redis上的业务数据。

重启redis,然后执行如下命令(新的节点ip:端口   已有的节点ip:端口   --cluster-slave   --cluster-master-id   主redis的id )
 redis-cli --cluster add-node 172.16.1.32:8000 172.16.1.35:8000   --cluster-slave --cluster-master-id 3699fc16cb9a78fdbcf82333216c7e7657048176 -a tqw961110

看到上述提示,则证明节点添加成功。
再查看一下集群状态

此时,35和32已经完成了主从切换的操作。

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

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

相关文章

【uniapp/uview1.x】解决在 u-popup 弹出层中使用 u-calendar 日历组件弹出方向出 bug 的问题

这个方法适用 uview 1.x 版本&#xff1b; 如果这个方法不适用可能是 uview 版本不一样&#xff0c;可以参考&#xff1a;https://github.com/dcloudio/uni-ui/issues/915 试试看 bug 的效果如图所示&#xff1a; 因为我为 popup 设置的方向为 top&#xff1a; <u-popup …

人工智能算法,图像识别技术;基于大语言模型的跨境商品识别与问答系统;图像识别

目录 一 .研究背景 二,大语言模型介绍 三,数据采集与预处理 商品识别算法 四. 跨境商品问答系统设计 五.需要源码联系 一 .研究背景 在当今全球化的背景下&#xff0c;跨境电商行业迅速发展&#xff0c;为消费者提供了更广泛的购物选择和更便利的购物方式。然而&#xf…

OLED屏幕制造工艺流程

OLED屏幕制造工艺流程是一个复杂且精细的过程&#xff0c;涉及多个关键步骤以确保最终的显示效果和性能。以下是OLED屏幕制造工艺流程的主要步骤&#xff1a; 1. 衬底制作与准备 材料选择&#xff1a;OLED器件需要一个透明的导电衬底&#xff0c;通常使用玻璃或塑料材料。 清…

集成RJ45网口网络变压器(网络隔离变压器)是如何影响网通设备的传输速率的。

华强盛电子导读RJ45连接器网口-199中间2643-0038 集成RJ45网口的网络变压器&#xff08;网络隔离变压器&#xff09;通常是指将网络变压器与RJ45连接器直接集成在一起的产品&#xff0c;这样的设计使得变压器可以直接安装在网络电缆的连接点上&#xff0c;而不需要额外的连接器…

【源码+文档+调试讲解】多媒体信息共享平台

摘 要 随着信息时代的来临&#xff0c;过去的武理多媒体信息共享管理方式缺点逐渐暴露&#xff0c;对过去的武理多媒体信息共享管理方式的缺点进行分析&#xff0c;采取计算机方式构建武理多媒体信息共享系统。本文通过阅读相关文献&#xff0c;研究国内外相关技术&#xff0c…

Unity | 游戏开发中的优化思维

目录 ​​​​​​一、优化三板斧&#xff1a; 第1步&#xff1a;定标准 第2步&#xff1a;重数据 第3步&#xff1a;严测试 二、流程和性能的优化 1.定标准&#xff1a; 2.重数据&#xff1a; 三、交互和表现的优化 1.卡顿和延迟 2.手感硬 四、沟通和学习 ​​​​…

C语言深度解析:static与extern关键字全指南

[大师C语言]合集&#xff3b;大师C语言(第一篇)&#xff3d;C语言栈溢出背后的秘密&#xff3b;大师C语言(第二十五篇)&#xff3d;C语言字符串探秘&#xff3b;大师C语言(第二篇)&#xff3d;C语言main函数背后的秘密&#xff3b;大师C语言(第二十六篇)&#xff3d;C语言结构体…

Electron 集成 Express + p-limit + SQlite WAL读写模式解决并发锁库的问题

背景 经过通信层面的优化后&#xff0c;我们不再走 Electron 提供的内置进程间通信 IPC&#xff0c;改为利用 Express 提供的 Http 本地服务来进行多处直达通信机制&#xff0c;同时利用本地 Sqlite 来保存大量数据&#xff0c;但 Express 提供的本地服务是支持并发请求的&…

食品零食小吃商城管理系统-计算机毕设Java|springboot实战项目

&#x1f34a;作者&#xff1a;计算机毕设残哥 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目、 源…

DataX二次开发之达梦数据库插件

达梦数据库自定义插件 达梦8的依赖引入定义reader module定义writer module修改核心配置数据库类型支持打包插件测试 以mysql到dm数据库为例配置mysql2dm.json执行任务查询下结果 DataX二次开发之达梦数据库插件 DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,支持…

eNSP 华为远程登录路由器

华为远程登录路由器 前提&#xff1a;主机能与路由器通信就行&#xff0c;如果不同网段就配路由协议&#xff0c;这里直接模拟直连通信 Cloud&#xff1a; R&#xff1a; <Huawei>sys [Huawei]sys R [R]int g0/0/0 [R-GigabitEthernet0/0/0] [R-GigabitEthernet0/0/0]i…

AQS 原理详解

日常开发中&#xff0c;我们经常使用锁或者其他同步器来控制并发&#xff0c;那么它们的基础框架是什么呢&#xff1f;如何实现的同步功能呢&#xff1f;本文将详细讲解构建锁和同步器的基础框架--AQS&#xff0c;并根据源码分析其原理。 一、什么是 AQS&#xff1f; (一) AQS…

Oracle+ASM+High冗余详解及空间计算

Oracle ASM&#xff08;Automatic Storage Management&#xff09;的High冗余模式是一种提供高度数据保护的策略&#xff0c;它通过创建多个数据副本来确保数据的可用性和安全性。 以下是关于Oracle ASM High冗余的详细解释&#xff1a; 一、High冗余的特点 1.数据冗余度 在Hi…

Java | Leetcode Java题解之第342题4的幂

题目: 题解&#xff1a; class Solution {public boolean isPowerOfFour(int n) {return n > 0 && (n & (n - 1)) 0 && n % 3 1;} }

【Datawhale AI夏令营第四期】 魔搭-大模型应用开发方向笔记 Task03 大咖项目分享 人话八股文Bakwaan_Buddy项目开发尝试

【Datawhale AI夏令营第四期】 魔搭-大模型应用开发方向笔记 Task03 人话八股文Bakwaan_Buddy项目开发尝试 Idea: 我们草台班子目前的想法是解决大家计算机学院毕业面临的BUG——不爱背、背不下来八股文&#xff0c;觉得枯燥、烦、工作了用不着&#xff0c;反正就是知识他不进…

Python酷库之旅-第三方库Pandas(085)

目录 一、用法精讲 356、pandas.Series.str.isnumeric方法 356-1、语法 356-2、参数 356-3、功能 356-4、返回值 356-5、说明 356-6、用法 356-6-1、数据准备 356-6-2、代码示例 356-6-3、结果输出 357、pandas.Series.str.isdecimal方法 357-1、语法 357-2、参数…

RabbitMQ的核心概念

RabbitMQ是一个消息中间件&#xff0c;也是一个生产者消费者模型&#xff0c;负责接收&#xff0c;存储和转发消息。 核心概念 Producer 生产者&#xff0c;是RabbitMQ Server的客户端&#xff0c;向RabbitMQ发送消息。 Consumer 消费者&#xff0c;是RabbitMQ Server的客…

Ps:首选项 - 单位与标尺

Ps菜单&#xff1a;编辑/首选项 Edit/Preferences 快捷键&#xff1a;Ctrl K Photoshop 首选项中的“单位与标尺” Units & Rulers选项卡允许用户根据工作需求定制 Photoshop 的测量单位和标尺显示方式。这对于保持工作的一致性和精确性&#xff0c;尤其是在跨设备或跨平台…

mybatis plus 查询部分源码分析,typehandler怎么实现的?FastjsonTypehandler 查询问题怎么解决?

我们在使用mysql的json字段的时候有时为了方便&#xff0c;最好是查询的时候直接反序列化为对象比较好&#xff0c;这时候我们就用到了typehandler这个属性 首先mybatis plus 会初始化一系列的 typeHandler,并且扫描用户设置的typeHandler路径&#xff08;mybatis-plus: type-…

Flutter-->AAPT: error: resource android:attr/lStar not found.

更新Flutter 3.24.0之后, 打包出现AAPT: error: resource android:attr/lStar not found.问题, 这里出一个我的解决方案. 更新Flutter 3.24.0之后, Android编译sdk需要使用34, 否则就会出现很多问题… 由于很多库都不可能及时更新适配到Android sdk 34, 所以可以等pub get将子…