mysql-cluster叢集原理介紹和搭建步驟(四個data/sql節點)
MySQL簇是一種技術,該技術允許在無共享的系統中部署“記憶體中”資料庫的簇。通過無共享體系結構,系統能夠使用廉價的硬體,而且對軟硬體無特殊要求。此外,由於每個元件有自己的記憶體和磁碟,不存在單點故障。
MySQL簇將標準的MySQL伺服器與名為NDB的“記憶體中”簇式儲存引擎集成了起來。在我們的文件中,術語NDB指的是與儲存引擎相關的設定部分,而術語“MySQL簇”指的是MySQL和NDB儲存引擎的組合。
MySQL簇由一組計算機構成,每臺計算機上均執行著多種程序,包括MySQL伺服器,NDB簇的資料節點,管理伺服器,以及(可能)專門的資料訪問程式。關於簇中這些元件的關係,請參見下圖:
所有這些程式一起構成了MySQL簇。將資料儲存到NDB簇儲存引擎中時,表將儲存在資料節點內。能夠從簇中所有其他MySQL伺服器直接訪問這些表。因此,在將資料儲存在簇內的工資表應用程式中,如果某一應用程式更新了1位僱員的工資,所有查詢該資料的其他MySQL伺服器能立刻發現這種變化。
對於MySQL簇,儲存在資料節點內的資料可被對映,簇能夠處理單獨資料節點的故障,除了少數事務將因事務狀態丟失而被放棄外,不會產生其他影響。由於事務性應用程式能夠處理事務失敗事宜,因而它不是問題源。
通過將MySQL簇引入開放原始碼世界,MySQL為所有需要它的人員提供了具有高可用性、高效能和可縮放性的簇資料管理。
MySQL簇的基本概念
NDB是一種“記憶體中”儲存引擎,它具有可用性高和資料一致性好的特點。
能夠使用多種故障切換和負載平衡選項配置NDB儲存引擎,但以簇層面上的儲存引擎開始最簡單。MySQL簇的NDB儲存引擎包含完整的資料集,僅取決於簇本身內的其他資料。
下面,我們介紹了設定由NDB儲存引擎和一些MySQL伺服器構成的MySQL簇的設定方法。
目前,MySQL簇的簇部分可獨立於MySQL伺服器進行配置。在MySQL簇中,簇的每個部分被視為1個節點。
註釋:在很多情況下,術語“節點”用於指計算機,但在討論MySQL簇時,它表示的是程序。在單臺計算機上可以有任意數目的節點,為此,我們採用術語簇主機。
有三類簇節點,在最低的MySQL簇配置中,至少有三個節點,這三類節點分別是:
管理(MGM)節點:這類節點的作用是管理MySQL簇內的其他節點,如提供配置資料、啟動並停止節點、執行備份等。由於這類節點負責管理其他節點的配置,應在啟動其他節點之前首先啟動這類節點。MGM節點是用命令ndb_mgmd啟動的。
資料節點:這類節點用於儲存簇的資料。資料節點的數目與副本的數目相關,是片段的倍數。例如,對於兩個副本,每個副本有兩個片段,那麼就有4個數據節點。沒有必要有一個以上的副本。資料節點是用命令ndbd啟動的。
SQL節點:這是用來訪問簇資料的節點。對於MySQL簇,客戶端節點是使用NDB簇儲存引擎的傳統MySQL伺服器。典型情況下,SQL節點是使用命令mysqld –ndbcluster啟動的,或將ndbcluster新增到my.cnf後使用mysqld啟動。
簇配置包括對簇中單獨節點的配置,以及設定節點之間的單獨通訊鏈路。對於目前設計的MySQL簇,其意圖在於,從處理器的能力、記憶體空間和頻寬來講,儲存節點是同質的,此外,為了提供單一的配置點,作為整體,簇的所有配置資料均位於1個配置檔案中。
管理伺服器(MGM節點)負責管理簇配置檔案和簇日誌。簇中的每個節點從管理伺服器檢索配置資料,並請求確定管理伺服器所在位置的方式。當資料節點內出現有趣的事件時,節點將關於這類事件的資訊傳輸到管理伺服器,然後,將這類資訊寫入簇日誌。
此外,可以有任意數目的簇客戶端程序或應用程式。它們分為兩種型別:
標準MySQL客戶端:對於MySQL簇,它們與標準的(非簇類)MySQL沒有區別。換句話講,能夠從用PHP、Perl、C、C++、Java、Python、Ruby等編寫的現有MySQL應用程式訪問MySQL簇。
管理客戶端:這類客戶端與管理伺服器相連,並提供了優雅地啟動和停止節點、啟動和停止訊息跟蹤(僅對除錯版本)、顯示節點版本和狀態、啟動和停止備份等的命令。
-----------------------------------------------------------------------------------以上部分是摘自官方文件
搭建sql節點(4個),data節點(4個),manage節點(1個)步驟
//環境介紹
1、manage節點:10.10.54.154
2、sql/data節點:10.10.54.154/155/156/157
//編譯安裝cmake2.8
[154/155/156/157]
1.下載mysql-cluster cmake
shell> wget http://dev.mysql.com/get/Downloads/MySQL-Cluster-7.2/mysql-cluster-gpl-7.2.15-linux2.6-x86_64.tar.gz
shell> wget http://www.cmake.org/files/v2.8/cmake-2.8.12.2.tar.gz
2.編譯安裝cmake2.8---(154/155/156/157)
shell> tar xvf cmake-2.8.12.2.tar.gz
shell> cd cmake-2.8.12.2
shell> ./configure
shell> make
shell> make install
3.編譯安裝mysql-cluster---(154/155/156/157)
shell> tar xvf mysql-cluster-gpl-7.2.15.tar.gz
shell> cd mysql-cluster-gpl-7.2.15
shell> cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/tmp/mysql-cluster.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DEXTRA_CHARSETS=all \
-DWITH_EMBEDDED_SERVER=0 \
-DWITH_NDB_JAVA=OFF \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_NDBCLUSTER_STORAGE_ENGINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DMYSQL_USER=mysql \
-DWITH_DEBUG=0 \
-DWITH_SSL=yes
4.shell> make && make install
//mysql-cluster配置---(154/155/156/157)
shell> mkdir /data/ndb
shell> cd /home/mysql-cluster-gpl-7.2.15
shell> cp support-files/mysql.server /etc/init.d/mysqld
shell> cp support-files/my-large.cnf /etc/my.cnf
shell> chown mysql.mysql /usr/local/mysql -R
shell> chmod 755 /usr/local/mysql/scripts/*
shell> chmod 755 /etc/init.d/mysqld
shell> sed -i "/\[mysqld\]/a datadir=/data/ndb" /etc/my.cnf
shell> /usr/local/mysql/scripts/mysql_install_db --user=root --basedir=/usr/local/mysql --datadir=/data/ndb
shell> chown mysql:mysql -R /data/ndb
//data/sql節點配置---(154/155/156/157)
shell> cd /usr/local/mysql/bin/
shell> cp ndb_mgm* /usr/local/bin/
shell> vim /etc/my.cnf
-------------------------
[mysql_cluster]
ndb-connectstring=10.10.54.154
[mysqld]
datadir=/data/ndb
ndbcluster
ndb-connectstring=10.10.54.154
-------------------------
//管理節點154配置
shell> mkdir -p /etc/ndb/config.ini
shell> vim /etc/ndb/config.ini
--------------------------------------
[NDBD DEFAULT]
NoOfReplicas=2
DataMemory=128M
IndexMemory=64M
[TCP DEFAULT]
portnumber=2202
[NDB_MGMD]
NodeId=1
hostname=10.10.54.154
datadir=/var/lib/mysql-cluster
[NDBD]
NodeId=2
hostname=10.10.54.154
datadir=/data/ndb
BackupDataDir=/data/backup
[NDBD]
NodeId=3
hostname=10.10.54.155
datadir=/data/ndb
BackupDataDir=/data/backup
[NDBD]
NodeId=4
hostname=10.10.54.156
datadir=/data/ndb
BackupDataDir=/data/backup
[NDBD]
NodeId=5
hostname=10.10.54.157
datadir=/data/ndb
BackupDataDir=/data/backup
[MYSQLD]
NodeId=7
hostname=10.10.54.154
[MYSQLD]
NodeId=8
hostname=10.10.54.155
[MYSQLD]
NodeId=9
hostname=10.10.54.156
[MYSQLD]
NodeId=10
hostname=10.10.54.157
[MYSQLD]
NodeId=11
[MYSQLD]
NodeId=12
[MYSQLD]
NodeId=13
[MYSQLD]
NodeId=14
------------------------------------
//啟動mysql-cluster
---啟動順序management node--data node---sql node
#啟動管理節點
shell> ndb_mgmd -f /var/lib/mysql-cluster/config.ini --initial
##--initial引數第一次啟動時加上
#啟動資料節點
shell> ndbd #--initial ##初始化資料庫,用在備份,恢復時
2014-02-27 18:14:23 [ndbd] INFO -- Angel connected to '10.10.54.154:1186'
2014-02-27 18:14:23 [ndbd] INFO -- Angel allocated nodeid: 2
#啟動sql節點
shell> /etc/init.d/mysqld start
//檢視mysql叢集狀態
shell> ndb_mgm
ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)] 4 node(s)
id=2 @10.10.54.154 (mysql-5.5.35 ndb-7.2.15, Nodegroup: 0, *)
id=3 @10.10.54.155 (mysql-5.5.35 ndb-7.2.15, Nodegroup: 0)
id=4 @10.10.54.156 (mysql-5.5.35 ndb-7.2.15, Nodegroup: 1)
id=5 @10.10.54.157 (mysql-5.5.35 ndb-7.2.15, Nodegroup: 1)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @10.10.54.154 (mysql-5.5.35 ndb-7.2.15)
[mysqld(API)] 8 node(s)
id=7 @10.10.54.154 (mysql-5.5.35 ndb-7.2.15)
id=9 @10.10.54.155 (mysql-5.5.35 ndb-7.2.15)
id=10 @10.10.54.156 (mysql-5.5.35 ndb-7.2.15)
id=11 @10.10.54.157 (mysql-5.5.35 ndb-7.2.15)
id=12 (not connected, accepting connect from any host)
id=13 (not connected, accepting connect from any host)
id=14 (not connected, accepting connect from any host)
id=15 (not connected, accepting connect from any host)
//測試mysql-cluster
1.管理機上建立表
mysql> create database d1;
mysql> use d1;
mysql> CREATE TABLE `t_e` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` enum('M','F') NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`)
) ENGINE=ndbcluster DEFAULT CHARSET=utf8
2.mysql> insert into t_e select * from employees.employees;
##插入出錯
ERROR 1297 (HY000): Got temporary error 233 'Out of operation records in transaction coordinator (increase MaxNoOfConcurrentOperations)' from NDBCLUSTER
#原因時插入資料量太大
mysql> insert into t_e select * from employees.employees limit 10000;
#插入成功
3.data節點上檢視,資料已同步
//關閉mysql-cluster
1.先關閉sql節點
/etc/init.d/mysqld stop
2.在管理機上
shell> ndb_mgm
ndb_mgm> shutdown #關閉所有cluster程序