Redis集群系列六 —— 分片集群搭建

news2024/10/3 2:25:06

Redis 常用集群中,常用的几种集群方案有:主从集群、哨兵集群、分片集群,不同的集群对应着不同的场景,并且各种集群也都有不同的优劣,本篇将以 redis 分片集群为切入点。

主从和哨兵虽然解决了高可用、高并发读的问题,但是依然有两个问题没有解决:

  • 海量数据存储问题
  • 高并发写的问题

使用分片集群可以解决上述问题。

分片集群结构

分片集群需要的节点数量较多,一个最小的分片集群至少需要6个节点(3主,3从)。要保证集群的高可用,需要每个主节点都有至少一个从节点,也就是备份节点,所以Redis集群至少需要6台服务器。如图:

分片集群特征

  • Redis 集群不支持单机版本的16个默认数据库,仅有0数据库,且select命令被禁用;
  • 每个主节点下都可能有1个或多个从节点,这些从节点在网络分区或者发生故障时会尝试替代主节点,同时从节点也可用于支撑大规模的读操作;
  • 主节点之间通过 ping 监测彼此健康状态;
  • 客户端可以访问集群中任意节点(包括从节点),节点将会分析要操作的 key,找到对应哈希槽的节点,最终都会被转发到正确节点。一般情况下从节点会将客户端请求重定向到负责对应哈希槽的主节点。如果要实现大规模读,可以给从节点开启 READONLY;
  • key 空间被划分为16384个槽位(哈希槽),集群中的每个主节点占据一部分槽位数,跨slot的两个 key 可能不能做一些操作,比如:sdiff sunion;
  • key 映射到哈希操作的算法是 hash_slot = CRC16(16)mod 16384;
  • Cluster bus: 集群节点都通过TCP连接(TCP bus)和一个二进制协议(集群连接,cluster bus)建立通信(在原客户端访问端口之上加上1000),节点之间使用 gossip 协议来发布广播消息,通知配置变更;

通过分片集群,Redis 解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,而且也具有故障迁移(主从切换)的功能,实现了较为完善的高可用方案。

搭建分片集群

建集群的第一件事情我们需要一些运行在集群模式的 Redis 实例。这意味这集群并不是由一些普通的 Redis 实例组成的,集群模式需要通过配置启用,开启集群模式后的Redis实例便可以使用集群特有的命令和特性了。

下面是一个最少选项的集群的配置文件:

port 7000

# 打开集群模式
cluster-enabled yes

# 设定节点配置文件名,保存节点配置文件的路径, 默认值为 nodes.conf;节点配置文件无须人为修改,它由 Redis 集群在启动时创建,并在有需要时自动进行更新。
cluster-config-file nodes.conf

# 设定节点心跳失联时间,超过该时间(毫秒),集群自动进行主从切换。
cluster-node-timeout 5000

# 开启 AOF
appendonly yes

搭建分片集群有两种方式,分别为:手动搭建和自动搭建两种。

手动搭建

准备实例和配置

参考上述配置,创建不同实例的 redis.conf 文件,并修改每个实例配置文件中的端口号。如图:

在当前目录下一键启动所有服务

printf '%s\n' 30001 30002 30003 30004 30005 30006 | xargs -I{} -t redis-server /etc/redis/cluster/{}.conf

一键关闭所有服务

printf '%s\n' 30001 30002 30003 30004 30005 30006 | xargs -I{} -t redis-cli -p {} shutdown

关于脚本使用说明请参考 xargs 命令。

通过ps查看状态 

这个时候虽然所有节点启动了,但是目前每个服务之间都是独立的,没有任何关联,还不能称之为集群。

创建集群

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

  • Redis5.0之前

Redis5.0 之前是通过使用 Redis 集群命令行工具 redis-trib 来实现,在此需要安装 ruby 环境。

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

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

./redis-trib.rb create --replicas 1 127.0.0.1:30001 127.0.0.1:30002 127.0.0.1:30003 127.0.0.1:30004 127.0.0.1:30005 127.0.0.1:30006

redis-trib 文件通过向实例发送特殊命令来完成创建新集群,检查集群, 或者对集群进行重新分片(reshared)等工作

选项 --replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。

  • Redis5.0以后

Redis5.0以后就不需要安装 ruby 环境,Redis 源码的 src 文件夹中已经包含了 redis-trib 文件。

./redis-trib.rb create --replicas 1 127.0.0.1:30001 127.0.0.1:30002 127.0.0.1:30003 127.0.0.1:30004 127.0.0.1:30005 127.0.0.1:30006

或者还可以使用

./redis-cli --cluster create --cluster-replicas 1 127.0.0.1:30001 127.0.0.1:30002 127.0.0.1:30003 127.0.0.1:30004 127.0.0.1:30005 127.0.0.1:30006

命令说明:

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

可以通过 redis-cli --cluster help 命令进行集群命令的查看。

执行以上命令后会出现如图:

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

查看集群状态:

注意:这里一定要有 -c ,表示连接的是集群。

还可以使用以下命令:

redis-cli -p 30001 cluster nodes

通过这个命令,可以清楚的看到集群中各个实例节点的主从状态,实例ID,槽位区间等信息。详情请参考文章末
 

自动搭建

以上是手动创建集群的方法,还可以使用 create-cluster 脚本启动节点,创建集群,停止集群等操作,文件在 Redis 安装目录下的 utils/create-cluster/ 中。

它是一个简单的 bash 脚本,可以根据需要修改端口、集群实例等,默认是 6 节点集群。只需键入以下命令:

# 启动实例
create-cluster start

# 创建集群
create-cluster create

# 停止集群
create-cluster stop

 同时还提供了其他命令,在此就不一一说明了,如图:

了解更多请阅读当前目录下的 README 文件以获取有关如何运行脚本的更多信息。

测试

使用以下命令进入

redis-cli -c -p 30001

 注意:这里一定要有 -c ,表示连接的是集群。

请求根据 key 哈希计算重定向到对应的节点上,如图:

集群下常用命令

# 查看状态
info replication

# 查看当前集群信息
cluster info

# 查看集群里有多少个节点
cluster nodes

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

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

相关文章

spring之IoC注解(二)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、Spring注解的使用1、加入aop的依赖2、在配置文件中添加context命名空间3、在配置文件中指定扫描的包4、在Bean类上使用注解二、Bean的选择性实例化1、需求2、…

二十三种设计模式--系列篇(一)

一、软件设计模式的产生背景 “设计模式”最初并不是出现在软件设计中,而是被用于建筑领域的设计中。 1977年,美国著名建筑大师、加利福尼亚大学伯克利分校环境结构中心主任克里斯托夫亚历山大(Christopher Alexander)在他的著作《…

(五)devops持续集成开发——jenkins发布一个maven流水线项目

前言 本节内容使用jenkins的maven流水线组件发布一个springboot项目,实现自动化部署一个后端项目。在开始流水化部署前我们需要准备好一个git项目,并在jenkins所在的服务器安装好git客户端便于源码的拉取。并且需要安装一个ssh插件,将我们的…

C++学习:多态与运算符(Day.7~)

总结让人明白。 表明覆盖意图的限定符 override 如图: 说明:1.使用关键字const后,由于函数特征不同,派生类不会再隐藏基类方法 2.想要覆盖基类方法可使用关键字override,此关键字会强制覆盖基类方法,若…

微信功能,你知道多少

用了微信很多年,选择才发现微信收藏的正确打开方式!感觉之前白用了那么久微信收藏,只用来保存消息实在是太可惜了,原来它还有那么多实用功能!协助日常安排如果每天需要做的事情比较多,可以在这里记录日常工…

谷粒商城之高级篇知识补充

谷粒商城高级篇之知识补充 前言 本篇主要是完成谷粒商城高级篇开发时,我们需要了解并学习一部分补充的知识,才能更好的完成商城业务。 以后我们将商城任务和额外知识分开来编写,方便商城业务的连贯性。 下面是本篇文章各个章节对应的相应…

Apollo星火计划学习笔记——Apollo速度规划算法原理与实践

文章目录1. 速度规划算法总体介绍1.2 不同场景下的ST图1.2.1 主车向前匀速行驶1.2.2 主车先向前匀速行驶,后停车1.2.3 主车跟随前车行驶1.2.4 主车跟随前车刹停1.2.5 障碍车在主车后方跟行1.3 速度规划算法整体流程1.3.1 Task: SPEED_BOUNDS_PRIORI_DECI…

数据结构-堆

1、什么是堆 堆是一种满足以下条件的树:堆中的每一个节点值都大于等于(或小于等于)子树中所有节点的值。 2、堆的用途 当我们只关心所有数据中的最大值或者最小值,存在多次获取最大值或者最小值,多次插入或删除数据时&…

ArrayList与顺序表(一)

目录 1.线性表 2.顺序表 2.1接口的实现 3.ArrayList的简介 4.ArrayList使用 4.1ArrayList的构造 4.2ArrayList常见的操作 4.3ArrayList的遍历 4.4ArrayList的扩容机制 5.模拟实现一个ArrayList 1.线性表 线性表:是n个具有相同特性的数据元素的有限序列。线性…

[思考进阶]04 优秀的人,都在使用“微习惯”

除了要提升自己的技术能力,思维的学习和成长也非常非常重要,特推出此[思考进阶]系列,进行刻意练习,从而提升自己的认知。 我有个微信群,人很少,都是兄弟,每天打开电脑的时候,我都会有…

朴素贝叶斯分类的python的实现

文章目录介绍GaussianNB()参数介绍实例BernoulliNB()参数介绍实例MultinomialNB()参数介绍实例作者:王乐介绍 sklearn 是 scikit–learn 的简称,是一个基于 Python 的第三方模块。 sklearn 库集成了一些常用的机器学习方法,在进行机器学习任务时,并不需要实现算法,…

Java 并发编程解析 | 如何正确理解Java领域中的并发锁,我们应该具体掌握到什么程度?

写在开头 对于Java领域中的锁,其实从接触Java至今,我相信每一位Java Developer都会有这样的一个感觉?不论是Java对锁的实现还是应用,真的是一种“群英荟萃”,而且每一种锁都有点各有各的驴,各有各的本&…

#P13787. [NOIP2021] 报数

目录 一,题目 二,题意分析 三,做法 1.直接模拟题意 2,用筛法来解 3,正解(加上记忆化) 一,题目 二,题意分析 题目意思是说:每次输入一个数,然后先判断这个数是否为某一个十进制中包含7的数…

Redis 为什么这么快?

1.基于内存实现 Redis 是基于内存的数据库,跟磁盘数据库相比,完全吊打磁盘的速度。 2.高效的数据结构 Redis 一共有 5 种数据类型,String、List、Hash、Set、SortedSet。 不同的数据类型底层使用了一种或者多种数据结构来支撑,目的…

如何选择适合自己的进销存系统软件?

选择一款合适的进销存软件,可以有效解决企业生产经营中业务管理、分销管理、存货管理、营销计划的执行和监控、统计信息的收集等方面的业务问题。 进销存软件一直是一个热门话题,别急,我这就来给你介绍。 一、进销存管理软件 这里我要推荐…

计算机系统概述

计算机系统概述一、操作系统的概念1、定义2、功能和目标二 、操作系统特征1、并发性2、共享性3、虚拟性4、异步性三、操作系统的发展1、手工操作阶段2、批处理阶段——单道批处理系统2、批处理阶段——多道批处理系统3、实时操作系统四、运行机制和体系结构1、运行机制①指令②…

Gitea 的邮件通知

有这样的一个需求,当仓库中被推送或者更新代码的时候,希望在邮件中收到邮件通知。 Gitea 是可以实现这个功能的,但是在默认情况下这个功能是关闭的。 修改配置文件 根据 Gitea 的安装不同,我们的配置文件在:vi /etc…

【正点原子FPGA连载】第六章Petalinux设计流程实战摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id692450874670 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第六章Petalinux…

【CS硕士三年级BetterBench】2022年终总结(脚踏实地,仰望星空)

2022年终总结 回忆录 2022年焦虑和快乐是这一年中最大的两种情绪了。焦虑主要是因为心里的三块石头,从年初就开始悬着。第一块石头,科研论文录用,第二个石头,拿到国奖,第三个石头是拿到满意的offer。目前只剩下最后一…

【Linux】多文件编译

目录 多文件编译 为什么要分两步编译: makefile文件 makefile里面安装 更改可调式版本 对比Windows中的VS 多文件编译 有以下文件 分两步: 第一步编译:.c->.o 第二步链接(可以不用写头文件):.o-…