mysql cluster

回覆文章
yehlu
Site Admin
文章: 3245
註冊時間: 2004-04-15 17:20:21
來自: CodeCharge Support Engineer

mysql cluster

文章 yehlu »

http://www.ithome.com.tw/plog/index.php ... blogId=257
MySQL Cluster學習筆記-1

fillano | 14 Feb, 2006 09:51

早期的MySQL沒有內建的Cluster機制,通常要建立一個可以redundant的mysql資料庫伺服器,主要是用他的資料複製機制。 mysql可以設定一個master跟數個slave伺服器,然後設定好在master發生資料寫入的時候,同步將資料寫入slave伺服器。

MySQL Cluster的架構,主要是應用一個新的storage engine,叫做NDB。利用這個技術,可以將mysql所需要做的事情分散到三種伺服器節點上,分別是管理節點(Management (MGM) nodes)、查詢節點(SQL (MySQL server) nodes)、與資料節點(Data nodes)。

不同種的節點必須位於不同的主機上,這樣可以保證分享資源所會有的干擾。

management nodes負責存放伺服器設定、啟動/停止節點、管理網路分割、建立與回復備份資料等等。

每個資料表都會被分割成數個部份(fragment),存放在不同的data nodes中,以提供mysql伺服器load balancing的能力。每個fragment,都會在其他data nodes中存放有備份,以提供mysql伺服器 redundancy能力。

實際負責對外的,則是查詢節點。一般的sql查詢都是針對查詢節點來做的。在mysql cluster中,使用者會用到的,只有查詢節點。查詢節點其實就是一般的mysql伺服器,只是使用了 ndb這個storage engine。

在使用management nodes來啟動mysql cluster之後,就不需要使用到management nodes了,這個時候management node可以關掉。所以一個運作中的mysql cluster,至少需要用到兩個主機。但是如果需要能做到load balancing以及reduncancy(or failover),就至少需要用到三台主機。


http://www.ithome.com.tw/plog/index.php ... blogId=257

MySQL Cluster學習筆記-2

fillano | 27 Feb, 2006 16:16

MySQL Cluster文件裡面只提到設定NoOfReplicas,沒有講清楚MySQL Cluster如何將資料表做出partitions。我原先以為,partitions的數目是跟Node Group相關,有四個Data Nodes時,如果將NoOfReplicas設為2,就會產生兩個Node Groups,同時把資料表切割成兩個partitions。

不過今天上去MySQL官方網站的論壇,卻看到了 些資料,也是搞不清楚Data Nodes、Data Groups以及NoOfReplicas的關係,結果MySQL的人員做了很詳細的解答:有多少Data Nodes就會有多少partitions!(出乎意料)

所以有四個data nodes,兩個node groups(定義了四個data nodes,設定NoOfReplicas=2)的狀況下,同樣會把資料表割成四個partitions,只是每個node group負責維護兩個partitions。

其實另外還有一個問題,就是我啟動兩個以上的data nodes以後,網路的交通就極度擁擠,每個data nodes之間似乎會密集地互相聯絡傳送資料的樣子。結果會影響到寫入資料庫的速度,測試結果幾乎跟sql node上面的myisam資料表速度差了六倍。殘念。但是查詢的速度還是很快。

沒有在做查詢時,應該交通量沒那麼大吧?似乎花很大的功夫在做heartbeat上面了,這一點還不知道有沒有解。(只見switch的燈不斷狂閃)

以下是我測試安裝的設定:

硬體:我們公司的網路開店機(Transmeta 5600,256MB RAM,20GB硬碟)x 5

作業系統:Centos / 核心2.6.9-22.0.2.EL

MySQL版本:mysql-max-4.1.16-pc-linux-gnu-i686

架構:

1. SQL Node + Management Node:

IP: 192.168.11.1
config.ini內容如下:

[ndbd default]
NoOfReplicas= 2
MaxNoOfConcurrentOperations= 5000
DataMemory= 40M
IndexMemory= 12M
TimeBetweenWatchDogCheck= 30000
DataDir= /var/lib/mysql-cluster
MaxNoOfOrderedIndexes= 256

[ndb_mgmd default]
DataDir= /var/lib/mysql-cluster

[ndb_mgmd]
Id=1
HostName= 192.168.11.1

[ndbd]
Id= 2
HostName= 192.168.11.2

[ndbd]
Id= 3
HostName= 192.168.11.3

[ndbd]
Id= 4
HostName= 192.168.11.4

[ndbd]
Id= 5
HostName= 192.168.11.5
[mysqld]
Id= 6

[mysqld]
Id= 7

my.cnf內容如下:

[mysqld]
ndbcluster
ndb-connectstring=192.168.11.1
datadir=/usr/local/mysql/data
socket=/var/lib/mysql/mysql.sock
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1

[mysql.server]
user=mysql
basedir=/usr/local/mysql

[mysqld_safe]
err-log=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[ndb_mgm]
connect-string=192.168.11.1
[ndb-mgmd]
config-file=/var/lib/mysql-cluster/config.ini

2. Data Nodes:

IP: 192.168.11.2 ~ 5

my.cnf內容如下:

[mysql_cluster]
ndb-connectstring=192.168.77.151

____________________________________

啟動順序:

management node (ndb_mgmd) -> data nodes (ndbd) -> sql node (mysqld)

這樣,就可以執行了。在management node裡面執行ndb_mgm,然後打show,可以檢視系統狀態:

[root@localhost mysql-cluster]# ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: 192.168.11.1:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 4 node(s)
id=2 @192.168.11.2 (Version: 4.1.16, Nodegroup: 0, Master)
id=3 @192.168.11.3 (Version: 4.1.16, Nodegroup: 0)
id=4 @192.168.11.4 (Version: 4.1.16, Nodegroup: 1)
id=5 @192.168.11.5 (Version: 4.1.16, Nodegroup: 1)

[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.11.1 (Version: 4.1.16)

[mysqld(API)] 2 node(s)
id=6 @192.168.11.1 (Version: 4.1.16)
id=7 (not connected, accepting connect from any host)

以上。
yehlu
Site Admin
文章: 3245
註冊時間: 2004-04-15 17:20:21
來自: CodeCharge Support Engineer

MySQL-Cluster集群研究

文章 yehlu »

http://kb.discuz.net/index.php?title=My ... 4%E7%A9%B6

MySQL-Cluster集群研究
Wikipedia,自由的百科全书
目录 [显示隐藏]
1 一、介绍
2 二、在Server1和Server2上安装MySQL
3 三、安装并配置管理节点服务器(Server3)
4 四、配置集群服务器并启动MySQL
5 五、检查工作状态
6 六、破坏性测试
[编辑]
一、介绍

这篇文档旨在介绍如何安装配置基于2台服务器的MySQL集群。并且实现任意一台服务器出现问题或宕机时MySQL依然能够继续运行。

注意!

虽然这是基于2台服务器的MySQL集群,但也必须有额外的第三台服务器作为管理节点,但这台服务器可以在集群启动完成后关闭。同时需要注意的是并不推荐在集群启动完成后关闭作为管理节点的服务器。尽管理论上可以建立基于只有2台服务器的MySQL集群,但是这样的架构,一旦一台服务器宕机之后集群就无法继续正常工作了,这样也就失去了集群的意义了。出于这个原因,就需要有第三台服务器作为管理节点运行。

另外,可能很多朋友都没有3台服务器的实际环境,可以考虑在VMWare或其他虚拟机中进行实验。

下面假设这3台服务的情况:

Server1: mysql1.vmtest.net 192.168.0.1
Server2: mysql2.vmtest.net 192.168.0.2
Server3: mysql3.vmtest.net 192.168.0.3

Servers1和Server2作为实际配置MySQL集群的服务器。对于作为管理节点的Server3则要求较低,只需对Server3的系统进行很小的调整并且无需安装MySQL,Server3可以使用一台配置较低的计算机并且可以在Server3同时运行其他服务。


[编辑]
二、在Server1和Server2上安装MySQL

从http://www.mysql.com上下载mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz

注意:必须是max版本的MySQL,Standard版本不支持集群部署!

以下步骤需要在Server1和Server2上各做一次

# mv mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz /usr/local/
# cd /usr/local/
# groupadd mysql
# useradd -g mysql mysql
# tar -zxvf mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz
# rm -f mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz
# mv mysql-max-4.1.9-pc-linux-gnu-i686 mysql
# cd mysql
# scripts/mysql_install_db --user=mysql
# chown -R root .
# chown -R mysql data
# chgrp -R mysql .
# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
# chmod +x /etc/rc.d/init.d/mysqld
# chkconfig --add mysqld

此时不要启动MySQL!


[编辑]
三、安装并配置管理节点服务器(Server3)

作为管理节点服务器,Server3需要ndb_mgm和ndb_mgmd两个文件:

从http://www.mysql.com上下载mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz

# mkdir /usr/src/mysql-mgm
# cd /usr/src/mysql-mgm
# tar -zxvf mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz
# rm mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz
# cd mysql-max-4.1.9-pc-linux-gnu-i686
# mv bin/ndb_mgm .
# mv bin/ndb_mgmd .
# chmod +x ndb_mg*
# mv ndb_mg* /usr/bin/
# cd
# rm -rf /usr/src/mysql-mgm

现在开始为这台管理节点服务器建立配置文件:

# mkdir /var/lib/mysql-cluster
# cd /var/lib/mysql-cluster
# vi config.ini

在config.ini中添加如下内容:

[NDBD DEFAULT]
NoOfReplicas=2
[MYSQLD DEFAULT]
[NDB_MGMD DEFAULT]
[TCP DEFAULT]
# Managment Server
[NDB_MGMD]
HostName=192.168.0.3 #管理节点服务器Server3的IP地址
# Storage Engines
[NDBD]
HostName=192.168.0.1 #MySQL集群Server1的IP地址
DataDir= /var/lib/mysql-cluster
[NDBD]
HostName=192.168.0.2 #MySQL集群Server2的IP地址
DataDir=/var/lib/mysql-cluster
# 以下2个[MYSQLD]可以填写Server1和Server2的主机名。
# 但为了能够更快的更换集群中的服务器,推荐留空,否则更换服务器后必须对这个配置进行更改。
[MYSQLD]
[MYSQLD]

保存退出后,启动管理节点服务器Server3:

# ndb_mgmd

启动管理节点后应该注意,这只是管理节点服务,并不是管理终端。因而你看不到任何关于启动后的输出信息。
[编辑]
四、配置集群服务器并启动MySQL

在Server1和Server2中都需要进行如下改动:

# vi /etc/my.cnf

[mysqld]
ndbcluster
ndb-connectstring=192.168.0.3 #Server3的IP地址
[mysql_cluster]
ndb-connectstring=192.168.0.3 #Server3的IP地址

保存退出后,建立数据目录并启动MySQL:

# mkdir /var/lib/mysql-cluster
# cd /var/lib/mysql-cluster
# /usr/local/mysql/bin/ndbd --initial
# /etc/rc.d/init.d/mysqld start

可以把/usr/local/mysql/bin/ndbd加到/etc/rc.local中实现开机启动。

注意:只有在第一次启动ndbd时或者对Server3的config.ini进行改动后才需要使用--initial参数!


[编辑]
五、检查工作状态

回到管理节点服务器Server3上,并启动管理终端:

# /usr/bin/ndb_mgm

键入show命令查看当前工作状态:(下面是一个状态输出示例)

[root@mysql3 root]# /usr/bin/ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 @192.168.0.1 (Version: 4.1.9, Nodegroup: 0, Master)
id=3 @192.168.0.2 (Version: 4.1.9, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.0.3 (Version: 4.1.9)
[mysqld(API)] 2 node(s)
id=4 (Version: 4.1.9)
id=5 (Version: 4.1.9)
ndb_mgm>

如果上面没有问题,现在开始测试MySQL:

注意,这篇文档对于MySQL并没有设置root密码,推荐你自己设置Server1和Server2的MySQL root密码。

在Server1中:

# /usr/local/mysql/bin/mysql -u root -p
> use test;
> CREATE TABLE ctest (i INT) ENGINE=NDBCLUSTER;
> INSERT INTO ctest () VALUES (1);
> SELECT * FROM ctest;

应该可以看到1 row returned信息(返回数值1)。

如果上述正常,则换到Server2上重复上面的测试,观察效果。如果成功,则在Server2中执行INSERT再换回到Server1观察是否工作正常。

如果都没有问题,那么恭喜成功!


[编辑]
六、破坏性测试

将Server1或Server2的网线拔掉,观察另外一台集群服务器工作是否正常(可以使用SELECT查询测试)。测试完毕后,重新插入网线即可。

如果你接触不到物理服务器,也就是说不能拔掉网线,那也可以这样测试:在Server1或Server2上:

# ps aux | grep ndbd

将会看到所有ndbd进程信息:

root 5578 0.0 0.3 6220 1964 ? S 03:14 0:00 ndbd
root 5579 0.0 20.4 492072 102828 ? R 03:14 0:04 ndbd
root 23532 0.0 0.1 3680 684 pts/1 S 07:59 0:00 grep ndbd

然后杀掉一个ndbd进程以达到破坏MySQL集群服务器的目的:

# kill -9 5578 5579

之后在另一台集群服务器上使用SELECT查询测试。并且在管理节点服务器的管理终端中执行show命令会看到被破坏的那台服务器的状态。

测试完成后,只需要重新启动被破坏服务器的ndbd进程即可:

# ndbd

注意!前面说过了,此时是不用加--inital参数的!

至此,MySQL集群就配置完成了!
yehlu
Site Admin
文章: 3245
註冊時間: 2004-04-15 17:20:21
來自: CodeCharge Support Engineer

MySQL Cluster 叢集安裝環境介紹

文章 yehlu »

http://www.neo.com.tw/archives/000869.html

MySQL Cluster 叢集安裝環境介紹

MySQL 叢集支援的作業系統:
* Linux (Red Hat, Novell/SUSE)
* Sun Solaris
* IBM AIX
* HP-UX
* Mac OS X

MySQL 軟體:
* MySQL Max 版本 (並不是指 MaxDB)
* MySQL NDB Cluster
(以上可在此下載)

硬體規畫:

* 官方建議叢集伺服器的節點(Node) 硬體配備最低需求:

CPU: Intel/AMD x86
Memory: 512MB RAM
HDD: 3GB
Network: 1+ nodes (Standard Ethernet - TCP/IP)

最佳硬體配備:

CPU: 2x Intel Xeon, Intel Itanium, AMD Opteron, Sun SPARC, IBM PowerPC
Memory: 16GB RAM
HDD: 4x 36GB SCSI (RAID 1 Controller)
Network: 1-8 Nodes (Gigabit Ethernet); 8+ Nodes (Dedicated Cluster Interconnect e.g. SCI)

* 由於 MySQL Cluster 5.0 的架構是把資料(包含索引) 全都放在記憶體中,所以主機的記憶體的大小就非常重要,MySQL 官方提供了記憶體需求的計算公式:

(SizeofDatabase × NumberOfReplicas × 1.1 ) / NumberOfDataNodes

* 由於 Data Nodes 之間的資料交換頻繁,建議採用 Gigabit 的網路卡,如果資料庫非常的大,可以考慮使用 SCI (Scalable Coherent Interface) 。

* MySQL 叢集間的資料交換未經過加密,尤其 Managment node 預設是開放外部連接的。因此如果 MySQL 做為網站使用,必須將 MySQL 叢集放在防火牆後面或規畫在獨立的網域內,以防止有心人士竊取及破壞。

* 要完成 MySQL 叢集的運作環境最少需要 3 台伺服器,MySQL 官方建議最少用 4 台 (註1)。

* Management node 主機若無其它特殊用途,可選用較低階的伺服器。

硬體規畫常見問題:

只有 2 台主機可以執行 MySQL Cluster 嗎?
不行,因為只有2台機器沒辦法處理 Split-Brain (註2) 的狀況。依照 MySQL 工程師的說法,只有 2 台機器的狀況下,當叢集中一台主機掛掉,整個叢集就會 Shut Down,這樣也失去了叢集的意義了。(可參考 MySQL Cluster FAQ 的 arbitrator 部份)

Management node 可以跟 SQL node 放在同一台伺服器上嗎?
可以。

Management node 可以跟 Data node 放在同一台伺服器上嗎?
建議不要。Management node 除了啟動、關閉及備份叢集之外,最大的功能就是防止 Split-brain (註2) 的產生,如果跟 Data node 放在同一台伺服器,等於球員兼裁判, 叢集一出問題便很難處理。

Management node 掛掉怎麼辦?
Management node 主要用在 MySQL 管理叢集啟動、關閉及備份,因此叢集啟動後就算 Management node 掛了,MySQL 叢集也能正常運作。除非叢集中有主機掛掉或網路斷線,而且正巧 Management node 也掛了,這時才會發生 Split-Brain (註2) 的狀況。當然也可以配置2個以上的 Management node 來防止這種狀況發生,只是要確定每個 Management node 的 config.ini 必須完全相同。

如果我的資料庫非常大怎麼辦?
MySQL Cluster 5.0 的架構是把資料跟索引全放在記憶體,資料庫愈大,代表所需的記憶體也愈大。MySQL Cluster 5.1 已經著手進行把資料及索引放在硬碟的架構,如果你像這位仁兄有 88G 的資料庫,解決的方式有二種: 如果不怕系統出問題,就是換 MySQL Cluster 5.1 (目前在 Beta 階段),再不然就是多增加幾台 Data node 伺服器了。

註1:
3台配置:
Management node (*1) SQL nodes + Data nodes (*2)
4台配置:
Management node、SQL node (自行配置) + Data nodes (*2)
(以上若為網站使用,請自行注意安全性問題)

註2:
Split-Brain 是叢集應用中常見的問題。簡單的說,當叢集中的兩個節點間斷線時,便會認為對方停止服務,因此認為自己是叢集中唯一的節點,於是開始嘗試取代對方的服務,這種狀況通常稱為 Split-brain。

MySQL Cluster 為了解決這個問題,便在叢集中就設了一個仲裁者 (Arbitrator),也就是 Management node 來防止這種狀況的發生。
(可參考 fswiki 的 MySQL Cluster Split-brain)

當然 Split-brain 不是三言二語可以說的明白,也不屬於本篇探討的範圍,有興趣可以請教 Google 大神。

MySQL Cluster 官方必讀文件:
MySQL Cluster 官方文件列表
MySQL Cluster FAQ
MySQL Cluster 目前的功能限制

延伸閱讀:
Mysql Cluster: The definitive HOWTO (對岸到處都有盜文翻譯)
Cluster Configuration 2 MGMD nodes
3 different architectures - best perfromance and redudancy?
dodolook れエ れエ (split-brain?)
yehlu
Site Admin
文章: 3245
註冊時間: 2004-04-15 17:20:21
來自: CodeCharge Support Engineer

第17章:MySQL叢集

文章 yehlu »

回覆文章

回到「MySQL」