保姆教程系列三、Redis高可用(Cluster集群模式)

news2024/11/16 9:44:01

系列文章目录

!!!是的没错,胖友们,保姆教程系列又更新了!!!

保姆教程系列一、Redis部署 so easy
保姆教程系列二、Redis高可用(主从同步+哨兵模式)
保姆教程系列三、Redis高可用(Cluster集群模式)

文章目录

  • 系列文章目录
  • 前言
  • 集群简介
  • 实现思路
  • 一、准备工作
    • 1.1 关闭防火墙
    • 1.2 伪集群搭建
    • 1.3 修改redis配置
  • 二、搭建集群
    • 2.1 一键启动redis服务
    • 2.3 关联集群
  • 三、集群测试
    • 3.1 连接客户端
    • 3.2 查看集群信息
    • 3.3 数据测试
  • 模式区别
  • 总结


前言

请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i、


上篇我们介绍到 保姆教程系列二、Redis高可用(主从同步+哨兵模式)

提示:以下是本篇文章正文内容,下面案例可供参考

集群简介

集群,即Redis Cluster,是Redis 3.0开始引入的分布式存储方案。
集群由多个节点(Node)组成,Redis的数据分布在这些节点中。
集群最核心的功能:数据分区(或称数据分片)是集群最核心的功能

集群将数据分散到多个节点,一方面突破了Redis单机内存大小的限制,存储容量大大增加:另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力。

实现思路

Redis集群一般需要6个节点,3主3从,本文使用一台服务器,模拟三主三从

  1. Redis集群高可用(cluster模式)至少需要3个节点,因为投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以2个节点无法构成集群
  2. 要保证集群的高可用,需要每个节点都有从节点,也就是备份节点,所以Redis集群至少需要6台服务器。
  3. 在此搭建伪分布式集群,即一台服务器虚拟运行6个redis实例,修改端口号为(6379-6384),当然实际生产环境的Redis集群搭建和这里是一样的。

一、准备工作

注意:准备一台服务器并搭建redis服务 友情链接:Centos下安装redis

1.1 关闭防火墙

#查看防火墙是否开启
firewall-cmd --state 结果:not running没有运行

#关闭防火墙
systemctl stop firewalld.service

1.2 伪集群搭建

注意:确保实例端口不冲突!!!
redis

1.3 修改redis配置

注意:修改所有集群服务的配置文件端口,使其不一致,请注意端口及文件存放路径!!!

#修改redis.conf
bind  0.0.0.0  #限定redis访问网卡
port 6739 # 绑定端口号
daemonize yes #用来指定redis是否要用守护进程的方式启动,默认为no
protected-mode no #设置为后台启动
requirepass admin123  #redis登录密码
logfile /usr/local/redis/log/redis_6379.log #redis日志文件
pidfile  /usr/local/redis/log/redis_6379.pid #redis以守护进程方式运行
cluster-enabled yes	#开启集群配置
cluster-node-timeout 15000	#集群超时毫秒	
cluster-config-file /usr/local/redis/conf/cloud-nodes-6379.conf	#集群节点配置文件名

二、搭建集群

2.1 一键启动redis服务

(1)创建启动脚本

#创建脚本
vim start_cloud.sh

脚本内容:

#!/bin/env bash

#实例1
./usr/local/redis01/binredis-server /usr/local/redis01/conf/redis.conf &
#实例2
./usr/local/redis02/binredis-server /usr/local/redis02/conf/redis.conf &
#实例3
./usr/local/redis03/binredis-server /usr/local/redis03/conf/redis.conf &
#实例4
./usr/local/redis04/binredis-server /usr/local/redis04/conf/redis.conf &
#实例5
./usr/local/redis05/binredis-server /usr/local/redis05/conf/redis.conf &
#实例6
./usr/local/redis06/binredis-server /usr/local/redis06/conf/redis.conf &

echo "启动成功"

(2)为脚本授权

chmod +x start_cloud.sh

启动redis

2.3 关联集群

注意:此处不要用127.0.0.1, 请用真实IP地址!!!

#获取集群指令
redis-cli --cluster help

#关联集群
./redis-cli -h 192.168.248.131 -p 6379 -a admin123 --cluster create --cluster-replicas 1 192.168.248.131:6379 192.168.248.131:6380 192.168.248.131:6381 192.168.248.131:6382 192.168.248.131:6383 192.168.248.131:6384

输入命令后开始分配哈希槽(slots),分配主从节点,然后提示是否确认此分配,输入yes
关联集群1
关联集群2

节点分配说明:
一个集群至少要有三个主节点
--replicas 1 采用最简单的方式配置集群,一台主机,一台从机,正好三组
分配原则尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上,存储的数据(key-value)是均匀分配到不同的节点的:

哈希槽(slots)说明:
一个 Redis 集群包含 16384 个哈希槽(hash slot), 数据库中的每个键都属于这 16384 个插槽的其中一个,
集群使用公式CRC16(key) % 16384来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。
集群中的每个节点负责处理一部分哈希槽。
举个例子: 如果一个集群可以有主节点, 其中:
集群内置了16384个slot(哈希槽),并且把所有的物理节点映射到了这16384[0-16383]个slot上,或者说把这些slot均等的分配给了各个节点。当需要在Redis集群存放一个数据(key-value)时,redis会先对这个key进行CRC16算法,然后得到一个结果。再把这个结果对16384进行求余,这个余数会对应[0-16383]其中一个槽,进而决定key-value存储到哪个节点中。所以一旦某个节点挂了,该节点对应的slot就无法使用,那么就会导致集群无法正常工作。
综上所述,每个Redis集群理论上最多可以有16384个节点。

至此Redi集群搭建成功!大家注意最后一段文字,显示了每个节点所分配的slots(哈希槽),这里总共6个节点,其中3个是从节点,所以3个主节点分别映射了:0-5460、5461-10922、10933-16383


三、集群测试

3.1 连接客户端

注意:在任意一个客户端执行命令即可!!!

#(-a访问服务端密码 -h -p 表示ip地址和端口 -c采用集群策略连接,设置数据会自动切换到相应的写主机)
./redis-cli -c -h 127.0.0.1 -p 6379 -a admin123

3.2 查看集群信息

#查看集群信息
cluster info

#查看节点列表
cluster nodes

集群信息
输出详解:

第一串字符表示节点id
master : 主节点
slave:表示从节点 后面跟着的id 表示是这个主节点的从节点
myself:本机
最后的数字表示主机连接的槽(slots)

3.3 数据测试

#存储数据
set name 123456

可见存储数据时,已经存储到redis实例6380中,已经将数据插入第2段5798哈希槽位中
数据测试

模式区别

哨兵模式(sentinal)
哨兵模式是由客户端本地来维护redis结点之间的信息,而集群模式是由结点来维护所有结点之间的连接关系
sentinal哨兵模式存在缺陷,在水平拓展redis结点的情况下,需要客户端在本地维护分片机制(客户端与redis结点之间存在耦合),并且如果此时需要再继续进行拓展,那么就会有一个数据迁移的过程,这个过程是繁琐的。

集群(cluster模式)
数据分区(或称数据分片)是集群最核心的功能
数据依照slot存储分布在多个节点,节点间数据共享,能够动态调整数据分布;可扩展性;无中心架构;高可用性;能够降低运维成本,有效提高系统的可用性以及扩展性。
而集群模式却不需要客户端来进行分片机制的维护,并且每个客户端中都维护了整个集群网络的信息,进行客户端与redis集群之间的解耦,并且更加易于拓展。

总结

我是南国以南i记录点滴每天成长一点点,学习是永无止境的!转载请附原文链接!!!

参考链接、参考链接、参考链接、

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

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

相关文章

java开发的医院体检预约系统

简介 体检项目预约网站,普通用户注册登录可以网上预约体检项目,经过后台人员审核后可以去体检。用户还可以记录自己的身体指标下载体检报个,查看医嘱等。医院后台可以进行权限管理,实现多角色管理后台的其他业务等,实…

前端—化繁为简

化繁为简 HTML5要的就是简单、避免不必要的复杂性。HTML5的口号是“简单至上,尽可能简化”。因此,HTML5做了以下改进: 以浏览器原生能力替代复杂的JavaScript代码。 新的简化的DOCTYPE。 新的简化的字符集声明。 简单而强大的HTML5API。 我…

【 shell 编程 】第2篇 判断

判断 文章目录判断一、条件测试二、流程控制1.单分支结构2.双分支结构3.多分支结构4.嵌套结构三、匹配模式一、条件测试 格式: 格式1:test 条件表达式 格式2:[ 条件表达式 ] 格式3:[[ 条件表达式 ]] 注意:[] 中的条件…

电气器件系列三十五:开关电源选型实例

开关模式电源(Switch Mode Power Supply,简称SMPS),又称交换式电源、开关变换器,是一种高频化电能转换装置,是电源供应器的一种。其功能是将一个位准的电压,透过不同形式的架构转换为用户端所需…

c++11 标准模板(STL)(std::deque)(三)

定义于头文件 <deque> std::deque 赋值给容器 std::deque<T,Allocator>::operator deque& operator( const deque& other ); (1) deque& operator( deque&& other ); (2)(C11 起) (C17 前) deque& operator( deque&& other ) no…

Docker的基本使用

文章目录1.初识Docker1.1 为什么会有docker出现&#xff1f;1.2 docker的理念1.3 Docker和虚拟机的区别1.4 Docker的基本组成(docker的三要素)1.4.1 镜像1.4.2 容器1.4.3 仓库1.5 Docker的架构2.Docker的安装3.常用命令3.1 帮助启动类命令3.2 镜像命令3.3 容器命令1.初识Docker…

使用Lua Script实现不同的限流算法

文章目录Redis中执行Lua ScriptRedis中Debug Lua Script固定窗口代码关键部分解释验证滑动窗口令牌桶漏桶参考资料Redis中执行Lua Script redis-cli --eval /tmp/script.lua mykey somekey , arg1 arg2特别注意&#xff1a;key和arg之间是空格逗号空格&#xff0c;否则脚本调用…

API网关在API安全性中的作用

从单一应用程序切换到微服务时&#xff0c;客户端的行为不能与客户端具有该应用程序的一个入口点的行为相同。简单来说就是微服务上的某一部分功能与单独实现该应用程序时存在不同。 目前在使用微服务时&#xff0c;客户端必须处理微服务体系结构带来的所有复杂性&#xff0c;…

一个月裂变50多万人?商城引流模式玩法——分享购

随着经济进入转型的关键期&#xff0c;零售行业的营销模式正在发生转变&#xff0c;以消费者为中心驱动营销数字化成为当下企业的共识。 新零售时代数字化的核心是数据能力的全面升级&#xff0c;企业通过数字化协同能力整合线上线下全域消费场景&#xff0c;赋能消费者深度洞…

JDK16及其以后的版本Maven打包成可运行的程序的方法

Java应用的分发一直是一个比较麻烦的问题。这是因为Java应用的运行需要虚拟机的支持&#xff0c;仅有Java应用打包的JAR文件是不够的&#xff0c;目标机器还需要安装版本匹配的JDK或JRE。随着云原生和容器化技术的流行&#xff0c;Java应用可以选择以容器镜像的形式来打包和分发…

以太网,拥塞控制与 AQM

拥塞的表现是冲突&#xff0c;大量消费者挤兑有限资源&#xff0c;即拥塞&#xff0c;在一个绝对没有冲突的系统里&#xff0c;自然就没有拥塞。而冲突的来源有两个&#xff0c;一个是无序&#xff0c;一个是贪婪。 仅引入秩序不能解决冲突&#xff0c;但可减少冲突损耗&#…

JavaScript高级 浏览器的渲染原理

浏览器的渲染原理1. 网页的解析过程2. 浏览器内核3. 浏览器渲染过程1. HTML解析2. 生成CSS规则3. 构建Render Tree4. 布局&#xff08;layout&#xff09;5. 绘制&#xff08;Paint&#xff09;4. 回流和重绘解析1. 回流2. 重绘3. web 性能优化4. 合成和性能优化5. 浏览器遇到 …

【VulnHub靶场】——CHRONOS: 1

作者名&#xff1a;Demo不是emo 主页面链接&#xff1a;主页传送门创作初心&#xff1a;舞台再大&#xff0c;你不上台&#xff0c;永远是观众&#xff0c;没人会关心你努不努力&#xff0c;摔的痛不痛&#xff0c;他们只会看你最后站在什么位置&#xff0c;然后羡慕或鄙夷座右…

PaddlePaddle/PaddleX本地离线安装(分别以C++和Python为例)

目录一. 本地离线安装简介1.1 为什么需要源码编译1.2 源码编译的产物1.3 源码编译的原理二. 本地离线安装准备2.1 编译准备(C/Python通用)2.2 本地编译推荐配置(C)2.3 本地编译推荐配置(Python)三. Windows本地离线安装(C源码编译)3.2 编译工具安装3.3 打开Visual studio 终端3…

torch.cat函数

#dim0,上下拼接 #dim1&#xff0c;左右拼接 import torch # x1 x1 torch.tensor([[1,2,3],[4,5,6]],dtypetorch.int)# x2 x2 torch.tensor([[7,8,9],[10,11,12]],dtypetorch.int)#inputs为&#xff12;个形状为[2 , 3]的矩阵 inputs [x1, x2] print(inputs)#dim0,上下拼接…

如何用Python字符串进行切片操作?

嗨害大家好鸭&#xff01;我是小熊猫~ 我们基本上都知道Python的序列对象 都是可以用索引号来引用的元素的&#xff0c; 索引号可以是正数由0开始从左向右&#xff0c; 也可以是负数由-1开始从右向左。 在Python中对于具有序列结构的数据来说都可以使用切片操作&#xff0…

【C++升级之路】第五篇:C/C++内存管理(new和delete的实现原理)

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【C学习与应用】 ✒️✒️本篇内容&#xff1a;C/C内存分布&#xff0c;C/C动态内存管理方法&#xff0c;C动态内存管理方法底层函数operator new 和operat…

浅谈树状数组

学习树状数组必不可少学习树状数组的精髓&#xff0c;lowbit()运算 在计算机中存储一个正数是以二进制的形式&#xff0c;而存储一个负数则是以二进制补码的形式&#xff0c;简单说就是二进制取反1&#xff0c;lowbit运算就是提取出最后一个1以后的位置&#xff0c;比如10100进…

【C语言】结构体、共用体、位域

结构体 1、 结构体的声明方法 struct struct_name {data_type member1;data_type member2;.. };这是其中一种声明方式~ 2、定义一个结构体变量 struct struct_name variable&#xff1b;3、访问成员变量 . 运算 一个结构体变量访问其成员时&#xff0c;使用的是 . 运算 下面…

BM35 判断是不是完全二叉树

题目 给定一个二叉树&#xff0c;确定他是否是一个完全二叉树。 完全二叉树的定义&#xff1a;若二叉树的深度为 h&#xff0c;除第 h 层外&#xff0c;其它各层的结点数都达到最大个数&#xff0c;第 h 层所有的叶子结点都连续集中在最左边&#xff0c;这就是完全二叉树。&a…