架設 HA 高可用性:MySQL Cluster 叢集 – 7.4.11(5.6.29)

2016-07-07 MySQL

前陣子架設了一套 MySQL Cluster 叢集的架構,終於在最近補上了實作過程,叢集的概念就是把一台式架構拆分為多台式架構,並且可以提供 HA 高可用性與負載均衡的需求,更不需要擔心延展性的問題,若是 Loading 加大了只需要增加 node 去分擔 Loading

 

MySQL Cluster Nodes:

  • Manage Nodes:負責監控叢集所有 Nodes 的狀態,並且由此控制所有 Nodes 的替換。
  • Data Nodes:負責所有 SQL Data 的 Nodes,單純儲存資料,將資料寫在 RAM & Disk。
  • SQL Nodes:負責 SQL 的 Table schema 和 Client 連接的空間。

 

MySQL Cluster architecture :

MySQL Cluster

 

 

本次 LAB 的實驗架構:

  • Manage Node:172.10.0.140
  • SQL Node1:172.10.0.141
  • SQL Node2:172.10.0.142
  • Data Node1:172.10.0.143
  • Data Node2:172.10.0.144

 

 

MySQL Cluster 實作

所有的 nodes 都需要安裝 mysql-cluster

$ wget https://dev.mysql.com/get/Downloads/MySQL-Cluster-7.4/mysql-cluster-gpl-7.4.11-linux-glibc2.5-i686.tar.gz
$ tar zxvf mysql-cluster-gpl-7.4.11-linux-glibc2.5-i686.tar.gz
$ mkdir /usr/local/mysql && mv mysql-cluster-gpl-7.4.11-linux-glibc2.5-i686 !$

 

建立 Manage node

$ mkdir /var/lib/mysql-cluster
$ vim /var/lib/mysql-cluster/config.ini

[NDBD DEFAULT]
NoOfReplicas=2
DataMemory=1024M
IndexMemory=256M

[MYSQLD DEFAULT]

[NDB_MGMD DEFAULT]
DataDir=/var/lib/mysql-cluster

[TCP DEFAULT]

[NDB_MGMD]
NodeId=1
HostName=172.10.0.140

[MYSQLD]
NodeId=2
HostName=172.10.0.141

[MYSQLD]
NodeId=3
HostName=172.10.0.142

[NDBD]
NodeId=4
HostName=172.10.0.143
DataDir=/var/lib/mysql-cluster

[NDBD]
NodeId=5
HostName=172.10.0.144
DataDir=/var/lib/mysql-cluster

NoOfReplicas=2:是 Cluster 非常重要的參數,代表著存在 2 份一樣的資料在 Data node,所以你的 Data node 允許著 1 台的故障容錯還有另一份資料可以正常運行,在本篇因為 Data node 只有 2 台,所以設定 2 就可以了,再多也沒有意義只是增加 write loading

DataMemory & IndexMemory:代表著資料和索引可以儲存的記憶體容量有多大。

NodeId:每一個 nodes 都必須擁有獨一無二的 id 值

 

這邊記錄著所有 nodes 的訊息,才能進行容錯移轉

 

把 ndb_mgm 和 ndb_mgmd 等工具放到 /usr/local/bin 方便使用

$ cp /usr/local/mysql/bin/ndb_mgm* /usr/local/bin/

 

 

建立 Data node

$ vim /etc/my.cnf

[mysqld]
# enable cluster service
ndbcluster

# with connect manage node
ndb-connectstring=172.10.0.140:1186

# defaulte database engine
default-storage-engine=NDBCLUSTER

# setting character
skip-character-set-client-handshake
character-set-server = utf8
collation-server = utf8_general_ci
init-connect = SET NAMES utf8

[mysql_cluster]
# cluster management node
ndb-connectstring=172.10.0.140:1186

 

 

建立 SQL node

# check permissions
$ adduser mysql -d /usr/local/mysql
$ chmod -R root.mysql /usr/local/mysql
$ chmod -R mysql /usr/local/mysql/data
$ vim /etc/my.cnf

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

ndbcluster
default_storage_engine=ndbcluster
ndb-connectstring=172.10.0.140:1186

[mysql_cluster]
ndb-connectstring=172.10.0.140:1186

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

[client]
socket=/usr/local/mysql/data/mysql.sock

$ /usr/local/mysql/scripts/mysql_install_db --user=mysql
$ cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql.server

 

 

啟動 Cluster 環境

啟動順序 Manager node > Data node > SQL node。

如果是第一次啟動 SQL node 請使用 –initial 初始化,如果已經有資料請絕對不要使用 –initial 否則此 node 的資料全毀

# in Manage node
$ ndb_mgmd -v -f /var/lib/mysql-cluster/config.ini

# in Data node , first use --initial
$ /usr/local/mysql/bin/ndbd --defaults-file=/etc/my.cnf -v

# in SQL node
$ /etc/init.d/mysql.server start

 

匯入資料庫(ndbcluster)

cluster 的資料庫類型都必須為 ndbcluster,在匯入資料庫前必須改為 NDBCLUSTER

# Type=InnoDB
$ mysqldump -uroot -p db | sed 's/ENGINE=InnoDB/ENGINE=NDBCLUSTER/g' > db.sql

or 

# Type=MyISAM
$ mysqldump -uroot -p db | sed 's/ENGINE=MyISAM/ENGINE=NDBCLUSTER/g' > db.sql

 

Cluster 確認

從 Manage node 確認所有 node 狀態

# in Manage node
$ ndb_mgm

-- NDB Cluster -- Management Client --
ndb_mgm> show

Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]	2 node(s)
id=3    @172.10.0.143  (mysql-5.6.29 ndb-7.4.11, Nodegroup: 0)
id=4	@172.10.0.144  (mysql-5.6.29 ndb-7.4.11, Nodegroup: 0, *)

[ndb_mgmd(MGM)]	1 node(s)
id=1	@172.10.0.140  (mysql-5.6.29 ndb-7.4.11)

[mysqld(API)]	2 node(s)
id=2	@172.10.0.141  (mysql-5.6.29 ndb-7.4.11)
id=3	@172.10.0.142  (mysql-5.6.29 ndb-7.4.11)

 

容錯測試

  • Data node1 中斷,服務正常
  • SQL node1 中斷,服務正常
  • Manage node 中斷,服務正常
  • Data node1 > SQL node1 順序中斷,服務正常
  • Data node1 > SQL node1 > Manage node 順序中斷,服務正常
  • Manage node > Data node1 順序中斷,服務異常
  • Manage node > SQL node1 順序中斷,服務異常

從上面測試可以理解,由於 Manage node 是所有 node 的管理者,一旦管理者掛了又觸發了容錯事件,就會無法處理而造成 cluster 中斷

 

這篇到結尾,如果你要基本的容錯機制可以允許一台故障的話,至少要 3 台才能建立起 MySQL Cluster 架構

  • Node1 (SQL + Data node)
  • Node2 (SQL + Data node)
  • Node3 (Manage node)

必須注意只擁有一台 Manage node 不能與其他的 node 共用,否則會同時觸發 Manage + node 異常而造成無法容錯的狀況。

 

這樣的架構還可以在無限延伸,包含 Manage node 也可以擁有多台進行容錯。

5 Replies to “架設 HA 高可用性:MySQL Cluster 叢集 – 7.4.11(5.6.29)”

  1. max表示:

    有個疑問,要存取db應該是要透過Manage node吧
    如果Manage node中斷要如何正常運作?

    • shazi7804表示:

      Hi max,
      Manage node 是用來管理叢集的,只要不是 Manage node 和 Data node / SQL node 同時兩台中斷的話都不影響整個 Cluster 運作。

  2. Orzzro表示:

    請問一下 是不是mysql cluster 如要load balance 要另外再用硬體或類似 HA Proxy 來達到是嗎?

    此外,如中途有一台 SQL NODE 或DATA NODE 掛點,
    是復恢服務後 有缺的資料( DB SCHEMA or Data )會就自動SYNC好嗎?

    還有如要再多擴充一台 SQL NODE 或 DATA NODE 是否整套機制要先停機? 還是直接加入設定後 reload Manage node 的config就好?

    • shazi7804表示:

      1. Yes
      2. Cluster 會自動 SYNC
      3. 加 Node 只要從 Manage 設定後 reload 即可

給 Mr. 沙先生一點建議

彙整

分類

展開全部 | 收合全部

License

訂閱 Mr. 沙先生 的文章

輸入你的 email 用於訂閱