您好,登錄后才能下訂單哦!
隨著計(jì)算機(jī)和信息技術(shù)的迅猛發(fā)展,行業(yè)應(yīng)用系統(tǒng)的規(guī)模迅速擴(kuò)大,行業(yè)應(yīng)用所產(chǎn)生的數(shù)據(jù)量呈爆炸式增長(zhǎng),動(dòng)輒達(dá)到數(shù)百TB甚至數(shù)百PB的規(guī)模,已遠(yuǎn)遠(yuǎn)超出傳統(tǒng)計(jì)算技術(shù)和信息系統(tǒng)的處理能力,集中式數(shù)據(jù)庫(kù)面對(duì)大規(guī)模數(shù)據(jù)處理逐漸表現(xiàn)出其局限性。因此,人們希望尋找一種能快速處理數(shù)據(jù)和及時(shí)響應(yīng)用戶訪問的方法,也希望對(duì)數(shù)據(jù)進(jìn)行集中分析、管理和維護(hù)。這已經(jīng)成為迫切需求。
分布式數(shù)據(jù)庫(kù)是在集中式數(shù)據(jù)庫(kù)的基礎(chǔ)上發(fā)展起來的,是計(jì)算機(jī)技術(shù)和網(wǎng)絡(luò)技術(shù)結(jié)合的產(chǎn)物。分布式數(shù)據(jù)庫(kù)是指數(shù)據(jù)在物理上分布而在邏輯上集中管理的數(shù)據(jù)庫(kù)系統(tǒng)。物理上分布是指數(shù)據(jù)分布在物理位置不同并由網(wǎng)絡(luò)連接的節(jié)點(diǎn)或站點(diǎn)上;邏輯上集中是指各數(shù)據(jù)庫(kù)節(jié)點(diǎn)之間的邏輯上是一個(gè)整體,并由統(tǒng)一的數(shù)據(jù)庫(kù)管理系統(tǒng)管理。不同的節(jié)點(diǎn)分布可以跨不同的機(jī)房、城市甚至國(guó)家。
分布式數(shù)據(jù)庫(kù)具有透明性、數(shù)據(jù)冗余性、易于擴(kuò)展性、自治性等特點(diǎn),還具有經(jīng)濟(jì)、性能優(yōu)越、響應(yīng)速度更快、靈活的體系結(jié)構(gòu)、易于集成現(xiàn)有系統(tǒng)等特點(diǎn)。
分布式數(shù)據(jù)庫(kù)盡管有著天生的高貴血統(tǒng),但它依賴調(diào)整網(wǎng)絡(luò),對(duì)事務(wù)的處理遠(yuǎn)沒有傳統(tǒng)數(shù)據(jù)庫(kù)成熟,在很長(zhǎng)一段時(shí)間內(nèi)分布式數(shù)據(jù)存儲(chǔ)將與傳統(tǒng)數(shù)據(jù)存儲(chǔ)共存。
MyCat是一個(gè)徹底開源的面向企業(yè)應(yīng)用開發(fā)的大數(shù)據(jù)庫(kù)集群,支持事務(wù)、ACID,是可以替代MySQL的加強(qiáng)版數(shù)據(jù)庫(kù)。MyCat被視為MySQL集群的企業(yè)級(jí)數(shù)據(jù)庫(kù),用來替代昂貴的Oracle集群,它是整合了內(nèi)存緩存技術(shù)、NoSQL技術(shù)、HDFS大數(shù)據(jù)的新型SQL Server,是結(jié)合了傳統(tǒng)數(shù)據(jù)庫(kù)和新型分布式數(shù)據(jù)倉(cāng)庫(kù)的新一代企業(yè)級(jí)數(shù)據(jù)庫(kù)產(chǎn)品,也是一個(gè)優(yōu)秀的數(shù)據(jù)庫(kù)中間件。
MyCat是通過Cobar改良而生。MyCat支持Oracle、PostgreSQL,從1.3版本開始支持NoSQL(SequoiaDB及MongoDB)并引入了Druid解析器。2016年MyCat發(fā)布了1.5版本,2018年發(fā)布了 1.6.6版本 。目前MyCat2.0項(xiàng)目已經(jīng)啟動(dòng),核心代碼已經(jīng)提交(https://github.com/MyCatApache/MyCat2.git)。
通常在實(shí)際應(yīng)用中,業(yè)務(wù)開發(fā)人員并不需要知道中間件的存在,只需要關(guān)注數(shù)據(jù)庫(kù),所以數(shù)據(jù)庫(kù)中間件可以被當(dāng)作一個(gè)或多個(gè)數(shù)據(jù)庫(kù)集群構(gòu)成的邏輯庫(kù)。
既然有邏輯庫(kù),就會(huì)有邏輯表。在分布式數(shù)據(jù)庫(kù)中,對(duì)于應(yīng)用來說,讀寫數(shù)據(jù)的表就是邏輯表。邏輯表可以分布在一個(gè)或多個(gè)分片庫(kù)中,也可以不分片。
1)分片表
分片表是指將數(shù)據(jù)量很大的表切分到多個(gè)數(shù)據(jù)庫(kù)實(shí)例中,所有分片組合起來構(gòu)成了一張完整的表。例如在MyCat上配置t_node的分片表,數(shù)據(jù)按照規(guī)則被切分到dn1、dn2兩個(gè)節(jié)點(diǎn)。
<table?name=”t_node”?primaryKey=”vid”?autoIncrement=”true”?dataNode=”nd1,dn2”?rule=”rule1”?/>
2)非分片表
并非所有的表在數(shù)量很大時(shí)都需要進(jìn)行分片。非分片表是相對(duì)分片表而言的,不需要進(jìn)行數(shù)據(jù)切分的表。如下面配置中的t_node只存在于節(jié)點(diǎn)dn1上。
<table?name=”t_node”?primaryKey=”vid”?autoIncrement=”true”?dataNode=”dn1”?/>
3)ER表
關(guān)系型數(shù)據(jù)庫(kù)是基于實(shí)體關(guān)系模型(Entity Relationship Model)的,MyCat中的ER表便來源于此。基于此思想,MyCat提出了基于E-R關(guān)系的數(shù)據(jù)分片策略,子表的記錄與其所關(guān)聯(lián)的父表的記錄存放在同一個(gè)數(shù)據(jù)分片上,即子表依賴于父表,通過表分組(Table Group)保證數(shù)據(jù)關(guān)聯(lián)查詢不會(huì)跨庫(kù)操作。
表分組是解決跨分片數(shù)據(jù)關(guān)聯(lián)查詢的一種很好的思路,也是數(shù)據(jù)切分的一條重要規(guī)則。
4)全局表
在一個(gè)真實(shí)的業(yè)務(wù)場(chǎng)景中往往存在大量類似的字典表,這些字典表中的數(shù)據(jù)變動(dòng)不頻繁,而且數(shù)據(jù)規(guī)模不大,很少有超過數(shù)十萬條的記錄。
當(dāng)業(yè)務(wù)表因?yàn)橐?guī)模進(jìn)行分片后,業(yè)務(wù)表與這些附屬的字典表之間的關(guān)聯(lián)查詢就成了比較棘手的問題,所以在MyCat中通過數(shù)據(jù)冗余來解決這類表的關(guān)聯(lián)查詢,即所有分片都復(fù)制了一份數(shù)據(jù),我們把這些冗余數(shù)據(jù)的表定義為全局表。
數(shù)據(jù)冗余是解決跨分片數(shù)據(jù)關(guān)聯(lián)查詢的一種很好的思路,也是數(shù)據(jù)切分規(guī)劃的另一條重要規(guī)則。
將數(shù)據(jù)切分后,一個(gè)大表被分到不同的分片數(shù)據(jù)庫(kù)上,每個(gè)表分片所在的數(shù)據(jù)庫(kù)是分片節(jié)點(diǎn)。
將數(shù)據(jù)切分后,每個(gè)分片節(jié)點(diǎn)不一定會(huì)獨(dú)占一臺(tái)機(jī)器,同一臺(tái)機(jī)器上可以有多個(gè)分片數(shù)據(jù)庫(kù),這樣一個(gè)或多個(gè)分片節(jié)點(diǎn)所在的機(jī)器就是節(jié)點(diǎn)主機(jī)。為了規(guī)避單節(jié)點(diǎn)主機(jī)并發(fā)數(shù)量的限制,盡量將讀寫壓力高的分片節(jié)點(diǎn)均勻地放在不同的節(jié)點(diǎn)主機(jī)上。
MyCat原理中最重要的一個(gè)動(dòng)詞是“攔截”,它攔截了用戶發(fā)送過來的SQL語句,首先對(duì)SQL語句做了一些特定的分析,例如分片分析、路由分析、讀寫分離分析、緩存分析等,然后將此SQL語句發(fā)往后端的真實(shí)數(shù)據(jù)庫(kù),并將返回的結(jié)果做適當(dāng)?shù)奶幚恚罱K再返回給用戶。
MyCat收到一條SQL語句時(shí),首先解析SQL語句涉及的表,接著查看此表的定義,如果該表存在分片規(guī)則,則獲取SQL語句里分片字段的值,并匹配分片函數(shù),得到該SQL語句對(duì)應(yīng)的分片列表,然后將SQL語句發(fā)送到相應(yīng)的分片去執(zhí)行,最后處理所有分片返回的數(shù)據(jù)并返回給客戶端。
schema.xml是MyCat的重要配置文件,它管理著邏輯庫(kù)、分片表、分片節(jié)點(diǎn)和分片主機(jī)等信息。
service.xml是系統(tǒng)參數(shù)的配置文件,掌握MyCat優(yōu)化方法,必需熟悉該文件的配置項(xiàng)。
sequence是全局序列的配置文件。
server.xml配置文件包含了MyCat的系統(tǒng)配置信息,對(duì)應(yīng)的源碼是SystemConfig.java。它有兩個(gè)重要的標(biāo)簽,分別是user、system。掌握system標(biāo)簽的各項(xiàng)配置屬性是MyCat調(diào)優(yōu)的關(guān)鍵。
<MyCat:server?xmlns:MyCat="http://io.MyCat/"> <system> <property?name="nonePasswordLogin">0</property>?<!--?0為需要密碼登陸、1為不需要密碼登陸?,默認(rèn)為0,設(shè)置為1則需要指定默認(rèn)賬戶--> <property?name="useHandshakeV10">1</property> <property?name="useSqlStat">0</property>??<!--?1為開啟實(shí)時(shí)統(tǒng)計(jì)、0為關(guān)閉?--> <property?name="useGlobleTableCheck">0</property>??<!--?1為開啟全加班一致性檢測(cè)、0為關(guān)閉?--> <property?name="sequnceHandlerType">2</property> <property?name="subqueryRelationshipCheck">false</property>?<!--?子查詢中存在關(guān)聯(lián)查詢的情況下,檢查關(guān)聯(lián)字段中是否有分片字段?.默認(rèn)?false?--> ??????<!--??<property?name="useCompression">1</property>-->?<!--1為開啟mysql壓縮協(xié)議--> ????????<!--??<property?name="fakeMySQLVersion">5.6.20</property>-->?<!--設(shè)置模擬的MySQL版本號(hào)--> <!--?<property?name="processorBufferChunk">40960</property>?--> <!--? <property?name="processors">1</property>? <property?name="processorExecutor">32</property>? ?--> ????????<!--默認(rèn)為type?0:?DirectByteBufferPool?|?type?1?ByteBufferArena?|?type?2?NettyBufferPool?--> <property?name="processorBufferPoolType">0</property> <!--默認(rèn)是65535?64K?用于sql解析時(shí)最大文本長(zhǎng)度?--> <!--<property?name="maxStringLiteralLength">65535</property>--> <!--<property?name="sequnceHandlerType">0</property>--> <!--<property?name="backSocketNoDelay">1</property>--> <!--<property?name="frontSocketNoDelay">1</property>--> <!--<property?name="processorExecutor">16</property>--> <!-- <property?name="serverPort">8066</property>?<property?name="managerPort">9066</property>? <property?name="idleTimeout">300000</property>?<property?name="bindIp">0.0.0.0</property>? <property?name="frontWriteQueueSize">4096</property>?<property?name="processors">32</property>?--> <!--分布式事務(wù)開關(guān),0為不過濾分布式事務(wù),1為過濾分布式事務(wù)(如果分布式事務(wù)內(nèi)只涉及全局表,則不過濾),2為不過濾分布式事務(wù),但是記錄分布式事務(wù)日志--> <property?name="handleDistributedTransactions">0</property> <!-- off?heap?for?merge/order/group/limit??????1開啟???0關(guān)閉 --> <property?name="useOffHeapForMerge">1</property> <!-- 單位為m --> ????????<property?name="memoryPageSize">64k</property> <!-- 單位為k --> <property?name="spillsFileBufferSize">1k</property> <property?name="useStreamOutput">0</property> <!-- 單位為m --> <property?name="systemReserveMemorySize">384m</property> <!--是否采用zookeeper協(xié)調(diào)切換??--> <property?name="useZKSwitch">false</property> <!--?XA?Recovery?Log日志路徑?--> <!--<property?name="XARecoveryLogBaseDir">./</property>--> <!--?XA?Recovery?Log日志名稱?--> <!--<property?name="XARecoveryLogBaseName">tmlog</property>--> <!--如果為?true的話?嚴(yán)格遵守隔離級(jí)別,不會(huì)在僅僅只有select語句的時(shí)候在事務(wù)中切換連接--> <property?name="strictTxIsolation">false</property> <property?name="useZKSwitch">true</property> </system> <!--?全局SQL防火墻設(shè)置?--> <!--白名單可以使用通配符%或著*--> <!--例如<host?host="127.0.0.*"?user="root"/>--> <!--例如<host?host="127.0.*"?user="root"/>--> <!--例如<host?host="127.*"?user="root"/>--> <!--例如<host?host="1*7.*"?user="root"/>--> <!--這些配置情況下對(duì)于127.0.0.1都能以root賬戶登錄--> <!-- <firewall> ???<whitehost> ??????<host?host="1*7.0.0.*"?user="root"/> ???</whitehost> ???????<blacklist?check="false"> ???????</blacklist> </firewall> --> <user?name="root"?defaultAccount="true"> <property?name="password">123456</property> <property?name="schemas">TESTDB</property> <!--?表級(jí)?DML?權(quán)限設(shè)置?--> <!--? <privileges?check="false"> <schema?name="TESTDB"?dml="0110"?> <table?name="tb01"?dml="0000"></table> <table?name="tb02"?dml="1111"></table> </schema> </privileges> ?--> </user> <user?name="user"> <property?name="password">user</property> <property?name="schemas">TESTDB</property> <property?name="readOnly">true</property> </user></MyCat:server>
schema.xml 作為MyCat中重要的配置文件之一,涵蓋了MyCat的邏輯庫(kù)、表、分片規(guī)則、分片節(jié)點(diǎn)及數(shù)據(jù)源。
1)schema 標(biāo)簽
<schema?name="TESTDB"?checkSQLschema="false"?sqlMaxLimit="100">
schema標(biāo)簽用于定義MyCat實(shí)例中的邏輯庫(kù)。MyCat可以有多個(gè)邏輯庫(kù),每個(gè)邏輯庫(kù)都有自己的相關(guān)配置。可以使用schema標(biāo)簽來劃分不同的邏輯庫(kù),如果有配置schema標(biāo)簽,則所有的表配置都會(huì)屬于同一個(gè)默認(rèn)的邏輯庫(kù)。
<schema?name="TESTDB"?checkSQLschema="false"?sqlMaxLimit="100"><table?name="travelrecord"?dataNode="dn1,dn2,dn3"?rule="auto-sharding-long"?/></schema><schema?name="USERDB"?checkSQLschema="false"?sqlMaxLimit="100"><table?name="company"?dataNode="dn10,dn11,dn12"?rule="auto-sharding-long"?/></schema>
如上所示配置了兩個(gè)不同的邏輯庫(kù),邏輯庫(kù)的概念等同于MySQL數(shù)據(jù)庫(kù)中的Database概念,我們?cè)诓樵冞壿嫀?kù)中的表時(shí),需要切換到該邏輯庫(kù)下才可以查詢其中的表。
checkSQLschema屬性,當(dāng)把該值設(shè)置為true時(shí),如果我們執(zhí)行語句 select * from TESTDB.travelrecord;,則MyCat會(huì)把schema字符去掉,把SQL語句修改為select * from travelrecord;可避免發(fā)送到后端數(shù)據(jù)庫(kù)執(zhí)行時(shí)報(bào)錯(cuò)。
SqlMaxLimit屬性,當(dāng)該屬性設(shè)置為某個(gè)值時(shí),每次執(zhí)行的SQL語句如果沒有加上limit語句,MyCat也會(huì)自動(dòng)在limit語句后加上對(duì)應(yīng)的值。如果不設(shè)置該值,則MyCat會(huì)把查詢到的信息全部返回。
2)table 標(biāo)簽
<table?name=”travelrecord”?dataNode=”dn1,dn2,dn3”?rule=”auto-sharding-long”></table>
table標(biāo)簽定義了MyCat中的邏輯表,所有需要拆分的的表都需要在table標(biāo)簽中定義。
table標(biāo)簽的主要屬性見下表,具體介紹參見MyCat官方網(wǎng)站?http://www.MyCat.io?。
屬性名 | 值 | 數(shù)量限制 |
---|---|---|
name | String | 1 |
dataNode | String | 1..* |
rule | String | 0..1 |
ruleRequired | boolean | 0..1 |
primaryKey | String | 1 |
type | String | 0..1 |
autoIncrement | boolean | 0..1 |
subTables | String | 1 |
needAddLimit | Boolean | 0..1 |
3)childTable 標(biāo)簽
childTable標(biāo)簽用于定義 E-R 分片的子表,通過標(biāo)簽上的屬性與父表進(jìn)行關(guān)聯(lián)。
4)dataNode標(biāo)簽
dataNode標(biāo)簽定義了MyCat中的數(shù)據(jù)節(jié)點(diǎn),也就是我們通常所說的數(shù)據(jù)分片。一個(gè)dataNode標(biāo)簽就是一個(gè)獨(dú)立的數(shù)據(jù)分片。
5)dataHost標(biāo)簽
dataHost標(biāo)簽在MyCat邏輯庫(kù)中作為底層標(biāo)簽存在,直接定義了具體的數(shù)據(jù)庫(kù)實(shí)例,讀寫分離和心跳語句。
Heartbeat標(biāo)簽用來配置心跳檢查語句,Mysql可以使用select user(),Oracle可以使用select 1 from dual 等。
writeHost和readHost是讀寫的配置,一個(gè)dataHost內(nèi)可以配置多個(gè)讀和寫。但如果writeHost指定的后端數(shù)據(jù)庫(kù)宕機(jī),那么這個(gè)writeHost綁定的所有readHost也將不可用;另一方面,MyCat會(huì)自動(dòng)檢測(cè)到writeHost宕機(jī),并切換到備用的writeHost上。
在MyCat中將表分為兩種大的概念:數(shù)據(jù)量小且不需要做數(shù)據(jù)切分的表,稱為非分片表;數(shù)據(jù)量大到單庫(kù)性能、容量不足以支撐,數(shù)據(jù)需要通過水平切分均勻分布到不同的數(shù)據(jù)庫(kù)中的表,稱為分片表。而中間件最終需要處理的事情是對(duì)數(shù)據(jù)切分、聚合。
ER模型是實(shí)體關(guān)系模型,廣泛采用概念模型設(shè)計(jì)方法,基本元素是實(shí)體、關(guān)系和屬性。MyCat將它引入數(shù)據(jù)切分規(guī)則中,使得有互相依賴的表能夠按照某一規(guī)則切分到相同的節(jié)點(diǎn)上,避免跨庫(kù)Join關(guān)聯(lián)查詢。具體詳情配置內(nèi)容在這里不做描述請(qǐng)參考官方文檔。https://www.jianshu.com/p/fc56f6221728
MyCat提供類似數(shù)據(jù)管理監(jiān)控方式,可以通過MySQL命令行登錄管理端口(9066)執(zhí)行相應(yīng)的SQL語句進(jìn)行管理,也可以通過JDBC方式進(jìn)行遠(yuǎn)程連接管理。
Reload @@config命令用于更新配置文件運(yùn)行該命令,不用重啟即可進(jìn)行配置文件更新。
Reload @@sqlstat用來關(guān)閉和開啟SQL監(jiān)控分析。
Show @@database命令用來顯示MyCat數(shù)據(jù)庫(kù)列表,運(yùn)行結(jié)果對(duì)應(yīng)schema.xml配置文件的schema子節(jié)點(diǎn)。
Show @@datanode用來顯示MyCat數(shù)據(jù)節(jié)點(diǎn),運(yùn)行結(jié)果對(duì)應(yīng)schema.xml配置文件的dataNode節(jié)點(diǎn)。
Show @@heartbeat用于報(bào)告心跳狀態(tài)。
Show @@connection用來獲取MyCat的前端連接狀態(tài)。
Kill @@connection id,id,id 用來關(guān)閉連接。
Show @@ cache用來查看緩存。
Show @@datasource 用來查看數(shù)據(jù)源狀態(tài),如果配置了主從或多主,則可以切換。
Switch @@ datasource name:index 用于切換數(shù)據(jù)源。
Show @@syslog limit 用于顯示系統(tǒng)日志。
Show @@sql 顯示在MyCat中執(zhí)行過的語句。
Show @@shl.show 顯示慢SQL語句。
Show @@sql.sum 顯示SQL語句的整體執(zhí)行情況、讀寫比例等。
delete操作不支持沒有主鍵的表。沒有主鍵的表在不同節(jié)點(diǎn)的順序不同,如果執(zhí)行 select ...limit...,則將出現(xiàn)不同的結(jié)果集。
不支持XA事務(wù),在提交上可能回滾。鄭州不孕醫(yī)院:http://jbk.39.net/yiyuanzaixian/zztjyy/
由于集群是樂觀的并發(fā)控件,事務(wù)commit可能在該階段中止,所以如果有兩個(gè)事務(wù)向集群中的不同節(jié)點(diǎn)的同一行寫入并提交,則失敗的節(jié)點(diǎn)將中止。對(duì)于集群級(jí)別的中止,集群返回死鎖錯(cuò)誤。
整個(gè)集群的寫入吞吐量由最弱的節(jié)點(diǎn)限制,如果有一個(gè)節(jié)點(diǎn)變得緩慢,那么整個(gè)集群將變得緩慢。
集群內(nèi)部按照id自增長(zhǎng)機(jī)制寫入數(shù)據(jù),比如集群中有三臺(tái)可能是3,6,9這樣的遞增。
MyCat是一個(gè)中間件的第三方應(yīng)用,sharding-jdbc是一個(gè)jar包。 因?yàn)镸yCat是單獨(dú)部署,所以使用MyCat就像是訪問數(shù)據(jù)庫(kù)一樣,而sharding-jdbc的邏輯都是需要在工程里寫的。
如果只是單獨(dú)應(yīng)用可以使用輕量級(jí)的Sharding-JDBC,如果多個(gè)服務(wù)都需要操作數(shù)據(jù)庫(kù)則使用MyCat更合適。因?yàn)橛肧harding-JDBC需要在每一個(gè)工程里邊都配置上相應(yīng)的分片等邏輯,而MyCat只需要配置一份單獨(dú)部署。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。