1 概述
MySQL Cluster 是MySQL 適合于分布式計算環境的高實用、可拓展、高性能、高冗余版本,其研發設計的初衷就是要滿足許多行業里的最嚴酷應用要求,這些應用中經常要求數據庫運行的可靠性要達到99.999%。MySQL Cluster允許在無共享的系統中部署“內存中”數據庫集群,通過無共享體系結構,系統能夠使用廉價的硬件,而且對軟硬件無特殊要求。此外,由于每個組件有自己的內存和磁盤,不存在單點故障。
實際上,MySQL集群是把一個叫做NDB的內存集群存儲引擎集成與標準的MySQL服務器集成。它包含一組計算機,每個都跑一個或者多個進程,這可能包括一個MySQL服務器,一個數據節點,一個管理服務器和一個專有的一個數據訪問程序。
MySQL Cluster能夠使用多種故障切換和負載平衡選項配置NDB存儲引擎,但在Cluster 級別上的存儲引擎上做這個最簡單。以下為MySQL集群結構關系圖,
?
MySQL從結構看,由3類節點(計算機或進程)組成,分別是:
管理節點:用于給整個集群其他節點提供配置、管理、仲裁等功能。理論上通過一臺服務器提供服務就可以了。
數據節點:MySQL Cluster的核心,存儲數據、日志,提供數據的各種管理服務。2個以上 時就能實現集群的高可用保證,DB節點增加時,集群的處理速度會變慢。
SQL節點(API):用于訪問MySQL Cluster數據,提供對外應用服務。增加 API 節點會提高整個集群的并發訪問速度和整體的吞吐量,該節點 可以部署在Web應用服務器上,也可以部署在專用的服務器上,也開以和DB部署在 同一臺服務器上。
2 NDB引擎
MySQL Cluster 使用了一個專用的基于內存的存儲引擎——NDB引擎,這樣做的好處是速度快, 沒有磁盤I/O的瓶頸,但是由于是基于內存的,所以數據庫的規模受系統總內存的限制, 如果運行NDB的MySQL服務器一定要內存夠大,比如4G, 8G, 甚至16G。NDB引擎是分布式的,它可以配置在多臺服務器上來實現數據的可靠性和擴展性,理論上 通過配置2臺NDB的存儲節點就能實現整個數據庫集群的冗余性和解決單點故障問題。
2.1 缺陷
-
基于內存,數據庫的規模受集群總內存的大小限制
基于內存,斷電后數據可能會有數據丟失,這點還需要通過測試驗證。
多個節點通過網絡實現通訊和數據同步、查詢等操作,因此整體性受網絡速度影響,
因此速度也比較慢
?
2.2 優點
-
多個節點之間可以分布在不同的地理位置,因此也是一個實現分布式數據庫的方案。
擴展性很好,增加節點即可實現數據庫集群的擴展。
冗余性很好,多個節點上都有完整的數據庫數據,因此任何一個節點宕機都不會造成服務中斷。
實現高可用性的成本比較低,不象傳統的高可用方案一樣需要共享的存儲設備和專用的軟件才能實現,NDB 只要有足夠的內存就能實現。
二、集群搭建
將搭建一個最簡化的MySQL Cluster系統,配置方法中的所有命令都是以root賬戶運行。這個MySQL Cluster包含一個管理結點、兩個數據結點、兩個SQL結點,這五個結點會分別安裝在五個虛擬機上,虛擬機的名稱和IP如下所示:
管理結點 |
mysql-mgm |
192.168.124.141 |
數據結點?1 |
mysql-ndbd-1 |
192.168.124.142 |
數據結點?2 |
mysql-ndbd-2 |
192.168.124.143 |
SQL?結點1 |
mysql-sql-1 |
192.168.124.144 |
SQL?結點2 |
mysql-sql-2 |
192.168.124.145 |
??
一、公共配置
請在三個虛擬機上分別配置此處的配置項。
1. 安裝虛擬機
虛擬機操作系統安裝CentOS 6.4的x86_64版本,使用NAT網絡,并且還要安裝vmware-tools,具體安裝方法此處不詳述。
2. 拷貝mysql cluster
下載以下版本的MySQL-Cluster:
http://www.php.cn/
下載得到的壓縮包拷貝至虛擬機的/root/Downloads目錄,然后在shell中運行以下命令:
@@######@@ |
3. 關閉安全策略
關閉iptables防火墻(或者打開防火墻的1186、3306端口),在Shell中運行以下命令:
@@######@@ |
關閉SELinux,在Shell中運行以下命令:
@@######@@ |
將config文件中的SELINUX項改為disabled,修改后的config文件的內容如下:
@@######@@ |
最后重啟系統
二、配置管理結點(192.168.124.141)
1. 配置config.ini配置文件
在shell中運行以下命令:
@@######@@ |
配置文件config.ini內容如下:
@@######@@ |
2. 安裝管理結點
安裝管理節點,不需要mysqld二進制文件,只需要MySQL Cluster服務端程序(ndb_mgmd)和監聽客戶端程序(ndb_mgm)。在shell中運行以下命令:
@@######@@ |
三、配置數據結點(192.168.124.142、192.168.124.143)
1. 添加mysql組和用戶
在shell中運行以下命令:
@@######@@ |
2. 配置my.cnf配置文件
在shell中運行以下命令:
@@######@@ |
配置文件my.cnf的內容如下:
@@######@@ |
3. 創建系統數據庫
在shell中運行以下命令:
@@######@@ |
4. 設置數據目錄
在shell中運行以下命令:
@@######@@ |
5. 配置MySQL服務
在shell中運行以下命令:
@@######@@ |
四、配置SQL結點(192.168.124.144、192.168.124.145)
1. 添加mysql組和用戶
在shell中運行以下命令:
@@######@@ |
2. 配置my.cnf配置文件
在shell中運行以下命令:
@@######@@ |
配置文件my.cnf的內容如下:
@@######@@ |
3. 創建系統數據庫
在shell中運行以下命令:
@@######@@ |
4. 設置數據目錄
在shell中運行以下命令:
@@######@@ |
5. 配置MySQL服務
在shell中運行以下命令:
@@######@@ |
五、Cluster環境啟動
注意啟動順序:首先是管理節點,然后是數據節點,最后是SQL節點。
1. 啟動管理結點
在shell中運行以下命令:
@@######@@ |
還可以使用ndb_mgm來監聽客戶端,如下:
@@######@@ |
2. 啟動數據結點
首次啟動,則需要添加–initial參數,以便進行NDB節點的初始化工作。在以后的啟動過程中,則是不能添加該參數的,否則ndbd程序會清除在之前建立的所有用于恢復的數據文件和日志文件。
@@######@@ |
如果不是首次啟動,則執行下面的命令。
@@######@@ |
3. 啟動SQL結點
若MySQL服務沒有運行,則在shell中運行以下命令:
@@######@@ |
4. 啟動測試
查看管理節點,啟動成功:
六、集群測試
1. 測試一
現在我們在其中一個SQL結點上進行相關數據庫的創建,然后到另外一個SQL結點上看看數據是否同步。
在SQL結點1(192.168.124.144)上執行:
@@######@@ |
然后在SQL結點2上看數據是否同步過來了
經過測試,在非master上創建數據,可以同步到master上
查看表的引擎是不是NDB,>show create table 表名;
2. 測試二
關閉一個數據節點 ,在另外一個節點寫輸入,開啟關閉的節點,看數據是否同步過來。
首先把數據結點1重啟,然后在結點2上添加數據
在SQL結點2(192.168.124.145)上操作如下:
@@######@@ |
等數據結點1啟動完畢,啟動數據結點1的服務
@@######@@ |
然后登錄進去查看數據
@@######@@ |
可以看到數據已經同步過來了,說明數據可以雙向同步了。
七、關閉集群
1.?關閉管理節點和數據節點,只需要在管理節點(ClusterMgm–134)里執行:
@@######@@ |
顯示
@@######@@ |
2.?然后關閉Sql節點(135,136),分別在2個節點里運行:
@@######@@ |
注意:要再次啟動集群,就按照第五部分的啟動步驟即可,不過這次啟動數據節點的時候就不要加”-initial”參數了。
cd?/root/Downloads tar?-xvzf?mysql-cluster-gpl-7.3.4-linux-glibc2.5-x86_64.tar.gz mv?mysql-cluster-gpl-7.3.4-linux-glibc2.5-x86_64?/usr/local/mysql
chkconfig?--level?35?iptables?off
gedit?/etc/selinux/config
#?This?file?controls?the?state?of?SELinux?on?the?system. #?SELINUX=?can?take?one?of?these?three?values: #?????enforcing?-?SELinux?security?policy?is?enforced. #?????permissive?-?SELinux?prints?warnings?instead?of?enforcing. #?????disabled?-?No?SELinux?policy?is?loaded. SELINUX=disabled #?SELINUXTYPE=?can?take?one?of?these?two?values: #?????targeted?-?Targeted?processes?are?protected, #?????mls?-?Multi?Level?Security?protection. SELINUXTYPE=targeted
mkdir?/var/lib/mysql-cluster cd?/var/lib/mysql-cluster gedit?config.ini
[ndbd?default] NoOfReplicas=2 DataMemory=80M IndexMemory=18M [ndb_mgmd] NodeId=1 hostname=192.168.124.141 datadir=/var/lib/mysql-cluster [ndbd] NodeId=2 hostname=192.168.124.142 datadir=/usr/local/mysql/data [ndbd]NodeId=3hostname=192.168.124.143datadir=/usr/local/mysql/data [mysqld]NodeId=4hostname=192.168.124.144 [mysqld] NodeId=5 hostname=192.168.124.145
cp?/usr/local/mysql/bin/ndb_mgm*?/usr/local/bin cd?/usr/local/bin chmod?+x?ndb_mgm*
groupadd?mysql useradd?-g?mysql?mysql
gedit?/etc/my.cnf
[mysqld] basedir=/usr/local/mysql datadir=/usr/local/mysql/data socket=/usr/local/mysql/sock/mysql.sock user=mysql #?Disabling?symbolic-links?is?recommended?to?prevent?assorted?security?risks symbolic-links=0 [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid [mysql_cluster] ndb-connectstring=192.168.124.141
cd?/usr/local/mysql mkdir?sock scripts/mysql_install_db?--user=mysql?--basedir=/usr/local/mysql?--datadir=/usr/local/mysql/data
chown?-R?root?. chown?-R?mysql.mysql?/usr/local/mysql/data chown?-R?mysql.mysql?/usr/local/mysql/sock chgrp?-R?mysql?.
cp?support-files/mysql.server?/etc/rc.d/init.d/ chmod?+x?/etc/rc.d/init.d/mysql.server chkconfig?--add?mysql.server
groupadd?mysql useradd?-g?mysql?mysql
gedit?/etc/my.cnf
[client] socket=/usr/local/mysql/sock/mysql.sock [mysqld] ndbcluster datadir=/usr/local/mysql/data socket=/usr/local/mysql/sock/mysql.sock ndb-connectstring=192.168.124.141 [mysql_cluster] ndb-connectstring=192.168.124.141
cd?/usr/local/mysql mkdir?sock scripts/mysql_install_db?--user=mysql?--basedir=/usr/local/mysql?--datadir=/usr/local/mysql/data
chown?-R?root?. chown?-R?mysql.mysql?/usr/local/mysql/data chown?-R?mysql.mysql?/usr/local/mysql/sock chgrp?-R?mysql?.
cp?support-files/mysql.server?/etc/rc.d/init.d/ chmod?+x?/etc/rc.d/init.d/mysql.server chkconfig?--add?mysql.server
ndb_mgmd?-f?/var/lib/mysql-cluster/config.ini
ndb_mgm
/usr/local/mysql/bin/ndbd?--initial
/usr/local/mysql/bin/ndbd
/usr/local/mysql/bin/mysqld_safe?--user=mysql?&
shell>?/usr/local/mysql/bin/mysql?-u?root?-p mysql>show?databases; 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;
mysql>?create?database?bb; mysql>?use?bb; mysql>?CREATE?TABLE?ctest3?(i?INT)?ENGINE=NDB; mysql>?use?aa; mysql>?INSERT?INTO?ctest2?()?VALUES?(3333); mysql>?SELECT?*?FROM?ctest2;
#/usr/local/mysql/bin/ndbd?--initial#service?mysqld?start
#?/usr/local/mysql/bin/mysql?-u?root?–p
shell>?/usr/local/mysql/bin/ndb_mgm?-e?shutdown
Connected?to?Management?Server?at:?localhost:1186 2?NDB?Cluster?node(s)?have?shutdown. Disconnecting?to?allow?management?server?to?shutdown.
shell>?/etc/init.d/mysql.server?stop Shutting?down?MySQL...?SUCCESS!