首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

系统架构师论文-论分布式数据库的设计与实现

本文通过XXX高速公路收费系统(以下简称收费系统),来论述分布式数据库的设计与实现。收费系统是我公司近年来接的较为大型的项目,管理结构为三层结构:公司级、收费中心级、收费站级,各级之间即可独立的完成自身业务,又有自上而下的管理关系。收费中心、收费站均为三层C/S结构,公司级采取B/S结构。该系统的数据库也按照三层来设计,收费站存放本站的所有流水数据,收费中心存放所有数据,公司本部存放查询用汇总数据,收费站与收费中心使用事务复制来同歩数据,而收费中心与公司本部使用快照复制来同歩数据,并且使用分级的方法来测试收费站、收费中心与公司本部之间的数据同歩。 在本项目的开发过程中,我担任了数据库的设计工作。

01

支撑百万并发的数据库架构如何设计?

看到这个题目,很多人第一反应就是:分库分表啊!但是实际上,数据库层面的分库分表到底是用来干什么的,其不同的作用如何应对不同的场景,我觉得很多同学可能都没搞清楚。 用一个创业公司的发展作为背景引入—— 假如我们现在是一个小创业公司,注册用户就 20 万,每天活跃用户就 1 万,每天单表数据量就 1000,然后高峰期每秒钟并发请求最多就 10。 天呐!就这种系统,随便找一个有几年工作经验的高级工程师,然后带几个年轻工程师,随便干干都可以做出来。 因为这样的系统,实际上主要就是在前期进行快速的业务功能开发,搞一个单块系统部署在一台服务器上,然后连接一个数据库就可以了。 接着大家就是不停地在一个工程里填充进去各种业务代码,尽快把公司的业务支撑起来。 如下图所示:

03

记一次mysql数据库cpu暴涨100%事故

在公司监控大盘上看到了我负责的项目的数据库服务器CPU达到100%了, 于是紧急排查问题。仔细的看了一下监控大盘,发现时间从下午3点47分起就开始迅速上升到满cpu的情况,并且持续了23分钟,之后又断断续续的满cpu,每次持续时间大概在几分钟到10分钟左右。第一反应是想到是不是服务器有什么错误日志没输出,检查了elk中的错误,没有错误异常。第二个排查的地方是检查从3点47分起开始的访问量看看是不是并发比较高,发现访问量也是正常的,qps大概在60左右。于是下去找运维要一份数据库的慢sql,但是运维还没看到有慢sql(这点不清楚运维的慢sql是怎么记录日志的,按道理是应该有慢sql)。于是通过show processlist查询到了大概4,5条正在执行的查询。发现用户是我们yearning的用户,而不是应用的用户,并且query_start的起始时间距离现在也差不多在7,8分钟左右。将该sql展开发现是一个在yearning上面执行的inner join,我们是有分表的措施的,将数据按照不同企业维度分摊到10个表。平均一张表大概在10万左右的数据量,同事执行的inner join查询通过explain关键词分析发现该语句笛卡尔积之后的扫描行数足足有6亿行,最后筛选出了89行符合要求的数据。跟同事沟通了一下才发现是他执行的复杂查询。让运维帮忙kill掉查询语句后,数据库cpu恢复正常。

01
领券