京东面试官:呦,你对中间件 Mycat了解的还挺深~
1.數據切分概念
數據的切分[(Sharding)]根據其切分規則的類型,可以分為兩種切分模式。一種是按照不同的表(或者Schema)來切分到不同的數據庫(主機))之上,這種切可以稱之為數據的垂直(縱向)切分;另外一則是根據表中的數據的邏輯關系,將同一個表中的數據按照某種條件拆分到多臺數據庫(主機)上面,這種切分稱之為數據的水平([橫向])切分。 垂直切分的最大特點就是規則簡單,實施也更為方便,尤其適合各業務之間的耦合度非常低,相互影響很小,業務邏輯非常清晰的系統。在這種系統中,可以很容易做到將不同業務模塊所使用的表分拆到不同的數據庫中。根據不同的表來進行拆分,對應用程序的影響也更小,拆分規則也會比較簡單清晰。 水平切分于垂直切分相比,相對來說稍微復雜一些。因為要將同一個表中的不同數據拆分到不同的數據庫中,對于應用程序來說,拆分規則本身就較根據表名來拆分更為復雜,后期的數據維護也會更為復雜一些。
垂直切分
一個數據庫由很多表的構成,每個表對應著不同的業務,垂直切分是指按照業務將表進行分類,分布到
不同 的數據庫上面,這樣也就將數據或者說壓力分擔到不同的庫上面,如下圖:
一般來講業務存在著復雜 join 的場景是難以切分的,往往業務獨立的易于切分。如何切分,切分到何種程度是考驗技術架構的一個難題。 下面來分析下垂直切分的優缺點:
優點:
- 拆分后業務清晰,拆分規則明確。
- 系統之間整合或擴展容易。
- 數據維護簡單。
缺點:
- 部分業務表無法 join,只能通過接口方式解決,提高了系統復雜度。
- 受每種業務不同的限制存在單庫性能瓶頸,不易數據擴展跟性能提高。
- 事務處理復雜。 由于垂直切分是按照業務的分類將表分散到不同的庫,所以有些業務表會過于龐大,存在單庫讀寫與存儲瓶頸,所以就需要水平拆分來做解決。
水平切分
相對于垂直拆分,水平拆分不是將表做分類,而是按照某個字段的某種規則來分散到多個庫之中,每個表中包含一部分數據。簡單來說,我們可以將數據的水平切分理解為是按照數據行的切分,就是將表中的某些行切分到一個數據庫,而另外的某些行又切分到其他的數據庫中,如圖:
拆分數據就需要定義分片規則。關系型數據庫是行列的二維模型,拆分的第一原則是找到拆分維度。幾種典型的分片規則包括: ? 按照用戶 ID 求模,將數據分散到不同的數據庫,具有相同數據用戶的數據都被分散到一個庫中。 ? 按照日期,將不同月甚至日的數據分散到不同的庫中。 ? 按照某個特定的字段求摸,或者根據特定范圍段分散到不同的庫中。
優點:
- 拆分規則抽象好,join 操作基本可以數據庫做。
- 不存在單庫大數據,高并發的性能瓶頸。
- 應用端改造較少。
- 提高了系統的穩定性跟負載能力。
缺點:
- 拆分規則難以抽象。
- 分片事務一致性難以解決。
- 數據多次擴展難度跟維護量極大。
- 跨庫 join 性能較差。
垂直切分和水平切分都有缺點,但共同的缺點有:
- 引入分布式事務的問題。
- 跨節點 Join 的問題。
- 跨節點合并排序分頁問題。
- 多數據源管理問題。
針對數據源管理,目前主要有兩種思路:
-
A. 客戶端模式,在每個應用程序模塊中配置管理自己需要的一個(或者多個)數據源,直接訪問各個數據 庫,在模塊內完成數據的整合;
-
B. 通過中間代理層來統一管理所有的數據源,后端數據庫集群對前端應用程序透明;
集中式代理 proxy mycat
嵌入應用去中心化架構 sharding-jdbc
基于主機進程的去中心化架構 sharding-sidecar service mesh
數據切分原則
第一原則:能不切分盡量不要切分。
第二原則:如果要切分一定要選擇合適的切分規則,提前規劃好。
第三原則:數據切分盡量通過數據冗余或表分組來降低跨庫 Join 的可能。
第四原則:由于數據庫中間件對數據 Join 實現的優劣難以把握,而且實現高性能難度極大,業務讀取盡量 少使用多表 Join。
2.什么是Mycat
定義
- 一個徹底開源的,面向企業應用開發的大數據庫集群
- 支持事務、ACID、可以替代MySQL的加強版數據庫
- 一個可以視為MySQL集群的企業級數據庫,用來替代昂貴的Oracle集群
- 一個融合內存緩存技術、NoSQL技術、HDFS大數據的新型SQL Server
- 結合傳統數據庫和新型分布式數據倉庫的新一代企業級數據庫產品
- 一個新穎的數據庫中間件產品
跨分片數據合并
應用場景
Mycat 發展到現在,適用的場景已經很豐富,而且不斷有新用戶給出新的創新性的方案,以下是幾個典
型的 應用場景:
單純的讀寫分離,此時配置最為簡單,支持讀寫分離,主從切換
分表分庫,對于超過 1000 萬的表進行分片,最大支持 1000 億的單表分片
多租戶應用,每個應用一個庫,但應用程序只連接 Mycat,從而不改造程序本身,實現多租戶化
報表系統,借助于 Mycat的分表能力,處理大規模報表的統計
替代 Hbase,分析大數據
作為海量數據實時查詢的一種簡單有效方案,比如 100 億條頻繁查詢的記錄需要在 3 秒內查詢出來結果, 除了基于主鍵的查詢,還可能存在范圍查詢或其他屬性查詢,此時 Mycat 可能是最簡單有效的選擇
3.Mycat中的核心概念及配置
核心概念
數據庫中間件
Mycat 是數據庫中間件,就是介于數據庫與應用之間,進行數據處理與交互的中間服務。
邏輯庫(schema)
通常對實際應用來說,并不需要知道中間件的存在,業務開發人員只需要知道數據庫的概念,所以
數據庫中間件可以被看做是一個或多個數據庫集群構成的邏輯庫
邏輯表(table)
邏輯表,可以是數據切分后,分布在一個或多個分片庫中,也可以不做數據切分,不分片,只有一
個表構成。
分片表 分片表,是指那些原有的很大數據的表,需要切分到多個數據庫的表,這樣,每個分
片都有一部分數據,所有分片構成了完整的數據。 例如在 mycat 配置中的 t_node 就屬于分
片表,數據按照規則被分到 dn1,dn2 兩個分片節點(dataNode) 上。
非分片表
一個數據庫中并不是所有的表都很大,某些表是可以不用進行切分的,非分片是相對分片表
來說的,就是那些不需要進行數據切分的表。
如下配置中 t_node,只存在于分片節點(dataNode)dn1 上。
分片節點(dataNode)
數據切分后,一個大表被分到不同的分片數據庫上面,每個表分片所在的數據庫就是分片節
(dataNode)
節點主機(dataHost) 數據切分后,每個分片節點(dataNode)不一定都會獨占一臺機器,同一機
器上面可以有多個分片數據庫, 這樣一個或多個分片節點(dataNode)所在的機器就是節點主機
(dataHost),為了規避單節點主機并發數限 制,盡量將讀寫壓力高的分片節點(dataNode)均
衡的放在不同的節點主機(dataHost)。
分片規則(rule)
一個大表被分成若干個分片表,就需要一定的規則,這樣按照某種業務規則把數據分到 某個分片
的規則就是分片規則,數據切分選擇合適的分片規則非常重要,將極大的避免后續數據處理的難
度。
全局序列號(sequence)
數據切分后,原有的關系數據庫中的主鍵約束在分布式條件下將無法使用,因此需要引入外部機制
保證數據 唯一性標識,這種保證全局性的數據唯一標識的機制就是全局序列號(sequence)。
安裝與配置
基于源碼
-
MyCAT-Server 源碼下載 MyCAT-Server 倉庫地址
-
源碼調試與配置 MyCAT 目前主要通過配置文件的方式來定義邏輯庫和相關配置: ?MYCAT_HOME/conf/schema.xml 中定義邏輯庫,表、分片節點等內容.
-
?MYCAT_HOME/conf/rule.xml 中定義分片規則.
-
? MYCAT_HOME/conf/server.xml 中定義用戶以及系統相關變量,如端口等.
-
源碼運行 MyCAT 入口程序是 org.opencloudb.MycatStartup.java ,需要設置MYCAT_HOME 目
錄,為你工程當前所在目錄(src/main) , 設置完 MYCAT 主目錄后即可正常運行 MyCAT 服務。
](https://jq.qq.com/?_wv=1027&k=0IsBuUb0)
linux安裝
下載
wget http://dl.mycat.io/1.6.7.3/20190927161129/Mycat-server-1.6.7.3-release- 20190927161129-linux.tar.gz #解壓進入mycat目錄 #啟動mycat ./bin/mycat start #停止 ./bin/mycat stop #重啟服務 ./bin/mycat restart #查看啟動狀態 ./bin/mycat statusconf 目錄下存放配置文件,server.xml 是 Mycat 服務器參數調整和用戶授權的配置文件,schema.xml 是邏 輯庫定義和表以及分片定義的配置文件,rule.xml 是分片規則的配置文件,分片規則的具體一些參數信息單獨存 放為文件
4. MyCat配置
- bin 啟動目錄
- conf 配置目錄存放配置文件:
- server.xml:是Mycat服務器參數調整和用戶授權的配置文件。
- schema.xml:是邏輯庫定義和表以及分片定義的配置文件。
- rule.xml: 是分片規則的配置文件,分片規則的具體一些參數信息單獨存放為文件,也在這個目錄
下,配置文件修改需要重啟MyCAT。 - log4j.xml: 日志存放在logs/log中,每天一個文件,日志的配置是在conf/log4j.xml中,根據
自己的需要可以調整輸出級別為debug debug級別下,會輸出更多的信
息,方便排查問題。 - autopartition-long.txt,partition-hash-int.txt,sequence_conf.properties,
- sequence_db_conf.properties 分片相關的id分片規則配置文件
- lib MyCAT自身的jar包或依賴的jar包的存放目錄。
- logs MyCAT日志的存放目錄。日志存放在logs/log中,每天一個文件
下面圖片描述了Mycat最重要的3大配置文件:
配置Mycat環境參數
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE mycat:server SYSTEM "server.dtd"> <mycat:server xmlns:mycat="http://org.opencloudb/"><system><property name="defaultSqlParser">druidparser</property></system> </mycat:server>如例子中配置的所有的Mycat參數變量都是配置在server.xml 文件中,system標簽下配置所有的參數,如果需要配置某個變量添加相應的配置即可,例如添加啟動端口8066,默認為8066:
<property name="serverPort">8066</property>其他所有變量類似。
配置Mycat邏輯庫與用戶
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE mycat:server SYSTEM "server.dtd"> <mycat:server xmlns:mycat="http://org.opencloudb/"> <user name="mycat"> <property name="password">mycat</property> <property name="schemas">TESTDB</property> </user> </mycat:server>如例子中配置的所有的Mycat連接的用戶與邏輯庫映射都是配置在server.xml 文件中,user標簽下配置所有的參數,例如例子中配置了一個mycat用戶供應用連接到mycat,同時mycat 在schema.xml中配置后了一個邏輯庫TESTDB,配置好邏輯庫與用戶的映射關系。【參考文獻】
配置邏輯庫(schema)
Mycat作為一個中間件,實現mysql協議,那么對前端應用連接來說就是一個數據庫,也就有數據庫的配置,mycat的數據庫配置是在schema.xml中配置,配置好后映射到server.xml里面的用戶就可以了。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://org.opencloudb/"><schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1"><table name="t_user" dataNode="dn1,dn2" rule="sharding-by-mod2"/><table name="ht_jy_login_log" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-date_jylog"/></schema><dataNode name="dn1" dataHost="localhost1" database="mycat_node1"/><dataNode name="dn2" dataHost="localhost1" database="mycat_node2"/><dataHost name="localhost1" writeType="0" switchType="1" slaveThreshold="100" balance="1" dbType="mysql" maxCon="10" minCon="1" dbDriver="native"><heartbeat>show status like 'wsrep%'</heartbeat><writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="root" ></writeHost> </dataHost> </mycat:schema >上面例子配置了一個邏輯庫TESTDB,同時配置了t_user,ht_jy_login_log兩個分片表。
邏輯表配置
<table name="t_user" dataNode="dn1,dn2" rule="sharding-by-mod2"/>table 標簽 是邏輯表的配置 其中
name代表表名,
dataNode代表表對應的分片,
Mycat默認采用分庫方式,也就是一個表映射到不同的庫上,
rule代表表要采用的數據切分方式,名稱對應到rule.xml中的對應配置,如果要分片必須配置。
配置分片(dataNode)
<dataNode name="dn1" dataHost="localhost1" database="mycat_node1"/><dataNode name="dn2" dataHost="localhost1" database="mycat_node2"/>表切分后需要配置映射到哪幾個數據庫中,Mycat的分片實際上就是庫的別名,例如上面例子配置了兩個分片dn1,dn2 分別對應到物理機映射dataHost localhost1 的兩個庫上。
配置物理庫分片映射(dataHost)
<dataHost name="localhost1" writeType="0" switchType="1" slaveThreshold="100" balance="1" dbType="mysql" maxCon="10" minCon="1" dbDriver="native"><heartbeat>show status like 'wsrep%'</heartbeat><writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="root" ></writeHost> </dataHost>Mycat作為數據庫代理需要邏輯庫,邏輯用戶,表切分后需要配置分片,分片也就需要映射到真實的物理主機上,至于是映射到一臺還是一臺的多個實例上,Mycat并不關心,只需要配置好映射即可,例如例子中:
配置了一個名為localhost1的物理主機(dataHost)映射。
heartbeat 標簽代表Mycat需要對物理庫心跳檢測的語句,正常情況下生產案例可能配置主從,或者多寫 或者單庫,無論哪種情況Mycat都需要維持到數據庫的數據源連接,因此需要定時檢查后端連接可以性,心跳語句就是來作為心跳檢測。
writeHost 此標簽代表 一個邏輯主機(dataHost)對應的后端的物理主機映射,例如例子中寫庫hostM1 映射到127.0.0.1:3306。如果后端需要做讀寫分離或者多寫 或者主從則通過配置 多個writeHost 或者readHost即可。
dataHost 標簽中的 writeType balance 等標簽則是不同的策略,具體參考指南。
表切分規則配置
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mycat:rule SYSTEM "rule.dtd"> <mycat:rule xmlns:mycat="http://org.opencloudb/"><tableRule name="sharding-by-hour"><rule><columns>createTime</columns><algorithm>sharding-by-hour</algorithm></rule></tableRule><function name="sharding-by-hour" class="org.opencloudb.route.function.LatestMonthPartion"><property name="splitOneDay">24</property></function> </mycat:rule >數據切分中作為表切分規則中最重要的配置,表的切分方式決定了數據切分后的性能好壞,因此也是最重要的配置。
如上面例子配置了一個切分規則,名為sharding-by-hour 對應的切分方式(function )是按日期切
分,該配置中:
tableRule
name 為schema.xml 中table 標簽中對應的 rule=“sharding-by-hour” ,也就是配置表的分片規則,columns 是表的切分字段: createTime 創建日期。algorithm 是規則對應的切分規則:映射到function 的name。
function
function 配置是分片規則的配置。
name 為切分規則的名稱,名字任意取,但是需要與tableRule 中匹配。
class 是切分規則對應的切分類,寫死,需要哪種規則則配置哪種,例如本例子是按小時分片:org.opencloudb.route.function.LatestMonthPartion
property 標簽是切分規則對應的不同屬性,不同的切分規則配置不同。【參考文獻】
5.Mycat讀寫分離實戰
Mysql同步原理
Mysql同步方案
docker配置
讀寫分離配置
配置 mysql 端主從的數據自動同步,mycat 不負責任何的數據同步問題
配置schema.xml
6.Mycat 全局序列號
本地文件方式
配置schema.xml
編輯 server.xml
修改主鍵生成策略 <property name="sequnceHandlerType">0</property>編輯sequence_conf.properties
#TRAVELRECORD 是表名稱 #HISIDS 表示歷史分段(一般無特殊需要則可以不配置) #MINID 最小id #MAXID 最大id #CURID 當前id TRAVELRECORD.HISIDS= TRAVELRECORD.MINID=10001 TRAVELRECORD.MAXID=20000 TRAVELRECORD.CURID=10000本地時間戳方式
ID= 64 位二進制 (42(毫秒)+5(機器 ID)+5(業務編碼)+12(重復累加)
配置schema.xml
在 mycat 下配置:sequence_time_conf.properties
WORKID=0-31 #任意整數 DATAACENTERID=0-31 #任意整數多個個 mycat 節點下每個 mycat 配置的 WORKID,DATAACENTERID 不同,組成唯一標識,總共支持32*32=1024 種組合。
多個個 mycat 節點下每個 mycat 配置的 WORKID,DATAACENTERID 不同,組成唯一標識,總共支持32*32=1024 種組合。
最后,祝大家早日學有所成,拿到滿意offer
總結
以上是生活随笔為你收集整理的京东面试官:呦,你对中间件 Mycat了解的还挺深~的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 现在房贷利率下调了以前买的房子怎么办?
- 下一篇: 面试官问:你做过什么Java线程池实践,