Ubuntu 12.04 LTS 構建高可用分佈式 MySQL 集羣

本文的英文版本鏈接是 https://xuri.me/2013/11/20/install-mysql-cluster-on-ubuntu-12-04-lts.html

MySQL Cluster 是 MySQL 適合於分佈式計算環境的高實用、高冗餘版本。它採用了 NDB Cluster 存儲引擎,允許在1個 Cluster 中運行多個MySQL服務器。通過無共享體系結構,系統能夠使用廉價的硬件,而且對軟硬件無特殊要求。此外,由於每個組件有自己的內存和磁盤,不存在單點故障
開發者官方網站 www.oracle.com
在這篇文章中,我會敘述如何 在 Ubuntu 12.04 LTS 構建高可用 MySQL 集羣
1. SQL Cluster 虛擬主機
要創建一個功能齊全的集羣,至少需要3臺主機纔可以完成。其中一個主機作爲管理節點,另外兩個做數據節點。如果數據節點脫機,羣集仍然可以工作,但是一旦管理節點出現問題,將導致集羣無法正常工作,所以在可能的情況下,建立兩個管理節點。在我的例子中,我將使用二個管理節點的集羣
這個例子中一共使用了 5 臺主機,系統架構如下圖所示

20131120202749687


虛擬機羣平臺     VMware ESXi 4.1
虛擬機操作系統    Ubuntu 12.04.3 LTS (Precise Pangolin) 64-bit

所有虛擬機都在同一 192.168.67.0/24 網絡地址段當中,請根據你的網絡情況來具體配置 IP 地址,在開始之前請確保所有主機網絡連接設置正常

2. 安裝管理節點

首先,我們需要安裝的 MySQL 集羣的管理節點。我們將開始與 MySQL-MGM-1,配置完成後按照相同的步驟配置第二個管理節點,如果只設定一個管理節點,那麼繼續下一步的配置

在開始配置前,請訪問 http://www.mysql.com/downloads/cluster/#downloads 確認當前安裝文檔的版本信息. 這裏我所使用的 MySQL Cluster 版本是 7.3.3

首先,我們把 MySQL Cluster 安裝包下載到管理主機上。進入到 /usr/src 文件夾並創建 mysql-mgm 目錄

mkdir /usr/src/mysql-mgm
cd /usr/src/mysql-mgm
完成這一步後,在 MySQL 的官方網站下載最新的安裝源代碼,並解壓軟件包

wget http://cdn.mysql.com/Downloads/MySQL-Cluster-7.3/mysql-cluster-gpl-7.3.3-linux-glibc2.5-x86_64.tar.gz
tar xvfz mysql-cluster-gpl-7.3.3-linux-glibc2.5-x86_64.tar.gz
進入解壓縮後的文件夾,然後移動二進制文件

cd mysql-cluster-gpl-7.3.3-linux-glibc2.5-x86_64
cp bin/ndb_mgm /usr/bin
cp bin/ndb_mgmd /usr/bin
更改目錄的權限,並可以選擇刪除下載的源文件

chmod 755 /usr/bin/ndb_mg*
cd /usr/src
rm -rf /usr/src/mysql-mgm
接下來,我們創建管理節點配置文件,在 /var/lib/mysql-cluster/ 文件夾中,名字叫做 config.ini ,這個文件夾事先不存在,創建它

mkdir /var/lib/mysql-cluster
在 config.ini 文件創建完成後,使用你喜歡的文本編輯器編輯此文件,內容類似於這樣

[NDBD DEFAULT]
 
NoOfReplicas=2
DataMemory=80M
IndexMemory=18M
[MYSQLD DEFAULT]
 
[NDB_MGMD DEFAULT]
DataDir=/var/lib/mysql-cluster
[TCP DEFAULT]
 
# Section for the cluster management node
[NDB_MGMD]
NodeId=1
# IP address of the first management node (this system)
HostName=192.168.67.10
 
[NDB_MGMD]
NodeId=2
#IP address of the second management node
HostName=192.168.67.11
 
# Section for the storage nodes
[NDBD]
# IP address of the first storage node
HostName=192.168.67.12
DataDir= /var/lib/mysql-cluster
[NDBD]
# IP address of the second storage node
HostName=192.168.67.13
DataDir=/var/lib/mysql-cluster
# one [MYSQLD] per storage node
[MYSQLD]
[MYSQLD]
所有主機都定義在這個裏,即使我們只安裝第一個。請注意,管理主機節點需要設定 NodeId,而 NDBD 節點不需要設定.
完成這步操作後,可以用下面的命令啓動管理節點

ndb_mgmd -f /var/lib/mysql-cluster/config.ini --configdir=/var/lib/mysql-cluster/
完成這步操作後, 你可以通過下面的命令向 init.d 中添加一個條目,以自動啓動程序

echo "ndb_mgmd -f /var/lib/mysql-cluster/config.ini --configdir=/var/lib/mysql-cluster/" > /etc/init.d/ndb_mgmd
chmod 755 /etc/init.d/ndb_mgmd
如果一切順利,第二個管理節點上遵循相同的步驟,並使用相同的配置。請不要改變的節點配置文件中的 ID


你可以使用 ndb_mgm 命令來驗證管理節點的運行,(只需要在終端中輸入 ndb_mgm ) ,並通過鍵入 show,啓動配置實用程序。此時 NDBD 節點和 MySQL 節點處於斷開狀態,需要將所有節點配置完成纔可以輸出正確的狀態。

3. 數據節點
創建數據節點與創建管理節點的過程是類似的。讓我們開始創建一個 mysql 組,將用戶 mysql 添加到 mysql 組中

groupadd mysql
useradd -g mysql mysql
進入 /usr/local ,並下載和配置管理節點時使用的相同的壓縮文檔,並解壓

cd /usr/local/
wget http://cdn.mysql.com/Downloads/MySQL-Cluster-7.3/mysql-cluster-gpl-7.3.3-linux-glibc2.5-x86_64.tar.gz
tar xvfz mysql-cluster-gpl-7.3.3-linux-glibc2.5-x86_64.tar.gz
創建一個名爲 mysql 指向解壓的文件夾(這以後將用於DB集羣,所以不要刪除它!)的的軟連接。創建完成後,你可以安裝數據庫

ln -s mysql-cluster-gpl-7.3.3-linux-glibc2.5-x86_64 mysql
cd mysql
apt-get install libaio1 libaio-dev
scripts/mysql_install_db --user=mysql --datadir=/usr/local/mysql/data
修改文件權限

chown -R root:mysql .
chown -R mysql data
與管理節點上一樣,我們希望的 DataBase 引擎自動啓動,因此,我們需要創建 init.d 命令

cp support-files/mysql.server /etc/init.d/
chmod 755 /etc/init.d/mysql.server
最後,複製 bin 文件夾到 /usr/bin 的位置,並創建一個符號鏈接,以保持能夠正確的引用

cd /usr/local/mysql/bin
mv * /usr/bin
cd ../
rm -fr /usr/local/mysql/bin
ln -s /usr/bin /usr/local/mysql/bin
MySQL 配置文件目前不存在,所以我們需要自己創建它。該文件位於 /etc/ 中,並命名爲 my.cnf 文件。使用你喜歡的文本編輯器,並添加以下幾行

[mysqld]
ndbcluster
# IP address of the cluster management node
ndb-connectstring=192.168.67.10,192.168.67.11
[mysql_cluster]
# IP address of the cluster management node
ndb-connectstring=192.168.67.10,192.168.67.11
請注意,這兩個管理節點的地址,使用逗號分隔。如果你只有一個管理節點,只需在列表中刪除第二個。一旦 my.cnf 文件已保存,我們需要創建 MySQL 的數據文件夾

mkdir /var/lib/mysql-cluster
完成這些後,我們需要初始化集羣並啓動該服務。只有當你開始第一次的節點,或當在管理節點上的 /var/lib/mysql-cluster/config.ini 文件被更改時,需要做初始化

cd /var/lib/mysql-cluster
ndbd –-initial
/etc/init.d/mysql.server start
接下來,通過運行相應的腳本安裝 MySQL

/usr/local/mysql/bin/mysql_secure_installation
最後,我們需要 NDB 自動啓動

echo "ndbd" > /etc/init.d/ndbd
chmod 755 /etc/init.d/ndbd
好了,我們已經完成了第一個數據節點的配置,按照相同的方法和步驟去完成第二個數據節點的配置

4.驗證與測試

如果一切正常,在管理節點終端中執行命令  ndb_mgm ,然後鍵入 show. 這個時候應該看到的數據庫節點已填充的提示

root@MYSQL-MGM1:~# ndb_mgm
ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=3    @192.168.67.12  (mysql-5.6.14 ndb-7.3.3, Nodegroup: 0, *)
id=4    @192.168.67.13  (mysql-5.6.14 ndb-7.3.3, Nodegroup: 0)
[ndb_mgmd(MGM)] 2 node(s)
id=1    @192.168.67.10  (mysql-5.6.14 ndb-7.3.3)
id=2    @192.168.67.11  (mysql-5.6.14 ndb-7.3.3)
[mysqld(API)]   2 node(s)
id=5    @192.168.67.12  (mysql-5.6.14 ndb-7.3.3)
id=6    @192.168.67.13  (mysql-5.6.14 ndb-7.3.3)
如果你能夠看到類似的輸出,去嘗試一些基本的SQL命令。登錄到SQL數據庫,並創建一個新的數據庫,表,以驗證數據同步。請注意,在創建數據庫時,需使用 NDBCLUSTER 存儲引擎。如果使用 InnoDB ,數據將不會在集羣節點之間被複制。在使用 NDBCLUSTER 引擎時,會有一些問題,請參閱 MySQL 官方網站

http://dev.mysql.com/doc/refman/5.5/en/mysql-cluster-limitations-unsupported.html
http://dev.mysql.com/doc/refman/5.5/en/mysql-cluster-limitations-syntax.html

mysql -u root -p
mysql> CREATE DATABASE mysqlclustertest;
mysql> USE mysqlclustertest;
mysql> CREATE TABLE testtable (i INT) ENGINE=NDBCLUSTER;
mysql> INSERT INTO testtable () VALUES (1);
mysql> SELECT * FROM testtable;
+------+
| i    |
+------+
|    1 |
+------+
1 row in set (0.01 sec)
連接到第二個數據庫節點,我們看看,得到了相同的輸出

mysql -u root -p
mysql> USE mysqlclustertest;
mysql> SELECT * FROM testtable;
+------+
| i    |
+------+
|    1 |
+------+
1 row in set (0.01 sec)
應該看到相同的輸出。現在,如果你插入一個新條目表,它會被複制回的第一個節點

5. 負載均衡

在這篇文章的最後部分是爲 MySQL 集羣安裝負載均衡服務器,負載均衡可以使用 mysql-proxy,很容易安裝,當然你也可以使用其他服務

root@mysql-proxy:~# apt-get install mysql-proxy
root@mysql-proxy:~# mkdir /etc/mysql-proxy
root@mysql-proxy:~# cd /etc/mysql-proxy
root@mysql-proxy:/etc/mysql-proxy# nano mysql-proxy.conf
在 mysql-proxy.conf 文件中加入下面幾行

[mysql-proxy]
daemon = true
proxy-address = 192.168.67.14:3306
proxy-skip-profiling = true
keepalive = true
event-threads = 50
pid-file = /var/run/mysql-proxy.pid
log-file = /var/log/mysql-proxy.log
log-level = debug
proxy-backend-addresses = 192.168.67.12:3306,192.168.67.13:3306
proxy-lua-script=/usr/lib/mysql-proxy/lua/proxy/balance.lua
對於自動啓動的附加選項創建以下文件 /etc/default/mysql-proxy

ENABLED="true"
OPTIONS="--defaults-file=/etc/mysql-proxy.conf --plugins=proxy"
然後,你可以通過調用以下命令啓動 mysql-proxy
/etc/init.d/mysql-proxy start/stop/status

完成後,你應該能夠連接到 MySQL 服務器使用代理地址。記得這個工作,你需要創建一個新的用戶具有特定的子網連接到它。還需要在 my.cnf 文件爲 MySQL 服務器添加捆綁地址

SQL用戶不用複製,所以相同的用戶有單獨被添加到所有的數據庫節點。在數據節點登錄到 SQL shell,執行以下命令

CREATE USER 'newuser'@'192.168.67.%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
SELECT * FROM mysql.user;

更改 newuser,IP和密碼,根據你的配置需求。 %作爲通配符,從而對整個子網的IP地址的行爲,它允許遠程連接到這個數據庫節點。請記得在這個集羣中的節點中添加相同的用戶具有相同配置的其他所有數據庫

撰寫本文參考了這篇文章 MySQL NDB Cluster setup on Ubuntu 12.04 LTS, 做了一些改動。

如果有哪裏有誤,歡迎指正,這篇文章的英文版本在我的個人網站 https://xuri.me 上,鏈接是 https://xuri.me/2013/11/20/install-mysql-cluster-on-ubuntu-12-04-lts.html 歡迎大家訪問。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章