目标
Ø 掌握数据库的大数据处理方案和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 名称