目标
Ø 掌握数据库的大数据处理方案和HA
Ø 掌握为什么需要数据库中间件,何为数据库中间件
Ø 掌握不同场景所需的数据库中间件特性
Ø 掌握数据库中间件设计要点
核心概念理解和工作原理
回顾
应对大数据和高并发的处理,在分库分表之后,如何解决对DAO层数据访问的影响
对数据库中间件的能力要求很高
Ø 1 要能解析SQL
Ø 2 能支持读写分离
Ø 3 能支持从库读的负载均衡
Ø 4 支持分库操作
Ø 5 支持分表操作
Ø 6 支持跨库关联查询
Ø 7 对事务处理的支持
Ø 8 主键ID生成
Ø 9 数据源管理
Mycat版本说明
Ø Mycat-mini-monitor项目开源了,又一款Mycat监控!
Ø Mycat-mini-monitor-1.0.0 版本发布
Ø Mycat-server-1.6.6-release 版本发布
Ø Mycat-server-1.6.6-test 版本发布
Ø Mycat-server-1.6-release 版本发布
Ø Mycat-server-1.5-release 版本发布
Ø Mycat-server-1.4-release 版本发布
Ø Mycat-server-1.3-release 版本发布
Ø Mycat-web(eye) 版本发布
Mycat工作原理
Mycat 的原理: ‚拦截‛,它拦截了用户发送过来的SQL 语句,首先解析SQL 语句,做一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL 发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户;
Mycat架构
核心概念
数据库中间件:对应用,mycat就是数据库服务,mycat是后端数据库集群的代理
逻辑概念:
Ø 逻辑库:mycat数据库服务中定义、管理的数据库
Ø 逻辑表:逻辑库中包含的需分库分表存储的表
Ø dataNode:数据节点(分片节点),逻辑表分片的存放节点。
Ø dataHost: 数据主机(节点主机),数据节点所在的主机。
物理概念
Ø writeHost:写主机,真实的数据库服务主机描述
Ø readHost:读主机,真实的数据库服务主机描述
schema.xml
<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>
schema配置-schema
逻辑库 schema
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
</schema>
</mycat:schema>
MyCat 可以有多个逻辑库,每个逻辑库都有自己的相关配置。 如果不配置schema 标签,所有的表配置,会属于同一个默认的逻辑库。
schema配置-schema元素属性说明
schema配置-table
逻辑表 table
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
<table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" />
<table name="customer" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile">
<childTable name="orders" primaryKey="ID" joinKey="customer_id" parentKey="id">
<childTable name="order_items" joinKey="order_id" parentKey="id" />
</childTable>
</table>
</schema>
Table标签定义了MyCat中的逻辑表,所有需要拆分的表都需要通过这个标签定义。
schema配置-table元素属性说明
schema配置-childTable标签
<table name="customer" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile">
<childTable name="orders" primaryKey="ID" joinKey="customer_id" parentKey="id">
<childTable name="order_items" joinKey="order_id" parentKey="id" />
</childTable>
</table>
childTable 标签用于定义E-R 分片的子表,通过标签上的属性与父表进行关联。
schema配置-dataHost
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="localhost:3306" user="root" password="123456">
<!-- can have multi read hosts -->
<readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" />
</writeHost>
</dataHost>
dataHost定义Mycat中的数据主机,数据主机定义中定义了具体的数据库服务、读写分离配置 和心跳语句。这是与物理数据库服务关联的地方。
schema配置-dataHost元素属性说明
schema配置-heartbeat
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql"
dbDriver="native" switchType="1"slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="localhost:3306" user="root" password="123456">
<!-- can have multi read hosts -->
<readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" />
</writeHost>
</dataHost>
1. 这个标签内指明用于和后端数据库进行心跳检查的语句
如:MYSQL 可以使用select user(),Oracle 可以使用select 1 from dual 等。
2. 这个标签还有一个connectionInitSql 属性,主要是当使用Oracle数据库时,需要执行的初始化SQL语句就放到这里。
如:alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'
3.主从切换的语句必须是:show slave status
schema配置-writeHost readHost
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1"
slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="localhost:3306" user="root" password="123456">
<!-- can have multi read hosts -->
<readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" />
</writeHost>
</dataHost>
这两个标签都指定后端数据库的相关配置给mycat,用于实例化后端连接池。writeHost 指定写实例、readHost 指定读实例。
在一个dataHost 内可以定义多个writeHost 和readHost。但是,如果writeHost 指定的后端数据库宕机,那么这个writeHost 绑定的所有readHost 都将不可用。另一方面,由于这个writeHost 宕机系统会自动的检测到,并切换到备用的writeHost 上去。
schema配置-writeHost readHost属性说明
加密密码,执行mycat jar 程序(1.4.1 以后)
java -cp Mycat-server-1.4.1-dev.jar io.mycat.util.DecryptUtil 1:host:user:password
Mycat-server-1.4.1-dev.jar 为mycat download 下载目录的jar
1:host:user:password 中1 为db 端加密标志,host 为dataHost 的host 名称
Mycat如何解决分库分表带来的挑战
挑战的解决思路
第一原则:能不切分尽量不要切分
第二原则:如果要切分一定要选择合适的切分规则,提前规划好。
第三原则:数据切分尽量通过数据冗余或表分组(Table Group)来降低跨库Join 的可能。
第四原则:由于数据库中间件对数据Join实现的优劣难以把握,而且实现高性能难度极大,业务读取尽量少使用多表Join。
Mycat解决分库分表的难点实战
Mycat中表分类
分片表
分片表,是指那些有很大数据,需要切分到多个数据库的表,这样每个分片都有一部分 数据,所有分片构成了完整的数据。
<table name="t_goods" primaryKey="vid" autoIncrement="true" dataNode="dn1,dn2" rule="rule1" />
非分片表
一个数据库中并不是所有的表都很大,某些表是可以不用进行切分的,非分片是相对分 片表来说的,就是那些不需要进行数据切分的表。
<table name="t_node" primaryKey="vid" autoIncrement="true" dataNode="dn1" />
ER表
Mycat 中的ER 表是基于E-R 关系的数据分片策略,子表的记录与所关联的父表记录存放 在同一个数据分片上,保证数据Join 不会跨库操作。
ER分片是解决跨分片数据join 的一种很好的思路,也是数据切分规划的一条重要规则。
<table name="customer" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile">
<childTable name="orders" primaryKey="ID" joinKey="customer_id" parentKey="id">
<childTable name="order_items" joinKey="order_id" parentKey="id" />
</childTable>
</table>
全局表
一个真实的业务系统中,往往存在大量的类似字典表的表,数据量不大,这些表基本上很少变动。
问题:业务表往往需要和字典表Join查询,当业务表因为规模而进行分片以后,业务表与字典表之间的关联跨库了。
解决:Mycat中通过表冗余来解决这类表的join,即它的定义中指定的dataNode上都有一份该表的拷贝。(将字典表或者符合字典表特性的表定义为全局表。 )
<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
分片规则
在conf/rule.xml中定义分片规则
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="rule1">
<rule>
<columns>id</columns>
<algorithm>func1</algorithm>
</rule>
</tableRule>
<function name="func1" class="io.mycat.route.function.PartitionByLong">
<property name="partitionCount">8</property>
<property name="partitionLength">128</property>
</function>
</mycat:rule>
Mycat的分片规则参照 官方手册《Mycat-权威指南》
Mycat架构实践方案
Mycat高可用方案
Mycat监控介绍
Mycat-web(eye)
支持对Mycat、Mysql性能监控
支持对Mycat的JVM内存提供监控服务
支持对线程的监控
支持对操作系统的CPU、内存、磁盘、网络的监控
现在还有 Mycat-mini-monitor
参考课件:
Mycat分库分表.pdf
Mycat最佳实践.pdf
来源:oschina
链接:https://my.oschina.net/u/3728166/blog/3137566