淺談Mysql簇

版權聲明:
本文遵循“署名非商業性使用相同方式共享 2.5 中國大陸”協議
您可以自由複製、發行、展覽、表演、放映、廣播或通過信息網絡傳播本作品
您可以根據本作品演義自己的作品
您必須按照作者或者許可人指定的方式對作品進行署名。
您不得將本作品用於商業目的。
如果您改變、轉換本作品或者以本作品爲基礎進行創作,您只能採用與本協議相同的許
可協議發佈基於本作品的演繹作品。
對任何再使用或者發行,您都必須向他人清楚地展示本作品使用的許可協議條款。
如果得到著作權人的許可,您可以不受任何這些條件的限制。
                                                                                                                  asram
 
MySQL是一款非常流行的數據庫軟件。她是採用客戶/服務器模型的開放源碼關係型數據庫管理系統。今天就來說說MySQL的一種技術--MySQL簇。MySQL簇是一種可以在分佈式計算環境中使用的可冗餘的內存數據庫。MySQL簇採用了NDB簇存儲引擎,該引擎具有高可用性和數據一致性好的特點。MySQL簇由一組計算機構成,每臺計算機上均運行着多種進程,包括MySQL服務器,NDB 簇的數據節點,管理服務器,以及(可能)專門的數據訪問程序。關於簇中這些組件的關係,請參見下圖:
p_w_picpath
 
所有這些程序一起構建了MySQL簇。將數據保存在NDB簇存儲引擎中時,表將保存在數據節點內。能夠從簇中所有其他MySQL服務器直接訪問這些表。
     目前,MySQL簇的簇部分可以獨立於MySQL服務器進行配置。在簇中,簇的每個部分都被視爲1個節點。(注:在很多情況下,術語“節點”用於指計算機,但是在討論MySQL簇時,它表示的是進程。在單臺計算機上可以有任意數目的節點,爲此,我們採用術語簇主機。)
     有三類簇節點,在最低的MySQL簇配置中,至少有三類節點,這三類節點分別是:
  1. 管理(MGM)節點:這類節點的作用是管理MySQL 簇內的其他節點,如提供配置數據、啓動並停止節點、運行備份等。由於這類節點負責管理其他節點的配置,應在啓動其他節點之前首先啓動這類節點。MGM 節點是用命令ndb_mgmd啓動的。
  2. 數據節點:這類節點用於保存簇的數據。數據節點的數目與副本的數目相關,是片段的倍數。例如,對於兩個副本,每個副本有兩個片段,那麼就有4 個數據節點。沒有必要有一個以上的副本。數據節點是用命令ndbd 啓動的。
  3. SQL 節點:這是用來訪問簇數據的節點。對於MySQL 簇,客戶端節點是使用NDB 簇存儲引擎的傳統MySQL 服務器。典型情況下,SQL 節點是使用命令
    mysqld –ndbcluster 啓動的,或將ndbcluster 添加到my.cnf 後使用mysqld啓動。
簇配置包括對簇中單獨節點的配置,以及設置節點之間的單獨通信鏈路。對於目前設計的MySQL簇,其意圖在於,從處理器的能力、內存空間和帶寬來講,存儲節點是同質的,此外,爲了提供單一的配置點,作爲整體,簇的所有配置數據均位於1個配置文件中。
管理服務器(MGM節點)負責管理簇配置文件和簇日誌。簇中的每個節點從管理服務器檢索配置數據,並請求確定管理服務器所在位置的方式。當數據節點內出現有趣的事件時,節點將關於這類事件的信息傳輸到管理服務器,然後,將這類信息寫入簇日誌。
此外,可以有任意數目的簇客戶端進程或應用程序。它們分爲兩種類型:
· 標準MySQL客戶端:對於MySQL簇,它們與標準的(非簇類)MySQL沒有區別。換句話講,能夠從用PHP、Perl、C、C++、Java、Python、Ruby等編寫的現有MySQL應用程序訪問MySQL簇。
· 管理客戶端:這類客戶端與管理服務器相連,並提供了優雅地啓動和停止節點、啓動和停止消息跟蹤(僅對調試版本)、顯示節點版本和狀態、啓動和停止備份等的命令。
MySQL簇的使用
     安裝下列包:
  1. MySQL-client-community。
  2. MySQL-server-community。
  3. MySQL-clusterstorage-community。
  4. MySQL-clustermanagement-community。
  5. MySQL-clustertools-community。
server1:192.168.102.19
server2:192.168.102.29
具體操作:
1。卸載每臺服務器上的原有的MySQL
    # rpm -qa | grep mysql
    #rpm -e mysqlclientxxx
    #rpm -e mysql-xxxx
2。安裝新版本MySQL服務端和客戶端以及NDB引擎
    # rpm -ivh MySQL-Cluster-gpl-server-6.3.20-0.rhel4.i386.rpm
    # rpm -ivh MySQL-Cluster-gpl-client-6.3.20-0.rhel4.i386.rpm
    # rpm -ivh MySQL-Cluster-gpl-storage-6.3.20-0.rhel4.i386.rpm
    # rpm -ivh MySQL-Cluster-gpl-management-6.3.20-0.rhel4.i386.rpm
    # rpm -ivh MySQL-Cluster-gpl-tools-6.3.20-0.rhel4.i386.rpm
    # rpm -ivh MySQL-Cluster-gpl-extra-6.3.20-0.rhel4.i386.rpm
    #cd /usr/bin
    #ln -fs /usr/sbin/ndbd /usr/bin
    #ln -fs /usr/sbin/ndb_mgmd /usr/bin
    #ln -fs /usr/sbin/ndb_cpcd /usr/bin
    #ln -fs /usr/sbin/mysqld /usr/bin
    #ln -fs /usr/sbin/mysqlmanager /usr/bin
    # mysql_install_db --user=mysql
mysql 安裝後需要設置root用戶的默認密碼爲mysql
命令爲:mysqladmin -uroot -p password mysql
3.節點配置
    修改2臺服務器的/etc/hosts文件
    192.168.102.19 db1
    192.168.102.29 db2
  • 配置管理節點配置文件:
    # cd /var/lib/mysql-cluster
    # vi config.ini
    在config.ini中添加如下內容:
    [ndbd default]
    NoOfReplicas= 2
    MaxNoOfConcurrentOperations= 10000
    DataMemory= 80M
    IndexMemory= 24M
    TimeBetweenWatchDogCheck= 30000
    DataDir= /var/lib/mysql-cluster
    MaxNoOfOrderedIndexes= 512
    StartPartialTimeout=100
    StartPartitionedTimeout=100
    ArbitrationTimeout=5000
    TransactionDeadlockDetectionTimeout=5000
    HeartbeatIntervalDbDb=5000
    StopOnError=0
    [ndb_mgmd default]
    DataDir= /var/lib/mysql-cluster
    [ndb_mgmd]
    Id=1
    HostName=db1---------------------------------------也可配成192.168.102.19
    [ndb_mgmd]
    Id=2
    HostName=db2---------------------------------------也可配成192.168.102.29
    [ndbd]
    Id= 3
    HostName=db1---------------------------------------也可配成192.168.102.19
    [ndbd]
    Id= 4
    HostName=db2---------------------------------------也可配成192.168.102.29
    [mysqld]
    ArbitrationRank=2 (非常重要,全靠有它,纔可以形成仲裁競爭,從而當另一個機子當了時,此機還可以有知道partion完整的節點)
    [mysqld]
    ArbitrationRank=2
    [mysqld]-------------------------------------------------空出來以便恢復數據庫用
    [mysqld]-------------------------------------------------空出來以便恢復數據庫用
    [tcp default]
    PortNumber=63132
  • 配置通用my.cnf文件,mysqld及ndbd,ndb_mgmd均使用此文件.
    # vi /etc/my.cnf
    在my.cnf中添加如下內容:
    [mysqld]
    default-storage-engine=ndbcluster   避免在sql語句中還要加入ENGINE=NDBCLUSTER。
    ndbcluster 這個要加上,否則mysql會啓動不了
    ndb-connectstring=db1,db2-----------------------------------------------也可配成192.168.102.19,192.168.102.29
    interactive_timeout=28800000
    wait_timeout=28800000
    log-bin---------------------------------------------------------------------------mysql增量備份用
    [ndbd]
    connect-string=db1,db2----------------------------------------------------也可配成192.168.102.19,192.168.102.29
    [ndb_mgm]
    connect-string=db1,db2----------------------------------------------------也可配成192.168. 102.19,192.168.102.29
    [ndb_mgmd]
    config-file=/var/lib/mysql-cluster/config.ini
    [mysql_cluster]
    ndb-connectstring=db1,db2------------------------------------------------也可配成192.168.102.19,192.168.102.29
    保存退出後。
  • 分別啓動db1、db2的mysql服務:
    # service mysql start
    啓動mysql之前一定要先保證ndbd和ndb_mgmd沒有啓動,否則會導致mysql啓動不了
  • 啓動管理節點Server1爲:
    # ndb_mgmd --ndb_nodeid=1
    啓動管理節點Server2爲:
    # ndb_mgmd --ndb_nodeid=2
    注:在啓動時有一個警告提示
    Cluster configuration warning:
       arbitrator with id 1 and db node with id 3 on same host 192.168.102.19
       arbitrator with id 2 and db node with id 4 on same host 192.168.102.29
       Running arbitrator on the same host as a database node may
       cause complete cluster shutdown in case of host failure.
    說節點1和3,2和4的arbitrator一樣,可能引起整個集羣失敗。(可以不用放在心上)
  • 自動重啓功能的添加:
    #chkconfig --add mysql
    #chkconfig --level 345 mysql on
    [root@mysql1 mysql]# vi /etc/rc.local
    ndb_mgmd -f /var/lib/mysql-cluster/config.ini
    ndbd
4。初始化MySQL簇
在db1中
# ndbd -- ndb_nodeid=3 --initial
在db2中
# ndbd -- ndb_nodeid =4 --initial
注:只有在第一次啓動ndbd時或者對config.ini進行改動後才需要使用--initial參數!!!該參數會使節點刪除由早期ndbd實例創建的、用於恢復的任何文件,包括恢復用日誌文件。
5.檢查運行情況
在db1上運行
# ndb_mgm –e show
Connected to Management Server at: 192.168.102.19:1186
Cluster Configuration
---------------------
[ndbd(NDB)]    2 node(s)
id=3    @192.168.102.19  (mysql-5.1.30 ndb-6.3.20, Nodegroup: 0)
id=4    @192.168.102.29  (mysql-5.1.30 ndb-6.3.20, Nodegroup: 0, Master)
[ndb_mgmd(MGM)]    2 node(s)
id=1    @192.168.102.19  (mysql-5.1.30 ndb-6.3.20)
id=2    @192.168.102.29  (mysql-5.1.30 ndb-6.3.20)
[mysqld(API)]    4 node(s)
id=5    @192.168.102.29  (mysql-5.1.30 ndb-6.3.20)
id=6    @192.168.102.19  (mysql-5.1.30 ndb-6.3.20)
id=7 (not connected, accepting connect from any host)
id=8 (not connected, accepting connect from any host)
如果顯示爲上面的結果,說明你的集羣配置已經成功完成了。
6。測試
在db1上使用MySQL客戶端連接到服務器新建一個數據庫和表,然後到db2上查看是否有此庫和表。有就表示OK了。
7。備份和還原
1.備份
ndb_mgm的 "start backup" 參數就是用來備份的。只要我們寫個腳本,建立好備份的目錄,將腳本加入cron就可以了。例如:
#more /backup/mysql/mysqlcluster.sh
#/bi/bash
BakDir=/backup/mysql
LogFile=/backup/mysql/mysqlbak.log
echo " " >> $LogFile
echo " " >> $LogFile
echo "-------------------------------------------" >> $LogFile
echo $(date +"%y-%m-%d %H:%M:%S") >> $LogFile
echo "--------------------------" >> $LogFile
cd $BakDir
ndb_mgm -e "start backup"  >> $LogFile
備份後的目錄應該大致如下:
clip_p_w_picpath002
日誌內容大致如下:
p_w_picpath
2.還原
由於備份是分片備份在所有數據結點上,所以恢復操作就需要在所有的數據結點都進行恢復操作。
先在db1上執行:
 
#ndb_restore -n 3 -b 7 -r /var/lib/mysql-cluster/BACKUP/BACKUP-7/
(這裏解釋一下上面的語句:
ndb_restore -n ndb_nodeid -b back_id -r /var/lib/mysql-cluster/BACKUP/BACKUP- back_id /
ndb_nodeid可以通過運行命令ndb_mgm –e show)
clip_p_w_picpath002[5]
最後如下:
clip_p_w_picpath002[7]
還原完畢。
同理,以上操作需要在db2上重新做一遍。然後將2臺服務器上的MySQL服務重新啓動一下,這樣2臺服務器上的數據就同步了。
參考文獻:
1.MySQL 5.1官方簡體中文參考手冊
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章