Ø 掌握數據庫的大數據處理方案和HA
Ø 掌握爲何須要數據庫中間件,何爲數據庫中間件
Ø 掌握不一樣場景所需的數據庫中間件特性
Ø 掌握數據庫中間件設計要點java
應對大數據和高併發的處理,在分庫分表以後,如何解決對DAO層數據訪問的影響node
對數據庫中間件的能力要求很高mysql
Ø 1 要能解析SQL
Ø 2 能支持讀寫分離
Ø 3 能支持從庫讀的負載均衡
Ø 4 支持分庫操做
Ø 5 支持分表操做
Ø 6 支持跨庫關聯查詢
Ø 7 對事務處理的支持
Ø 8 主鍵ID生成
Ø 9 數據源管理web
Ø 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) 版本發佈sql
Mycat 的原理: ‚攔截‛,它攔截了用戶發送過來的SQL 語句,首先解析SQL 語句,作一些特定的分析:如分片分析、路由分析、讀寫分離分析、緩存分析等,而後將此SQL 發日後端的真實數據庫,並將返回的結果作適當的處理,最終再返回給用戶;數據庫
數據庫中間件:對應用,mycat就是數據庫服務,mycat是後端數據庫集羣的代理後端
邏輯概念:緩存
Ø 邏輯庫:mycat數據庫服務中定義、管理的數據庫
Ø 邏輯表:邏輯庫中包含的需分庫分表存儲的表
Ø dataNode:數據節點(分片節點),邏輯表分片的存放節點。
Ø dataHost: 數據主機(節點主機),數據節點所在的主機。網絡
物理概念session
Ø 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
<?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 標籤,全部的表配置,會屬於同一個默認的邏輯庫。
邏輯表 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中的邏輯表,全部須要拆分的表都須要經過這個標籤訂義。
<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 分片的子表,經過標籤上的屬性與父表進行關聯。
<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中的數據主機,數據主機定義中定義了具體的數據庫服務、讀寫分離配置 和心跳語句。這是與物理數據庫服務關聯的地方。
<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
<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 上去。
加密密碼,執行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 名稱
第一原則:能不切分儘可能不要切分
第二原則:若是要切分必定要選擇合適的切分規則,提早規劃好。
第三原則:數據切分儘可能經過數據冗餘或表分組(Table Group)來下降跨庫Join 的可能。
第四原則:因爲數據庫中間件對數據Join實現的優劣難以把握,並且實現高性能難度極大,業務讀取儘可能少使用多表Join。
分片表
分片表,是指那些有很大數據,須要切分到多個數據庫的表,這樣每一個分片都有一部分 數據,全部分片構成了完整的數據。
<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-web(eye)
支持對Mycat、Mysql性能監控
支持對Mycat的JVM內存提供監控服務
支持對線程的監控
支持對操做系統的CPU、內存、磁盤、網絡的監控
如今還有 Mycat-mini-monitor
參考課件:
Mycat分庫分表.pdf
Mycat最佳實踐.pdf