本文介紹了一種新的數(shù)據(jù)庫(kù)中間件產(chǎn)品,Mycat,支持MySQL集群或Mariadb cluster,并提供高可用性。Mycat基于cobar,重構(gòu)網(wǎng)絡(luò)模塊,優(yōu)化Buffer和Join等基本特性,并兼容絕大多數(shù)數(shù)據(jù)庫(kù)。
目
錄
一、Mycat是什么?
二、Mycat安裝
三、MyCat分片
前言
那么大表的數(shù)據(jù)如何優(yōu)化呢?
當(dāng)MySQL單表記錄數(shù)過(guò)大時(shí),數(shù)據(jù)庫(kù)的CRUD性能會(huì)明顯下降
限定數(shù)據(jù)的范圍 例如日期限制在一個(gè)月之內(nèi)
讀/寫(xiě)分離
對(duì)數(shù)據(jù)庫(kù)表進(jìn)行垂直拆分根據(jù)數(shù)據(jù)庫(kù)里面數(shù)據(jù)表的相關(guān)性進(jìn)行拆分。例如,用戶表中既有用戶的登錄信息又有用戶的基本信息,可以將用戶表拆分成兩個(gè)單獨(dú)的表
對(duì)數(shù)據(jù)庫(kù)表進(jìn)行水平拆分保持?jǐn)?shù)據(jù)表結(jié)構(gòu)不變,通過(guò)某種策略對(duì)數(shù)據(jù)進(jìn)行分片。這樣每一片數(shù)據(jù)分散到不同庫(kù)中,達(dá)到了分布式的目的。水平拆分可以支撐非常大的數(shù)據(jù)量。
如何實(shí)現(xiàn)數(shù)據(jù)庫(kù)的水平拆分呢中間件代理:在應(yīng)用和數(shù)據(jù)中間加了一個(gè)代理層。分片邏輯統(tǒng)一維護(hù)在中間件服務(wù)中。我們現(xiàn)在談的 Mycat 、360的Atlas、網(wǎng)易的DDB等等都是這種架構(gòu)的實(shí)現(xiàn)。
一、Mycat是什么?
官網(wǎng):http://www.mycat.org.cn/
Mycat 背后是阿里曾經(jīng)開(kāi)源的知名產(chǎn)品——Cobar。Cobar的核心功能和優(yōu)勢(shì)是MySQL數(shù)據(jù)庫(kù)分片,此產(chǎn)品曾經(jīng)廣為流傳,阿里隨后開(kāi)源的 Cobar,并維持到 2013 年年初。Cobar 的思路和實(shí)現(xiàn)路徑的確不錯(cuò)。基于 Java 開(kāi)發(fā)的,實(shí)現(xiàn)了 MySQL 公開(kāi)的二進(jìn)制傳輸協(xié)議,巧妙地將自己偽裝成一個(gè) MySQL Server,目前市面上絕大多數(shù) MySQL 客戶端工具和應(yīng)用都能兼容。比自己實(shí)現(xiàn)一個(gè)新的數(shù)據(jù)庫(kù)協(xié)議要明智的多,因?yàn)樯鷳B(tài)環(huán)境在哪里擺著。 Mycat 是基于 cobar 演變而來(lái),對(duì) cobar 的代碼進(jìn)行了徹底的重構(gòu),使用 NIO 重構(gòu)了網(wǎng)絡(luò)模塊,并且優(yōu)化了 Buffer 內(nèi)核,增強(qiáng)了聚合,Join 等基本特性,同時(shí)兼容絕大多數(shù)數(shù)據(jù)庫(kù)成為通用的數(shù)據(jù)庫(kù)中間件。簡(jiǎn)單的說(shuō),MyCAT是一****個(gè)新穎的數(shù)據(jù)庫(kù)中間件產(chǎn)品支持 mysql 集群,或者 mariadb cluster,提供高可用性數(shù)據(jù)分片集群。你可以像使用mysql一樣使用mycat。對(duì)于開(kāi)發(fā)人員來(lái)說(shuō)根本感覺(jué)不到mycat的存在。
支持以下數(shù)據(jù)庫(kù)
二、Mycat安裝
2.1 下載
下載地址:https://github.com/MyCATApache/Mycat-download/
在這里插入圖片描述
在這里插入圖片描述
2.2 MyCat的安裝及啟動(dòng)
2.2.1上傳包到linux解壓
Mycat的默認(rèn)端口號(hào)為:8066
# 1、將 Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz 上傳至服務(wù)器
# 2、將壓縮包解壓縮。建議將mycat放到/usr/local目錄下。
tar -xzvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local
# 3、進(jìn)入mycat目錄的bin目錄,啟動(dòng)mycat
./mycat start
# 4、停止MyCat
./mycat stop
# 5、Mycat的默認(rèn)端口號(hào)為:8066
目錄結(jié)構(gòu)為:
2.2.2 啟動(dòng)注意事項(xiàng)
server.xml中的邏輯庫(kù)和schema.xml中的邏輯庫(kù)名稱對(duì)應(yīng)
2.2.3 啟動(dòng)失敗問(wèn)題記錄
解決Bit Server VM警告:忽略選項(xiàng)MaxPermSize=64M,因?yàn)樵?.0中已刪除 這是由于MaxPermSize=64M選項(xiàng)在8.0版本中被移除了。為了解決這個(gè)問(wèn)題,您可以按照以下步驟進(jìn)行配置調(diào)整:
進(jìn)入Mycat的配置文件目錄:mycat/conf/
編輯wrapper.conf文件,可以使用命令:vim wrapper.conf
定位到wrapper.java.additional.3=-XX:MaxPermSize=64M這一行配置
將該行配置注釋掉,改為:#wrapper.java.additional.3=-XX:MaxPermSize=64M
保存文件并從新啟動(dòng)Mycat服務(wù)
啟動(dòng)正常
2.2.4 登錄MyCat
終端登錄
mysql -uroot -p -p27.0.0.1 -P8066
navicat登錄
三、MyCat分片
3.1 MyCat架構(gòu)
1、邏輯庫(kù)(schema):
前面一節(jié)講了數(shù)據(jù)庫(kù)中間件,通常對(duì)實(shí)際應(yīng)用來(lái)說(shuō),并不需要知道中間件的存在,業(yè)務(wù)開(kāi)發(fā)人員只需要知道數(shù)據(jù)庫(kù)的概念,所以數(shù)據(jù)庫(kù)中間件可以被看做是一個(gè)或多個(gè)數(shù)據(jù)庫(kù)集群構(gòu)成的邏輯庫(kù)。
2、邏輯表(table):
既然有邏輯庫(kù),那么就會(huì)有邏輯表,分布式數(shù)據(jù)庫(kù)中,對(duì)應(yīng)用來(lái)說(shuō),讀寫(xiě)數(shù)據(jù)的表就是邏輯表。邏輯表,可以是數(shù)據(jù)切分后,分布在一個(gè)或多個(gè)分片庫(kù)中,也可以不做數(shù)據(jù)切分,不分片,只有一個(gè)表構(gòu)成。
3、分片表:是指那些原有的很大數(shù)據(jù)的表,需要切分到多個(gè)數(shù)據(jù)庫(kù)的表,這樣,每個(gè)分片都有一部分?jǐn)?shù)據(jù),所有分片構(gòu)成了完整的數(shù)據(jù)。總而言之就是需要進(jìn)行分片的表。
4、非分片表:一個(gè)數(shù)據(jù)庫(kù)中并不是所有的表都很大,某些表是可以不用進(jìn)行切分的,非分片是相對(duì)分片表來(lái)說(shuō)的,就是那些不需要進(jìn)行數(shù)據(jù)切分的表。
5、數(shù)據(jù)節(jié)點(diǎn)(dataNode): 數(shù)據(jù)節(jié)點(diǎn)也被稱之為分片節(jié)點(diǎn),數(shù)據(jù)切分以后,每一個(gè)部分就可以被稱之為一個(gè)分片。每一個(gè)分片需要對(duì)應(yīng)一個(gè)節(jié)點(diǎn)主機(jī)。
6、節(jié)點(diǎn)主機(jī)(dataHost):數(shù)據(jù)切分后,每個(gè)分片節(jié)點(diǎn)(dataNode)不一定都會(huì)獨(dú)占一臺(tái)機(jī)器,同一機(jī)器上面可以有多個(gè)分片節(jié)點(diǎn),這樣一個(gè)或多個(gè)分片節(jié)點(diǎn)(dataNode)所在的機(jī)器就是節(jié)點(diǎn)主機(jī)(dataHost),為了規(guī)避單節(jié)點(diǎn)主機(jī)并發(fā)數(shù)限制,盡量將讀寫(xiě)壓力高的分片節(jié)點(diǎn)(dataNode)均衡的放在不同的節(jié)點(diǎn)主機(jī)(dataHost)。
7、分片規(guī)則(rule):
前面講了數(shù)據(jù)切分,一個(gè)大表被分成若干個(gè)分片表,就需要一定的規(guī)則,這樣按照某種業(yè)務(wù)規(guī)則把數(shù)據(jù)分到某個(gè)分片的規(guī)則就是分片規(guī)則,數(shù)據(jù)切分選擇合適的分片規(guī)則非常重要,將極大的避免后續(xù)數(shù)據(jù)處理的難度。
3.2 分片配置
3.2.1 配置文件schema.xml
schema.xml 作為MyCat中重要的配置文件之一,**管理著MyCat的邏輯庫(kù)、邏輯表以及對(duì)應(yīng)的分片規(guī)則、DataNode以及DataSource。** 弄懂這些配置,是正確使用MyCat的前提。這里就一層層對(duì)該文件進(jìn)行解析。
schema標(biāo)簽用于定義MyCat實(shí)例中的邏輯庫(kù)Table 標(biāo)簽定義了MyCat中的邏輯表
rule用于指定分片規(guī)則
auto-sharding-long的分片規(guī)則是按ID值的范圍進(jìn)行分片 1-5000000 為第1片
5000001-10000000 為第2片.... 具體設(shè)置我們會(huì)在第5小節(jié)中講解。dataNode 標(biāo)簽定義了MyCat中的數(shù)據(jù)節(jié)點(diǎn),也就是我們通常說(shuō)所的數(shù)據(jù)分片。dataHost標(biāo)簽在mycat邏輯庫(kù)中也是作為最底層的標(biāo)簽存在,直接定義了具體的數(shù)據(jù)庫(kù)實(shí)例、讀寫(xiě)分離配置和心跳語(yǔ)句。
修改schema.xml文件
3.2.2 配置文件server.xml
server.xml幾乎保存了所有mycat需要的系統(tǒng)配置信息。最常用的是在此配置用戶名、密碼及權(quán)限。在system中添加UTF-8字符集設(shè)置,否則存儲(chǔ)中文會(huì)出現(xiàn)問(wèn)號(hào)
<property name="charset">utf8</property>
修改user的設(shè)置 , 我們這里為 ITCAST 設(shè)置了兩個(gè)用戶,這里的TESTDB邏輯庫(kù)要和schema.xml中的邏輯庫(kù)一致
<user name="test">
<property name="password">test</property>
<property name="schemas">TESTDB</property>
</user>
<user name="root">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
</user>
3.3 MyCat分片測(cè)試
登錄Mycat后,執(zhí)行下列語(yǔ)句創(chuàng)建一個(gè)表,前提是你在schema.xml的邏輯表中有指定下表
CREATE TABLE TB_TEST (
id BIGINT(20) NOT NULL,
title VARCHAR(100) NOT NULL ,
PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
測(cè)試改名后能否成功,發(fā)現(xiàn)失敗,因此需要在schema.xml中指定邏輯表使用TB_TEST后創(chuàng)建成功,我們?cè)诓榭碝ySQL的3個(gè)庫(kù),發(fā)現(xiàn)表都自動(dòng)創(chuàng)建好啦。
在這里插入圖片描述
接下來(lái)是插入表數(shù)據(jù),注意,在寫(xiě) INSERT 語(yǔ)句時(shí)一定要寫(xiě)把字段列表寫(xiě)出來(lái)
INSERT INTO TB_TEST(ID,TITLE) VALUES(1,'goods1');
INSERT INTO TB_TEST(ID,TITLE) VALUES(2,'goods2');
INSERT INTO TB_TEST(ID,TITLE) VALUES(3,'goods3');
在這里插入圖片描述
在這里插入圖片描述
我們會(huì)發(fā)現(xiàn)這些數(shù)據(jù)被寫(xiě)入到第一個(gè)節(jié)點(diǎn)中了,那什么時(shí)候數(shù)據(jù)會(huì)寫(xiě)到第二個(gè)節(jié)點(diǎn)中呢?
我們插入下面的數(shù)據(jù)就可以插入第二個(gè)節(jié)點(diǎn)了
INSERT INTO TB_TEST(ID,TITLE) VALUES(5000001,'goods5000001');
因?yàn)槲覀儾捎玫姆制?guī)則是每節(jié)點(diǎn)存儲(chǔ)500萬(wàn)條數(shù)據(jù),所以當(dāng)ID大于5000000則會(huì)存儲(chǔ)到第二個(gè)節(jié)點(diǎn)上。目前只設(shè)置了兩個(gè)節(jié)點(diǎn),如果數(shù)據(jù)大于1000萬(wàn)條,會(huì)怎么樣呢?執(zhí)行下列語(yǔ)句測(cè)試一下
INSERT INTO TB_TEST(ID,TITLE) VALUES(10000001,'goods10000001');
3.4 MyCat分片規(guī)則
3.4.1 按主鍵范圍分片rang-long
通過(guò)上述測(cè)試證明,分片的規(guī)則是每張表存儲(chǔ)500萬(wàn)的數(shù)據(jù),那么這個(gè)數(shù)量可以修改嗎?當(dāng)然是可以的,請(qǐng)往下看
下圖清晰的展示了規(guī)則的關(guān)聯(lián)性
在這里插入圖片描述
3.4.2 一致性哈希 murmur
當(dāng)我們需要將數(shù)據(jù)平均分在幾個(gè)分區(qū)中 ,需要使用一致性hash規(guī)則 我們找到function的name為 murmur 的定義,將count屬性改為3,因?yàn)槲乙獙?shù)據(jù)分成3片
在rule.xml中配置如下:
<tableRule name="sharding-by-murmur">
<rule>
<columns>id</columns>
<algorithm>murmur</algorithm>
</rule>
</tableRule>
<function name="murmur" class="org.opencloudb.route.function.PartitionByMurmurHash">
<!-- 默認(rèn)是0 -->
<property name="seed">0</property>
<!-- 要分片的數(shù)據(jù)庫(kù)節(jié)點(diǎn)數(shù)量,必須指定,否則沒(méi)法分片 -->
<property name="count">3</property>
<!-- 一個(gè)實(shí)際的數(shù)據(jù)庫(kù)節(jié)點(diǎn)被映射為這么多虛擬節(jié)點(diǎn),默認(rèn)是160倍,也就是虛擬節(jié)點(diǎn)數(shù)是物理節(jié)點(diǎn)數(shù)的160倍 -->
<property name="virtualBucketTimes">160</property>
<!-- 節(jié)點(diǎn)的權(quán)重,沒(méi)有指定權(quán)重的節(jié)點(diǎn)默認(rèn)是1。以properties文件的格式填寫(xiě),以從0開(kāi)始到count-1的整數(shù)值也就是節(jié)點(diǎn)索引為key,以節(jié)點(diǎn)權(quán)重值為值。所有權(quán)重值必須是正整數(shù),否則以1代替 -->
<!-- <property name="weightMapFile">weightMapFile</property> -->
<!-- 用于測(cè)試時(shí)觀察各物理節(jié)點(diǎn)與虛擬節(jié)點(diǎn)的分布情況,如果指定了這個(gè)屬性,會(huì)把虛擬節(jié)點(diǎn)的murmur hash值與物理節(jié)點(diǎn)的映射按行輸出到這個(gè)文件,沒(méi)有默認(rèn)值,如果不指定,就不會(huì)輸出任何東西 -->
<!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property> -->
</function>
在schema.xml中配置邏輯表時(shí),指定規(guī)則為sharding-by-murmur-order
<table name="tb_order" dataNode="dn1,dn2,dn3" rule="sharding-by-murmur-order" />
3.4.3 取模分片
<tableRule name="mod-long">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<property name="count">3</property>
</function>
id對(duì)count=3取模,結(jié)構(gòu)肯定是0,1,2,因此根據(jù)結(jié)果放到3個(gè)庫(kù)的其中一個(gè)
配置說(shuō)明 :
屬性描述columns標(biāo)識(shí)將要分片的表字段algorithm指定分片函數(shù)與function的對(duì)應(yīng)關(guān)系class指定該分片算法對(duì)應(yīng)的類count數(shù)據(jù)節(jié)點(diǎn)的數(shù)量
在schema.xml中配置邏輯表時(shí),指定規(guī)則為mod-long
<table name="tb_brand" dataNode="dn1,dn2,dn3" rule="mod-long" />
3.4.4 枚舉分片
通過(guò)在配置文件中配置可能的枚舉值, 指定數(shù)據(jù)分布到不同數(shù)據(jù)節(jié)點(diǎn)上, 本規(guī)則適用于按照省份或狀態(tài)拆分?jǐn)?shù)據(jù)等業(yè)務(wù) , 配置如下:status是枚舉值
<tableRule name="sharding-by-intfile">
<rule>
<columns>status</columns>
<algorithm>hash-int</algorithm>
</rule>
</tableRule>
<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap">
<property name="mapFile">partition-hash-int.txt</property>
<property name="type">0</property>
<property name="defaultNode">0</property>
</function>
partition-hash-int.txt ,指定枚舉指與節(jié)點(diǎn)索引的對(duì)應(yīng)關(guān)系 內(nèi)容如下 :
1=0
2=1
3=2
配置說(shuō)明:
屬性描述columns標(biāo)識(shí)將要分片的表字段algorithm指定分片函數(shù)與function的對(duì)應(yīng)關(guān)系class指定該分片算法對(duì)應(yīng)的類mapFile對(duì)應(yīng)的外部配置文件type默認(rèn)值為0 ; 0 表示Integer , 1 表示StringdefaultNode默認(rèn)節(jié)點(diǎn) ; 小于0 標(biāo)識(shí)不設(shè)置默認(rèn)節(jié)點(diǎn) , 大于等于0代表設(shè)置默認(rèn)節(jié)點(diǎn) ;
默認(rèn)節(jié)點(diǎn)的所用:枚舉分片時(shí),如果碰到不識(shí)別的枚舉值, 就讓它路由到默認(rèn)節(jié)點(diǎn) ; 如果沒(méi)有默認(rèn)值,碰到不識(shí)別的則報(bào)錯(cuò) 。
有趣
原文來(lái)源:https://mp.weixin.qq.com/s/zC0qTyIVI5ebs8VOjh9J9g
來(lái)源:本文內(nèi)容搜集或轉(zhuǎn)自各大網(wǎng)絡(luò)平臺(tái),并已注明來(lái)源、出處,如果轉(zhuǎn)載侵犯您的版權(quán)或非授權(quán)發(fā)布,請(qǐng)聯(lián)系小編,我們會(huì)及時(shí)審核處理。
聲明:江蘇教育黃頁(yè)對(duì)文中觀點(diǎn)保持中立,對(duì)所包含內(nèi)容的準(zhǔn)確性、可靠性或者完整性不提供任何明示或暗示的保證,不對(duì)文章觀點(diǎn)負(fù)責(zé),僅作分享之用,文章版權(quán)及插圖屬于原作者。
Copyright?2013-2024 JSedu114 All Rights Reserved. 江蘇教育信息綜合發(fā)布查詢平臺(tái)保留所有權(quán)利
蘇公網(wǎng)安備32010402000125
蘇ICP備14051488號(hào)-3技術(shù)支持:南京博盛藍(lán)睿網(wǎng)絡(luò)科技有限公司
南京思必達(dá)教育科技有限公司版權(quán)所有 百度統(tǒng)計(jì)