海量数据存储解决方案之分库分表原理解析及mycat安装及使用
Posted 踩踩踩从踩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了海量数据存储解决方案之分库分表原理解析及mycat安装及使用相关的知识,希望对你有一定的参考价值。
前言
上篇文章主要介绍的海量数据的简介,介绍传统的数据库及nosql数据库;如何使用分区进行对数据库数据进行缓解压力,但是单单利用分区进行缓解,远远不够;效率还是达不到生产使用。这篇文件开始介绍比较常用,也是我在项目中使用的分库分表对海量数据存储的另一种解决方案,如果真的想解决tb级别的,还是得使用clickhouse mongdbdb等列式数据库,这个会在后面进行解析。
用分区,提升数据库的性能
海量数据分片之分库分表
但平常中,解决这种方式采用分片 之分库分表的方式;更不能采用多主多从
分片
分库
按业务模块垂直拆分
优点:
- 拆分后业务清晰,拆分规则明确;
- 系统之间整合或扩展容易;
- 数据维护简单。
- 部分业务表无法join,只能通过接口方式解决, 提高了系统复杂度;
- 受每种业务不同的限制存在单库性能瓶颈,不易 数据扩展跟性能提高;
- 事务处理复杂。
多表 ,特别式分库过后的表 并且 group by 在加聚合函数等都会出现问题, 一般数据库中间件都会现在分库中 group by 在进行函数,这就会出现问题的。 因此 需要先group by完毕,在进行函数处理。
这都是我在项目中出现的问题。
而且事务处理的话,麻烦的情况。
分表
分表又叫水平切分,它不再将数据根据业务逻辑分类,而是通过某个字段(或某几个字段),根据某种
规则或逻辑,将一个表的数据拆分成多份,分别存储在多个表结构一样的表中,这多个表可以存在一到
多个库中,每个分片仅包含数据的一部分。
- 垂直分表:将本来可以在同一个表的内容,划分为多个表。(按照关系型数据库的第三范式要求,是应该在同一个表的。)
- 水平分表:是把一个表复制成同样表结构的不同表,然后把数据按照一定的规则划分,分别存储到这些表中,从而保证单表的容量不会太大,提升性能;当然这些结构一样的表,可以放在一个或多个数据库中。
- 拆分规则抽象好,join 操作基本可以数据库做;
- 不存在单库大数据,高并发的性能瓶颈;
- 应用端改造较少;
- 提高了系统的稳定性跟负载能力。
- 拆分规则难以抽象;
- 分片事务一致性难以解决;
- 数据多次扩展难度跟维护量极大;
- 跨库join 性能较差。
分片规则
水平对数据进行拆分最重要的是分片规则—拆分规则
可以如何来拆分?
范围:时间、数值;
列表:按地域、按组织、分类;
散列:hash(某个字段) % 分片数、一致性hash; 复合多种方式。
按照时间进行拆分, 也好数值拆分,一旦涉及到分库过后,进行很多函数就会有问题。不只是效率慢,有可能导致数据都不正确了。
数据库中间件
分库分表会出现的难点
- 分布式事务的问题;
- 跨节点Join的问题;
- 跨节点合并排序分页问题;
- 多数据源管理问题。
- 要能解析SQL
- 能支持读写分离
- 能支持从库读的负载均衡
- 支持分库操作
- 支持分表操作
- 支持跨库关联查询
- 对事务处理的支持
- 主键ID生成
- 数据源管理
两种实现模式
分为客户端模式和服务端代理模式
客户端
服务端模式
解决业务场景,最多的还是mycat的把,但是根据不同的功能,支持性,以及解决分库分表问题的支撑度来选择。
Mycat
MyCAT 是一个彻底开源的,面向企业应用开发的“大数据库集群” 支持事务、ACID、可以替代mysql的加强版数据库 ? 一个可以视为“Mysql”集群的企业级数据库,用来替代昂贵的Oracle集群 ? 一个融合内存缓存技术、Nosql技术、HDFS大数据的新型SQL Server ? 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品 ? 一个新颖的数据库中间件产品。
- 一个彻底开源的,面向企业应用开发的大数据库集群
- 支持事务、ACID、可以替代MySQL的加强版数据库
- 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
- 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
- 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
- 一个新颖的数据库中间件产品。
关键特性
支持前端作为MySQL通用代理
后端JDBC方式支持Oracle,DB2,SQL Server,mongodb,巨杉
基于心跳的自动故障切换,支持读写分离
支持MySQL Cluster,Galera,Percona,cluster集群
支持数据的多片自动路由与聚合
支持sum,count,max等常用的聚合函数,支持跨库分页
支持库内分表,支持单库内部任意join全局表,支持跨库2表join
基于caltlet的多表join
支持通过全局表,ER关系的分片策略,实现了高效的多表join查询
支持多租户方案
支持弱XA,XA分布式事务
支持全局序列号,解决分布式下的主键生成问题
分片规则丰富,插件化开发,易于扩展
支持命令行监控,支持密码加密,支持IP白名单
支持SQL黑名单、sql注入攻击拦截
支持prepare预编译指令
支持非堆内存(Direct Memory)聚合计算
支持oracle存储过程,out参数
支持zookeeper协调主从切换、zk序列、配置zk化
Mycat 安装
环境准备
1 JDK1.7+ Mycat是用java开发
2 MySQL统一5.7 镜像地址: http://mirrors.163.com/mysql/Downloads/MySQL- 5.7/mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar
3 Mycat安装包 下载地址: http://dl.mycat.io 当前最新版本:1.6.6.1
1 源码方式导入到IDE,源码地址:https://github.com/MyCATApache/Mycat-Server
2 安装包方式安装,下载地址: http://dl.mycat.io
解压过后
- /etc/profile/ 配置环境变量
- 基本关键的 logs包 及 lib bin包
- bin下面就存在包括 window 和linux版本
- 其中比较重要的 rule.xml 以及server.xml schema.xml;定义 规则,以及数据源 的配置文件。
启动 mycat包
- 连接mycat 在server.xml中有端口号及 用户名等信息
并且在testdb中会创建默认的表信息数据
核心概念
schema.xml
- 逻辑库:mycat数据库服务中定义、管理的数据库
- 逻辑表:逻辑库中包含的需分库分表存储的表
- dataNode:数据节点(分片节点),逻辑表分片的存放节点。
- dataHost: 数据主机(节点主机),数据节点所在的主机。
-
writeHost:写主机,真实的数据库服务主机描述
-
readHost:读主机,真实的数据库服务主机描述
<mycat:schema>
<schema name="testdb">
<table name="orders" primaryKey="ID"
type="global" dataNode="dn1,dn2" />
</schema>
<dataNode name="dn1" dataHost="dhost1" database="db1" />
<dataHost name="dhost1" ...>
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="localhost:3306"...>
<readHost host="hostS2" url="192.168.1.2:3306".../>
</writeHost>
</dataHost>
</mycat:schema>
<mycat:server xmlns:mycat="http://io.mycat/">
<user name="user">
<property name="password">user</property>
<property name="schemas">mydb1</property>
<property name="readOnly">false</property>
</user>
</mycat:server>
rule.xml
配置对应的规则 包括 mod-long 根据 uuid 取模
分库分表的优缺点和原则
分片优点
- 解决磁盘系统最大文件限制,比如常见的有:
- 减少增量数据写入时的锁对查询的影响,减少长时间查询造成的表锁,影响写入操作等锁竞争的情况, 节省排队的时间开支,增加呑吐量。
- 由于单表数量下降,常见的查询操作由于减少了需要扫描的记录,使得单表单次查询所需的检索行数变少,减少了磁盘IO,时延变短。
分库原则
- 若划归到一起的表关系紧密,且数据量并不大,增速也非常缓慢,则适宜放在一起,不需要再进行水平切分;
- 若划归到一起的表的数据量巨大且增速迅猛,则势必要在分库的基础上再进行分表,这就意味着原单一的库还可能会被拆分成多个库,这会导致更多的复杂性,一开始最好就要考虑进去
分表原则
可以如何来拆分?
- 范围:时间、数值;
- 列表:按地域、按组织、分类;
- 散列:hash(某个字段) % 分片数、一致性hash;
- 复合多种方式。
以上是关于海量数据存储解决方案之分库分表原理解析及mycat安装及使用的主要内容,如果未能解决你的问题,请参考以下文章