mysql 集群实践_MySQL Cluster集群探索与实践
MySQL集群是一種在無(wú)共享架構(gòu)(SNA,Share Nothing Architecture)系統(tǒng)里應(yīng)用內(nèi)存數(shù)據(jù)庫(kù)集群的技術(shù)。這種無(wú)共享的架構(gòu)可以使得系統(tǒng)使用低廉的硬件獲取高的可擴(kuò)展性。
MySQL集群是一種分布式設(shè)計(jì),目標(biāo)是要達(dá)到?jīng)]有任何單點(diǎn)故障點(diǎn)。因此,任何組成部分都應(yīng)該擁有自己的內(nèi)存和磁盤。任何共享存儲(chǔ)方案如網(wǎng)絡(luò)共享,網(wǎng)絡(luò)文件系統(tǒng)和SAN設(shè)備是不推薦或不支持的。通過(guò)這種冗余設(shè)計(jì),MySQL聲稱數(shù)據(jù)的可用度可以達(dá)到99.999%。
實(shí)際上,MySQL集群是把一個(gè)叫做NDB的內(nèi)存集群存儲(chǔ)引擎集成與標(biāo)準(zhǔn)的MySQL服務(wù)器集成。它包含一組計(jì)算機(jī),每個(gè)都跑一個(gè)或者多個(gè)進(jìn)程,這可能包括一個(gè)MySQL服務(wù)器,一個(gè)數(shù)據(jù)節(jié)點(diǎn),一個(gè)管理服務(wù)器和一個(gè)專有的一個(gè)數(shù)據(jù)訪問(wèn)程序。它們之間的關(guān)系如下圖所示:
存儲(chǔ)引擎
MySQL Cluster 使用了一個(gè)專用的基于內(nèi)存的存儲(chǔ)引擎,這樣做的好處是速度快, 沒(méi)有磁盤I/O的瓶頸,但是由于是基于內(nèi)存的,所以數(shù)據(jù)庫(kù)的規(guī)模受系統(tǒng)總內(nèi)存的限制, 如果運(yùn)行NDB的MySQL服務(wù)器一定要內(nèi)存夠大,比如4G, 8G, 甚至16G。NDB引擎是分布式的,它可以配置在多臺(tái)服務(wù)器上來(lái)實(shí)現(xiàn)數(shù)據(jù)的可靠性和擴(kuò)展性,理論上 通過(guò)配置2臺(tái)NDB的存儲(chǔ)節(jié)點(diǎn)就能實(shí)現(xiàn)整個(gè)數(shù)據(jù)庫(kù)集群的冗余性和解決單點(diǎn)故障問(wèn)題。
該存儲(chǔ)引擎有下列弊端:
基于內(nèi)存,數(shù)據(jù)庫(kù)的規(guī)模受集群總內(nèi)存的大小限制
基于內(nèi)存,斷電后數(shù)據(jù)可能會(huì)有數(shù)據(jù)丟失,這點(diǎn)還需要通過(guò)測(cè)試驗(yàn)證。
多個(gè)節(jié)點(diǎn)通過(guò)網(wǎng)絡(luò)實(shí)現(xiàn)通訊和數(shù)據(jù)同步、查詢等操作,因此整體性受網(wǎng)絡(luò)速度影響,
因此速度也比較慢
當(dāng)然也有它的優(yōu)點(diǎn):
多個(gè)節(jié)點(diǎn)之間可以分布在不同的地理位置,因此也是一個(gè)實(shí)現(xiàn)分布式數(shù)據(jù)庫(kù)的方案。
擴(kuò)展性很好,增加節(jié)點(diǎn)即可實(shí)現(xiàn)數(shù)據(jù)庫(kù)集群的擴(kuò)展。
冗余性很好,多個(gè)節(jié)點(diǎn)上都有完整的數(shù)據(jù)庫(kù)數(shù)據(jù),因此任何一個(gè)節(jié)點(diǎn)宕機(jī)都不會(huì)造成服務(wù)中斷。
實(shí)現(xiàn)高可用性的成本比較低,不象傳統(tǒng)的高可用方案一樣需要共享的存儲(chǔ)設(shè)備和專用的軟件才能實(shí)現(xiàn),NDB 只要有足夠的內(nèi)存就能實(shí)現(xiàn)。
體系結(jié)構(gòu)
MySQL Cluster 由3個(gè)不同功能的服務(wù)構(gòu)成,每個(gè)服務(wù)由一個(gè)專用的守護(hù)進(jìn)程提供,一項(xiàng) 服務(wù)也叫做一個(gè)節(jié)點(diǎn),下面來(lái)介紹每個(gè)節(jié)點(diǎn)的功能。
The management (MGM) node
管理節(jié)點(diǎn),用來(lái)實(shí)現(xiàn)整個(gè)集群的管理,理論上一般只啟動(dòng)一個(gè),而且宕機(jī)也不影響 cluster 的服務(wù),這個(gè)進(jìn)程只在cluster 啟動(dòng)以及節(jié)點(diǎn)加入集群時(shí)起作用, 所以這個(gè)節(jié)點(diǎn)不是很需要冗余,理論上通過(guò)一臺(tái)服務(wù)器提供服務(wù)就可以了。
通過(guò) ndb_mgmd 命令啟動(dòng),使用 config.ini 配置文件
The storage or database (DB) node:
數(shù)據(jù)庫(kù)節(jié)點(diǎn),用來(lái)存儲(chǔ)數(shù)據(jù),可以和管理節(jié)點(diǎn)(MGM) , 用戶端節(jié)點(diǎn)(API) 可以處在 不同的機(jī)器上,也可以在同一個(gè)機(jī)器上面,集群中至少要有一個(gè)DB節(jié)點(diǎn),2個(gè)以上 時(shí)就能實(shí)現(xiàn)集群的高可用保證,DB節(jié)點(diǎn)增加時(shí),集群的處理速度會(huì)變慢。
通過(guò) ndbd 命令啟動(dòng),第一次創(chuàng)建好cluster DB 節(jié)點(diǎn)時(shí),需要使用 –init參數(shù)初始化。
例如: bin/ndbd –ndb-connectstring=ndb_mgmd.mysqlcluster.net –initial
The client (API) node:
客戶端節(jié)點(diǎn),通過(guò)他實(shí)現(xiàn) cluster DB 的訪問(wèn),這個(gè)節(jié)點(diǎn)也就是普通的 mysqld 進(jìn)程, 需要在配置文件中配置ndbcluster 指令打開(kāi) NDB Cluster storage engine 存儲(chǔ)引擎,增加 API 節(jié)點(diǎn)會(huì)提高整個(gè)集群的并發(fā)訪問(wèn)速度和整體的吞吐量,該節(jié)點(diǎn) 可以部署在Web應(yīng)用服務(wù)器上,也可以部署在專用的服務(wù)器上,也開(kāi)以和DB部署在 同一臺(tái)服務(wù)器上。
通過(guò) mysqld_safe 命令啟動(dòng),
這3類節(jié)點(diǎn)可以分布在不同的主機(jī)上,比如 DB 可以是多臺(tái)專用的服務(wù)器,也可以 每個(gè)DB都有一個(gè)API,當(dāng)然也可以把API分布在Web前端的服務(wù)器上去,通常來(lái)說(shuō), API越多cluster的性能會(huì)越好。
Mysql集群探索與實(shí)踐
1. 準(zhǔn)備好3臺(tái)機(jī)器,從官網(wǎng)下載最新的mysql集群版本,此處用到mysql-cluster-gpl-7.1.5.tar.gz源碼包, 配置并安裝,記得加上
–with-plugins=innobase,ndbcluster (innobase可選)
3臺(tái)機(jī)器分別是192.168.207.153,192.168.208.3,192.168.208.9,具體分配如下
管理節(jié)點(diǎn)(ndb_mgmd):192.168.207.153
數(shù)據(jù)節(jié)點(diǎn)(ndbd): 192.168.208.3
數(shù)據(jù)節(jié)點(diǎn)(ndbd): 192.168.208.9
SQL節(jié)點(diǎn)(mysqld): 192.168.208.3
SQL節(jié)點(diǎn)(mysqld): 192.168.208.9
2. 在mysql目錄下新建mysql-cluster文件夾,切換到mysql-cluster,新建config.ini
[NDBD DEFAULT]
NoOfReplicas=2 #備份,副本,這樣的話2臺(tái)數(shù)據(jù)節(jié)點(diǎn)的數(shù)據(jù)就會(huì)同步
DataMemory=200M
IndexMemory=100M
[TCP DEFAULT]
portnumber=2202
[NDB_MGMD] #管理節(jié)點(diǎn)
id=1
hostname=192.168.207.153
datadir=/home/taozi/mysql/mysql-cluster
[NDBD] #數(shù)據(jù)節(jié)點(diǎn)
id=2
hostname=192.168.208.3
datadir=/home/taozi/mysql/data
[NDBD] #數(shù)據(jù)節(jié)點(diǎn)
id=3
hostname=192.168.208.9
datadir=/home/taozi/mysql/data
[MySQLD] #sql節(jié)點(diǎn)
id=4
hostname=192.168.208.3
[MySQLD] #sql節(jié)點(diǎn)
id=5
hostname=192.168.208.9
[MySQLD] #sql節(jié)點(diǎn)
id=6
3. 在管理節(jié)點(diǎn)服務(wù)器上啟動(dòng)管理節(jié)點(diǎn)服務(wù) (如果不存在ndb_mgmd那么要從libexec下面復(fù)制過(guò)來(lái))
~/mysql/bin/ndb_mgmd -f ~/mysql/mysql-cluster/config.ini
4. 進(jìn)入2臺(tái)數(shù)據(jù)節(jié)點(diǎn)服務(wù)器,分別啟動(dòng)數(shù)據(jù)節(jié)點(diǎn)服務(wù)
~/mysql/bin/ndbd (第一次啟動(dòng)使用 ~/mysql/bin/ndbd --initial)
5. 最后分別進(jìn)入sql節(jié)點(diǎn)服務(wù)器,修改my.cnf,加入
[MYSQL_CLUSTER]
ndb-connectstring=192.168.207.153
[MYSQLD]
ndbcluster
ndb-connectstring=192.168.207.153
啟動(dòng)mysql服務(wù)
/home/taozi/mysql/bin/mysqld_safe --ledir=/home/taozi/mysql/bin /
--log-error=/home/taozi/mysql/data/t.err --datadir=/home/taozi/mysql/data /
--socket=/home/taozi/mysql/tmp/mysql.sock --pid-file=/home/taozi/mysql/data/mysqld.pid &
6. 此時(shí)回到管理節(jié)點(diǎn)
~/mysql/bin/ndb_mgm -e show
可以看到顯示如下
[taozi@search153 mysql]$ ./show.sh
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 @192.168.208.3 (mysql-5.1.47 ndb-7.1.5, Nodegroup: 0, Master)
id=3 @192.168.208.9 (mysql-5.1.47 ndb-7.1.5, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.207.153 (mysql-5.1.47 ndb-7.1.5)
[mysqld(API)] 3 node(s)
id=4 @192.168.208.3 (mysql-5.1.47 ndb-7.1.5)
id=5 @192.168.208.9 (mysql-5.1.47 ndb-7.1.5)
id=6 (not connected, accepting connect from any host)
7. 進(jìn)入sql節(jié)點(diǎn),在test數(shù)據(jù)庫(kù)創(chuàng)建表
CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=ndbcluster DEFAULT CHARSET=gbk
切換到2臺(tái)數(shù)據(jù)節(jié)點(diǎn)服務(wù)器~/mysql/data/ndb_2_fs和~/mysql/data/ndb_3_fs看看,
或者直接去數(shù)據(jù)庫(kù)查,數(shù)據(jù)已經(jīng)同步了!
8. 關(guān)閉集群服務(wù)
關(guān)閉sql節(jié)點(diǎn)等同于停止mysql服務(wù),此時(shí)外界數(shù)據(jù)不將再進(jìn)來(lái)。然后關(guān)閉管理節(jié)點(diǎn)
~/mysql/bin/ndb_mgm -e shutdown
rm ~/mysql/mysql-cluster/ndb_1_config.bin.1 #不是必須的,如果config.ini有改動(dòng)則要加上
這樣操作后,管理節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)都將停止服務(wù)
Notes:
1:如果發(fā)現(xiàn)關(guān)閉一臺(tái)機(jī)器的ndbd進(jìn)程,另一臺(tái)機(jī)器的ndbd的進(jìn)程也關(guān)閉,則需要修改參數(shù)NoOfReplicas。
2:./ndbd --initial 不能同時(shí)在所有數(shù)據(jù)節(jié)點(diǎn)機(jī)器上執(zhí)行,如執(zhí)行,會(huì)刪除所有數(shù)據(jù)
3:可以像操作非簇類型的數(shù)據(jù)庫(kù)那樣,操作mysqld節(jié)點(diǎn)
4:每次修改config.ini文件,重啟ndb_mgmd時(shí),需要?jiǎng)h除mysql-cluster文件下的ndb_1_config.bin.1文件,
因?yàn)樗J(rèn)調(diào)用此文件
5:NDB 簇不支持自動(dòng)發(fā)現(xiàn)數(shù)據(jù)庫(kù)的功能,這點(diǎn)很重要,一旦在一個(gè)數(shù)據(jù)節(jié)點(diǎn)上創(chuàng)建了世界(world)數(shù)據(jù)庫(kù)和它的表,
在簇中的每個(gè)SQL節(jié)點(diǎn)上還需要發(fā)出命令 CREATE DATABASE world,后跟FLUSH TABLES。這樣,節(jié)點(diǎn)就能
識(shí)別數(shù)據(jù)庫(kù)并讀取其表定義。(在本版本MySQL Cluster 7.1.5下數(shù)據(jù)庫(kù)也會(huì)自動(dòng)同步的)
6:如果在相關(guān)節(jié)點(diǎn)服務(wù)器啟動(dòng)時(shí),注意查看~/mysql/mysql-cluster目錄內(nèi)的相關(guān)日志文件以獲取錯(cuò)誤信息.
7:在管理節(jié)點(diǎn)的配置文件里各[mysqld],[ndbd]和[ndb_mgmd]配置的選項(xiàng)值順序應(yīng)該如下:
[mysqld]
Id=4
HostName=192.168.208.3
Id在頂端緊跟其后的是HostName,如果順序錯(cuò)了,當(dāng)SQL或數(shù)據(jù)節(jié)點(diǎn)連接管理節(jié)點(diǎn)時(shí),管理節(jié)點(diǎn)無(wú)法正確的定位
到其對(duì)應(yīng)的節(jié)點(diǎn)配置上.
因?yàn)闊o(wú)法定位到對(duì)應(yīng)的節(jié)點(diǎn)配置,當(dāng)沒(méi)有剩余的[空節(jié)點(diǎn)]時(shí),客戶端節(jié)點(diǎn)啟動(dòng)時(shí)(./mysqld or ./ndbd)
還會(huì)報(bào):
Configuration error: Error : Could not alloc node id at 192.168.0.231 port 1186: No free
node id found for mysqld
(API).Failed to initialize consumers
8:[空節(jié)點(diǎn)]是沒(méi)有指定HostName選項(xiàng)的節(jié)點(diǎn)配置均為空節(jié)點(diǎn),空節(jié)點(diǎn)可以用來(lái)動(dòng)態(tài)配置一些動(dòng)態(tài)IP的節(jié)點(diǎn),
一般管理節(jié)點(diǎn)的 配置文件要預(yù)留3個(gè)以上的空節(jié)點(diǎn),因?yàn)閭浞輹r(shí)需要連接一個(gè)節(jié)點(diǎn),如下:
[mysqld]
Id=6
總結(jié)
以上是生活随笔為你收集整理的mysql 集群实践_MySQL Cluster集群探索与实践的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 网页开发 与数据联动的图_零基础学习数据
- 下一篇: 车载以太网之权威指南_awk权威指南之