分布式MySQL架构

article/2025/10/5 13:32:17

分布式数据库一般是以下的这种结构,计算层获取元数据层信息进行路由。下面说下各个层级的目的:
在这里插入图片描述
(1)计算层就是单机时的SQL层,用来对数据访问进行权限检查、路由访问,以及对计算结果等操作。
(2)元数据层记录了分布式数据库集群下有多少个存储节点,对应IP、端口等元数据信息是多少。当分布式数据库的计算层启动时,会优先访问元数据层,获取所有集群信息,才能正确进行SQL解析和SQL执行路由。
(3)存储层用来存放数据,但存储层要和计算层在同一台服务器上,甚至不求在同一个进程中。
从可用性的角度看,如果存储层发生宕机,那么只会影响 1/N 的数据,N 取决于数据被打散到多少台服务器上。所以,分布式数据库的可用性对比单机会有很大提升,单机数据库要实现99.999% 的可用性或许很难,但是分布式数据库就容易多了。
其引入了新的分布式服务的几大问题,包括自增实现、索引设计、分布式事务、分片副本等。

在分布式MySQL架构下,客户端不再是访问MySQL数据库本身,而是访问一个分布式中间件。

关于分片键的选择

选择分片的算法,比较常见的有 RANGE 和 HASH 算法。

  1. RANGE算法。
    缺点:该算法不能解决传输数据库的两个痛点。
    (1)性能可扩展,通过增加分片节点,性能可以线性提升;
    (2)存储容量可扩展,通过增加分片节点,解决单点存储容量的数据瓶颈。
    优点:方便将数据在不同节点之间进行迁移。

  2. Hash分区算法。对于海量并发的OLTP业务来说,建议采用这种方式。这种方式在NG上也比较常用。

分布式数据库架构设计的原则是:选择一个适合的分片键和分片算法,把数据打散,并且业务(角度)的绝大部分查询都是根据分片键进行访问

互联网业务的分片键就是用户的ID,业务的大部分访问都是根据用户ID进行查询,比如:

  1. 查看某个用户下的微博/短视频;
  2. 查看某个用户的商品信息/购买记录。

分库分表

分库分表的目前是确定数据流。即通过以下方式可以确定。

分片 = 实例 + 库 + 表 = ip@port:db_name:table_name

很多情况下一般都采用既分库又分表的方式。有以下两个优点:

  1. 不同分片的数据可以在同一MySQL数据库实例上,便于做容量的规划和后期的扩展;
  2. 同一分片键的表都在同一个库下,方便做整体数据迁移和扩容。

在这里插入图片描述
按上面这样的分布式设计,数据分片完成后,所有的库表依然是在同一个 MySQL实例上!!!

扩缩容

在 HASH 分片的例子中,我们把数据分片到了 4 个节点,然而在生产环境中,为了方便之后的扩缩容操作,推荐一开始就把分片的数量设置为不少于 1000 个。

不用担心分片数量太多,因为分片 1 个还是 1000 个,管理方式都是一样的,但是 1000 个,意味着可以扩容到 1000 个实例上,对于一般业务来说,1000 个实例足够满足业务的需求了(BTW,网传阿里某核心业务的分布式数据库分片数量为 10000个)。

一般公司建议分片数后能满足最近5年以上的业务发展,并且是2的指数倍数,便于后期的扩容或缩容。

主键选择

自增并不能在插入前就获得值,而是要通过填 NULL 值,然后再通过函数 last_insert_id()获得自增的值。所以,如果在每个分片上通过自增去实现主键,可能会出现同样的自增值存在于不同的分片上。所以,在分布式数据库架构下,尽量不要用自增作为表的主键。可以采用MySQL自带的有序UUID,或者是开源的UUID生成算法,比如雪花算法(存在时间回溯问题)。

索引设计

在分布式数据服务中,最优雅的索引设计不是创建一个索引表,而是将分片键的信息保存在想要的查询列中,这样通过查询的列就能知道所在的分片信息。比如查询的列保存为:

o_orderkey = string(o_orderkey + o_custkey)
此时的查询:SELECT * FROM Orders WHERE o_orderkey = ‘1000-1’;

对于非唯一的二级索引查询,依然需要扫描的分片才能得到最终的结果。

SELECT * FROM Orders WHERE o_orderate >= ? o_orderdate < ?

分布式数据库架构设计的要求是业务的绝大部分请求能够根据分片键定位到1个分片上。

对于唯一索引,需要采用类似UUID的机制实现全局唯一。即使是单机版的MySQL,也推荐最开始就采用全局唯一设计,因为你的业务不一定哪天就要升级为全局唯一的方式。

全局表

关于全局表的设计,有很多种方式。第一种方式是采用每个分片上都存储该全局表信息,这样就可以防止跨分片查询,第二种方式是只存到一个公共的分片上,该分片数据通过服务启动后动态加载到缓存中。每次需要时从缓存中获取。且维护成本少。

分库分表中间件

之前的京东时,采用的sharding-jdbc。目前如果继续在互联网或者金融领域使用,还是建议采用sharding-jdbc。有以下原因。

  1. sharding-jdbc已经成为apache的顶级项目。社区活跃度尤其是中国社区活跃度很高,并且很多互联网巨头也在使用,遇到问题容易解决。
  2. sharding-jdbc在使用是不需要搭建代理层,而是直接集成在应用中,中间链路少,集成方便。
  3. sharding-jdbc升级为代理方式时,转化更加灵活。只需要将jar引入去掉,将配置信息加入到代理中间件(如mysql-proxy:mycat)中即可。

分库分表的存储

条带化

条带化是一种数据存储方案,将磁盘进行条带化后,相同的数据可以写入到不同的条带,可以提高数据的查询性能和写入性能。

如下所示的RAID 0条带化存储。
在这里插入图片描述

多活架构

与单活架构不同,多活架构是指不同地理位置上的系统,都能够提供业务读/写服务。这里的“活”是指实时提供读/写服务的意思,而不仅仅只是读服务。多活架构主要是为了提升系统的容灾能力,提高系统的可用性,保障业务持续可用。

在高可用架构中,需要做到跨机房部署,实现的方式是无损半同步复制,以及最新的MySQL Group Replication技术。数据库实例通过三园区进行部署。当一个机房发生宕机时,可以快速切到另外一个机房部署,当一个机房的数据存储出现问题时,可以通过另外机房的数据存储提供服务。

在这里插入图片描述
要实现多活架构,首先要进行分布式数据库的改造,然后是将不同数据分片的主服务器放到不同机房,最后是实现业务条带化的部署。如下面的这张图:

在这里插入图片描述
可以看到,对于上一节的订单服务和订单数据分片,通过将其部署在不同的机房,使得订单服务1 部署在机房 1,可以对分片1进行读写;订单服务 2 部署在机房 1,可以对分片 2 进行读写;订单服务 3 部署在机房 3,可以对分片 3 进行读写。

这样每个机房都可以有写入流量,每个机房都是“活”的,这就是多活架构设计。

若一个机房发生宕机,如机房 1 宕机,则切换到另一个机房,上层服务和数据库跟着一起切换,切换后上层服务和数据库依然还是在一个机房,访问不用跨机房访问,依然能提供最好的性能和可用性保障。

分布式架构下的事务处理


http://chatgpt.dhexx.cn/article/s3tpQVPj.shtml

相关文章

搭建分布式存储服务minio详细过程

最近项目的存储量比较大&#xff0c;考虑项目后期存储需要拓展&#xff0c;决定使用分布式存储&#xff0c;综合考察后&#xff0c;最终选定使用minio作为存储服务。以下是使用步骤&#xff0c;MARK一下&#xff01; 1、服务器 192.168.40.124 192.168.40.1282、创建目录 本集…

分布式存储概述

一、数据分类及存储分类 数据分为元数据和数据 分布式数据存储的实现&#xff1a; 元数据即是文件的属性信息(文件名、权限(属主、属组)、大小、更新时间等)&#xff0c;元数据就是有一种路由机制&#xff0c;即当客户端或者应用程序产生的客户端数据被写入到分布式存储系统的…

分布式存储 HDFS原理

思维导图&#xff1a; 分布式存储 一、NameNode 1接收客户端的请求 管理元数据&#xff08;文件上传时间、文件权限、文件属主、大文件的block数及blockId号&#xff09; 管理集群 二、SecondaryNameNode 持久化内存中的元数据。 因为内存不稳定&#xff0c;可以将数据持…

分布式存储系统Minio简介

Minio 是一个基于Go语言的对象存储服务。它实现了大部分亚马逊S3云存储服务接口&#xff0c;可以看做是是S3的开源版本&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等&#xff0c;而一个对象文件可以是任意…

分布式存储技术的对比分析与应用

主流分布式存储技术的对比分析与应用 随着数字化转型的深入&#xff0c;海量数据对存储提出了新的要求。传统存储虽然有技术成熟、性能良好、可用性高等优点&#xff0c;但面对海量数据&#xff0c;其缺点也越来越明显&#xff1a;如扩展性差、成本高等。为了克服上述缺点&…

分布式存储架构一-分布式存储概念

分布式存储系统是由大量廉价普通PC服务器通过Internet互联&#xff0c;对外作为一个整体提供服务的系统。它的规模大且成本低。 分布式存储系统的特性&#xff1a; 可扩展&#xff1a;分布式存储系统能扩展几百到几千台的规模&#xff0c;随着集群数量的提升&#xff0c;它的…

分布式系列之开源分布式存储技术分析

分布式存储在云计算及容器技术中将广泛使用&#xff0c;本文仅简单介绍了下几个主流的开源分布式技术&#xff0c;整个分布式存储系列相当复杂&#xff0c;文中介绍略微粗浅且当引子。 1、集中式存储和分布式存储 1.1 存储类型 常见的存储类型有三种&#xff1a;块存储、文件…

浅谈分布式存储架构: IPFS和HDFS

分布式存储架构是一个复杂的系统工程&#xff0c;针对特定应用的数据存储有不同的系统架构解决方案。不同的存储方法会影响存储性能、存储成本、冗余度、工程复杂性等。 分布式存储的历史 分布式存储最早是由谷歌提出的&#xff0c;其目的是通过廉价的服务器来解决大规模&…

开源分布式存储架构概览

关注「开源Linux」&#xff0c;选择“设为星标” 回复「学习」&#xff0c;有我为您特别筛选的学习资料~ 材料提纲包括三部分内容&#xff1a; 1、基本思想和关注的问题 2、四种开源分布式存储系统概览&#xff08;HDFS 、GlusterFS 、OpenStack Swift、Ceph&#xff09; 3、以…

FISCO BCOS 2.0原理解析: 分布式存储架构设计

FISCO BCOS 2.0新增对分布式数据存储的支持&#xff0c;克服了本地化数据存储的诸多限制。 在FISCO BCOS 1.0中&#xff0c;节点采用MPT数据结构&#xff0c;通过LevelDB将数据存储于本地&#xff0c;这种模式受限于本地磁盘大小&#xff0c;当业务量增大时数据会急剧膨胀&…

杉岩PACS影像系统分布式存储架构

该医院创建于1999年&#xff0c;是深圳市政府投资建成的集医疗、教学、科研和预防为一体的现代化三级综合性医院。2017年通过三级甲等医院复审。2018年&#xff0c;医院年门急诊总量约292万人次&#xff0c;年出院病人近7.4万人次&#xff0c;年手术量4.9万台次。 该院在深圳有…

Ceph分布式存储 原理+架构图详解

分布式存储Ceph ceph介绍 ceph是一个统一的、分布式的存储系统&#xff0c;设计初衷式提供较好的性能(io)、可靠性(没有单点故障)和可扩展性(未来可以理论上无限扩展集群规模)&#xff0c;这三点也是集群架构所追求的。 统一性 : 意味着我们可以仅凭ceph这一套存储系统&…

几种分布式存储组网架构参考

作 者&#xff1a; NGDCN 原文链接&#xff1a;几种分布式存储组网架构参考 - NGDCN 版 权&#xff1a; 本文由 NGDCN 于2022-11-12原创发布在 NGDCN&#xff0c;未经许可&#xff0c;禁止转载。 1、名词解释 ◼ VBS&#xff1a;云硬盘备份&#xff08;Volume …

谈谈Java内存模型

谈谈Java内存模型 什么是JMM为什么需要这种规范呢&#xff1f;三大特性在Java中是怎么满足的呢&#xff1f; 什么是JMM Java Memory Model &#xff0c;Java内存模型&#xff0c;是一种共享内存系统中多线程程序读写操作行为的规范&#xff0c;它是一种屏蔽了各种硬件和操作系…

Java内存模型及管理

1. 概述 多任务和高并发是衡量一台计算机处理器的能力重要指标之一。一般衡量一个服务器性能的高低好坏&#xff0c;使用每秒事务处理数&#xff08;Transactions Per Second&#xff0c;TPS&#xff09;这个指标比较能说明问题&#xff0c;它代表着一秒内服务器平均能响应的请…

什么是Java内存模型

概述&#xff1a;本文向您介绍Java内存模型的概念&#xff0c;在C或C中, 利用不同操作平台下的内存模型来编写并发程序&#xff1b;Java利用了自身虚拟机的优势, 使内存模型不束缚于具体的处理器架构&#xff0c;真正实现了跨平台。 内存模型 (memory model) 内存模型描述的是程…

详说Java内存模型(JMM)

文章目录 什么是Java内存模型为什么提出内存模型Java主内存与工作内存JMM三大特性可见性有序性原子性 并发总结 什么是Java内存模型 Java内存模型就是&#xff08;Java Memory Model&#xff09;&#xff0c;它规范了Java虚拟机与计算机内存是如何协同工作的。Java虚拟机就是一…

详解Java内存模型

文章目录 一、简介二、处理器、高速缓冲、主内存间的交互关系三、Java线程、工作内存和主内存的交互关系四、8大原子操作五、8大Happens-Before原则 一、简介 Java内存模型&#xff08;JMM&#xff09;是线程间通信的控制机制&#xff0c;JMM定义了主内存和线程工作内存之间的抽…

Java内存模型的一点理解

关于Java内存模型的问题 文章目录 前言一、Java内存模型二、其中一些指向问题1.内存指向问题为什么&#xff1f; 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要…

【Java】Java内存模型

1.什么是Java内存模型 Java内存模型&#xff08;Java Memory Model&#xff0c;JMM&#xff09;是一种抽象的&#xff0c;不存在的概念。是一种屏蔽了各种硬件和操作系统的访问差异的&#xff0c;保证了Java程序在各种平台下对内存的访问都能保证效果一致的机制及规范。 Java内…