存儲-海量數據-(mycat核心概念以及進階)

目標

Ø 掌握數據庫的大數據處理方案和HA
Ø 掌握爲何須要數據庫中間件,何爲數據庫中間件
Ø 掌握不一樣場景所需的數據庫中間件特性
Ø 掌握數據庫中間件設計要點java

 

核心概念理解和工做原理

回顧

應對大數據和高併發的處理,在分庫分表以後,如何解決對DAO層數據訪問的影響node

對數據庫中間件的能力要求很高mysql

Ø 1 要能解析SQL
Ø 2 能支持讀寫分離
Ø 3 能支持從庫讀的負載均衡
Ø 4 支持分庫操做
Ø 5 支持分表操做
Ø 6 支持跨庫關聯查詢
Ø 7 對事務處理的支持
Ø 8 主鍵ID生成
Ø 9 數據源管理web

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) 版本發佈sql

Mycat工做原理

Mycat 的原理: ‚攔截‛,它攔截了用戶發送過來的SQL 語句,首先解析SQL 語句,作一些特定的分析:如分片分析、路由分析、讀寫分離分析、緩存分析等,而後將此SQL 發日後端的真實數據庫,並將返回的結果作適當的處理,最終再返回給用戶;數據庫

Mycat架構

核心概念

數據庫中間件:對應用,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配置-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

相關文章
相關標籤/搜索