開源數據庫中間件-MyCa初探與分片實踐

  • 如今隨著互聯網的發展,數據的量級也是撐指數的增長,從GB到TB到PB。對數據的各種操作也是愈加的困難,傳統的關系性數據庫已經無法滿足快速查詢與插入數據的需求。這個時候NoSQL的出現暫時解決了這一危機。它通過降低數據的安全性,減少對事務的支持,減少對復雜查詢的支持,來獲取性能上的提升。

  • 但是,在有些場合NoSQL一些折衷是無法滿足使用場景的,就比如有些使用場景是絕對要有事務與安全指標的。這個時候NoSQL肯定是無法滿足的,所以還是需要使用關系性數據庫。如果使用關系型數據庫解決海量存儲的問題呢?此時就需要做數據庫集群,為了提高查詢性能將一個數據庫的數據分散到不同的數據庫中存儲。

MyCat簡介

  • Mycat 背后是阿里曾經開源的知名產品——Cobar。Cobar 的核心功能和優勢是 MySQL 數據庫分片,此產品曾經廣為流傳,據說最早的發起者對 Mysql 很精通,后來從阿里跳槽了,阿里隨后開源的 Cobar,并維持到 2013 年年初,然后,就沒有然后了。

  • Cobar 的思路和實現路徑的確不錯。基于 Java 開發的,實現了 MySQL 公開的二進制傳輸協議,巧妙地將自己偽裝成一個 MySQL Server,目前市面上絕大多數MySQL客戶端工具和應用都能兼容。比自己實現一個新的數據庫協議要明智的多,因為生態環境在哪里擺著。

  • Mycat 是基于 cobar 演變而來,對 cobar 的代碼進行了徹底的重構,使用 NIO 重構了網絡模塊,并且優化了 Buffer 內核,增強了聚合,Join 等基本特性,同時兼容絕大多數數據庫成為通用的數據庫中間件。

  • 簡單的說,MyCAT就是:一個新穎的數據庫中間件產品支持mysql集群,或者mariadb?cluster,提供高可用性數據分片集群。你可以像使用mysql一樣使用mycat。對于開發人員來說根本感覺不到mycat的存在。

MyCat支持的數據庫:

MyCat下載及安裝

MySQL安裝與啟動

JDK:要求jdk必須是1.7及以上版本
MySQL:推薦mysql是5.5以上版本
MySQL安裝與啟動步驟如下:( 步驟1-5省略 )

  1. 將MySQL的服務端和客戶端安裝包(RPM)上傳到服務器

2. 查詢之前是否安裝過MySQL
rpm -qa|grep -i mysql
3. 卸載舊版本MySQL
rpm -e --nodeps? 軟件名稱
4. 安裝服務端
rpm -ivh?MySQL-server-5.5.49-1.linux2.6.i386.rpm
5. 安裝客戶端
rpm -ivh?MySQL-client-5.5.49-1.linux2.6.i386.rpm
6. 啟動MySQL服務
service mysql start
7. 登錄MySQL
mysql -u root
8. 設置遠程登錄權限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY '123456' WITH GRANT OPTION;
在本地SQLyog 連接遠程MySQL進行測試

MyCat安裝及啟動

MyCat的官方網站: www.mycat.org.cn
下載地址: github.com/MyCATApache…

  1. 將Mycat-server-1.4-release-20151019230038-linux.tar.gz上傳至服務器
  2. 將壓縮包解壓縮。建議將mycat放到/usr/local/mycat目錄下
tar -xzvf Mycat-server-1.4-release-20151019230038-linux.tar.gz
mv mycat /usr/local
復制代碼
  1. 進入mycat目錄的bin目錄,啟動: ./mycat start 停止:./mycat stop

mycat 支持的命令{ console | start | stop | restart | status | dump }
Mycat的默認端口號為:8066

MyCat分片

什么是分片

簡單來說,就是指通過某種特定的條件,將我們存放在同一個數據庫中的數據分散存放到多個數據庫(主機)上面,以達到分散單臺設備負載的效果。

數據的切分(Sharding)根據其切分規則的類型,可以分為兩種切分模式。

  1. 一種是按照不同的表(或者Schema)來切分到不同的數據庫(主機)之上,這種切分可以稱之為數據的垂直(縱向)切分

2. 另外一種則是根據表中的數據的邏輯關系,將同一個表中的數據按照某種條件拆分到多臺數據庫(主機)上面,這種切分稱之為數據的水平(橫向)切分。

MyCat分片策略:

分片相關的概念

邏輯庫(schema) :

  • 前面一節講了數據庫中間件,通常對實際應用來說,并不需要知道中間件的存在,業務開發人員只需要知道數據庫的概念,所以數據庫中間件可以被看做是一個或多個數據庫集群構成的邏輯庫。

邏輯表(table):

  • 既然有邏輯庫,那么就會有邏輯表,分布式數據庫中,對應用來說,讀寫數據的表就是邏輯表。邏輯表,可以是數據切分后,分布在一個或多個分片庫中,也可以不做數據切分,不分片,只有一個表構成。

分片表:

  • 是指那些原有的很大數據的表,需要切分到多個數據庫的表,這樣,每個分片都有一部分數據,所有分片構成了完整的數據。 總而言之就是需要進行分片的表。

非分片表:

  • 一個數據庫中并不是所有的表都很大,某些表是可以不用進行切分的,非分片是相對分片表來說的,就是那些不需要進行數據切分的表。

分片節點(dataNode)

  • 數據切分后,一個大表被分到不同的分片數據庫上面,每個表分片所在的數據庫就是分片節點(dataNode)。

節點主機(dataHost)

  • 數據切分后,每個分片節點(dataNode)不一定都會獨占一臺機器,同一機器上面可以有多個分片數據庫,這樣一個或多個分片節點(dataNode)所在的機器就是節點主機(dataHost),為了規避單節點主機并發數限制,盡量將讀寫壓力高的分片節點(dataNode)均衡的放在不同的節點主機(dataHost)。

分片規則(rule)

  • 前面講了數據切分,一個大表被分成若干個分片表,就需要一定的規則,這樣按照某種業務規則把數據分到某個分片的規則就是分片規則,數據切分選擇合適的分片規則非常重要,將極大的避免后續數據處理的難度。

MyCat分片配置

  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邏輯庫中也是作為最底層的標簽存在,直接定義了具體的數據庫實例、讀寫分離配置和心跳語句。
    • 在服務器上創建3個數據庫,分別是db1 db2 db3
    • 修改schema.xml如下:
      <?xml version="1.0"?>
      <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
      <mycat:schema xmlns:mycat="http://org.opencloudb/"><schema name="PINYOUGOUDB" checkSQLschema="false" sqlMaxLimit="100"><table name="tb_test" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" /></schema><dataNode name="dn1" dataHost="localhost1" database="db1" /><dataNode name="dn2" dataHost="localhost1" database="db2" /><dataNode name="dn3" dataHost="localhost1" database="db3" /><dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100"><heartbeat>select user()</heartbeat><writeHost host="hostM1" url="192.168.25.142:3306" user="root"password="123456"></writeHost></dataHost>	
      </mycat:schema>
      復制代碼
  2. 配置 server.xml
    • server.xml幾乎保存了所有mycat需要的系統配置信息。最常用的是在此配置用戶名、密碼及權限。在system中添加UTF-8字符集設置,否則存儲中文會出現問號
      <property name="charset">utf8</property>
    • 修改user的設置 , 我們這里為 PINYOUGOUDB設置了兩個用戶
      <user name="test"><property name="password">test</property><property name="schemas">PINYOUGOUDB</property></user><user name="root"><property name="password">123456</property><property name="schemas">PINYOUGOUDB</property></user>
      復制代碼

MyCat分片測試

進入mycat ,執行下列語句創建一個表:

CREATE TABLE tb_test (id BIGINT(20) NOT NULL,title VARCHAR(100) NOT NULL ,PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8 
復制代碼

創建后你會發現,MyCat會自動將你的表轉換為大寫,這一點與Oracle有些類似。

我們再查看MySQL的3個庫,發現表都自動創建好啦。好神奇。
接下來是插入表數據,注意,在寫INSERT語句時一定要寫把字段列表寫出來,否則會出現下列錯誤提示:
錯誤代碼: 1064 partition table, insert must provide ColumnList
我們試著插入一些數據:

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');

MyCat分片規則

rule.xml用于定義分片規則 ,我們這里講解兩種最常見的分片規則

  1. 按主鍵范圍分片rang-long,在配置文件中我們找到
        <tableRule name="auto-sharding-long"><rule><columns>id</columns><algorithm>rang-long</algorithm></rule></tableRule>
    復制代碼
    • tableRule 是定義具體某個表或某一類表的分片規則名稱,columns用于定義分片的列,algorithm代表算法名稱, 我們接著找rang-long的定義
    <function name="rang-long"class="org.opencloudb.route.function.AutoPartitionByLong"><property name="mapFile">autopartition-long.txt</property>
    </function>
    復制代碼
    • Function用于定義算法 mapFile 用于定義算法需要的數據,我們打開autopartition-long.txt
    # range start-end ,data node index
    # K=1000,M=10000.
    0-500M=0
    500M-1000M=1
    1000M-1500M=2
    復制代碼
  2. 一致性哈希murmur
    • 當我們需要將數據平均分在幾個分區中,需要使用一致性hash規則, 我們找到function的name為murmur 的定義,將count屬性改為3,因為我要將數據分成3片
    <function name="murmur"class="org.opencloudb.route.function.PartitionByMurmurHash"><property name="seed">0</property>      <!-- 默認是0 --><property name="count">3</property>     <!-- 要分片的數據庫節點數量,必須指定,否則沒法分片 --><!-- 一個實際的數據庫節點被映射為這么多虛擬節點,默認是160倍,也就是虛擬節點數是物理節點數的160倍 --><property name="virtualBucketTimes">160</property><!-- <property name="weightMapFile">weightMapFile</property> 節點的權重,沒有指定權重的節點默認是1。以properties文件的格式填寫,以從0開始到count-1的整數值也就是節點索引為key,以節點權重值為值。所有權重值必須是正整數,否則以1代替    --><!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property> 用于測試時觀察各物理節點與虛擬節點的分布情況,如果指定了這個屬性,會把虛擬節點的murmur hash值與物理節點的映射按行輸出到這個文件,沒有默認值,如果不指定,就不會輸出任何東西-->
    </function>
    復制代碼
    • 我們再配置文件中可以找到表規則定義
    <tableRule name="sharding-by-murmur"><rule><columns>id</columns><algorithm>murmur</algorithm></rule>
    </tableRule>
    復制代碼
    • 但是這個規則指定的列是id ,如果我們的表主鍵不是id ,而是order_id ,那么我們應該重新定義一個tableRule:
    <tableRule name="sharding-by-murmur-order"><rule><columns>order_id</columns><algorithm>murmur</algorithm></rule>
    </tableRule>
    復制代碼
    • 在schema.xml中配置邏輯表時,指定規則為sharding-by-murmur-order <table name="tb_order" dataNode="dn1,dn2,dn3" rule="sharding-by-murmur-order" />
      我們測試一下,創建訂單表 ,并插入數據,測試分片效果。

    了解數據庫讀寫分離

    數據庫讀寫分離對于大型系統或者訪問量很高的互聯網應用來說,是必不可少的一個重要功能。對于MySQL來說,標準的讀寫分離是主從模式,一個寫節點Master后面跟著多個讀節點,讀節點的數量取決于系統的壓力,通常是1-3個讀節點的配置

Mycat讀寫分離和自動切換機制,需要mysql的主從復制機制配合。

擴展思考

  1. 連表查詢怎么做
  2. 分片策略是每個表需要配嗎?如果不配置的話會怎么樣?
  3. 分片策略有哪些,都應對什么場景比較多
  4. 支持事務嗎?怎么支持的?
  5. 查詢夸庫時, 返回的結果集是怎么樣的?效率怎么樣呢?
  6. 不同的分片策略下,實例擴展怎么操作
  7. 缺點是怎么樣的

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253838.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253838.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253838.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【JAVA設計模式】外觀模式(Facade Pattern)

一 定義 為子系統中的一組接口提供一個一致的界面。Facade模式定義了一個高層的接口&#xff0c;這個接口使得這一子系統更加easy使用。二 案例 一個子系統中擁有3個模塊。每一個模塊中都有3個方法。當中一個為client調用方法&#xff0c;其它兩個則為各子模塊間互相調用方法…

return的用處

#include "stdio.h" main() {int a,b1,c0;for(a1;a<5;a){ cca;}printf("%d",c);return ;printf("hello word"); } 輸出結果是10并沒有hello word&#xff1b;return將不會執行下面的語句。轉載于:https://www.cnblogs.com/doublekai/p/6148…

靜態時序分析——Clock Gating check

門控時鐘是RTL級進行低功耗設計的最常用方法&#xff0c;能夠有效降低動態功耗。在實際使用中&#xff0c;一般用ICG&#xff08;集成門控時鐘單元&#xff09;來完成clock gating。ICG電路和時序如下&#xff1a; 通常來說&#xff0c;工藝庫已經集成了ICG&#xff0c;在做門控…

U-boot中TFTP 解釋

http://www.cnblogs.com/heaad/archive/2009/08/10/1542538.html

BlackHat Arsenal USA 2018 ToolsWatch黑客工具庫

原文鏈接&#xff1a;https://medium.com/hack-with-github/black-hat-arsenal-usa-2018-the-w0w-lineup-7de9b6d32796 Black Hat Arsenal USA 2018?—?The w0w lineup After the huge success of Black Hat Arsenal USA 2017, toolswatch has now announced the list of too…

SOA是什么

SOA是什么&#xff1f; SOA是面向服務的架構&#xff0c;是一個組件模型&#xff0c;它將應用程序的不同功能單元&#xff08;稱為服務&#xff09;通過這些服務之間定義良好的接口和契約聯系起來。接口是采用中立的方式進行定義的&#xff0c;它獨立于實現服務的硬件平臺、操作…

redis 優化

系統優化echo "vm.overcommit_memory1" > /etc/sysctl.conf 0&#xff0c; 表示內核將檢查是否有足夠的可用內存供應用進程使用&#xff1b;如果有足夠的可用內存&#xff0c;內存申請允許&#xff1b;否則&#xff0c;內存申請失敗&#xff0c;并把錯誤返回給應…

IC設計常見設計思想

速度與面積互換原則 所謂速度&#xff0c;是指整個工程穩定運行所能夠達到的最高時鐘頻率&#xff0c;它不僅和電路內部各個寄存器的建立時間、保持時間以及外部器件接口的各種時序要求有關&#xff0c;而且還和兩個緊鄰的寄存器間的邏輯延時&#xff0c;走線延時有關。所謂面…

DM365 u-boot啟動分析

http://www.61ic.com/Article/DaVinci/DM644X/201009/27429.html

(十三)Hibernate高級配置

配置數據庫連接池 配置C3P0連接池。先導入c3p0包。然后在hibernate.cfg.xml文件中 &#xff0c;使用下面代碼配置連接池<property name"hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>可以通過下面的…

eclipse中如何配置tomcat

1.打開eclipse上面的Windows選項&#xff0c;選擇Preferences>Server>Runtime Environments>Add 2.選擇你電腦中安裝的tomcat的版本我的是8所以我選的是Apache Tomcat v8.0 3,Next>Browse選擇Tomcat的安裝目錄&#xff0c;選擇jdk 4.Finish>OK tomcat配置完成。…

jsp調試小技巧

console.log($("#toolbar")); 打印對象可知道這個對象的參數信息轉載于:https://www.cnblogs.com/chenweida/p/6149342.html

數字IC驗證學習(一)

一、數據類型 1、logic logic類型只能有一個驅動。使用wire和reg的地方均可使用logic&#xff0c;但如雙向總線等有多個驅動的地方&#xff0c;則不可使用logic。 2、二值邏輯 對于二值邏輯變量與DUT中的四值邏輯變量連接時&#xff0c;如果DUT中產生了X和Z&#xff0c;會被…

SecureCRT 配置文件中 找密碼

打開本地電腦如下路徑 C:\Users\XXX\AppData\Roaming\VanDyke\Config\Sessions 找到配置文件。 運行命令&#xff1a;python SecureCRTDecrypt.py [配置文件名稱] 例如&#xff1a;python SecureCRTDecrypt.py 192.168.1.249.ini ssh root192.168.1.249 # 123456 即可得到密…

刷題比賽

題目描述 給你四個數組A,B,C,D. 給出每個數組的初始值A[1] 1, B[1] 1, C[1] 1, D[1] 1 , A[2] 3, B[2] 3, C[2] 3, D[2] 3; 有以下的遞推公式: (1) a[k2]p* a[k1]qa[k]b[k1]c[k1]r k^2t * k1d[k]; (2)b[k2]u* b[k1]vb[k]a[k1]c[k1]w^kd[k]; (3)c[k2]x c[k1]yc[k]a[k1]b[…

自動化測試用例設計原則

自動化測試用例設計原則&#xff1a;每一個用例 都是一個閉合的業務操作。用例之間要保持獨立 &#xff0c;不要有操作上的依賴關系&#xff0c;就算有也是測試數據上的依賴。第二個用例 依賴第一個用例產生的數據。轉載于:https://www.cnblogs.com/yyjiangnan/p/6149430.html

MII/MDIO接口詳解

MII/MDIO接口詳解 http://dpinglee.blog.163.com/blog/static/144097753201041131115262/

T24412 Cup#182-3 洞穴之旅

弱連通模板題&#xff0c;不過還是不會。。。 這道題在POJ2762有&#xff0c;這個出題人直接翻譯弄過來了。。。 弱連通的定義是&#xff1a;從u能到達v或從v能到達u&#xff0c;則u和v這兩個點弱連通。 顯然如果是強連通分量就一定是弱連通分量啦&#xff0c;所以可以直接縮點…