文章目录
前言
你知道Mysql 的集群吗,你了解主从复制的过程吗,当海量数据出现你们是怎么处理的。本文重点对面试的问题进行介绍,祝愿每位程序员都能上岸!!!
一、Mysql 的集群
在线上环境我们一般要部署1主1从,或者1主多从的Mysql 实例,来实现Mysql 的高可用和读写分离;Mysql 主从同步是通过binlog 日志进行的。
1.1 Mysql 集群的搭建:
关于Mysql 主从集群的搭建,可以参考博主下面的文章
1.2 主从同步过程:
二、Mysql 怎么应对海量数据存储
Mysql 作为关系型数据的存储,单个表的数据量在超过3千万的时候,会出现性能瓶颈;同样的mysql 的一个单例支持的客户端连接和并发量是有一定的瓶颈的;此时系统就需要考虑使用分库分表的技术来实现。
2.1 垂直拆分
2.1.1 垂直分库:
如现在的微服务都已经做到了垂直拆分,每个微服务模块可能都连接自己的Mysql 数据库实例,它的特点是以表为依据,根据业务将不同表拆分到不同库中,按业务对数据分级管理、维护、监控、扩展;在高并发下,提高磁盘I0和数据量连接数;
2.1.2 垂直分表:
以字段为依据,根据字段属性将不同字段拆分到不同表中。可以做到:冷热数据分离;减少IO过渡争抢,两表互不影响
2.2 水平拆分:
2.2.1 水平分库:
将一个库的数据拆分到多个库中。解决了单库大数量,高并发的性能瓶颈问题,提高了系统的稳定性和可用性。
2.2.2 水平分表:
将一个表的数据拆分到多个表中(可以在同一个库内)。优化单一表数据量过大而产生的性能问题;避免IO争抢并减少锁表的几率;
2.3 你们项目中有使用过分库分表吗:
我们在spring-cloud 管理的spring-boot 中按照不同的业务分别建立了数据库实例,进行了垂直分库。为了应对海量数据的存储,我们项目还使用了Mycat 中间件进行了分库分表。
Mycat的安装和Spring-boot 集成:
2.4 分库分表时你们有遇到过什么技术挑战吗
分库分表后,因为数据会被存放到多个数据库的多个表中中,所以就会遇到分布式事务;分布式全局id,路由规则的设置,跨节点分页的问题;
- Mycat 设置了许多的分片规则,如:取模,范围,枚举,ER 分片等,分片规则可以参考:分库分表篇-2.2 Mycat-分片规则
- 对于分布式事务,Mycat1.6版本之后已经通过2阶段提交解决了分布式事务,并且也支持使用雪花算法生成主键id 可以参考:分库分表篇-2.4 springBoot 集成Mycat(1.6) 分库分表,读写分离,分布式事务
- Mycat 提供了E-R 分片来确保相同关联关系的数据会被分配到同一个数据库,来尽可能避免跨节点的查询;对于跨节点的分页,Mycat 会将sql 发送到多个Mysql 实例,并最后将结果进行汇总返回;
总结
本文对Mysql 集群,及分库分表的一些面试问题进行了梳理。