1. 程式人生 > >資料庫中介軟體MyCat(一)

資料庫中介軟體MyCat(一)

一.開源資料庫中介軟體MyCat

1.簡介:

如今隨著網際網路的發展,資料的量級也是成指數的增長,從 GB 到 TB 到 PB。對資料的各種操作也是愈加的困難,傳統的關係性資料庫已經無法滿足快速查詢與插入資料的需求。這個時候 NoSQL 的出現暫時解決了這一危機。它通過降低資料的安全性,減少對事務的支援,減少對複雜查詢的支援,來獲取效能上的提升。
但是,在有些場合 NoSQL 一些折衷是無法滿足使用場景的,就比如有些使用場景是絕對要有事務與安全指標的。這個時候 NoSQL 肯定是無法滿足的,所以還是需要使用關係性資料庫。如果使用關係型資料庫解決海量儲存的問題呢?此時就需要做資料庫叢集,為了提高查詢效能將一個數據庫的資料分散到不同的資料庫中儲存。

2.背景

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安裝與配置

注意:我們如果用contos系統,則在7的系統上使用,jdk 1.7以上  mysql 5.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 進行測試,ip是我們linux的地址

安裝:

  1. 我們找到要上傳到linux中的有mycat安裝包。將該安裝包上傳到Linux伺服器

  2. 解壓mycat,命令:tar -zxvf Mycat-server-1.4-release-20151019230038-linux.tar.gz,並放在/usr/local目錄中 命令:mv mycat/ /usr/local/

  3. 進入mycat 目錄的bin 目錄,啟動mycat 命令:./mycat start

  4. mycat 支援的命令{ console | start | stop | restart | status | dump }
    Mycat 的預設埠號為:8066

三.MyCat 分片-海量資料儲存解決方案

1.什麼是分片

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

可以分為兩種切分模式:

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

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

mycat的分片策略:

分片相關的概念
邏輯庫(schema) :
前面一節講了資料庫中介軟體,通常對實際應用來說,並不需要知道中介軟體的存在,業務開發人員只需要知道資料庫的概念,所以資料庫中介軟體可以被看做是一個或多個數據庫叢集構成的邏輯庫。
邏輯表(table ):
既然有邏輯庫,那麼就會有邏輯表,分散式資料庫中,對應用來說,讀寫資料的表就是邏輯表。邏輯表,可以是資料切分後,分佈在一個或多個分片庫中,也可以不做資料切分,不分片,只有一個表構成。
分片表:是指那些原有的很大資料的表,需要切分到多個數據庫的表,這樣,每個分片都有一部分資料,所有分片構成了完整的資料。 總而言之就是需要進行分片的表。
非分片表:一個數據庫中並不是所有的表都很大,某些表是可以不用進行切分的,非分片是相對分片表來說的,就是那些不需要進行資料切分的表。
分片節點(dataNode)資料切分後,一個大表被分到不同的分片資料庫上面,每個表分片所在的資料庫就是分片(dataNode)。
節點主機(dataHost)資料切分後,每個分片節點(dataNode)不一定都會獨佔一臺機器,同一機器上面可以有多
個分片資料庫,這樣一個或多個分片節點(dataNode)所在的機器就是節點主機(dataHost),為了規避單節點主機併發數限制,儘量將讀寫壓力高的分片節點(dataNode)均衡的放在不同的節點主機(dataHost)。
分片規則(rule)前面講了資料切分,一個大表被分成若干個分片表,就需要一定的規則,這樣按照某種業務規則把資料分到某個分片的規則就是分片規則,資料切分選擇合適的分片規則非常重要,將極大的避免後續資料處理的難度。

mycat的核心配置檔案:(非常重要)

首先為了,便於我們配置檔案,我們將,通過editplus遠端連線linux來進行編輯:

點選確定後,我們選擇sftp 模式   還有填寫22埠號

邏輯庫的配置:

同時在我們剛剛連線的資料庫上,建立三個資料庫,db1 db2  db3

注意:還有個心跳的配置,我們目的是,檢測主機是否正常執行,如果正常可以讓,從機休息

Table 標籤定義了 MyCat 中的邏輯表 rule 用於指定分片規則,auto-sharding-long 的分片規
則是按 ID 值的範圍進行分片 1-5000000 為第 1 片 5000001-10000000 為第 2 片

dataNode 標籤定義了 MyCat 中的資料節點,也就是我們通常說所的資料分片。
dataHost標籤在mycat邏輯庫中也是作為最底層的標籤存在,直接定義了具體的資料庫例項、
讀寫分離配置和心跳語句。
在伺服器上建立 3 個數據庫,分別是 db1 db2 db3

配置service.xml:

server.xml 幾乎儲存了所有 mycat 需要的系統配置資訊。最常用的是在此配置使用者名稱、密碼
及許可權。在 system 中新增 UTF-8 字符集設定,否則儲存中文會出現問號

然後從新啟動mycat

我們進行測試:

  1. 基於mysql客戶端連線工具連線mycat。注意:連線埠預設是8066,而不是3306

  2. 在mycat中執行如下建表語句 現象:mycat中建表後,與之對應的mysql資料庫db1、db2、db3自動也建表

在mycat中插入三條測試語句:必須指定列名,不能預設

CREATE TABLE tb_test (
id BIGINT(20) NOT NULL,
title VARCHAR(100) NOT NULL ,
PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO TB_TEST(ID,TITLE) VALUES(1,'商品1');
INSERT INTO TB_TEST(ID,TITLE) VALUES(2,'商品2');
INSERT INTO TB_TEST(ID,TITLE) VALUES(3,'商品3');
INSERT INTO TB_TEST(ID,TITLE) VALUES(5000001,'商品5000001');
INSERT INTO TB_TEST(ID,TITLE) VALUES(10000001,'商品10000001');

我們先插入前三條:

我們發現數據庫中只有db1中有,其他兩個沒有

我們插入後面兩條資料

那麼我就可以知道,這個是通過分片規則進行分片的,

第一種:auto-shading-long為主鍵分片規則

適用場景:id值從小開始增加,主鍵自增

第二種分片規則:一致性雜湊

當我們需要將資料平均分在幾個分割槽中,需要使用一致性 hash 規則我們找到 function 的 name 為 murmur 的定義,將 count 屬性改為 3,因為我要將資料分成3 片

首先我們配置一個分片規則,指定為id為order_id,我們根據我們order表進行測試,分片的效果

rule.xml:

<function name="murmur"
class="org.opencloudb.route.function.PartitionByMurmurHash">
<property name="seed">0</property><!-- 預設是 0 -->
<property name="count">3</property><!-- 要分片的資料庫節點數量,必須指定,否則沒法分片
-->
<property name="virtualBucketTimes">160</property><!-- 一個實際的資料庫節點被對映為這麼
多虛擬節點,預設是 160 倍,也就是虛擬節點數是物理節點數的 160 倍 -->
<!-- <property name="weightMapFile">weightMapFile</property> 節點的權重,沒有指定權重的節
點預設是 1。以 properties 檔案的格式填寫,以從 0 開始到 count-1 的整數值也就是節點索引為 key,以節
點權重值為值。所有權重值必須是正整數,否則以 1 代替 -->
<!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property>
用於測試時觀察各物理節點與虛擬節點的分佈情況,如果指定了這個屬性,會把虛擬節點
的 murmur hash 值與物理節點的對映按行輸出到這個檔案,沒有預設值,如果不指定,就不會輸出任何東
西 -->
</function>

在schema.xml:中我們配置一致性雜湊的分片規則:

我重新建立一個tb_order表進行測試一致性雜湊的分片規則

CREATE TABLE tb_order (
order_id BIGINT(20) NOT NULL,
title VARCHAR(100) NOT NULL ,
PRIMARY KEY (order_id)
) ENGINE=INNODB DEFAULT CHARSET=utf8	

插入資料:

INSERT INTO TB_ORDER(order_id,TITLE) VALUES(1,'商品1');
INSERT INTO TB_ORDER(order_id,TITLE) VALUES(2,'商品2');
INSERT INTO TB_ORDER(order_id,TITLE) VALUES(3,'商品3');
INSERT INTO TB_ORDER(order_id,TITLE) VALUES(4,'商品4');
INSERT INTO TB_ORDER(order_id,TITLE) VALUES(5,'商品5');
INSERT INTO TB_ORDER(order_id,TITLE) VALUES(6,'商品6');
INSERT INTO TB_ORDER(order_id,TITLE) VALUES(7,'商品7');
INSERT INTO TB_ORDER(order_id,TITLE) VALUES(8,'商品8');
INSERT INTO TB_ORDER(order_id,TITLE) VALUES(9,'商品9');

我們檢視資料庫,發現,三個表的資料幾乎一致的分配到每個資料庫中,根據order_id在配置檔案關聯一致性雜湊的配置

下一章我們繼續mycat的讀寫分離的原理以及詳細配置