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