標籤:mysql cluster ndb儲存
一、NDB Cluster (分布式儲存引擎)儲存引擎簡單簡介
NDB 儲存引擎也叫NDB Cluster 儲存引擎,主要用於MySQL Cluster 分布式叢集環境,
Cluster 是MySQL 從5.0 版本才開始提供的新功能。這部分我們可能並不僅僅只是介紹NDB
儲存引擎,因為離開了MySQL CLuster 整個環境,NDB 儲存引擎也將失去太多意義。所以
接下來會和MySQL Cluster的搭建一塊介紹。
Mysql Cluster 是一種技術,其主要功能是在無共用的相關係統中部署記憶體中資料庫的Cluster,其主要是通過NDB Cluster(簡稱NDB)儲存引擎來實現的。
在通過無共用體繫結構,系統能夠使用廉價的硬體,而且對軟硬體無特殊要求。
一般來說,一個Mysql Cluster 的環境結構主要如下:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/43/D1/wKioL1PdBLWSVGssAAGBsv50qV4277.jpg" title="Screenshot11.png" alt="wKioL1PdBLWSVGssAAGBsv50qV4277.jpg" />
主要由以下三部分組成:
1). 負責管理各個節點的Manage 節點主機:
管理節點負責整個Cluster 叢集中各個節點的管理工作,包括叢集的配置,啟動關閉
各節點,以及實施資料的備份恢複等。管理節點會擷取整個Cluster 環境中各節點的狀態和
錯誤資訊,並且將各Cluster 叢集中各個節點的資訊反饋給整個叢集中其他的所有節點。由
於管理節點上儲存在整個Cluster 環境的配置,同時擔任了叢集中各節點的基本溝通工作,
所以他必須是最先被啟動的節點。
2). SQL 層的SQL 伺服器節點(後面簡稱為SQL 節點),也就是我們常說的Mysql Server:
主要負責實現一個資料庫在儲存層之上的所有事情,比如串連管理,query 最佳化和響
應,cache 管理等等,只有儲存層的工作交給了NDB 資料節點去處理了。也就是說,在純粹
的Mysql Cluster 環境中的SQL 節點,可以被認為是一個不需要提供任何儲存引擎的Mysql
伺服器,因為他的儲存引擎有Cluster 環境中的NDB 節點來擔任。所以,SQL 層各Mysql 服
務器的啟動與普通的Mysql 啟動有一定的區別,必須要添加ndbcluster 項,可以添加在
my.cnf 設定檔中,也可以通過啟動命令列來指定。
3). Storage 層的NDB 資料節點,也就是上面說的NDB Cluster:
NDB 是一個記憶體式儲存引擎也就是說,他會將所有的資料和索引資料都load 到記憶體中,
但也會將資料持久化到存放裝置上。不過,最新版本,已經支援使用者自己選擇資料可以不全
部Load 到記憶體中了,這對於有些資料量太大或者基於成本考慮而沒有足夠記憶體空間來存放
所有資料的使用者來說的確是一個大好訊息。
NDB 節點主要是實現底層資料存放區的功能,儲存Cluster 的資料。每一個NDB 節點儲存
完整資料的一部分(或者一份完整的資料,視節點數目和配置而定),在MySQL CLuster 裡
面叫做一個fragment。而每一個fragment,正常情況來講都會在其他的主機上面有一份(或
者多分)完全相同的鏡像存在。這些都是通過配置來完成的,所以只要配置得當,Mysql
Cluster 在儲存層不會出現單點的問題。
一般來說,NDB 節點被組織成一個一個的NDB Group,一個NDB Group 實際上就是一組存有完全相同的物理資料的NDB 節點群。
上面提到了NDB 各個節點對資料的組織,可能每個節點都存有全部的資料也可能只儲存
一部分資料,主要是受節點數目和參數來控制的。首先在Mysql Cluster 主設定檔(在管
理節點上面,一般為config.ini)中,有一個非常重要的參數叫NoOfReplicas,這個參數
指定了每一份資料被冗餘儲存在不同節點上面的份數,該參數一般至少應該被設定成2,也
只需要設定成2 就可以了。因為正常來說,兩個互為冗餘的節點同時出現故障的機率還是非
常小的,當然如果機器和記憶體足夠多的話,也可以繼續增大。一個節點上面是儲存所有的數
據還是一部分資料,還受到儲存節點數目的限制。NDB 儲存引擎首先保證NoOfReplicas 參
數配置的要求對資料冗餘,來使用儲存節點,然後再根據節點數目將資料分段來繼續使用多
餘的NDB 節點,分段的數目為節點總數除以NoOfReplicas 所得。
二、MySQL Cluster叢集架構的實現
管理節點上:
rpm -ivh MySQL-Cluster-gpl-management-7.1.18-1.el6.x86_64.rpm
rpm -ivh MySQL-Cluster-gpl-tools-7.1.18-1.el6.x86_64.rpm
mkdir /usr/mysql-cluster
vi /usr/mysql-cluster/config.ini [ndbd default] noofreplicas=1 //運行NDB儲存引擎 datamemory=30M indexmemory=10M [ndb_mgmd] nodeid=1 hostname=192.168.1.21 //管理節點ip datadir=/usr/mysql-cluster [ndbd] nodeid=2 hostname=192.168.1.22 //儲存節點ip datadir=/usr/mysql-cluster [mysqld] //用戶端 nodeid=3 hostname=192.168.1.23
ndb_mgmd -f /usr/mysql-cluster/config.ini --initial //指定設定檔,初始化
ndb_mgm //就可以查看各個節點的資訊了
儲存節點上:
rpm -ivh MySQL-Cluster-gpl-storage-7.1.18-1.el6.x86_64.rpm
vi /etc/my.cnf [mysqld] ndbcluster //運行ndb叢集引擎 ndb-connectstring=192.168.1.21 //指定管理節點 [mysql_cluster] ndb-connectstring=192.168.1.21
ndbd --initial //初始化後,在manager節點上ndb_mgm查看儲存節點已經串連上了
SQL節點 上:
MySQL-Cluster-gpl-client-7.1.18-1.el6.x86_64.rpm
MySQL-Cluster-gpl-server-7.1.18-1.el6.x86_64.rpm
SQL節點上若安裝了mysql、mysql-server、mysql-libs,需要將其卸載才能安裝MySQL-Cluster,否則會報錯
error: Failed dependencies:
mysql conflicts with MySQL-Cluster-gpl-server-7.1.18-1.el6.x86_64
mysql-server conflicts with MySQL-Cluster-gpl-server-7.1.18-1.el6.x86_64
rpm -e mysql-libs --nodeps //強制卸載
rpm -ivh MySQL-Cluster-gpl-*
vi /etc/my.cnf [mysqld] .... ndbcluster (以下資料添加在[mysqld]地區的最下方) ndb-connectstring=192.168.1.21 [mysql_cluster] ndb-connectstring=192.168.1.21
/etc/init.d/mysql start //啟動mysql,然後在管理節點上ndb_mgm查看
sql節點上如初始化時會在目錄 /var/lib/mysql/mysql 中產生資料庫的好多檔案,如啟動時初始化失敗,可以手動執行命令 mysql_install_db --user=mysql 產生。
--------------------
添加新的儲存節點和sql節點:
添加新的儲存節點和sql節點前,必須先將已有的管理節點、儲存節點、sql節點關閉
在管理節點上執行ndb_mgm -e shutdown只能關閉儲存節點和管理節點自己的服務,sqlt節點仍需手工stop,之後再添加。
先在管理節點的設定檔中加入要添加的節點:
vi /usr/mysql-cluster/config.ini [ndbd default] noofreplicas=2 //定義兩個節點為一個節點群組, datamemory=30M indexmemory=10M [ndb_mgmd] nodeid=1 hostname=192.168.1.21 datadir=/usr/mysql-cluster [ndbd] nodeid=2 hostname=192.168.1.22 datadir=/usr/mysql-cluster [ndbd] //加入的儲存節點 nodeid=4 hostname=192.168.1.10 datadir=/usr/mysql-cluster [mysqld] nodeid=3 hostname=192.168.1.23 [mysqld] //加入的sql節點 nodeid=5 hostname=192.168.1.24
然後再配置新加的節點(和原來的配置一致)
ndb_mgmd -f /usr/mysql-cluster/config.ini --initial //重新初始化管理端
啟動各個節點,在管理節點上ndb_mgm show,就可以看見各個節點已經正常工作
--------------
在任一sql節點插入資料,都可以在另一節點看到,
在管理節點上執行備份資料命令,資料將分別備份到各個儲存節點上,恢複時需要在各個儲存節點上都執行恢複命令;
ndb_mgm> start backup
Waiting for completed, this may take several minutes
Node 2: Backup 1 started from node 1
Node 2: Backup 1 started from node 1 completed
StartGCP: 1125 StopGCP: 1128
#Records: 2059 #LogRecords: 0
Data: 51264 bytes Log: 0 bytes
在儲存節點/usr/mysql-cluster/BACKUP目錄中就可以看到備份的資料;當在sql節點上刪除資料,就可以利用此備份恢複(只能恢複資料,如將表或庫直接刪掉了,需要手動加上,才可以恢複);
恢複資料需要命令 ndb_restore (由包MySQL-Cluster-gpl-tools-7.1.18-1.el6.x86_64.rpm提供),若儲存節點上沒有此命令,可以將其直接由管理節點上複製過去,也可以安裝tools包。
注意:恢複資料時,管理節點上一定要有空閑串連,否則無法恢複。
ndb_restore -n 2 -b 1 -r /usr/mysql-cluster/BACKUP/BACKUP-1/
-n指節點id -b指備份id -r指備份目錄
本文出自 “劃舞魚” 部落格,請務必保留此出處http://ty1992.blog.51cto.com/7098269/1534313