Redis7.2.4分片集群搭建

news2024/11/18 23:37:14

Redis分片集群搭建

1.集群结构

分片集群需要的节点数量较多,这里我们搭建一个最小的分片集群,包含3个master节点,每个master包含一个slave节点,结构如下:

image-20240313105554888

信息如下:

IPPORT角色
glnode036379slave
glnode056379slave
glnode076379master
glnode086379master
glnode096379master
glnode116379slave

2.准备实例和配置

在 redis 的安装目录下的 etc 目录下准备一个新的 redis.conf 文件,内容如下:

port 6379

# 以下的集群配置在redis官方提供的配置模板文件中并没有,需要自己添加
# 开启集群功能
cluster-enabled yes
# 集群的配置文件名称,不需要我们创建,由redis自己维护
cluster-config-file /export/servers/redis/etc/nodes.conf
# 节点心跳失败的超时时间
cluster-node-timeout 5000

# 开启aof,也可以不开启
appendonly yes
# 开启RDB
save 3600 1 300 100 60 10000
# 持久化文件存放目录
dir ../data/
# 绑定地址
bind 0.0.0.0
# 让redis后台运行
daemonize yes
# 注册的实例ip
replica-announce-ip 192.168.150.101
# 保护模式
protected-mode no
# 数据库数量
databases 16
# 日志
logfile logfile "/export/servers/redis/logs/redis.log"

将这个文件拷贝到每台服务器中:

切记:在这步骤之前 删除所有的 RDB AOF 文件

[root@glnode07 AutoShell]# ./1toN.sh 01,03-06,08,09,11 /export/servers/redis /export/servers/

这个脚本文件会在附录中给出,当然也可以通过 Xfps 等工具直接拖拽

3.启动

因为已经配置了后台启动模式,所以可以直接启动服务,进入到redis安装文件的bin目录下:

redis-server ../etc/redis.conf

通过ps查看状态:

ps -ef | grep redis

发现服务都已经正常启动:
image-20240313093439870

如果要关闭进程,可以执行命令:

redis-cli shutdown

4.创建集群

虽然服务启动了,但是目前每个服务之间都是独立的,没有任何关联。

我们需要执行命令来创建集群,在Redis5.0之前创建集群比较麻烦,5.0之后集群管理命令都集成到了redis-cli中。

1)Redis5.0之前

Redis5.0之前集群命令都是用redis安装包下的src/redis-trib.rb来实现的。因为redis-trib.rb是有ruby语言编写的所以需要安装ruby环境。

# 安装依赖
yum -y install zlib ruby rubygems
gem install redis

然后通过命令来管理集群:

# 进入redis的src目录
cd /tmp/redis-7.2.4/src
# 创建集群
./redis-trib.rb create --replicas 1 glnode03:6379 glnode05:6379 glnode07:6379 glnode08:6379 glnode9:6379 glnode11:6379

2)Redis5.0以后

我们使用的是Redis7.2.4版本,集群管理以及集成到了redis-cli中,格式如下:

redis-cli --cluster create --cluster-replicas 1 glnode07:6379 glnode08:6379 glnode09:6379 glnode03:6379 glnode05:6379 glnode11:6379
redis-cli --cluster create --cluster-replicas 1 192.168.150.101:7001 192.168.150.101:7002 192.168.150.101:7003 192.168.150.101:8001 192.168.150.101:8002 192.168.150.101:8003

命令说明:

  • redis-cli --cluster或者./redis-trib.rb:代表集群操作命令
  • create:代表是创建集群
  • --replicas 1或者--cluster-replicas 1 :指定集群中每个master的副本个数为1,此时节点总数 ÷ (replicas + 1) 得到的就是master的数量。因此节点列表中的前n个就是master,其它节点都是slave节点,随机分配到不同master

运行后的样子:
image-20240313102814282

这里输入yes,则集群开始创建:

image-20240313102839387

通过命令可以查看集群状态:

redis-cli -p 7001 cluster nodes

image-20240313103212594

5.测试

尝试连接7001节点,存储一个数据:

# 连接
redis-cli -c
# 存储数据
set num 123
# 读取数据
get num
# 再次存储
set a 1

集群操作时,需要给redis-cli加上-c参数才可以:

redis-cli -c

可以看到会在存储 hash 不在一个节点的数据时,自动切换master节点
image-20240313103423020

报错:

在创建集群时报错[ERR] Node glnode07:6379 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.

主要原因是 RDB 或者 AOF 文件中有数据,redis集群搭建的时候需要所有节点都为 空,不可以右节点有数据,我这个节点原本是一个单机 redis 并且存在数据,所以我需要删除之前的 RDB 和 AOF 文件。

还可能由于上次redis集群没有配置成功,生成了每个节点的配置文件,才产生这个错误,要将每个节点中的 nodes.conf文件删除.

先停止 redis 服务

redis-cli shutdown

按照我的配置 AOF 和 RDB 文件是在redis安装目录下的 redis/data/appendonlydir 这个文件夹中。删除即可

[root@glnode07 appendonlydir]# rm -rf *

删除 dump.rdb 文件,按照我的配置是在 redis 安装目录下的 redis/data 这个文件夹

[root@glnode07 data]# rm -rf dump.rdb 

然后 删除 nodes.conf 文件

[root@glnode07 etc]# rm -rf nodes.conf

参考

redisNode is not empty

附件

#!/bin/bash

if [ $# -ne 3 ]
then
  printf "Usage:                                                     \n"
  printf "    1toN.sh \"01,04-05,08-12\" SrcFile TargetDir           \n"
  printf "该命令会将本机的SrcFile文件(夹)传输至01,04,05,08,09,10,11, \n"
  printf "12主机的TargetDir路径下                                    \n"
  printf "                                                           \n"
  printf "PS:                                                        \n"
  printf "    + 目标主机编号应使用双引号,源文件(夹)和目标路径不需要 \n"
  exit
fi

array=(${1//,/ })
for arra in ${array[@]}
do
  if (( ${#arra} == 2 ))
  then
    # do somethings
    echo "#################### glnode${arra} ####################"
    # scp -r ${2} root@glnode${arra}:${3}>/export/AutoShell/1toN.log
    script /export/AutoShell/scp.log -q -c "scp -r ${2} root@glnode${arra}:${3}"
    echo "#################### glnode${arra} ####################"
    echo 
  else
    arr=(${arra[@]})
    start=`echo ${arra:0:2}|bc`
    end=`echo ${arra:3:2}|bc`
    while (($start <= $end))
    do
      ar=`printf "%02d" $start`
      start=$(($start+1))
      # do somethings
      echo "#################### glnode${ar} ####################"
      # scp -r ${2} root@glnode${ar}:${3}>/export/AutoShell/1toN.log
      script /export/AutoShell/scp.log -q -c "scp -r ${2} root@glnode${ar}:${3}"
      echo "#################### glnode${ar} ####################"
      echo
    done
  fi
done

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

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

相关文章

JavaEE:文件IO

硬盘 文件指的是硬盘/磁盘上的文件 ⚠硬盘 ≠ 磁盘 磁盘属于外存的一种&#xff1b;而软盘&#xff0c;硬盘&#xff08;机械硬盘&#xff09;这种属于用磁性介质来存储二进制数据 ssd硬盘&#xff08;固态硬盘&#xff09;&#xff0c;内部完全是集成电路&#xff0c;和磁…

手写简易操作系统(七)--加载操作系统内核

前情提要 上一节中&#xff0c;我们开启了内存分页&#xff0c;这一节中&#xff0c;我们将加载内核&#xff0c;内核是用C语言写的&#xff0c;C语言编译完了是一段ELF可加载程序&#xff0c;所以我们需要学会解析ELF格式文件&#xff0c;并将内核加载到内存 一、ELF格式 程…

(黑马出品_高级篇_04)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

&#xff08;黑马出品_高级篇_04&#xff09;SpringCloudRabbitMQDockerRedis搜索分布式 微服务技术——可靠性消息服务 今日目标服务异步通信-高级篇1.消息可靠性1.1.生产者消息确认1.1.1.修改配置1.1.2.定义Return回调1.1.3.定义ConfirmCallbac…

【LeetCode热题100】2. 两数相加(链表)

一.题目要求 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数…

论文阅读——RemoteCLIP

RemoteCLIP: A Vision Language Foundation Model for Remote Sensing 摘要——通用基础模型在人工智能领域变得越来越重要。虽然自监督学习&#xff08;SSL&#xff09;和掩蔽图像建模&#xff08;MIM&#xff09;在构建此类遥感基础模型方面取得了有希望的结果&#xff0c;但…

深度学习系列62:Agent入门

1 anget介绍和openai标准接口 agent的核心是其代理协同工作的能力。每个代理都有其特定的能力和角色&#xff0c;你需要定义代理之间的互动行为&#xff0c;即当一个代理从另一个代理收到消息时该如何回复。 agent目前大多使用openai标准接口调用LLM服务&#xff0c;说明如下。…

Java集合基础知识总结(绝对经典)

List接口继承了Collection接口&#xff0c;定义一个允许重复项的有序集合。该接口不但能够对列表的一部分进行处理&#xff0c;还添加了面向位置的操作。 实际上有两种list&#xff1a;一种是基本的ArrayList&#xff0c;其优点在于随机访问元素&#xff0c;另一种是更强大的L…

PYTHON 自动化办公:更改图片后缀

1、前言 在之前的文章中&#xff0c;介绍了图片的压缩技术&#xff0c;这里讲解如何利用python批量将图片改为指定后缀的格式。当然&#xff0c;也可以为深度学习批量更改文件后缀&#xff0c;例如在分割中&#xff0c;可能需要img和mask的图片名称完全一致等等 PYTHON 自动化…

掌握FilterOutputStream类!

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java IO相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

谈谈Darknet53为啥这么难训练

在我使用Imagenet2012对Darknet53进行预训练的时候&#xff0c;往往训练到一半&#xff0c;就会出现过拟合&#xff0c;导致无法继续向下训练&#xff0c;尝试了很多方法&#xff0c;最后发现问题出现在下图红框的部分。 得出这个结论是因为当我使用Resnet中&#xff0c;包含有…

力扣654 最大二叉树 Java版本

文章目录 题目描述解题思路代码 题目描述 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组后缀上…

【DVWA】19. Insecure CAPTCHA 不安全的验证码(全等级)

文章目录 1. Low1) 源码分析2&#xff09;实操 2. Medium1) 源码分析2&#xff09;实操 3. High1) 源码分析2&#xff09;实操 4. Impossible1) 源码分析 1. Low 1) 源码分析 <?phpif( isset( $_POST[ Change ] ) && ( $_POST[ step ] 1 ) ) {// Hide the CAPTC…

WPF图表库LiveCharts的使用

这个LiveCharts非常考究版本&#xff0c;它有非常多个版本&#xff0c;.net6对应的是LiveChart2 我这里的wpf项目是.net6&#xff0c;所以安装的是这三个&#xff0c;搜索的时候要将按钮“包括愈发行版”打勾 git&#xff1a;https://github.com/beto-rodriguez/LiveCharts2?…

BUGKU-WEB never_give_up

题目描述 题目截图如下&#xff1a; 进入场景看看&#xff1a; 解题思路 F12查看请求和响应&#xff0c;查找线索 相关工具 base64解码URL解码Burp Suit抓包 解题步骤 F12查看请求和响应&#xff0c;发现一行注释包含一个文件名称【1p.html】&#xff0c;这应该就是提…

GaN HEMTs在电力电子应用中的交叉耦合与基板电容分析与建模

来源&#xff1a;Analysis and Modeling of Cross-Coupling and Substrate Capacitances in GaN HEMTs for Power-Electronic Applications&#xff08; TED 17年&#xff09; 摘要 本文提出了一种考虑了基板电容与场板之间交叉耦合效应的场板AlGaN/GaN高电子迁移率晶体管(HE…

RabbitMQ自学笔记——消息可靠性问题

1.发送者的可靠性 1.1生产者重连 有时由于网络波动等原因&#xff0c;发送方一次可能没有连接上RabbitMQ&#xff0c;我们可以配置发送方的连接失败重试机制。但需要注意的是&#xff1a;SpringAMQP提供的重试机制是阻塞式的重试&#xff0c;也就是说多次重试等待的过程中&am…

[JAVAEE]—进程和多线程的认识

文章目录 什么是线程什么是进程进程的组成什么是pcb 进程概括线程线程与进程的关系线程的特点 创建线程创建线程方法创建线程的第二种方法对比 其他的方式匿名内部类创建线程匿名内部类创建Runable的子类lambda表达式创建一个线程 多线程的优势 什么是线程 什么是进程 首先想…

iOS 判断触摸位置是否在图片的透明区域

装扮功能系列&#xff1a; Swift 使用UIScrollerView 实现装扮功能&#xff08;基础&#xff09;Swift 使用UIScrollerView 实现装扮功能&#xff08;拓展&#xff09;iOS 判断触摸位置是否在图片的透明区域 背景 在装扮功能中&#xff0c;一般都是长按使道具进入编辑状态&…

ES分布式搜索-使用RestClient操作索引库

RestClient操作索引库 1、什么是RestClient&#xff1f; ES官方提供了各种不同语言的客户端&#xff0c;用来操作ES。这些客户端的本质就是组装DSL语句&#xff0c;通过http请求发送给ES。官方文档地址&#xff1a;Elasticsearch Clients官方文档 2、利用JavaRestClient实现…

软考高级:软件架构风格-闭环控制概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…