MySQL-Cluster

awen7916發表於2016-01-13

MySQL-Cluster

MySQL叢集是一種在無共享架構(SNA,Share Nothing Architecture)系統裡應用記憶體資料庫叢集的技術。這種無共享的架構可以使得系統使用低廉的硬體獲取高的可擴充套件性。 MySQL叢集是一種分佈 式設計,目標是要達到沒有任何單點故障點。因此,任何組成部分都應該擁有自己的記憶體和磁碟。任何共享儲存方案如網路共享,網路檔案系統和SAN裝置是不推 薦或不支援的。通過這種冗餘設計,MySQL聲稱資料的可用度可以達到99.999%。

 實際上,MySQL叢集是把一個叫做NDB的記憶體叢集儲存引擎整合與標準的MySQL伺服器整合。它包含一組計算機,每個都跑一個或者多個程式,這可能包括一個MySQL伺服器,一個資料節點,一個管理伺服器和一個專有的一個資料訪問程式。它們之間的關係如下圖所示:

儲存引擎

MySQL Cluster 使用了一個專用的基於記憶體的儲存引擎,這樣做的好處是速度快, 沒有磁碟I/O的瓶頸,但是由於是基於記憶體的,所以資料庫的規模受系統總記憶體的限制, 如果執行NDB的MySQL伺服器一定要記憶體夠大,比如4G, 8G, 甚至16G。NDB引擎是分散式的,它可以配置在多臺伺服器上來實現資料的可靠性和擴充套件性,理論上 通過配置2臺NDB的儲存節點就能實現整個資料庫叢集的冗餘性和解決單點故障問題。

該儲存引擎有下列弊端:

  • 基於記憶體,資料庫的規模受叢集總記憶體的大小限制
  • 基於記憶體,斷電後資料可能會有資料丟失,這點還需要通過測試驗證。
  • 多個節點通過網路實現通訊和資料同步、查詢等操作,因此整體性受網路速度影響,
  • 因此速度也比較慢

當然也有它的優點:

  • 多個節點之間可以分佈在不同的地理位置,因此也是一個實現分散式資料庫的方案。
  • 擴充套件性很好,增加節點即可實現資料庫叢集的擴充套件。
  • 冗餘性很好,多個節點上都有完整的資料庫資料,因此任何一個節點當機都不會造成服務中斷。
  • 實現高可用性的成本比較低,不象傳統的高可用方案一樣需要共享的儲存裝置和專用的軟體才能實現,NDB 只要有足夠的記憶體就能實現。

體系結構

MySQL Cluster 由3個不同功能的服務構成,每個服務由一個專用的守護程式提供,一項 服務也叫做一個節點,下面來介紹每個節點的功能。

The management (MGM) node

管理節點,用來實現整個叢集的管理,理論上一般只啟動一個,而且當機也不影響 cluster 的服務,這個程式只在cluster 啟動以及節點加入叢集時起作用, 所以這個節點不是很需要冗餘,理論上通過一臺伺服器提供服務就可以了。

通過 ndb_mgmd 命令啟動,使用 config.ini 配置檔案

The storage or database (DB) node:

資料庫節點,用來儲存資料,可以和管理節點(MGM) , 使用者端節點(API) 可以處在 不同的機器上,也可以在同一個機器上面,叢集中至少要有一個DB節點,2個以上 時就能實現叢集的高可用保證,DB節點增加時,叢集的處理速度會變慢。

通過 ndbd 命令啟動,第一次建立好cluster DB 節點時,需要使用 –init引數初始化。

例如: bin/ndbd –ndb-connectstring=ndb_mgmd.mysqlcluster.net –initial

The client (API) node:

客戶端節點,通過他實現 cluster DB 的訪問,這個節點也就是普通的 mysqld 程式, 需要在配置檔案中配置ndbcluster 指令開啟 NDB Cluster storage engine 儲存引擎,增加 API 節點會提高整個叢集的併發訪問速度和整體的吞吐量,該節點 可以部署在Web應用伺服器上,也可以部署在專用的伺服器上,也開以和DB部署在 同一臺伺服器上。

通過 mysqld_safe 命令啟動,

這3類節點可以分佈在不同的主機上,比如 DB 可以是多臺專用的伺服器,也可以 每個DB都有一個API,當然也可以把API分佈在Web前端的伺服器上去,通常來說, API越多cluster的效能會越好。

==========================以上理論摘抄自搜尋技術部落格-淘寶 ==========================

MySQL-Cluster具體配置

----------------------------------------

MGM    IP:192.168.100.1
SQL1    IP:192.168.100.2
SQL2    IP:192.168.100.3
NDBD1    IP:192.168.100.4
NDBD2    IP:192.168.100.5
----------------------------------------

MGM配置
########################################################################
MySQL叢集版安裝
mysql-cluster-gpl-7.2.5.tar.gz
---------------------------------------------------------
# tar xf mysql-cluster-gpl-7.2.5.tar.gz -C /usr/src
# cd /usr/src/mysql-cluster-gpl-7.2.5
# cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr/local/mysql -DMYSQL_DATADIR:PATH=/database -DMEMCACHED_HOME:PATH=/usr/local -DWITH_CLASSPATH:STRING=/usr/java -DWITH_EXTRA_CHARSETS:STRING=all -DWITH_INNOBASE_STORAGE_ENGINE:BOOL=ON -DWITH_NDBCLUSTER_STORAGE_ENGINE:BOOL=ON -DWITH_PARTITION_STORAGE_ENGINE:BOOL=ON -DWITH_PERFSCHEMA_STORAGE_ENGINE:BOOL=ON
# make && make install
--------------------------------------------------------
具體的MySQL配置檔案定義等這裡不作進一步描述

# vim /usr/local/mysql/etc/config.ini   //配置管理檔案
# cat /usr/local/mysql/etc/config.ini
[NDBD DEFAULT]
NoOfReplicas=2
DataMemory=80M
IndexMemory=18M

[NDB_MGMD]
hostname=192.168.100.1
datadir=/data
nodeid=1

[NDBD]
hostname=192.168.100.4
datadir=/data
nodeid=2

[NDBD]
hostname=192.168.100.5
datadir=/data
nodeid=3

[MYSQLD]
hostname=192.168.100.2
nodeid=4

[MYSQLD]
hostname=192.168.100.3
nodeid=5

# /usr/local/mysql/bin/ndb_mgmd --config-file=/usr/local/mysql/etc/config.ini

  1. # /usr/local/mysql/bin/ndb_mgm  
  2. -- NDB Cluster -- Management Client --  
  3. ndb_mgm> show  
  4. Connected to Management Server at: localhost:1186  
  5. Cluster Configuration  
  6. ---------------------  
  7. [ndbd(NDB)]     2 node(s)  
  8. id=2 (not connected, accepting connect from 192.168.100.4)  
  9. id=3 (not connected, accepting connect from 192.168.100.5)  
  10.   
  11. [ndb_mgmd(MGM)] 1 node(s)  
  12. id=1    @192.168.100.1  (mysql-5.5.20 ndb-7.2.5)  
  13.   
  14. [mysqld(API)]   2 node(s)  
  15. id=4 (not connected, accepting connect from 192.168.100.2)  
  16. id=5 (not connected, accepting connect from 192.168.100.3)  

########################################################################


NBDB配置
########################################################################
MySQL無需再次編譯,把MGM上的MySQL目錄打包分發到各個NBDB節點上即可
# cat /usr/local/mysql/etc/my.cnf
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/database
socket=/var/run/mysqld/mysql5.socket
pid-file=/var/run/mysqld/mysql5.pid
general-log
general-log-file=/var/log/mysqld/mysql5-access.log
log-error=/var/log/mysqld/mysql5-error.log
port=3306
innodb=On

ndbcluster
ndb-connectstring=192.168.100.1

[mysql_cluster]
ndb-connectstring=192.168.100.1
# /usr/local/mysql/bin/ndbd --ndb-connectstring=192.168.100.1
########################################################################

SQL節點配置
########################################################################
MySQL無需再次編譯,把MGM上的MySQL目錄打包分發到各個SQL節點上即可
# cat /usr/local/mysql/etc/my.cnf
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/database
socket=/var/run/mysqld/mysql5.socket
pid-file=/var/run/mysqld/mysql5.pid
general-log
general-log-file=/var/log/mysqld/mysql5-access.log
log-error=/var/log/mysqld/mysql5-error.log
port=3306
innodb=On

ndbcluster
ndb-connectstring=192.168.100.1

[mysql_cluster]
ndb-connectstring=192.168.100.1


# /etc/init.d/mysqld5 restart
########################################################################

MGM連線檢視當前狀態:

  1. # /usr/local/mysql/bin/ndb_mgm  
  2. -- NDB Cluster -- Management Client --  
  3. ndb_mgm> show  
  4. Connected to Management Server at: localhost:1186  
  5. Cluster Configuration  
  6. ---------------------  
  7. [ndbd(NDB)] 2 node(s)  
  8. id=2    @192.168.100.4  (mysql-5.5.20 ndb-7.2.5, Nodegroup: 0, Master)  
  9. id=3    @192.168.100.5  (mysql-5.5.20 ndb-7.2.5, Nodegroup: 0)  
  10.   
  11. [ndb_mgmd(MGM)] 1 node(s)  
  12. id=1    @192.168.100.1  (mysql-5.5.20 ndb-7.2.5)  
  13.   
  14. [mysqld(API)]   2 node(s)  
  15. id=4    @192.168.100.2  (mysql-5.5.20 ndb-7.2.5)  
  16. id=5    @192.168.100.3  (mysql-5.5.20 ndb-7.2.5)  
  17.   
  18. ndb_mgm>  

SQL節點測試
SQL1

  1. mysql> create database mysql_cluster;  
  2. Query OK, 1 row affected (0.20 sec)  
  3.   
  4. mysql> use mysql_cluster  
  5. Database changed  
  6. mysql> create table tt1 (id intname varchar(10)) engine ndbcluster;  
  7. //注意這裡建表只能使用ndbcluster引擎,否則只能同步庫,不能同步表中內容  
  8. Query OK, 0 rows affected (0.45 sec)  
  9.   
  10. mysql> insert into tt1 select 1,'wu';  
  11. Query OK, 1 row affected (0.02 sec)  
  12. Records: 1  Duplicates: 0  Warnings: 0  
  13.   
  14. mysql> insert into tt1 select 2,'ku';  
  15. Query OK, 1 row affected (0.01 sec)  
  16. Records: 1  Duplicates: 0  Warnings: 0  
  17.   
  18. mysql>   

SQL2

  1. mysql> show databases;  
  2. +--------------------+  
  3. Database           |  
  4. +--------------------+  
  5. | information_schema |  
  6. | mysql              |  
  7. | mysql_cluster      |  
  8. | ndbinfo            |  
  9. | performance_schema |  
  10. | test               |  
  11. +--------------------+  
  12. rows in set (0.01 sec)  
  13.   
  14. mysql> use mysql_cluster  
  15. Reading table information for completion of table and column names  
  16. You can turn off this feature to get a quicker startup with -A  
  17.   
  18. Database changed  
  19. mysql> show tables;  
  20. +-------------------------+  
  21. | Tables_in_mysql_cluster |  
  22. +-------------------------+  
  23. | tt1                     |  
  24. +-------------------------+  
  25. 1 row in set (0.00 sec)  
  26.   
  27. mysql> select * from tt1;  
  28. +------+------+  
  29. | id   | name |  
  30. +------+------+  
  31. |    1 | wu   |  
  32. |    2 | ku   |  
  33. +------+------+  
  34. rows in set (0.01 sec)  
  35.   
  36. mysql>   
  37. //檢視SQL2節點可以看出兩邊資料是同步的