點關注,不迷路!
本文已整理成檔案!
文章目錄
- 1.資料切分概念
- 垂直切分
- 水平切分
- 2.什么是Mycat
- 應用場景
- 3.Mycat中的核心概念及配置
- 核心概念
- 安裝與配置
- linux安裝
- 4. MyCat配置
- 配置Mycat環境引數
- 配置Mycat邏輯庫與用戶
- 配置邏輯庫(schema)
- 邏輯表配置
- 配置分片(dataNode)
- 配置物理庫分片映射(dataHost)
- 表切分規則配置
- 5.Mycat讀寫分離實戰
- 6.Mycat 全域序列號
最近也整理了一些資料!分享給需要面試刷題的朋友,也祝愿大家順利拿到自己想要的offer,這份資料主要包含了Java基礎,資料結構,jvm,多執行緒等等,由于篇幅有限,以下只展示小部分面試題,有需要完整版的朋友可以點一點鏈接跳轉領取,鏈接:戳這里免費下載,獲取碼:csdn

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 服務,

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 status
conf 目錄下存放組態檔,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配置
# master
docker run --name mysql_master -v /root/mysql-cluster/master/:/etc/mysql/conf.d/
-e MYSQL_ROOT_PASSWORD=root -p 3316:3306 -d mysql:5.7
# slave1
docker run --name mysql_slave1 -v /root/mysql-cluster/slave1/:/etc/mysql/conf.d/
-e MYSQL_ROOT_PASSWORD=root -p 3326:3306 -d mysql:5.7
# slave2
docker run --name mysql_slave2 -v /root/mysql-cluster/slave2/:/etc/mysql/conf.d/
-e MYSQL_ROOT_PASSWORD=root -p 3336:3306 -d mysql:5.7
讀寫分離配置
配置 mysql 端主從的資料自動同步,mycat 不負責任何的資料同步問題
配置schema.xml
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" >
<heartbeat>show slave status</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="localhost:3306" user="root" password="123456">
<!-- can have multi read hosts -->
<readHost host="hostS1" url="localhost2:3306" user="root" password="123456"
weight="1" />
</writeHost>
</dataHost>
強制走從:
/*!mycat:db_type=slave*/ select * from travelrecord
強制走寫:
/*!mycat:db_type=master*/ select * from travelrecord
6.Mycat 全域序列號
- 本地檔案方式
配置schema.xml
<table name="travelrecord" dataNode="dn1" autoIncrement="true"
primaryKey="id" />
編輯 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
<table name="travelrecord" dataNode="dn1" autoIncrement="true" primaryKey="id"
/>
配置server.xml
<property name="sequnceHandlerType">2</property>
在 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 種組合,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/230341.html
標籤:其他
上一篇:想進BAT?這個技能必須掌握,不是高并發也不是分布式
下一篇:永遠不會的二分(二分做不對)
