浅析分布式数据库中间件DDM

DDM是华为云Paas推出的分布式数据库中间件,作为Mysql的辅助,提供分库分表、读写分离等功能,有效解决单库性能瓶颈。文章探讨了SQL与NoSQL的选择,以及关系型数据库在高并发场景下的挑战,介绍了DDM如何通过智能分片、自动扩容和保证事务一致性来提升系统QPS。

前言

DDM是什么?这是华为云Paas推出的分布式数据库中间件,DDM(Distributed Database Middleware)是一个实现了Mysql协议栈的服务器,前端用户可以把它看做一个数据库代理,用Mysql客户端工具和命令行访问,而DDM后端连接一到多个Mysql Server。因此,DDM本身并不存储数据,数据是在后端连接的Mysql Server上存储的。简单来说,DDM就是Mysql的最佳伴侣,一定程度上让Mysql拥有了跟Oracle PK的能力。这样听起来DDM好像是Mysql的辅助大神,这里有必要对八卦下DDM发展背景,了解下DDM的前世历程。

 

NoSQL与SQL之争

目前,互联网常有海量数据高并发和存储的场景,对于数据的存储,目前有基于SQL (Structured Query Language)的关系型数据库和NoSQL(Not Only SQL)的非关系型数据库。SQL数据存在特定结构的表中;而NoSQL则更加灵活和可扩展,存储方式可以是JSON文档、哈希表或者其他方式,比如键值存储(redis,ROMA,Memcached)数据库应用在排行更新,会话保存,面向文档的数据库(mongoDB、couchDB)应用在日志记录,面向列的数据库(Cassandra、HBase)在博客中的应用。而且速度极高。

 

虽然在云计算时代,传统数据库存在着先天性的弊端,但是NoSQL数据库只能在特定场景下有奇效,只能作为传统数据的补充而不能将其替代。

 

关系型数据库性能瓶颈

目前绝大多数数据库不具备自动扩展,自动迁移的能力,对于单库单表性能瓶颈明显,当单表超过1000W数据量,性能会出现比较明显的下降。为了解决该难题,常见的做法就是进行分库分表来规避。

 

垂直分库:可按照业务模块进行划分,把数据分在不同的库中。

### 分布式消息中间件概述 分布式消息中间件是一种用于在分布式系统中传递消息的软件工具,其核心目标是解耦系统的不同模块并提高系统的可扩展性和可靠性。常见的分布式消息中间件有 Apache Kafka、RabbitMQ 和 RocketMQ 等。 #### 原理分析 分布式消息中间件的工作原理主要基于发布/订阅模式和点对点模式两种通信方式。其中,RocketMQ 是一种高性能的消息队列系统,支持高吞吐量和低延迟的消息传输[^1]。它通过 Producer 将消息发送到 Broker 中间节点,Consumer 则从 Broker 订阅这些消息。这种设计使得生产者和消费者之间无需直接交互即可完成数据交换。 #### 架构组成 根据参考资料中的描述,RocketMQ 的架构由多个关键组件构成,主要包括 Namesrv(名称服务器)、Broker(消息代理)、Producer(消息生产者)以及 Consumer(消息消费者)。具体来说: - **Namesrv**: 负责管理元数据信息,提供路由查询服务给 Producers 和 Consumers 使用[^2]。 - **Broker**: 存储实际的消息内容,并处理来自客户端的各种请求操作。 - **Producer & Consumer**: 完成消息生产和消费的功能逻辑实现。 此外,在更复杂的场景下还可能涉及到其他辅助角色如 SchedulerService 或 MonitorService 来增强整个平台的能力范围。 #### 实现细节探讨 对于像 DDM 这样的分布式数据库中间件而言,其实现在很大程度依赖于良好的路由算法来决定每条 SQL 请求应当被定向至哪个具体的物理分片之上执行[^3] 。而在消息领域内同样存在类似的考量因素——即如何高效准确地将特定类型的数据包投递给预定的目标群体成员之一或者全体成员共同接收处理。 以下是有关 rocketmq 生产环境部署的一个简单 python demo 示例代码片段展示: ```python from rocketmq.client import PushConsumer, ConsumeStatus def consume_message(msg): print(f"Received message: {msg.body.decode('utf-8')}") return ConsumeStatus.CONSUME_SUCCESS consumer = PushConsumer("example_group") consumer.set_name_server_address("localhost:9876") consumer.subscribe("TestTopic", "*", consume_message) consumer.start() print("Consumer started.") while True: pass ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值