Redis: 集群环境搭建,集群状态检查,分析主从日志,查看集群信息
集群环境搭建
- 在 Redis 5版本以前是用 Ruby 来搭建集群,在后面的版本中仍保留了相关功能
- 可以再源码src目录中,看到 redis-trib.rb 这个东西,只是现在用这种方式搭建的少了
- 我们看新的版本是怎样搭建集群的,新版构建集群的方式简单好用
- 构建集群我们可以用6台机器,如果机器少,也可以使用3台,每台机器上有2个redis实例
- 但是,这里需要注意, 主从机器不是我们说的算,而是基于它内部的算法来确定
- 也就是说,同一台机器上,不一定是主从的关系,这个要明确
- 我们现在用这种方式,在3台机器上提供6台Redis实例的方式来搭建集群模拟
- 每天机器上基于端口来区分,使用不同的配置文件
- 最好的方式,还是每台机器上一个Redis,提供至少6台机器的方式
- 但是这里没有太多资源,做模拟集群,搭建方式大同小异
- 我们使用 redis-cli --cluster 的方式来搭建集群
1 ) 节点准备
IP | Redis 节点 |
---|---|
192.168.10.101 | 6371, 6372 |
192.168.10.102 | 6373, 6374 |
192.168.10.103 | 6375, 6376 |
-
在3个节点分别创建如下目录
- $
mkdir -p /usr/local/redis/cluster/conf /usr/local/redis/cluster/data /usr/local/redis/cluster/log
- $
vi /usr/local/redis/cluster/conf/redis-6371.conf
这个仅做演示,分别在不同节点上创建不同的配置
- $
-
3个节点,分别创建 redis-*.conf,这个
*
替换成上面准备的端口,并添加如下通用配置信息 -
示例:
vi /usr/local/redis/cluster/conf/redis-6371.conf
# 放行访问IP限制 bind 0.0.0.0 # 端口 port 6371 # 后台启动 daemonize yes # 日志存储目录及日志文件名 logfile "/usr/local/redis/custer/log/redis-6371.log" # rdb数据文件名 dbfilename dump-6371.rdb # aof模式开启和aof数据文件名 appendonly yes appendfilename "appendonly-6371.aof" # rdb数据文件和aof数据文件的存储目录 dir /usr/local/redis/cluster/data # 设置密码 requirepass 123456 # 从节点访问主节点密码(必须与 requirepass 一致) masterauth 123456 # 是否开启集群模式,默认 no cluster-enabled yes # 集群节点信息文件,会保存在dir配置对应目录下 cluster-config-file nodes-6371.conf # 集群节点连接超时时间 cluster-node-timeout 15000 # 集群节点 IP cluster-announce-ip 192.168.10.101 # 集群节点映射端口 cluster-announce-port 6371 # 集群节点总线端口 cluster-announce-bus-port 16371
-
上面为什么会有一个总线端口?
- 每个 Redis 集群节点需要打开两个TCP的连接
- 一个是为客户端提供服务的正常的 Redis TCP 端口, 比如这里的 6371
- 还有一个是基于这个端口加1w产生的 16371, 这个端口是集群总线
- 集群总线它是一个二进制协议的节点到节点通信的一个通道
- 就是节点之间使用这个端口来进行故障检测,配置更新,故障转移授权等等
-
所以,客户端不要跟这个集群总线端口进行通信,与正常的 Redis 的TCP的这个端口通信即可
-
你现在要搭建集群,要确保防火墙里边这两个端口都是打开的
- 或者说你把防火墙直接关了,简单粗暴
- 否则你的这个 Redis 集群可能没有办法互相通信,就构建不了集群环境
-
注意,其他节点在修改 IP 和 端口 部分内容的时候,使用 vi 命令
%s/old/new/g
全局替换- 示例:$
:%s/6371/6372/g
- 注意每个节点的 IP 不要搞错了
- 示例:$
-
在其余节点上都进行上述快速的配置
2 )开始构建集群
- 并在3个节点上,启动上述 6个 redis 实例
- 示例:$
/usr/ocal/redis/bin/redis-server /usr/local/redis/cluster/conf/redis-6371.conf
- 从 6371 ~ 6376 3个节点上redis-server全部启动
- 示例:$
- 每个节点上,启动后,都需要检查一下:$
ps -ef | grep redis
- 创建集群的语法如下:
- $
/usr/local/redis/bin/redis-cli --cluster create --cluster-replicas 1
--cluster
构建集群环境的所有 Redis 节点 IP + PORT 信息--cluster-replicas
表示构建集群中主从的比例,1:1
- $
- 在101节点上(随便找一个节点即可操作),开始创建集群
/usr/local/redis/bin/redis-cli -a 123456 --cluster create \ 192.168.10.101:6371 192.168.10.101:6372 \ 192.168.10.101:6373 192.168.10.101:6374 \ 192.168.10.101:6375 192.168.10.101:6376 \ --cluster-replicas 1
- 输入
yes
- 输入
- 现在,一个高可用的 Redis Cluster 集群搭建完成,该集群包含 6个 Redis 节点,3主3从
- 3个节点会分配槽,处理客户端的命令请求,而从节点可用在主节点故障后,顶替主节点
检查集群状态
- 找到任意集群内的节点,执行
- $
/usr/local/redis/bin/redis-cli -a 123456 --cluster check 192.168.10.103:6371
- $
- 这里可以看到很多集群内的信息
- 主节点IP和端口,存储了多少key, 槽有多少,对应备份从节点多少
- 这里有很多信息,可以反映集群内的情况
分析主从日志
- 在这个集群中,去查看主节点和它对应的从节点即可,否则没有太多意义
- 比如现在:101:6371 是一个主节点,102:6374 是其从节点
- $
tail -f -n 1000 /usr/local/redis/cluster/log/redis-6371.log
- 这里面有整个集群初始化的过程
- $
- 再来看从节点的日志, 这个要去到 102 节点上了
- $
tail -f -n 1000 /usr/local/redis/cluster/log/redis-6374.log
- 主要和6371.log的区别在于,变为从节点之前的准备工作
- 连接到主节点,主从同步开始,触发SYNC非阻塞连接事件
- 收到 Master 的 PING, 尝试增量复制被Master拒绝(因为环境初始化需要全量复制)
- 在全量复制之前,会抛弃之前缓存的主节点的状态
- 全量复制会:接收数据,刷新数据,加载数据到内存
- 之后,加载RDB相关,主从复制顺利完成
- 后台开启 aof 基于aof来继续写入数据,aof 完成
- 这是初次构建集群中从节点的初始化日志
- $
查看集群信息
-
随便找一个节点:$
/usr/local/redis/bin/redis-cli -c -a 123456 -h 192.168.10.103 -p 6376
*-c
表示以集群的方式,让客户端连接 -
连接进来之后,$
CLUSTER INFO
cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 cluster_size:3 cluster_current_epoch:6 cluster_my_epoch:3 cluster_stats_messages_ping_sent:2027 cluster_stats_messages_pong_sent:2171 cluster_stats_messages_meet_sent:1 cluster_stats_messages_sent:4199 cluster_stats_messages_ping_received:2171 cluster_stats_messages_pong_received:2028 cluster_stats_messages_received:4199
cluster_slots_assigned
在集群中分配的总槽数cluster_slots_ok
成功分配的总槽数cluster_slots_pfail
可能失效的槽数cluster_slots_fail
已经失效的槽数cluster_known_nodes
集群环境的节点cluster_size
主节点的个数/分片的个数cluster_current_epoch
当前环境的节点cluster_my_epoch
我的节点
-
$
CLUSTER NODES
f3353d11eae2dae1e46cdee9134beea872d1c6e8 192.168.10.103:6375@16375 master -0 1607339167170 5 connected 10923 -16383 afe0b3936c837a46972055c7b9b691bdd8149b7d 192.168.10.101:6371@16371 master -0 1607339166164 1 connected 0-5460 70613e4ec9d16162808accd9e5e2da0792c9ec12 192.168.10.101:6372@16372 slave f3353d11eae2dae1e46cdee9134beea872d1c6e8 0 1607339165000 5 connected b444cc7e6a6ee077e2d2292c68abde22977c7e5d 192.168.10.102:6374@16374 slave afe0b3936c837a46972055c7b9b691bdd8149b7d 0 1607339165000 1 connected d3028e6da602735c18f5917102a818daaf4f5a8a 192.168.10.103:6376@16376 myself,slave 339e0d0b6f92322fb269a83c0b43c44850e7e0aa 0 1607339163000 3 connected 339e0d0b6f92322fb269a83c0b43c44850e7e0aa 192.168.10.102:6373@16373 master -0 1607339167000 3 connected 5461-10922
- 第一个是节点ID,之后是 当前这个节点的一个IP:端口@集群总线端口
- 再后面是 节点的角色,如果当前节点是 slave(从节点),后面会紧跟主节点的ID
- 再后面 -0 表示当前没有从节点连接到这个主节点,负号通常表示没有连接的从节点数量(即,这是一个主节点,且当前没有从属关系
- 再后面是 集群最近一次向节点发送PING命令之后过了多长时间还没有收到回复
- 再后面就是节点纪元的配置,
- 之后是节点网络情况,如果是 master 角色那它最后是所在插槽的范围
-
上面的输出也会被存储在 /usr/local/redis/cluster/data/nodes-*.conf 中,这个是之前配置文件中指定的
- 这里的
*
替换成自己之前配置的数字
- 这里的
关于纪元
- 纪元(Epoch)在Redis集群中是一个重要的概念,它用于记录集群状态变更的递增版本号
- 以下是关于Redis集群中纪元的详细解释
1 ) 纪元的定义
- 纪元是一个整数,它在Redis集群中用于标识集群状态的不同版本
- 每当集群的拓扑结构发生变化时(例如,添加或删除节点、主从切换等),纪元就会递增
- 这样,集群中的每个节点都可以通过比较纪元来确定哪个节点的集群状态信息是最新的
2 )纪元的类型
- 在Redis集群中,主要有两种类型的纪元:
- currentEpoch:当前纪元,表示集群当前的状态版本号。每当集群状态发生变化时,currentEpoch就会增加。集群中的每个节点都会维护一个currentEpoch,并且最终会达成一致,以确保对集群状态的认知是一致的
- configEpoch:配置纪元,用于记录节点的配置信息(如负责的槽位)的版本号。当节点的配置发生变化时(例如,负责的槽位发生变化),configEpoch就会增加。这有助于解决节点配置冲突的问题
3 )纪元的作用
-
确保集群状态的一致性:通过递增的纪元,集群中的节点可以确保它们对集群状态的认知是一致的。当某个节点发起状态变更时,它会增加currentEpoch,并通知其他节点。其他节点在收到通知后,会更新自己的currentEpoch,以确保与发起变更的节点保持一致
-
解决配置冲突:在Redis集群中,每个节点都有自己的configEpoch。当多个节点试图同时更新同一个槽位的配置时,它们会比较自己的configEpoch。具有更大configEpoch的节点的配置将被接受,从而解决配置冲突
-
支持故障转移:在Redis集群中,当主节点发生故障时,其从节点会尝试发起故障转移流程。在这个过程中,从节点会增加自己的currentEpoch,并向其他节点发起拉票请求。其他节点在收到请求后,会根据currentEpoch的大小来判断是否投票给该从节点。当从节点获得足够多的选票时,它就会成为新的主节点,并增加自己的configEpoch来更新槽位配置
4 )纪元的更新机制
-
在Redis集群中,纪元的更新通常是由节点间的通信和状态变更触发的。例如,当某个节点接收到来自其他节点的状态变更通知时,它会比较通知中的纪元与自己的纪元。如果通知中的纪元更大,则更新自己的纪元。此外,在故障转移等过程中,节点也会主动增加自己的纪元来发起或响应状态变更
-
综上所述,纪元是Redis集群中用于记录集群状态变更和确保集群一致性的重要机制。通过递增的纪元版本号,集群中的节点可以确保它们对集群状态的认知是一致的,并解决可能出现的配置冲突问题
相关文章:
Redis: 集群环境搭建,集群状态检查,分析主从日志,查看集群信息
集群环境搭建 在 Redis 5版本以前是用 Ruby 来搭建集群,在后面的版本中仍保留了相关功能可以再源码src目录中,看到 redis-trib.rb 这个东西,只是现在用这种方式搭建的少了我们看新的版本是怎样搭建集群的,新版构建集群的方式简单…...

『网络游戏』动态界面制作创建角色UI【02】
将上一章的登录界面隐藏 创建空物体重命名为CreateWnd 自适应铺满父物体 创建image重命名为bg并铺满 将以下资源图片放进Art文件夹 设置为精灵模式 填充背景 创建介绍Image面板与角色按钮 制作将3D模型动态防止UI界面上 首先创建RawImage 创建RenderTextures文件夹 创建Render…...
CMake 教程跟做与翻译 2
目录 STEP 1(Extra A):指定C的版本 STEP1(Extra B): 为我们的项目添加版本信息与配置的头文件 Reference STEP 1(Extra A):指定C的版本 有的时候,我们会是对一个比较年老的项目进行构建。这个时候,我们可能就需要限制一下使用的…...

Linux 之 安装软件、GCC编译器、Linux 操作系统基础
安装软件、GCC编译器、Linux 操作系统基础 学习任务: 安装 Vmware虚拟机、掌握Ubuntu 系统的使用认识 Ubuntu 操作系统的终端和 Shell掌握软件安装、文件系统、掌握磁盘管理与解压缩掌握 VIM 编辑器、Makefile 基本语法熟悉 Linux 常见指令操作 安装好开发软件&…...

[CTF夺旗赛] CTFshow Web13-14 详细过程保姆级教程~
前言 CTFShow通常是指网络安全领域中的“Capture The Flag”(夺旗赛)展示工具或平台。这是一种用于分享、学习和展示信息安全竞赛中获取的信息、漏洞利用技巧以及解题思路的在线社区或软件。参与者会在比赛中收集“flag”,通常是隐藏在网络环境中的数据或密码形…...

【Matlab】Matlab 导入数据.csv或者.xlsx文件,然后使用这些数据来绘制图表
Matlab 导入数据.csv或者.xlsx文件,然后使用这些数据来绘制图表 初始数据 filename C:\Users\jia\Desktop\yadian\data\1Hz 2024_09_12 17_10_06.csv; 代码: clc;clear close all; % 读取Excel文件 filename C:\Users\jia\Desktop\yadian\data\1Hz …...

Awaken Likho恶意组织利用高级网络工具对俄罗斯政府发起“猛攻”
近日,俄罗斯政府机构和工业实体遭遇了一场名为“ Awaken Likho ”的网络活动攻击活动。 卡巴斯基表示,攻击者现在更倾向于使用合法MeshCentral平台的代理,而不是他们之前用来获得系统远程访问权限的UltraVNC模块。这家俄罗斯网络安全公司详细…...
【洛谷】P10938 Vani和Cl2捉迷藏 的题解
【洛谷】P10938 Vani和Cl2捉迷藏 的题解 洛谷传送门 题解 噢噢噢噢哦哦哦,神奇网络流,有点像 Floyd 在图上选取若干条互不相交的路径,并让这些路径不重不漏覆盖到每一个点。符合上述要求且总数最小的方案就叫做原图的最小路径点覆盖&…...

三角形面积 python
题目: 计算三角形面积 代码: a int(input("请输入三角形的第一个边长:")) b int(input("请输入三角形的第二个边长:")) c int(input("请输入三角形的第三个边长:")) s (abc) / 2 #…...

【C++第十七章】二叉搜索树
【C第十七章】二叉搜索树 二叉搜索树的介绍🧐 二叉搜索树又称二叉排序树,它可能是空树,也可能是具有以下性质的二叉树: 若它的左子树不为空,则左子树上的所有节点的值小于根节点的值若它的右子树不为空,则…...
Springboot 文件上传
文件上传,是指将本地图片、视频、音频等文件上传到服务器,供其他用户浏览或下载的过程。 文件上传前端需要完成的准备: 需要提交一个form表单,表单必须包含以下三点(上传文件页面三要素) …...
简单认识redis-5 jdbc 与 jedis 使用的区别
概念与功能定位 JDBC (Java Database Connectivity) JDBC 是 Java 语言用于连接数据库(如 MySQL、Oracle 等关系型数据库)的标准 API。它提供了一套统一的接口,让 Java 程序能够与各种数据库进行交互,执行 SQL 语句(如…...

Unity3d动画插件DoTween使用指南
1、DoTween是什么? DoTween是一款对象动画类插件,它是一款针对Unity 3D编辑器的、快速高效的、安全的、面向对象的补间动画引擎,并且对C#语言开发做出了很多的优化。另外,它使得开发者无需通过Unity内置的Animator或Coroutines即可…...
学习函数知识
学习函数是编程中的重要基础,以下是关于函数的详细知识点: 1. 函数的定义 函数是一组执行特定任务的代码块,可以重复使用。在 JavaScript 中,可以通过以下方式定义函数: 函数声明: function functionNam…...

案例-表白墙简单实现
文章目录 效果展示初始画面提交内容后画面(按键按下) 代码区 效果展示 初始画面 提交内容后画面(按键按下) 代码区 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">…...

和鲸科技创始人范向伟:拐点即将来临,AI产业当前的三个瓶颈
在科技迅猛发展的时代,人工智能(AI)无疑已经成为引领新一轮产业革命的核心动力之一。全球企业纷纷拥抱AI技术,试图借助其变革力量在竞争中突围,然而业界对AI产业化的拐点何时来临却众说纷纭。毕竟AI技术从实验室到商业…...

基于函数计算FC 部署 ComfyUI实现AI生图 的优势
基于函数计算FC 部署 ComfyUI实现AI生图 的优势 部署ComfyUI实现AI生图使用函数计算FC 一键部署ComfyUI 绘画平台的优势有哪些? 在文章开始之前,先来看一下基于函数计算FC 部署 ComfyUI实现AI生图 的大概步骤,整个基础部署操作比较简单。即便…...

瑞萨IDE:CS+ for CC编译过程中执行脚本文件
最近发现使用CS for CC IDE发现一个很有意思的功能。编译工程过程中,IDE自动执行Python脚本和批处理脚本,极大地提高开发效率。 编写好脚本文件后,在IDE中选择CC-RH(Build Tool)->Common Options->Others。 Co…...
在 CentOS 上安装 Docker 的步骤
在 CentOS 上安装 Docker 的步骤如下: 步骤 1:更新系统包 sudo yum update -y步骤 2:安装依赖包 确保安装了 yum-utils、device-mapper-persistent-data 和 lvm2,这些是 Docker 运行所需的依赖项: sudo yum instal…...
【C#生态园】探索地理信息系统软件套件与库:功能、API和应用
探索地理信息系统:软件套件与库详解 前言 地理信息系统(GIS)是当今世界上广泛使用的技术之一,它以空间数据为基础,能够提供丰富的地理信息分析和可视化功能。在GIS领域,有许多优秀的软件套件和库…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...

AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...
二维FDTD算法仿真
二维FDTD算法仿真,并带完全匹配层,输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...

运行vue项目报错 errors and 0 warnings potentially fixable with the `--fix` option.
报错 找到package.json文件 找到这个修改成 "lint": "eslint --fix --ext .js,.vue src" 为elsint有配置结尾换行符,最后运行:npm run lint --fix...
Angular中Webpack与ngx-build-plus 浅学
Webpack 在 Angular 中的概念 Webpack 是一个模块打包工具,用于将多个模块和资源打包成一个或多个文件。在 Angular 项目中,Webpack 负责将 TypeScript、HTML、CSS 等文件打包成浏览器可以理解的 JavaScript 文件。Angular CLI 默认使用 Webpack 进行项目…...