MySQL羣集技術在分佈式系統中爲MySQL數據提供了冗餘特性,加強了安全性,使得單個MySQL服務器故障不會對系統產生巨大的負面效應,系統的穩定性獲得保障。html
Mysql羣集(Cluster)簡介node
MySQL羣集須要有一組計算機,每臺計算機的角色多是不同的。MySQL羣集中有三種節點:管理節點、數據節點和SQL節點。羣集中的某計算機多是某一種節點,也多是兩種或三種節點的集合。這三種節點只是在邏輯上的劃分,因此它們不必定和物理計算機是一一對應的關係。mysql
管理節點(也能夠稱管理服務器)主要負責管理數據節點和SQL節點,還有羣集配置文件和羣集日誌文件。它監控其餘節點的工做狀態,可以啓動、關閉或重啓某個節點。其餘節點從管理節點檢索配置數據,當數據節點有新事件時就把事件信息發送給管理節點並寫入羣集日誌。linux
數據節點用於存儲數據。sql
SQL節點跟通常的MySQL服務器是同樣的,咱們能夠經過它進行SQL操做。數據庫
下圖中畫出了三種羣集節點及應用程序間的關係:安全
1、配置環境:服務器
OS:Linux CentOS 6.3Bit64tcp
MySQL:mysql-cluster-gpl-7.2.12-linux2.6-x86_64.tar.gz分佈式
(注意:需用Cluster版本,可在官網上下載http://dev.mysql.com/downloads/cluster/#downloads)
節點配置狀況:
hostname IP地址應用服務
DB1 172.16.10.160 MGM
DB2 172.16.10.161 NDBD1,MYSQLD
DB3 172.16.10.162 NDBD2, MYSQLD
DB4 172.16.10.254 MYSQLD
我這裏數據節點和sql節點用相同的2臺機器承擔,sql節點也可分開,例db4.
2、管理節點:
(一)安裝管理節點MGM
#groupadd mysql
#useradd mysql -g mysql
#mv mysql-cluster-gpl-7.0.8a-linux-i686-glibc23.tar.gz/usr/local/
#cd /usr/local/
#tar zxvfmysql-cluster-gpl-7.0.8a-linux-i686-glibc23.tar.gz
#rm -fmysql-cluster-gpl-7.0.8a-linux-i686-glibc23.tar.gz
#mv mysql-cluster-gpl-7.0.8a-linux-i686-glibc23mysql
#chown -R mysql:mysql mysql
(二)配置裝管理節點MGM
#mkdir/var/lib/mysql-cluster
#cd /var/lib/mysql-cluster
#vi config.ini//這裏須要手動添加以下內容
[NDBD DEFAULT]
NoOfReplicas=2 #副本數量,建議使用默認的2
DataMemory=600M #每一個數據節點中給數據分配的內存
IndexMemory=100M #每一個數據節點中給索引分配的內存
BackupMemory: 20M
[NDB_MGMD] #管理節點配置項
Nodeid= 1
HostName=172.16.10.160 #管理節點IP
DataDir=/usr/local/mysql/data #管理節點日誌、配置目錄
ArbitrationRank: 1 #該節點的優先級別等級
[NDBD] #數據節點配置項
Nodeid = 2 #第一個數據節點
HostName=172.16.10.161 #數據節點IP
DataDir=/usr/local/mysql/data #數據節點存放數據的目錄
[NDBD]
Nodeid = 3 #第二個數據節點
HostName=172.16.10.162
DataDir=/usr/local/mysql/data
[mysqld] #SQL節點配置項
Nodeid = 4 #第一個SQL節點
HostName=172.16.10.161
[mysqld]
Nodeid = 5 #第二個SQL節點
HostName=172.16.10.162
[mysqld]
Nodeid = 6 #第三個SQL節點
HostName=172.16.10.254
[mysqld] #建議保留一個SQL節點配置口
(三)管理節點啓動相關服務及測試:
#/usr/local/mysql/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini
#netstat -lntpu
tcp 0 0 0.0.0.0:1186 0.0.0.0:* LISTEN 22907/ndb_mgmd
看到1186端口開放了說明啓動是正常的.
命令行中的ndb_mgmd是mysql cluster的管理服務器,後面的-f表示後面的參數是啓動的參數配置文件。若是在啓動後過了幾天又添加了一個數據節點,這時修改了配置文件啓動時就必須加上--initial參數,否則添加的節點不會做用在mysql cluster中。
ndb_mgmd -f /var/lib/mysql-cluster/config.ini --initial
使用ndb_mgm來監聽客戶端,以下:
#/usr/local/mysql/bin/ndb_mgm -e show
關閉管理節點,以下:
#/usr/local/mysql/bin/ndb_mgm -e shutdown
3、數據節點和SQL節點:
(一)安裝數據節點和SQL節點(在兩個ndbd 節點 DB1,DB2 安裝mysql):
#groupadd mysql
#useradd mysql -g mysql
#mvmysql-cluster-gpl-7.0.8a-linux-i686-glibc23.tar.gz /usr/local/
#cd /usr/local/
#tar zxvfmysql-cluster-gpl-7.0.8a-linux-i686-glibc23.tar.gz
#rm -fmysql-cluster-gpl-7.0.8a-linux-i686-glibc23.tar.gz
#mv mysql-cluster-gpl-7.0.8a-linux-i686-glibc23mysql
#chown -R mysql:mysql mysql
#cd mysql
#scripts/mysql_install_db --user=mysql
#cp support-files/my-medium.cnf /etc/my.cnf
#cp support-files/mysql.server /etc/init.d/mysqld
(二)配置數據節點和SQL節點
#vi/etc/my.cnf //這裏須要手動添加以下的內容
[mysqld]
datadir=/usr/local/mysql/data/ //這裏要與管理節點的config.ini相同
ndbcluster #運行NDB存儲引擎
ndb-connectstring=172.16.10.160:1186 #指定管理節點,這兩行聲明其爲SQL節點
[mysql_cluster]
ndb-connectstring=172.16.10.160:1186 #指定管理節點, 這兩行聲明其爲數據節點
[ndb_mgm]
connect-string=172.16.10.160
[ndb_mgmd]
config-file=/var/lib/mysql-cluster/config.ini //這裏要指定管理節點配置文件路徑
(三)數據節點和SQL節點服務:
啓動數據節點
#/usr/local/mysql/bin/ndbd –initial #/usr/local/mysql/bin/ndbd
能夠把/usr/local/mysql/bin/ndbd加到/etc/rc.local中實現開機啓動。
注意:只有在第一次啓動ndbd時或者對管理節點的config.ini進行改動後才須要使用–initial參數!這很重要。緣由在於,該參數會使節點刪啓動SQL節點除由早期ndbd實例建立的、用於恢復的任何文件,包括恢復用日誌文件。
啓動SQL節點
Service mysqld start
完成配置後,啓動集羣並不很困難。必須在數據節點所在的主機上分別啓動每一個集羣節點進程。儘管可以按任何順序啓動節點,但咱們建議,應首先啓動管理節點,而後啓動存儲節點,最後啓動SQL節點。
4、功能測試:
到管理節點查看下相關服務狀態
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 @10.10.1.65 (mysql-5.1.37 ndb-7.0.8,Nodegroup: 0, Master)
id=3 @10.10.1.58 (mysql-5.1.37 ndb-7.0.8,Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @10.10.1.151 (mysql-5.1.37 ndb-7.0.8)
[mysqld(API)] 2 node(s)
id=4 @10.10.1.65 (mysql-5.1.37 ndb-7.0.8)
id=5 @10.10.1.58 (mysql-5.1.37 ndb-7.0.8)
能夠看到這裏的數據節點、管理節點、sql節點都是正常的.
如今咱們在其中一個數據節點上進行相關數據庫的建立,而後到另一個數據節點上看看數據是否同步
# /usr/local/mysql/bin/mysql -u root -p
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
|mysql |
| ndb_2_fs |
|test |
+--------------------+
mysql> create database aa;
mysql> use aa
mysql> CREATE TABLE ctest2 (i INT) ENGINE=NDB;
//這裏必須指定數據庫表的引擎爲NDB,不然同步失敗
mysql> INSERT INTO ctest2 () VALUES(1);
mysql> SELECT * FROM ctest2;
+------+
| i |
+------+
| 1 |
+------+
如今到另一個數據節點查看下aa數據庫是否同步過來了.
#/usr/local/mysql/bin/mysql -u root -p
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
|aa |
|bb |
|mysql |
| ndb_3_fs |
|test |
+--------------------+
mysql> use aa
mysql> select * from ctest2;
+------+
| i |
+------+
| 1 |
+------+
從上面能夠看到數據已經同步了,mysql集羣環境已經搭建完成.
5、破壞性測試:
在上面能夠看到10.10.1.65做爲主的數據節點,我如今把10.10.1.65這臺機器關閉,看下有什麼結果
ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 (not connected, accepting connect from 10.10.1.65)
id=3 @10.10.1.58 (mysql-5.1.37 ndb-7.0.8,Nodegroup: 0, Master)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @10.10.1.151 (mysql-5.1.37 ndb-7.0.8)
[mysqld(API)] 2 node(s)
id=4 (not connected, accepting connect from any host)
id=5 @10.10.1.58 (mysql-5.1.37 ndb-7.0.8)
從上面能夠發現如今10.10.1.65這臺機器的數據節點和sql節點已經鏈接不上了,10.10.1.58成爲了主數
據節點,咱們如今在10.10.1.58數據節點上建立一個表,而後恢復10.10.1.65的數據節點,看下它是否
把數據同步過來了.
先在10.10.1.58數據節點作以下操做:
mysql> create table ctest3(idint(11)) engine=NDB;
mysql> show tables;
+--------------+
| Tables_in_aa |
+--------------+
| ctest2 |
| ctest3 |
+--------------+
mysql> insert into ctest3 values(1);
mysql> select * from ctest3;
+------+
| id |
+------+
| 1 |
+------+
而後咱們恢復10.10.1.65數據節點,查看下ctest3數據是否同步過來了.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
|aa |
|bb |
|mysql |
| ndb_2_fs |
|test |
+--------------------+
mysql> use aa
mysql> show tables;
+--------------+
| Tables_in_aa |
+--------------+
| ctest |
| ctest2 |
| ctest3 |
+--------------+
mysql> select * from ctest3;
+------+
| id |
+------+
| 1 |
+------+
能夠看到10.10.1.65數據節點已經把10.10.1.58數據節點的數據同步過來了,說明mysql集羣是沒有問題的了.隨後作下mysql性能相關的測試.
6、sql更密碼及遠程訪問:
開啓Mysql數據庫的遠程鏈接權限,密碼改成123456
# /usr/local/mysql/bin/mysql -u root -p
use mysql
grant all privileges on *.* to 'root' @'%'identified by '123456';
flush privileges;FLUSH PRIVILEGES;
http://xylonwang.iteye.com/blog/563063