分布式数据访问基础
数据处理分类
海量数据处理,按使用场景,主要分为两类:
- 联机事务处理OLTP(On-line Transaction Processing)
类似实时处理
- 联机分析处理OLAP(On-line Analytical Processing)
类似离线分析
两者对比如下:
常用数据库分类
传统数据库:
- oracle
- mysql
- ms sqlserver
- db2
NoSQL数据库:
- 临时性键值存储:redis、memcached
- 永久性键值存储:ROMA、Redis
- 面向文档存储:MongoDB、 CouchDB
- 面向列存储:Cassandra、HBase
两类数据库对比:
分库分表
对高并发、大数据场景下的各种问题,我们有一个很朴素的处理思想分而治之
分库分表是面向高并发、大数据量的背景下数据访问的一种解决方案
分库分表的目的:分散单台设备负载压力
在实际生产经验中,对于单表:
- 几万到百万级数据,使用常用的关系型数据库就能拥有很好性能
- 300万左右级别,oracle可以很好胜任,包含比较糟糕的表设计
- 当达到600万+数据量,传统数据库出现较明显性能降低现象,通过优化表结构、数据库设计,sql优化也可以较好解决问题
- 当数据量到800w-1000w+,紧紧通过一些优化措施已经不能解决数据访问性能问题,这个是由于单台机器的IO,CPU等硬件资源的制约,这时候就需要进行单机节点到多机节点的分布式处理
分库分表的基本思想:数据切分
两种切分模式:
- 垂直(纵向)切分
一般单表字段不能多于255个
多字段单表,可根据业务字段分类,拆分成多表,分布在多个不同机器
多个不同表,拆分到不同的机器(数据库)上
- 水平(横向)切分
同一张大量数据的表,根据某种条件拆分成多份数据,分布在多个机器(数据库)上
两种模式可单独进行,也可以同时使用,根据实际需要。
两种切分模式比较:
分库分表组建有哪些
OneProxy 收费 有条件的话,可以试试
github开源项目:
atlas、cobar、tddl、oceanus长时间无更新,社区不活跃不推荐
vitess:YouTube开源项目、英文不是障碍推荐
Sharding-JDBC:社区较活跃,现已作为Apache开源项目 属于JDBC驱动版直接应用集成,也有Sharding-Proxy版本,推荐
mycat:社区活跃,属于Proxy版本,推荐
选用驱动型和Proxy型,根据实际取舍
JDBC 驱动版的优点:
- 轻量级,仅仅是JDBC增强,不包括 HA、事务以及数据库元数据管理
- 开发的工作量较小,无需关注NIO,各个数据库协议等
- 运维无需改动,无需关注中间件本身的 HA
- 性能高,JDBC 直连数据库,无需二次转发
- 可支持各种基于 JDBC 协议的数据库,如:MySQL,Oralce,SQLServer
Proxy 版的优点:
- 可以负责更多的内容,将数据迁移,分布式事务等纳入 Proxy 的范畴
- 更有效的管理数据库的连接
- 整合大数据思路,将 OLTP 和 OLAP 分离处理
目前常用的分库分表中间件对比: