- 來源:https://blog.csdn.net/yun6713/article/details/103375066
- 3,Mycat中的概念
- 4,快速入門
- 6 Mycat防火牆配置
- 7 Mycat配置
- 8 Mycat的分片join
- 9 全局序列號
- 10 Mycat分片規則
- 進階
3,Mycat中的概念
數據庫中間件;介於應用與數據庫之間,進行數據處理與交互的中間服務。數據庫路由,結果封裝處理。
邏輯庫;數據庫中間件可被看作一個或多個數據庫集群構成的邏輯庫。
邏輯表;邏輯庫中的表,分片表、非分片表、ER表(表分組)、全局表(表冗余)。
分片節點;分片表所在數據庫。
節點主機;數據庫主機。
分片規則;表切分規則。
全局序列號;全局唯一性標識。
多租戶;多租戶技術,多重租賃技術。多用戶環境下共用相同的系統或程序組件,並保證用戶間數據隔離。方案:獨立數據庫、共享數據庫隔離數據架構(schema)、共享數據庫數據架構(tenantId)。
4,快速入門
下載地址:http://dl.mycat.io/
解壓后,運行./bin/startup_nowrap.bat;連接:mysql -uroot -p123456 -P8066 -h127.0.0.1
安裝與配置
源碼:https://github.com/MyCATApache/Mycat-Server.git
配置文件
- ./conf/server.xml;用戶及系統變量
- ./conf/schema.xml;節點主機、分片節點、邏輯庫、邏輯表
- ./conf/rule.xml;分片規則、規則函數
源碼運行,配置vm參數:-DMYCAT_HOME=projectPath/src/main
6 Mycat防火牆配置
<firewall> <whitehost> 配置允許訪問的主機 <host user="mycat" host="127.0.0.1"></host> </whitehost> <blacklist check="true"> 配置攔截屬性,校驗sql操作 <property name="selelctAllow">false</property> </blacklist> </firewall>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
7 Mycat配置
schema.xml
管理邏輯庫、邏輯表、分片節點、節點主機配置。
配置詳解:https://blog.csdn.net/webnum/article/details/88821218
schema標簽
定義邏輯庫;屬性:
- name;邏輯庫名
- dataNode;綁定分片,未配置的邏輯表查詢綁定分片。綁定后可跨域查詢。
- checkSQLschema;刪除邏輯庫名
- sqlMaxLimit;默認最大記錄數;邏輯庫為非拆分庫時無效。
table標簽
定義邏輯表;屬性:
- name;邏輯表名
- dataNode;邏輯表所屬的dataNode。
- rule;rule.xml中分片規則名
- ruleRequired;true時必須綁定分片規則
- primaryKey;主鍵
- type;邏輯表類型。全局表(type=“global”)、普通表
- autoIncrement;主鍵自增,默認false
- subTables;分表規則。單庫多表?
- needAddLimit;記錄數限制,默認true。
childTable標簽
定義ER分片表;屬性:
- joinKey;子表關聯屬性名,確定父表所在dataNode
- parentKey;父表關聯屬性名
- name、primaryKey、needAddLimit;同上
dataNode標簽
定義分片節點、數據分片;屬性:
- name;分片節點名
- dataHost;dbms實例名
- database;具體數據庫,schema
dataHost標簽
定義DBMS實例組、讀寫分離、心跳配置;屬性:
- name;dbms實例名
- maxCon、minCon;最大連接數、最小連接數
- balance、writeType;讀操作負載均衡、寫操作負載均衡
- dbType;數據庫類型
- dbDriver;驅動類型,native(mysql)、JDBC。
- switchType;自動切換
- tempReadHostAvailable;
heartbeat標簽
定義心跳語句;屬性:
- connectionInitSql;初始化sql
- writeHost/readHost標簽,定義讀寫實例;屬性:
- host;實例名
- url、user、password;連接信息
- weight;讀節點權重
- usingDecrypt;密碼加密,默認0否。
server.xml
配置系統、用戶信息。
user標簽
定義用戶;標簽屬性:name;用戶名
常用property屬性:password、schemas、readOnly
system標簽
定義系統屬性;property子標簽。
rule.xml
tableRule標簽
定義表規則;
- name屬性;規則名
- columns子標簽;路由列列名,如不匹配則廣播
- algorithm子標簽;路由算法
function標簽
定義路由算法;
- name屬性;算法名
- class屬性;算法類
- property子標簽;算法類參數
8 Mycat的分片join
mycat跨分片join實現方式:全局表、ER分片、catletT(人工智能)
全局表
字典類表格,定義為全局表。table屬性:type=“global”
ER Join
Table Group,子表的存儲位置依賴於主表,並在物理上緊鄰存放。
table+childTable;joinKey、parentKey指定關聯屬性
Share Join
解析sql,拆分為單表執行;然后把各個節點的數據匯集起來。
直接進行join連接,按ER join執行。
格式:/!mycat:catlet=demo.catlets.ShareJoin/SQL
catlet(人工智能)
自定義處理邏輯。
9 全局序列號
全局唯一標記。system-sequenceHandlerType配置方式:
0本地文件、1數據庫、2本地時間戳、3分布式zkID、4遞增zk
server.xml
<system><property name="sequnceHandlerType">1</property></system>
- 1
總體兩種方式:遞增、時間戳。
本地文件方式
classpath:sequence_conf.properties,配置:
- GLOBAL_SEQ.HISIDS;歷史分段
- GLOBAL_SEQ.MINID;最小值
- GLOBAL_SEQ.MAXID;最大值
- GLOBAL_SEQ.CURID;當前值
使用:insert into user (id,name) values (next value for MYCATSEQ_GLOBAL,‘lkk’)
數據庫方式
讀取數據庫表,獲取序列號;表字段:name、current_value、increment
本地時間戳方式
ID=64位二進制;42(毫秒)+5(機器ID)+5(業務編碼)+12(重復累加)
每毫秒最多4096並發。
配置sequence_time_conf.properties:
- WORKID;0-31
- DATAACENTERID;0-31
分布式ZK ID生成器
規則類似本地時間戳
Zk遞增方式
規則類似本地文件
10 Mycat分片規則
數據切分原則
數據冗余、table group
全局表
所有分片都持有表實例。
join時優先選擇系統分片的全局表;數據更新時更新所有分片;select時隨機選擇分片。
ER分片表
表依賴,Table Group;子表與關聯的父表放在同一分片,避免跨庫。
多對多關聯
表A–中間表–表B;按關系偏向表分片。
采用非主鍵分片時,mycat會緩存id–node。
Mycat常用分片規則
val轉換:hash、取模
val–node映射:直接映射、范圍映射
分片枚舉
sharding-by-intfile
枚舉值直接映射到節點;適用於分片字段值固定的情況,如地域。
固定分片hash算法
rule1
划分1024個槽位,分配給各分片,sum(partitionCount[i]partitionLength[i])=1024;取id二進制低10位,映射到對應分片。
算法類似redis集群尋址。
范圍約定
auto-sharding-long
提前規划好分片字段范圍–node映射。類似分片枚舉。
取模
mod-long
批量插入時,增大事務一致性難度。
按日期分片
sharding-by-date
取模范圍約束
sharding-by-pattern
取模運算和范圍約束的結合;主要為后續數據遷移做准備。
一致性hash
sharding-by-murmur
解決分布式擴容問題。類似取模范圍約束,對232取模;232個槽位,分配到節點數虛擬倍數個節點上。增刪節點時,只有部分區間受影響。
https://blog.csdn.net/NewxCJY/article/details/82667097
…
權限控制
user標簽,readOnly、schemas
進階
1 讀寫分離
MySQL主從復制方案
主從、主從從、雙主/多主(環)
原理
1,主庫事務提交前記錄日志
2,從庫拉取主庫日志,並按日志更新本地數據。
復制方式:基於sql語句SBR、基於行RBR、混合模式MBR
Mycat支持的讀寫分離
mycat不負責數據同步;
、;寫節點、讀節點,寫節點宕機后對應讀節點不可用。第一個writeHost為主節點,其余均為從節點。
事務內部的一切操作,都走寫節點。故讀操作不要加事務。
2 高可用與集群化
MySQL高可用方案
主從復制+讀寫分離;heartbeat+雙主復制;集群;MariaDBM Galera
Mycat高可用方案
mycat將第一個writeHost當做主節點,所有DML發往此節點。
寫節點宕機后,升級下一個writeHost為主節點。
建議使用mysql主從復制+心跳檢測+讀寫分離方式,由mycat負責主從切換。
mycat+HAProxy,保證mycat高可用
3 事務支持
單庫可保證事務完整性;跨庫弱XA(異常時全部回滾,commit時不保證全部成功)。
XA事務原理
分布式事務處理(DTP)模型:
- AP;應用程序
- TM;事務管理器
- RM;資源管理器,一般為數據庫
- CRM;通信資源管理器,消息中間件
XA,兩段式提交;處理–提交。TM必須記錄事務信息(XID、RM情況),在完全提交或回滾后才能丟棄。
XA事務問題和MySQL的局限
timeout問題,兩段提交增加事務時間。慢。
使用最終一致性、冪等邏輯,避免使用XA事務。
XA提交前沖突,可能導致主從不一致。
4 Mycat SQL攔截機制
執行前攔截sql;默認攔截器實現了mysql轉義字符替換。
自定義:
實現 SQLInterceptor,編譯后放到catlet文件夾。
修改server.xml;sqlInterceptor、sqlInterceptorType、sqlInterceptorFIle等參數。
5 Mycat注解
mycat執行流程:攔截、解析路由。注解指定dataNode、dataHost、schema。
格式:
- /!mycat:注解表達式/SQL;前綴可為/!、/#、/**
- /balance/;強制從寫節點查詢數據。主節點?
使用:
- 為sql語句指定分片
/*mycat:sql=select 1 from test/CREATE PROCEDUREtest_proc
() BEGIN END ;
/*mycat:sql=select 1 from test/insert into user2 select * from user1 - 指定節點(讀節點、寫節點)
/balance/select * from user;強制從寫節點查詢
/#mycat:db_type=master/ select * from travelrecord;主節點查詢
/#mycat:db_type=slave/ select * from travelrecord;從節點查詢 - shareJoin,指定本分片join
/*!mycat:catlet=demo.catlets.ShareJoin / select a.,b.id, b.name as tit from customer a,company b on a.company_id=b.id; - 多租戶支持,指定分片。
/*!mycat : schema = test_01 */ sql ;
6 Mycat支持的catlet實現
格式:/*mycat:catlet=classFullName/SQL
1,shareJoin,指定本分片join
/!mycat:catlet=demo.catlets.ShareJoin / select a.,b.id, b.name as tit from customer a,company b on a.company_id=b.id;
2,批量插入與ID自增長結合的支持
/!mycat:catlet=demo.catlets.BatchInsertSequence / insert into sam_test(name_)
values(‘ t1’ ),(‘ t2’ );
3,獲取批量sequence值得支持
/!mycat:catlet=demo.catlets.BatchGetSequence */SELECT mycat_get_seq(‘ MYCAT_TEST’ ,100);
7 JDBC多數據庫支持
dataHost,dbDriver改為jdbc,dbType改為對應數據庫名,如:oracle、mongodb等。
導入驅動文件到bin文件夾。
8 管理命令與監控
默認連接:mysql -uroot -p123456 -P9066
show @@help;查看所有命令
9 壓縮協議支持
需mycat、客戶端、mysql(默認開啟壓縮)均開啟壓縮。
mycat在server.xml–system–useCompression,設為1。
客戶端,mysql命令行加-C,jdbc加參數useCompression=true
10 Mycat-WEB
可視化監控,基於jrds實現。
- 下載安裝zookeeper;修改./conf/zoo_sample.cfg為zoo.cfg;運行./bin/zkServer.cmd
- 下載解壓mycat-web,https://github.com/MyCATApache/Mycat-download/tree/master/mycat-web-1.0;運行./start.bat
- 訪問mycat-web,localhost:8082/mycat。添加mycat及其vm監控實例;jmx端口在./conf/wrapper.conf。jmx連接信息localhost:1984。
jmx需自行開啟:-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1984 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
配置示例:https://blog.csdn.net/zhxdick/article/details/50728859