目录

一、MySQL单机架构的问题

二、MySQL集群架构的优点与工作原理

(1)读写分离:读性能的提升

(2)数据库分片(分库分表):写性能的提升

2.1垂直分片(分库)

2.2水平分片(分表)

三、Docker


        在学习数据库的时候,发觉简单的记忆背诵SQL语句较为枯燥,于是从本文开始将直接从MySQL顶层设计入手,深入学习数据库系统背后的底层原理,从而帮助我们避免成为调包侠。

一、MySQL单机架构的问题

       MySQL是一个历史十分悠久的数据,他甚至发扬与互联网热潮之前,在此阶段人们大多是采用单机模式的数据库来进行数据存储、数据交互的。不过随着计算机设备的增多、访问量并发性的提升,该模式逐渐力不从心,产生了一些性能上明显的缺点。

    在单机模式下,一个公司的所有业务都放在同一台物理机上,用这一台物理机充当数据库服务器。该服务器中充斥着大量的数据库、表结构等,每一种类型的业务想要获取数据都得去同一台物理机上拿,一旦访问并发性很高、访问量很大时,这种架构的速度只能依赖于单物理机的性能优化进行提升,显然难堪大用。

二、MySQL集群架构的优点与工作原理

        在当今的互联网时代,各种网络服务访问量爆发式增长,比如抖音,它背后就依赖于大量高性能的数据库服务器去存储视频信息,然后在用户访问时候通过网络转发即可。但毕竟一台物理主机的性能再怎么优秀、内存容量再怎么大,它都不可能一个人干完所有的事情,即使它真的能实现,也会因为高并发访问而使得交互速率极为低下,于是MySQL集群应运而生。

        MySQL 高性能集群架构主要分为两大核心方案:读写分离数据库分片(分库分表),二者解决的问题维度不同,也常被结合使用。

(1)读写分离:读性能的提升

        MySQL数据库一般被设计成主从模式,其中主节点作为联网公司的主录入节点,所有的数据录入信息都由此发往从节点。而从节点往往会设计多个,用于负载均衡式的承担高并发的读访问请求,并且可以作为分布式结构,保障数据安全性。

下面是它读写分离的详细过程:

(1)节点部署与集群组网首先运维人员在多台物理机上分别部署 MySQL 服务,配置成主从复制架构;再通过 Apache ShardingSphere-Proxy 这类数据库中间件,将这些节点连接成一个统一的集群网络。

(2)透明化访问与请求中转每一个客户端看似直接连接到了 MySQL 服务器,实际上连接的都是 Proxy 虚拟出来的逻辑数据库。客户端发送的所有 SQL 请求,都必须经过 Proxy 的中转,才能传递到背后真实的数据库节点中。

(3)读写分离与负载均衡Proxy 会自动将客户端请求分为两类:写请求(INSERT/UPDATE/DELETE)和读请求(SELECT)。它会将所有写请求只转发给主节点服务器;而把读请求以负载均衡的方式,分发到多个从节点上执行,实现读写分离。

(4)主节点日志记录与推送主节点执行写操作后,会将数据变更记录到自身的 **Binary Log(二进制日志)中;主节点上的 Binlog Dump 线程(主节点为每一个从节点连接都生成一个线程,类似订阅设计模式),会实时读取这些日志,并推送给从节点。

(5)从节点日志接收与回放而从节点一方面需要接收主节点的数据信息、另一方面需要处理客户端的请求,所以从节点也是多线程设计,于是Binlog Dump线程会把二进制日志推送给从节点的 I/O 线程。从节点的 I/O 线程收到日志后,先写入本地的Relay Log(中继日志)** 暂存,再由从节点的 SQL 线程读取并回放这些日志,最终在从节点上执行与主节点相同的写操作,实现数据同步。

(5)冗余设计的收益从这样的设计中可以发现:每一个从节点都会被同步成与主节点完全一致的数据,存在一定的数据冗余开销。但这种冗余是工程上的必要取舍:它不仅能大幅提升读请求的并发处理能力,还提供了数据备份和故障恢复的能力,用少量磁盘空间开销换取了性能与可靠性的双重收益,是非常值得的设计。

(2)数据库分片(分库分表):写性能的提升

        读写分离虽然解决了读性能瓶颈,但当业务规模进一步扩大,主节点的写性能、单库单表的容量上限会成为新的瓶颈,这时就需要引入数据库分片。所以读写分离可以简单的提升读性能,而数据库分片则是为了提升写性能而出现的。

        只要是数据库分片,不论是分库还是分表,都会增大主节点个数,从而提升写性能。

  • 核心思想:由原来每个数据库服务中保存完整的全量数据,拆分为每个数据库服务只保存一部分数据(分片),多个数据库服务共同组成一份完整的数据。
  • 通俗理解:就像把一本厚厚的百科全书,拆分成 A-M、N-Z 两本分册,不同的用户查询会被分发到对应的分册中,每本分册的压力都大幅降低。

        其中数据库分片可以分为垂直分片和水平分片,他们各自有各自的优点。一般来说随着业务量的增大,首先会采用垂直分片的架构,再当数据量过大,一个库存不下或查询效率太低才会进一步引入水平分片。

2.1垂直分片(分库)

        把一个超市拆成生鲜区、日用品区、零食区,每个区只卖一类商品。

  • 逻辑:按业务模块拆分,比如把用户库、订单库、商品库拆分成独立的数据库实例。
  • 解决的问题:单库表数量过多、不同业务模块互相影响的问题,实现业务解耦。

2.2水平分片(分表)

        把一个 1000 万用户的 “大超市”,拆成 4 个小超市,每个小超市服务 250 万用户,用户按 ID 分布在不同超市。

  • 逻辑:按数据规则拆分,比如按用户 ID 哈希取模,把用户数据分散存储到多个分片节点中。
  • 解决的问题:单表数据量过大(如千万级 / 亿级)导致的查询、写入性能下降问题。

三、Docker

        既然我们要学习集群架构,那么理论上需要多台机器。但在学习环境中,我们不可能为了练手就准备好几台物理服务器,成本太高,也不方便反复搭建和销毁。

        这时候,Docker 就成了我们的 “神器”。它的核心价值,就是帮我们用一台电脑,模拟出一整个集群

        简单来说,Docker可以理解成一个轻量级的迷你服务器,即一台Ubuntu机器。但重要的是,Docker是极其轻量化的服务器,他占用的资源非常少,比Vmware开的虚拟机要轻量很多,一台家用笔记本可以轻松带动多个Docker容器。

  • 每个容器都有自己独立的 IP、端口、文件系统和进程空间,和真实的服务器一样可以配置网络、启动服务;
  • 多个容器可以同时运行在一台物理机 / 虚拟机上,互相之间完全隔离,互不干扰;
  • 启动一个容器只需要几秒钟,占用资源极少,一台普通电脑跑三五个 MySQL 容器完全没有压力。

        关于Docker我们不需要过多了解,直接在网上搜索安装教程,一步步安装即可,在数据库这门课中我们只需要学会使用Docker,其背后的原理不需要学习。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐