1. 程式人生 > >MySQL Cluste(入門篇)—分散式資料庫叢集搭建

MySQL Cluste(入門篇)—分散式資料庫叢集搭建

目錄

前言

1 概述

2 環境說明

7 測試

9 總結

前言

之前寫了一篇mysql資料庫的主從同步,實現讀寫分離,主要以replication方式實現資料庫主從備份和讀寫分離,以減輕資料庫的負載和避免資料的丟失。但是,這種實現務必要保證主從資料庫的資料一致性,否則,一旦有一條資料複製失敗,則會導致後面的資料同步都無法繼續進行,即出現主從不同步的情形。因此,在這裡再寫一篇文章,分散式資料庫叢集,來補充這一缺點。

1 概述

1.1 分散式資料庫叢集

Mysql cluster是適用於分散式計算環境的高可用、高冗餘版本的mysql,其技術在分散式系統中為mysql資料提供了冗餘特性,增強了安全性,使得單個mysql伺服器故障不會對系統產生巨大的負面效應,系統的穩定性得到保障。Mysql cluster採用shared-nothing(無共享)架構,主要利用了NDB儲存引擎來實現,NDB儲存引擎是一個記憶體式儲存引擎,要求資料必須全部載入到記憶體之中,具有自動分片(分割槽)功能。資料被自動分佈在叢集中的不同儲存節點上,每個儲存節點只儲存完整資料的一個分片(fragment)。同時,使用者可以設定同一份資料儲存在多個不同的儲存節點上,以保證單點故障不會造成資料丟失。

Mysql cluster需要一組計算機,用到mysql cluster安裝包,在叢集中的每臺計算機上安裝,只是每臺計算機的角色可能是不一樣的。Mysql cluster按照節點型別可以分為3類:管理節點(對其他節點進行管理)、資料節點(存放cluster中的資料,可以有多個)和mysql節點(存放表結構,可以有多個)。Cluster中的某計算機可以是某一種節點,也可以是2種或3種節點的集合。這3種節點只是在邏輯上劃分,所以他們不一定和物理計算機是一一對應的關係。多個節點之間可以分佈在不同的地理位置,因此也是一個實現分散式資料庫的方案。

管理節點(MGM):這類節點的作用是管理MySQL Cluster內的其他節點,如提供配置資料,並停止節點,執行備份等。由於這類節點負責管理其他節點的配置,應該在啟動其他節點之前啟動這類節點。MGM節點是用命令“ndb_mgmd”啟動的。

資料節點(NDB):這類節點用於儲存Cluster的資料,資料節點的數目與副本的數目相關,是片段的倍數。例如,對於兩個副本,每個副本有兩個片段,那麼就有4個數據節點,沒有必要設定過多的副本,在NDB中資料會盡量的儲存在記憶體中。資料節點使用命令“ndbd”(單執行緒)或"ndbmtd"(多執行緒)啟動的。

SQL節點:這是用來訪問Cluster資料的節點,對於MySQL Cluster,客戶端節點是使用NDB Cluster儲存引擎的傳統MySQL伺服器。通常,SQL節點是使用命令“mysqld –ndbcluster”啟動的,或將“ndbcluster”新增到“my.cnf”後使用“mysqld”啟動。

Mysql cluster的資料更新使用讀已提交隔離級別(read-committedisolation)來保證所有節點資料的一致性,使用兩階段提交機制(two-phasedcommit)保證所有節點都有相同的資料(如果任何一個寫操作失敗,則更新失敗)。

Mysql cluster具體的同步複製步驟,如下所示:

1.Master執行提交語句時,事務被髮送到slave,slave開始準備事務的提交。
2.每個slave都要準備事務,然後向master傳送OK(或ABORT)訊息,表明事務已經準備好(或者無法準備該事務)。
3.Master等待所有Slave傳送OK或ABORT訊息,如果Master收到所有 Slave的OK訊息,它就會向所有Slave傳送提交訊息,告訴Slave提交該事務;如果 Master收到來自任何一個Slave的ABORT訊息,它就向所有 Slave傳送ABORT訊息,告訴Slave去中止事務。
4.每個Slave等待來自Master的OK或ABORT訊息。如果Slave收到提交請求,它們就會提交事務,並向Master傳送事務已提交 的確認;如果Slave收到取消請求,它們就會撤銷所有改變並釋放所佔有的資源,從而中止事務,然後向Masterv送事務已中止的確認。
5.Master收到來自所有Slave的確認後,就會報告該事務被提交(或中止),然後繼續進行下一個事務處理。
由於同步複製一共需要4次訊息傳遞,故mysql cluster的資料更新速度比單機mysql要慢。所以mysql cluster要求執行在千兆以上的區域網內,節點可以採用雙網絡卡,節點組之間採用直連方式。

1.2 資料庫的分散式和主從的區別

主從(Master-Slave): 主從機器上安裝mysql community(普通版)就可以。

主從並沒有像叢集那樣分三種節點,只有主和從兩種,而且主從之間是通過mysql的replication方式來保證資料的一致性。相對mysql cluster的資料同步方式來講是非同步的。 

主從複製的過程中,若從資料庫中出現其中一條資料同步失敗(即relay log中的語句有其中一條寫操作語句執行失敗),則後面的資料無法繼續同步(relay log中後面的寫操作語句無法繼續執行下去),必須得解決掉或跳過這個執行失敗的語句(需要人為去操作),這樣就不能保證所有的從資料庫的資料一致了。而mysql cluster則不然,若其中只要有一個節點的寫操作失敗,則其他所有節點針對這一同步均會更新失敗,以保證所有節點的資料一致性。

2 環境說明

2.1 系統環境

伺服器 角色 說明
192.168.17.130 管理節點(MGM) 系統 centos 7 64位
192.168.17.131 資料節點(NDB) 系統 centos 7 64位
192.168.17.132 資料節點(NDB) 系統 centos 7 64位
192.168.17.133 SQL節點 系統 centos 7 64位
192.168.17.134 SQL節點 系統 centos 7 64位

2.2 軟體環境

mysql cluster 叢集版本:

mysql-cluster-gpl-7.6.7-linux-glibc2.12-x86_64.tar.gz

3 安裝MySQL Cluster

所有伺服器均需執行執行以下操作。

注意:在安裝mysql cluster之前,必須得先檢查該伺服器上是否已安裝了普通mysql,若安裝了則需先把mysql刪除乾淨,因為mysql cluster就包括了普通版mysql;

在安裝管理節點、資料節點和sql節點時,最好以root使用者登入執行,否則有一些步驟需要用到sudo命令來執行。

#上傳到伺服器目錄/usr/softwares並解壓
tar -xzvf mysql-cluster-gpl-7.6.7-linux-glibc2.12-x86_64.tar.gz

#將解壓的檔案重新命名為mysql,並放到/usr/local/目錄下
mv mysql-cluster-gpl-7.6.7-linux-glibc2.12-x86_64 /usr/local/mysql

4 配置安裝管理節點

在伺服器192.168.17.130上執行以下操作。

注意,管理節點的防火牆埠開放,預設是1186。

4.1 拷貝命令

#將檔案ndb_mgm和ndb_mgmd拷貝到/usr/local/bin/目錄下
cp /usr/local/mysql/bin/ndb_mgm* /usr/local/bin/

#ndb_mgm,ndb客戶端命令
#ndb_mgmd,ndb管理節點啟動命令
#ndb_mgm是ndb_mgmd(MySQL Cluster Server)的客戶端管理工具,通過它可以方便的檢查Cluster的狀態、啟動備份、關閉Cluster等功能。

4.2 配置檔案

#建立資料庫叢集配置檔案的目錄
mkdir /var/lib/mysql-cluster

#建立並編輯配置檔案
vim /var/lib/mysql-cluster/config.ini

[ndbd default]
NoOfReplicas=1
DataMemory=200M
IndexMemory=64M

[ndb_mgmd]
NodeId=1
hostname=192.168.17.130
datadir=/var/lib/mysql-cluster/

[ndbd]
NodeId=2
hostname=192.168.17.131
datadir=/usr/local/mysql/data/
[ndbd]
NodeId=3
hostname=192.168.17.132
datadir=/usr/local/mysql/data/

[mysqld]
NodeId=4
hostname=192.168.17.133
[mysqld]
NodeId=5
hostname=192.168.17.134

[NDBD DEFAULT]:表示每個資料節點的預設配置,在每個節點的[NDBD]中不用再寫這些選項,只能有一個。

NoOfReplicas:副本數量,資料節點數必須是副本數的整數倍。

[NDB_MGMD]:表示管理節點的配置,只有一個,預設的對其他節點的埠是1186,故伺服器需要開放1186埠。

[NDBD]:表示每個資料節點的配置,可以有多個,分別寫上不同資料節點的IP地址。

[MYSQLD]:表示SQL節點的配置,可以有多個,分別寫上不同SQL節點的IP地址。

4.3 啟動管理節點

ndb_mgmd -f /var/lib/mysql-cluster/config.ini --initial

 ndb_mgmd是mysql cluster的管理伺服器,後面的-f表示後面的引數是啟動的引數配置檔案。如果在啟動後過了幾天又添加了一個數據節點,這時修改了配置檔案啟動時就必須加上--initial引數,不然新增的節點不會作用在mysql cluster中。

5 配置安裝資料節點

分別在伺服器192.168.17.131和192.168.17.132上執行以下操作。

注意,資料節點的埠開放問題,最好把防火牆關閉,雖然之前版本的預設埠號時2202,但是好像時5.1之後的埠號就沒有限制(看哪個埠空閒就用哪個埠),即與sql節點通訊的埠號會隨機變換。若沒有關閉防火牆,後面在管理節點檢視叢集狀態的時候,可能會出現mysql節點老是連線不上的問題。

5.1 配置my.cnf檔案

mysql服務啟動時會預設載入/etc/my.cnf作為其配置檔案,故需要修改/etc/my.cnf配置檔案。

[mysqld]
datadir=/usr/local/mysql/data
basedir=/usr/local/mysql
character_set_server=utf8

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[mysql_cluster]
ndb-connectstring=192.168.17.130:1186

5.2 安裝mysql資料庫

5.2.1 更改許可權

#分別新增mysql組和mysql使用者
groupadd mysql
useradd mysql -g mysql

#進入mysql目錄
cd /usr/local/mysql/

#把mysql的目錄設定成所有者為root
chown -R root .

#建立data目錄,並把data目錄設定所有者為mysql
mkdir data
chown -R mysql data

#把mysql的目錄改成所屬組為mysql
chgrp -R mysql .

5.2.2 執行安裝指令碼

初始化資料庫(這裡要注意,如果你安裝的版本和我的不同,資料庫初始化的命令使不同的,很多之前的版本會使用:scripts/mysql_install_db --user=mysql來初始化,這個已經被mysql在新的版本中廢棄了,所以需要使用下面的命令安裝,如果你需要安裝別的版本請參考mysql官網的對應版本的安裝命令。)

#執行安裝指令碼,初始化資料庫
./bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/

#注意其中使用者為mysql的名稱需要跟配置檔案my.cnf中的user=mysql相同
#另外,這裡一定要把--basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/ 加上,
#否則會最後啟動MySQL服務的時候會出現"table mysql.plugin doesn't exist","Can\'t open the mysql.plugin table. Please run mysql_upgrade to create it."錯誤,以及"PID"獲取失敗的錯誤

5.2.3 設定mysql服務開機自啟動

#加入到service服務
cp support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld

#加入到開機自啟動列表
chkconfig --add mysqld

查詢是否啟動成功

chkconfig --list

5.2.4 修改資料庫密碼

#啟動資料庫
[[email protected] bin]# service mysqld start

#進入客戶端
[[email protected] bin]# ./mysql -uroot -p
Enter password:這裡輸入之前的臨時密碼
 
#修改密碼
mysql> set password=password('新密碼');

#注意此密碼必須要與其他伺服器上的資料庫設定的密碼相同

5.3 啟動資料節點

cd /usr/local/mysql
./bin/ndbd --initial

#非第一次啟動,命令如下
./bin/ndbd

安裝後第一次啟動資料節點時要加上--initial引數。在以後的啟動過程中,則是不能新增該引數的,否則ndbd程式會清除在之前建立的所有用於恢復的資料檔案和日誌檔案。

6 配置安裝sql節點

分別在伺服器192.168.17.133和192.168.17.134上執行以下操作。

6.1 配置my.cnf檔案

mysql服務啟動時會預設載入/etc/my.cnf作為其配置檔案,故需要修改/etc/my.cnf配置檔案。

[mysqld]
ndbcluster
datadir=/usr/local/mysql/data
basedir=/usr/local/mysql
character_set_server=utf8
default-storage-engine=ndbcluster
port=3306

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[mysql_cluster]
ndb-connectstring=192.168.17.130:1186

default-storage-engine,資料庫建表時的預設引擎為ndbcluster,否則資料會同步失敗。

6.2 安裝mysql資料庫

詳見 5.2 安裝mysql資料庫

6.3 啟動sql節點

其實就是啟動mysql服務。

service mysqld start

7 測試

7.1 用管理節點檢視

ndb_mgm

ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)]	2 node(s)
id=2	@192.168.17.131  (mysql-5.7.23 ndb-7.6.7, Nodegroup: 0, *)
id=3	@192.168.17.132  (mysql-5.7.23 ndb-7.6.7, Nodegroup: 1)

[ndb_mgmd(MGM)]	1 node(s)
id=1	@192.168.17.130  (mysql-5.7.23 ndb-7.6.7)

[mysqld(API)]	2 node(s)
id=4	@192.168.17.133  (mysql-5.7.23 ndb-7.6.7)
id=5	@192.168.17.134  (mysql-5.7.23 ndb-7.6.7)

證明,mysql cluster啟動成功!

7.2 測試資料

連線任何一個sql節點,在此sql節點上操作,建立資料庫、建立表結構、增刪改等操作,在其他的sql節點上也會同步這些操作,使資料保持一致。

(1)這裡在sql節點192.168.17.134上操作。

#登陸資料庫
cd /usr/local/mysql
./bin/mysql -uroot -p
Enter password:輸入密碼

#建立資料庫mytest
mysql> create database mytest;

#切換到mytest資料庫
mysql> use mytest;

#建立表結構sys_myfirst
mysql> create table sys_myfirst(id varchar(36) primary key, name varchar(100), memo varchar(255));

#在sys_myfirst中新增幾條資料
mysql> insert into sys_myfirst(id, name, memo) values('1','test1','hello world!');
mysql> insert into sys_myfirst(id, name, memo) values('2','test2','hello world haha!');
mysql> insert into sys_myfirst(id, name, memo) values('3','test3','hello world hehe!');

#檢視資料
mysql> select * from sys_myfirst;
+----+-------+-------------------+
| id | name  | memo              |
+----+-------+-------------------+
| 2  | test2 | hello world haha! |
| 1  | test1 | hello world!      |
| 3  | test3 | hello world hehe! |
+----+-------+-------------------+
3 rows in set (0.00 sec)

(2)在sql節點192.168.17.133上檢視資料

#這裡就省去登陸mysql客戶端的步驟了
#檢視資料
mysql> select * from sys_myfirst;
+----+-------+-------------------+
| id | name  | memo              |
+----+-------+-------------------+
| 1  | test1 | hello world!      |
| 3  | test3 | hello world hehe! |
| 2  | test2 | hello world haha! |
+----+-------+-------------------+
3 rows in set (0.00 sec)

測試成功!這裡每次查找出來的資料順序不一樣,其原因不難想到是,查詢的資料是兩個資料庫來回切換導致的。

8 啟動和停止叢集

啟動順序:管理節點—資料節點—sql節點

停止順序:管理節點(會同時停止管理節點和資料節點)—sql節點

以上是看網上的人都是這麼說的,但是根據我的實踐,其實sql節點可以一直保持啟動狀態(即使管理節點停止了也沒關係,下次啟動的時候會自動連線上此sql節點),只要第一次啟動的時候遵循上面的順序即可。

8.1 停止管理節點

停止管理節點的同時,會把其管理的所有資料節點也停止掉。

#第一種方法
ndb_mgm -e shutdown

#第二種方法
ndb_mgm
ndb_mgm> shutdown;

8.2 停止sql節點

其實就是停止mysql服務。

service mysqld stop

9 總結

到這裡,mysql cluster的簡單搭建就完成了。不知讀者有沒發現這麼一個問題,因為我這裡把管理節點、資料節點和sql節點都是分開的,所以在部署資料節點的時候,其實並不用去安裝mysql資料庫和開啟mysql服務都可以。然而,這裡的問題是,怎麼確定在sql節點上操作的資料並不是sql節點上的資料,而是資料節點上的資料呢?

之前看到了很多網上的資料,都是自以為的資料就是存在資料節點,但是我到資料節點上找那些我曾在sql節點上操作的資料,均沒有找到,反而是在sql節點上找到了那些資料庫(但是沒有表資料)。因此,我就在想資料庫叢集的資料到底是存在哪裡的呢?

在網上找了很多資料,終於不負有心人,讓我找到了,資料確實是存在資料節點上的,原來可以在資料節點上通過lsof -c ndb命令(以root身份執行)來找出包含ndb程序所有開啟的檔案,發現其真正儲存資料的位置在mysql/data/ndb_3_fs/下面(3數字是config.ini的節點id),各個資料夾中的檔案是以16.7M為單位儲存的,臨時檔案達到16.7M後就另起一個,如圖: