Sharding运行模式、元数据、持久化详解

运行模式

单机模式

能够将数据源和规则等元数据信息持久化,但无法将元数据同步至多个Sharding实例,无法在集群环境中相互感知。 通过某一实例更新元数据之后,会导致其他实例由于获取不到最新的元数据而产生不一致的错误。 适用于工程师在本地搭建 Apache ShardingSphere 环境。

支持持久化类型jdbc

集群模式

提供了多个Sharding实例之间的元数据共享和分布式场景下状态协调的能力。 在真实部署上线的生产环境,必须使用集群模式。它能够提供计算能力水平扩展和高可用等分布式系统必备的能力。 集群环境需要通过独立部署的注册中心来存储元数据和协调节点状态。

支持持久化配置ZooKeeper、Etcd

总结一下,这两种模式的主要区别在于,运行多个节点的时候,元数据是否共享。比如,你运行了多个单机模式的proxy,这时候,你登录其中一个proxy节点,去新增一张表,那么这张新增的表,只能够在你操作的proxy节点看到,其他节点是看不到的。其他节点要是想要看到的话,也是有一些办法的,等说过元数据之后,咱们再谈一谈单节点之间如何实现数据的共享。而集群模式则能够实现多个节点的元数据共享,当我们在其中一个节点中新增了一张表,其他节点也能够看到新增的表,因为集群模式下,所有的节点的元数据是同步的。这种同步,是通过ZooKeeper或者Etcd这样的中间件实现的。

元数据

元数据是表示数据的数据。从数据库角度而言,则概括为描述数据库的数据。因此如列名、数据库名、用户名、表名等以及数据自定义库表存储的关于数据库对象的信息都是元数据。而 ShardingSphere 中的核心功能如数据分片、加解密等都是需要基于数据库的元数据生成路由或者加密解密的列实现,由此可见元数据是ShardingSphere 系统运行的核心,同样也是每一个数据存储相关中间件或者组件的核心数据。

也就是说,ShardingSphere-Proxy所提供的一切功能,比如:数据分片、读写分离等,都是对元数据组合利用的结果。功能的背后是需要有数据的支撑的。元数据是非常重要的,所以,需要进行持久化存储,我们不能够因为我们的Sharding重启了,元数据发生了丢失。

元数据持久化

不管是单机模式还是集群模式,都需要将元数据保存下来,需要配置对应的仓库。当元数据仓库和配置文件同时存在的情况下,proxy会优先从元数据仓库中读取信息,之后才从配置文件中读取。

  • 单机模式,持久化仓库类型:JDBC

  • 集群模式,持久化仓库类型:ZooKeeper、Etcd

  • 当然元数据也可以不持久,即单机模式的jdbc,默认采用H2数据库内存形式存储。以这种方式启动的proxy,每次从配置文件中读取信息,创建对应资源和规则的元数据,以内存的形式保存下来。proxy结束运行的时候,内存中对应的元数据也会被销毁。

下方图片是使用MySQL作为元数据持久化仓库的方案,我们可以看到其存储的元数据,使用四列信息来描述:id、key、value、parent

单机模式下如何实现元数据的同步

有好好的集群模式不使用,为什么要在单机模式下,实现元数据的同步?

不是不使用,是因为在一些特殊的场景下,不能够使用官方提供的集群模式。

先来说一说,我所面临的场景:

1. 公司的技术栈是Golang,不想要引入过多的Java生态的中间件。

2. 目前Sharding的集群模式支持ZooKeeper、Etcd。Go的技术栈,自然而让就倾向于使用Etcd,但是Proxy组件,集群模式目前不支持使用Etcd,具体可以看这个issue。

3. 公司目前有K8S集群,能够支持自动伸缩和滚动更新,即使,频繁重启proxy不会造成太大的影响。

所以,公司就想要在K8S上部署多个Proxy副本,并且多个副本的元数据持久化仓库指向同一个,这样就可以通过重启Proxy副本的方式,来使用元数据的同步了(当我们配置了持久化仓库了,重启的proxy会优先从仓库中加载元数据,如果仓库为空,才会从配置文件中加载元数据)。

单机模式多节点替代集群模式方案
单机模式多节点替代集群模式方案

 

参考资料:

元数据持久化仓库

元数据在 ShardingSphere 中加载的过程  

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

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

相关文章

挖掘web程序中的OAuth漏洞:利用redirect_uri和state参数接管账户

本文探讨了攻击者如何利用OAuth漏洞,重点是滥用redirect_uri和state参数以接管用户账户。如果redirect_uri参数验证不严,可能会导致未经授权的重定向到恶意服务器,从而使攻击者能够捕获敏感信息。同样,state参数的错误实现可能使O…

Python世界:力扣题解1712,将数组分成三个子数组的方案数,中等

Python世界:力扣题解1712:将数组分成三个子数组的方案数,中等 任务背景思路分析代码实现测试套件本文小结 任务背景 问题来自力扣题目1712. Ways to Split Array Into Three Subarrays,大意如下: A split of an intege…

Java集合基础——针对实习面试

目录 Java集合基础什么是Java集合?说说List,Set,Queue,Map的区别?说说List?说说Set?说说Map?说说Queue?为什么要用集合?如何选用集合? Java集合基础 什么是Java集合? Java集合(Java Collect…

基于单片机的客车载客状况自动检测系统(论文+源码)

1系统整体设计 本课题为客车载客状况自动检测系统,在此以STM32单片机为核心控制器,结合压力传感器、红外传感器、蜂鸣器、语音提示模块、继电器、液晶等构成整个客车载客状况自动检测系统,整个系统架构如图2.1所示,在此通过两个红…

渗透测试(socket,namp,scapy)

socket:可以用来实现不同虚拟机或者不同计算机之间的通信。 socket常用函数: sock.bind(host,port) //host可接受client范围,以及连接的端口 sock.listen()//sever开启监听连接 sock.accpet()//返回 sock,addr 用来接受和发送数据 addr…

【mongodb】数据库的安装及连接初始化简明手册

NoSQL(NoSQL Not Only SQL ),意即"不仅仅是SQL"。 在现代的计算系统上每天网络上都会产生庞大的数据量。这些数据有很大一部分是由关系数据库管理系统(RDBMS)来处理。 通过应用实践证明,关系模型是非常适合于客户服务器…

内网对抗-信息收集篇SPN扫描DC定位角色区域定性服务探针安全防护凭据获取

知识点: 1、信息收集篇-网络架构-出网&角色&服务&成员 2、信息收集篇-安全防护-杀毒&防火墙&流量监控 3、信息收集篇-密码凭据-系统&工具&网站&网络域渗透的信息收集: 在攻防演练中,当完成边界突破后进入内…

OpenWebUI,RAG+外部知识库+AI写文的开源应用

引言 自从去年AI火起来之后,很多人便热衷于寻找适合自用的AI开源项目,把各家大模型API接入到自己的AI程序里,便可以通过AI辅助完成一系列日常任务,比如内容翻译/润色/总结/撰写、格式转换、数据分类、代码分析、角色扮演等等。 …

qt QErrorMessage详解

1、概述 QErrorMessage是Qt框架中用于显示错误消息的一个对话框类。它提供了一个简单的模态对话框,用于向用户显示错误或警告消息。QErrorMessage通常用于应用程序中,当需要向用户报告错误但不希望中断当前操作时。它提供了一个标准的错误消息界面&…

一文了解Android的Doze模式

Android 的 Doze 模式是一项省电功能,主要用于减少设备的功耗,特别是在屏幕关闭且设备长时间未被使用的情况下。Doze 模式在 Android 6.0(API Level 23)首次引入,并在后续版本中不断改进,以便更智能地管理后…

美团代付微信小程序系统 read.php 任意文件读取漏洞复现

0x01 产品简介 美团代付微信小程序系统是美团点评旗下的一款基于微信小程序技术开发的应用程序功能之一,它允许用户方便快捷地请求他人为自己支付订单费用。随着移动支付的普及和微信小程序的广泛应用,美团作为中国领先的本地生活服务平台,推出了代付功能,以满足用户多样化…

SpringBoot-员工管理系统(1)

目录 一、首页配置 二、国际化 2.1 配置文件编写 2.2 使配置文件生效 2.3 配置页面国际化值 2.4 实现根据按钮自动切换中英文 三、登录拦截器 一、首页配置 1、所有页面的静态资源都需要用thymeleaf接管 2、url使用{}格式 二、国际化 2.1 配置文件编写 1、在resourc…

JavaSE:初识Java(学习笔记)

java是高级语言的面向对象语言 .[最贴近生活.最快速分析和设计程序] 一,计算机语言发展历史 二,Java体系结构 1,JavaSE(Java Standard Edition) 标准版,定位在个人计算机上的应用 这个版本是Jav…

Android——多线程、线程通信、handler机制

Android——多线程、线程通信、handler机制 模拟网络请求&#xff0c;会阻塞主线程 private String getStringForNet() {StringBuilder stringBuilder new StringBuilder();for (int i 0; i < 100; i) {stringBuilder.append("字符串" i);}try {Thread.sleep(…

Jumpserver

概述 一款开源的堡垒机&#xff0c;可使系统的管理员和开发人员安全的连接到企业内部服务器上执行操作&#xff0c;是一款非常安全的远程连接工具。 4A 身份验证授权控制账号管理安全审计 安装 [rootjumpserver project]# tar -xf jumpserver-offline-installer-v2.28.6-amd64…

【专题】2024年全球生物医药交易报告汇总PDF洞察(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p38191 在当今复杂多变的全球经济环境下&#xff0c;医药行业正面临着诸多挑战与机遇。2024 年&#xff0c;医药行业的发展态势备受关注。 一方面&#xff0c;全球生物医药交易活跃&#xff0c;2021 - 2023 年的交易中&#xff0c;已…

统信UOS开发环境支持rust

集成了Rust编译器和包管理工具,支持系统级编程、网络应用等多场景,为开发者提供丰富的库支持。 文章目录 一、环境部署1. rust开发环境安装2. rust开发环境配置二、代码示例三、常见问题1. 借用和所有权问题2. 编译器错误和警告一、环境部署 1. rust开发环境安装 rust是一门…

Addressables资源打包(AA包)代码中改变远程地址

接着上一篇“Unity资源打包Addressable AA包” 还是先贴代码 LoadPath.cs 中定义一个远程服务器的地址&#xff0c;这个地址将来在代码中会修改 namespace HFS {public class LoadPath{public static string Path "http://172.18.216.168:6565/HFS/1/";} } 远程服…

linux基础-完结(详讲补充)

linux基础-完结 一、Linux目录介绍 二、基础命令详细讲解 1. ls&#xff08;列出目录内容&#xff09; 2. cd&#xff08;更改目录&#xff09; 3. clear&#xff08;清除终端屏幕&#xff09; 4. pwd(显示你当前所在的目录) 5. vim(文本编辑器) 6. touch&#xff08;创…

开启鸿蒙开发之旅:准备篇

写在前面 Q:为什么要学习鸿蒙&#xff1f; A:没有特定的理由&#xff0c;有可能是因为大环境不好的原因&#xff0c;大家越来越卷&#xff0c;技术革新越来越快&#xff0c;如果手里多掌握一门技术&#xff0c;心里会更有底气一些。再一个自己只有前端开发经验&#xff0c;平时…