Linux下搭建MySQL集群

一、MySQL集群簡介

1、什麼是MySQL集群

MySQL集群是一個無共享的(shared-nothing)、分散式節點架構的存儲方案,其目的是提供容錯性和高性能。

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

無共享的對等節點使得某台伺服器上的更新操作在其他伺服器上立即可見。傳播更新使用一種複雜的通信機制,這一機制專用來提供跨網路的高吞吐量。

通過多個MySQL伺服器分配負載,從而最大程序地達到高性能,通過在不同位置存儲數據保證高可用性和冗餘。

2、名稱概念

MySQL集群有如下三層:

應用程序層:負責與mysql伺服器通信的各種應用程序。

Mysql伺服器層:處理SQL命令,並與NDB存儲引擎通信和Mysql伺服器。

NDB集群組件層:NDB集群組件有時也稱數據節點,負責處理查詢,然後將結果返回給mysql伺服器。

其中MySQL資料庫集群主要包括如下三部分:

1) SQL節點(SQL node - 下圖對應為 mysqld):分散式資料庫。包括自身數據和查詢中心結點數據

2) 數據節點(Data node - ndbd):集群共享數據(內存中)

3) 管理伺服器(Management Server - ndb_mgmd):管理集群 SQL node,Data node

拓撲結構圖如下所示:

二、環境說明

1、系統環境

註:主要是為了學習MySQL集群的環境搭建,加上資源有限,故將數據節點和SQL節點安裝在一起。

2、軟體環境

MySQL集群版本:

mysql-cluster-gpl-7.3.6-linux-glibc2.5-x86_64.tar.gz

註:依據系統,在MySQL官網自行下載。

三、搭建集群(Linux環境)

1、安裝集群版本

a、準備工作

不管是Management Server,還是Data node、SQL node,都需要先安裝MySQL集群版本,然後根據不用的配置來決定當前伺服器有哪幾個角色。

安裝之前準備好mysql用戶和mysql用戶組,

相關命令:

groupadd mysql useradd mysql -g mysql

為了方便測試,確定相關機器的防火牆已關閉(或者設置防火牆這幾台機器之間的網路連接是暢通無阻的),

相關命令:

chkconfig iptables off service iptables stop

b、安裝集群版本

1.上傳安裝包至/usr/local目錄下,並解壓

tar -zxvf mysql-cluster-gpl-7.3.6-linux-glibc2.5-x86_64.tar.gz

2.重命名文件夾

mv mysql-cluster-gpl-7.3.6-linux-glibc2.5-x86_64 mysql

3.授權

chown -R mysql:mysql mysql

4.切換mysql用戶

su - mysql

5.安裝MySQL

cd /usr/local/mysqlscripts/mysql_install_db --user=mysql --datadir=/usr/local/mysql/data

註:所有伺服器上都需要執行上述操作來安裝MySQL集群版本。

2、集群配置

a、管理節點

1.root用戶下,創建目錄和配置文件

mkdir /var/lib/mysql-clustercd /var/lib/mysql-clustervim config.ini

config.ini配置信息如下:

[NDBD DEFAULT]NoOfReplicas=2[NDB_MGMD]#設置管理節點伺服器nodeid=1HostName=192.168.3.115DataDir=/var/lib/mysql-cluster[NDBD]id=2HostName=192.168.3.116DataDir=/usr/local/mysql/data[NDBD]id=3HostName=192.168.3.117DataDir=/usr/local/mysql/data[MYSQLD]id=4HostName=192.168.3.116[MYSQLD]id=5HostName=192.168.3.117#必須有空的mysqld節點,不然數據節點斷開後啟動有報錯[MYSQLD]id=6[mysqld]id=7

2.授權

chown -R mysql:mysql /var/lib/mysql-cluster

3.切換用戶

su - mysql

4.啟動管理服務

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

注:命令行中的ndb_mgmd是mysql cluster的管理伺服器,後面的-f表示後面的參數是啟動的參數配置文件。

如果在啟動後過了幾天又添加了一個數據節點,這時修改了配置文件啟動時就必須加上--initial參數,不然添加的節點不會作用在mysql cluster中。

b、數據節點

1.編輯/etc/my.cnf文件

# vim /etc/my.cnf[mysqld] sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES datadir=/usr/local/mysql/datasocket=/var/lib/mysql/mysql.sockuser=mysqlndbcluster ndb-connectstring=192.168.3.115[mysql_cluster] ndb-connectstring=192.168.3.115

2.切換用戶

su - mysql

3.啟動數據節點服務

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

註:第一次啟動需要加參數:–initial,以後就不用加了,直接運行: /usr/local/mysql/bin/ndbd

c、SQL節點

1.編輯/etc/my.cnf文件(數據節點和SQL節點在統一伺服器時可省略)

# vim /etc/my.cnf[mysqld] sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES datadir=/usr/local/mysql/datasocket=/var/lib/mysql/mysql.sockuser=mysqlndbcluster ndb-connectstring=192.168.3.115[mysql_cluster] ndb-connectstring=192.168.3.115

2.複製mysqld到系統服務裡面去

cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

3.切換用戶

su - mysql

4.啟動數據節點服務

service mysqld start/usr/local/mysql/bin/mysqladmin -u root password password

d、完成效果

ndb_mgm> showConnected to Management Server at: localhost:1186Cluster Configuration---------------------[ndbd(NDB)] 2 node(s)id=2 @192.168.3.116 (mysql-5.6.19 ndb-7.3.6, Nodegroup: 0, *)id=3 @192.168.3.117 (mysql-5.6.19 ndb-7.3.6, Nodegroup: 0)[ndb_mgmd(MGM)] 1 node(s)id=1 @192.168.3.115 (mysql-5.6.19 ndb-7.3.6)[mysqld(API)] 4 node(s)id=4 @192.168.3.116 (mysql-5.6.19 ndb-7.3.6)id=5 @192.168.3.117 (mysql-5.6.19 ndb-7.3.6)id=6 (not connected, accepting connect from any host)id=7 (not connected, accepting connect from any host)

四、常用命令與問題整理

1) ndb_mgmd管理命令:/usr/local/mysql/bin/ndb_mgm 執行之後就是管理控制台了,裡面可以繼續輸入命令。(具體命令可以使用help查看)

2) 停止集群伺服器的命令:/usr/local/mysql/bin/ndb_mgm -e shutdown

如果集群配置有更新了:rm /usr/local/mysql/mysql-cluster/ndb_1_config.bin.1

3) 停止SQL節點的命令:/usr/local/mysql/bin/mysqladmin -uroot shutdown

4)使用需要注意如下兩點:

a.表必須用ENGINE=NDB或ENGINE=NDBCLUSTER選項創建,或用ALTER TABLE選項更改,以使用NDB Cluster存儲引擎在 Cluster內複製它們。如果使用mysqldump的輸出從已有資料庫導入表,可在文本編輯器中打開SQL腳本,並將該選項添加到任何錶創建語句,或 用這類選項之一替換任何已有的ENGINE(或TYPE)選項。

b.另外還請記住,每個NDB表必須有一個主鍵。如果在創建表時用戶未定義主鍵,NDB Cluster存儲引擎將自動生成隱含的主鍵。(注釋:該隱含 鍵也將佔用空間,就像任何其他的表索引一樣。由於沒有足夠的內存來容納這些自動創建的鍵,出現問題並不罕見)。

其他操作上沒有什麼區別!

文章來源:Linux下搭建MySQL集群


推薦閱讀:

利用DB實現分散式鎖的思路
yaraft 的開發近況〔2017.11〕
Introduction to Distributed System Design
分散式系統論文筆記目錄
論文筆記:[DSN 2002] Scalable Weakly-consistent Infection-style process group Membership protocol

TAG:MySQL | 分散式系統 | 集群 |