具有負載均衡功能MySQL服務器集羣部署實現

 

摘要:MySQL是一個高速度、高性能、多線程的關係型數據庫管理系統,適用平臺多,可擴展性強。在實際生產環境中,部署和實現具有一定負載均衡功能的MySQL服務器 集羣,對於提高用戶數據庫應用系統的性能、速度和穩定性具有明顯的作用。本文簡要介紹了在FreeBSD 7.0-Release系統上部署實現MySQL服務器 集羣的方案,並對可能出現的問題提供了相應的解決方法。

    1. 引言

  MySQL是一個高速度、高性能、多線程、開放源代碼,建立在客戶/服務器(Client/Server)結構上的關係型數據庫管理系統(RDBMS)。它始於1979年,最初是Michael Widenius爲瑞典TcX公司創建的UNIREG數據庫系統,當時的UNIREG沒有SQL(Structured Query Language結構化查詢語言)接口,限制了它的應用。1996年5月,Widenius開發出了MySQL的最初版本,開始在Internet上公開發行。MySQL的開發人員從一開始就一直關注它的性能,爲此不惜特性集,直到今天,MySQL依然保持本色,以高速度高性能爲首要原則。隨着時間的推移,MySQL也加入了大型數據庫產品的高級特性,如存儲 過程、視圖、觸發器等,使其在企業級數據庫系統中開始被部署應用[1]。2008年10月,SUN公司收購了MySQL AB公司,開始進入開源領域。隨着重量級操作系統Solaris的開源,SUN MySQL在數據庫市場佔有的份額將會進一步提高。因此,在生產環境中部署具有負載均衡功能的MySQL服務器集羣,對於提高企業數據庫應用系統的速度、穩定性及可伸縮性具有很大的現實意義,也可以有效降低應用系統的投資成本。本文將以FreeBSD 7.0-Release操作系統爲例,利用MySQL數據庫的複製(Replication)特性,簡要介紹部署MySQL服務器集羣的實現方法和相關注意事項。

  2. 系統模型

  本集羣的結構爲一個主MySQL服務器(Master)服務器與多個從屬MySQL服務器(Slave)建立複製(replication)連接,主服務器與從屬服務器實現一定程度上的數據同步,多個從屬服務器存儲 相同的數據副本,實現數據冗餘,提供容錯功能。部署開發應用系統時,對數據庫操作代碼進行優化,將寫操作(如UPDATE、INSERT)定向到主服務器,把大量的查詢操作(SELECT)定向到從屬服務器,實現集羣的負載均衡功能。如果主服務器發生故障,從屬服務器將轉換角色成爲主服務器,使應用系統爲終端用戶提供不間斷的網絡服務;主服務器恢復運行後,將其轉換爲從屬服務器,存儲數據庫副本,繼續對終端用戶提供數據查詢檢索服務。

  3. 部署實現

  本文以一臺主服務器帶三臺從屬服務器爲例,簡要介紹MySQL服務器集羣的實現方案和具體方法步驟。

  3.1 系統部署

  由於FreeBSD系統對機器硬件要求較低,出於降低系統部署成本考慮,主服務器和從屬服務器操作系統均採用FreeBSD 7.0-Release,並採用最小化定製安裝,完成以後系統佔用磁盤空間僅爲254M(不計swap分區所佔空間,它隨具體機器內存容量的變化而變化)。爲充分發揮系統硬件性能,MySQL數據庫採用源代碼編譯安裝。

  3.1.1 安裝FreeBSD系統

  在主服務器和從屬服務器上安裝FreeBSD 7.0-Release,具體安裝方法步驟不是本文主要內容,在此略過,如有疑問可以參考FreeBSD系統手冊。需要說明的是爲方便用戶系統運行期間的維護管理,要打開系統的SSH服務功能,系統安裝配置期間允許root用戶遠程登錄,正常運行以後要關閉root用戶的遠程登錄功能。在/etc/ssh/sshd_config配置文件中對PermitRootLogin設置爲yes爲允許root用戶遠程登錄到系統,設置爲no即爲不允許。修改保存文件後執行kill –HUP `cat /var/run/sshd.pid`命令即可重啓sshd守護進程,使設置生效[2]。上述操作需要root用戶權限。

 

      3.1.2 編譯安裝MySQL

  到MySQL的官方網站http://www.mysql.com 下載 MySQL數據庫的安裝源代碼壓縮包,本例下載 的是mysql-5.1.30.tar.gz,以root用戶身份登錄到系統,開始安裝MySQL數據庫系統。

  由於在對MySQL進行源代碼編譯安裝時要求使用GNU的C編譯器,而FreeBSD系統本身提供的不是該編譯器,因此用戶必須下載 安裝GNU C編譯器[3]。把下載的gnumake-3.81.tar.gz解壓安裝,按如下步驟即可安裝GNU C編譯器:

  [root@FreebsdMaster/softwares]# tar –zxvf gnumake-3.81.tar.gz

  [root@FreebsdMaster /softwares]# cd make-3.81

  [root@FreebsdMaster /softwares/make-3.81]# ./configure ; make; make install; make clean

  GNU C編譯器默認安裝到/usr/local/bin,在安裝MySQL時按絕對路徑調用make命令即可,如# /usr/local/bin/make。

  MySQL的編譯安裝比較複雜,具體操作及相關注意事項如下:

  (1). 解壓mysql-5.1.30.tar.gz,並進行配置

  [root@FreebsdMaster /softwares]# tar –zxvf mysql-5.1.30.tar.gz

  [root@FreebsdMaster /softwares]# cd mysql-5.1.30

  [root@FreebsdMaster /softwares/mysql-5.1.30]# ./configure /

  -–prefix=/app/mysql5 -–with-charset=gb2312

  說明:MySQL默認的安裝目錄是/usr/local/mysql,爲了增強系統部署的靈活性,緊貼用戶應用系統實際情況,可以用—-prefix參數定製安裝目錄。--with-charset參數是使MySQL數據庫支持中文gb2312字符集,如果需要支持其它字符集,使用--with-extra-charset參數,格式爲—-with-extra-charset=CHARSET1,CHARSET2, … 。

  (2). 編譯安裝MySQL

  [root@FreebsdMaster /softwares/mysql-5.1.30]# /usr/local/bin/make

  [root@FreebsdMaster /softwares/mysql-5.1.30]# /usr/local/bin/make install

  [root@FreebsdMaster /softwares/ mysql-5.1.30]# /usr/local/bin/make clean

  注意一定要按絕對路徑調用GNU C編譯器,否則編譯過程報錯退出。

  (3). 爲系統添加mysql用戶組和用戶

  [root@FreebsdMaster /]# pw group add mysql

  [root@FreebsdMaster /]# adduser

  FreeBSD系統沒有groupadd命令,其添加用戶組的命令是pw,添加用戶命令adduser按系統提示操作即可完成。當然用 pw user add mysql命令也可以完成添加用戶mysql的功能,但不如adduser命令功能完善。

  (4). 更改/app/mysql5目錄及文件屬性

  [root@FreebsdMaster /app]# chmod –R mysql mysql5

  [root@FreebsdMaster /app]# chgrp –R mysql mysql5

  說明:/app/mysql5爲MySQL數據庫系統所在目錄,如果用戶部署的應用系統數據量極大,可以將數據庫系統目錄設在大容量磁盤陣列上。磁盤陣列設置與具體機器硬件相關性很大,具體操作設置參考具體硬件系統說明和FreeBSD操作手冊。不借助第三方軟件,FreeBSD 7.0-Release系統可以配置RAID0、RAID1磁盤陣列。

  (5). 安裝MySQL系統初始數據庫

  [root@FreebsdMaster /softwares/ mysql-5.1.30]# ./scripts/mysql_install_db.sh --basedir=/app/mysql5 –-data-dir=/app/mysql5/data

  注意:必須考慮Unix系統的文件權限特性,首先給mysql_install_db.sh腳本添加可執行屬性,否則安裝腳本無法執行。執行chmod +x ./scripts/mysql_install_db.sh命令即可。參數--basedir=/app/mysql5和--datadir=/app/msyql5/data爲必加參數,否則腳本運行報錯退出,無法安裝系統初始數據庫mysql和測試 數據庫test,mysql數據庫包含系統權限設置表,沒有這些表數據庫服務進程mysqld將無法啓動。

  (6). 再次更改/app/mysql5目錄及其文件屬性

  [root@FreebsdMaster /app]# chmod –R root mysql5

  [root@FreebsdMaster /app]# chmod –R mysql mysql5/data

  這樣做是爲了保證系統安全 ,防止通過MySQL系統漏洞的入侵行爲。MySQL以mysql用戶身份運行,對/data目錄具有完全訪問權限,對其它目錄則只有系統管理員根據需要設置的訪問權限,確保FreeBSD系統的安全 。這裏需要特別提醒用戶注意的是要確保mysqld文件(MySQL的守護進程,位於/app/mysql5/libexec目錄下)沒有設置setuid標誌位,如果設置了該標誌位,入侵者對其它文件就具有其不應有的權限。具體原因參考關於Unix系統安全的手冊,本文對這個問題不再贅述。

  (7). 啓動MySQL服務器

  上述操作全部完成以後,輸入如下命令啓動MySQL數據庫服務守護進程:

  [root@FreebsdMaster /]# /app/mysql5/bin/mysqld_safe –user=mysql &

  --user參數表示以mysql用戶身份運行MySQL數據庫服務守護進程,“&”符號表示以後臺方式運行。輸入 netstat –an|grep 3306命令,如果看到下面的輸出則表示MySQL5.1.30已在用戶系統上編譯安裝成功。其中,3306是MySQL數據庫系統默認的監聽端口號。

  [root@FreebsdMaster /]# netstat –an|grep 3306

  tcp4 0 0 *.3306 *.* LISTEN

  按照同樣方法與步驟在其它三臺機器上安裝FreeBSD 7.0-Release與MySQL5.1.30,爲下面的MySQL服務器集羣配置準備好系統平臺基礎。

 

 

      3.2 系統配置

  所有系統安裝完畢之後,需要對它們做一些必要的配置方可按照用戶預先設計的結構模型實現具有負載均衡功能的MySQL服務器集羣。

  3.2.1 FreeBSD操作系統配置

  (1). 調整內核參數,優化操作系統性能

  因爲是處於生產環境的服務器,投入正常運行之前一定要對內核參數進行必要的調整,提升系統性能,加強穩定性。簡要說就是去掉不必要的硬件支持選項,使新內核佔用更少的內存,加快啓動速度。不同機器硬件系統差異很大,用戶可根據具體系統的硬件情況不斷調整試驗,最終定製出最優化、最安全的FreeBSD系統。一定要屏蔽掉組合鍵Ctrl+Alt+Del的熱重啓功能,防止用戶誤按Ctrl+Alt+Del重啓系統,引起數據庫系統服務意外中斷。在內核配置文件如MYKERNEL中加入:

  options SC_DISABLE_REBOOT

  重新編譯系統內核,重啓後即可屏蔽Ctrl+Alt+Del組合鍵的熱重啓功能。如何定製新內核及重新編譯FreeBSD系統,用於可參考FreeBSD系統手冊,此不贅述。

  (2). 進行其它設置,增強系統安全性

  用戶可根據以下一般安全準則設置自己的FreeBSD系統。

  ·選擇一個好的密碼並予以妥善保護。

  ·對於敏感文件採用適當安全等級的加密算法進行加密。對於敏感級別不是很高的文件採用系統自帶的crypt工具加密;對於敏感度極高的文件則使用專用加密工具,如PGP、GPG進行不對稱加密,提高加密文件的防攻擊能力。

  ·仔細設置文件訪問權限,達到保護文件目的。

  ·保護好自己的.profile文件。恰當設置.profile文件的訪問權限,確保只有自己能訪問。

  ·仔細維護已設置setuid或setgid標誌位的任何程序。

  ·禁止不加防範地離開已註冊終端。任何時候都必須按常規正常退出系統,先執行clear清屏命令,防止其它用戶看到操作痕跡,再執行exit命令退出終端。

  ·防範特洛伊木馬程序。正確設置PATH變量的檢索順序,確保系統目錄位於當前目錄的前面。

  ·防範病毒的入侵。

  ·監控最近一次註冊時間,確保沒有他人盜用自己的帳號。

  特別提示:對於生產環境的服務器,一定要保證服務器的物理安全,安全措施再完善的系統,一旦被入侵者物理接觸,所有的安全措施將形同虛設!

  Unix系統安全是一個很大的課題,本文只是提及了一些最膚淺的常識,具體內容用戶可以參考相關書籍或網上資源。爲確保Unix系統的配置具有高度的安全性,可以使用Internet安全中心(Center for Internet Security,CIS)提供的安全測試 工具Benchmarks或評估工具Scoring Tools,檢驗和監控系統配置的安全性 [4]。

  3.2.2 MySQL數據庫系統配置

  爲了能使上述系統實現一對多的主從複製(replication)和冗餘機制,還需要對以上四個MySQL服務器進行一些必要的配置。

  (1). 配置主機名和IP地址

  本實現方案中把MySQL服務器Master主機名設爲FreebsdMaster,IP地址配置爲192.168.1.100,其它三臺Slave依次設爲FreebsdSlave1,192.168.1.101;FreebsdSlave2,192.168.1.102;FreebsdSlave3,IP地址192.168.1.103。

  (2). 設置root用戶密碼

  MySQL的root用戶初始密碼爲空,爲保證系統安全必須爲root用戶設置密碼:

  [root@FreebsdMaster /]# /app/mysql5/bin/mysql –uroot –p

  Enter password:

  mysql>SET PASSWORD=PASSWORD(‘secret’);

  同Unix系統一樣,輸入密碼時屏幕沒有任何回顯,進入系統後執行SET PASSWORD SQL語句設置或修改MySQL root用戶密碼。爲使應用系統服務器遠程連接到MySQL數據庫服務器,除本地root用戶以外,還要設置一個能從用戶內部網絡其它終端登錄的root用戶。具體操作如下:

  mysql>USE mysql;

  mysql>UPDATE user SET Host=’%’ WHERE Host=’hostname.yourdomain’ AND User=’root’;

  mysql>flush privileges;

  完成上述操作後應用系統服務器就可以連接到MySQL數據庫服務器進行各種操作了,這個遠程root用戶的初始密碼爲空,用戶需要從遠程終端登錄,爲其設置密碼。

  (3). 開啓MySQL服務器的二進制更新日誌功能

  上述MySQL服務器安裝完成後,安裝程序沒有生成my.cnf配置文件,爲此用戶需要手工添加/etc/my.cnf文件。MySQL服務是由/app/myql5/libexec/mysqld提供的,其尋找my.cnf配置文件的默認順序爲/etc/my.cnf,~/.my.cnf,/usr/local/mysql/etc/my.cnf。啓動ee編輯器,# ee /etc/my.cnf,在Master機器的配置文件寫入如下內容:

  [mysqld]

  log-bin=mysql-master-bin

  server-id=1

  在其它三臺Slave機器的配置文件/etc/my.cnf文件寫入如下內容:

  [mysqld]

  server-id=int

  其中,int爲一大於1且互不相等的正整數,如2,3,4等。務必要正確設置每個機器上的/etc/my.cnf配置文件,尤其是server-id不能有重複,這是一對多數據庫複製能否成功的關鍵[5]!

  設定好上述/etc/my.cnf文件後啓動Master上的MySQL數據庫服務時就自動開啓了二進制更新日誌功能。在Slave上啓動MySQL時要加上--log-bin參數,即可開啓二進制更新日誌功能。在Slave機器上啓動MySQL服務的命令如下:

  # /app/mysql5/bin/mysqld_safe --user=mysql --log-bin &

  這樣做的目的爲了實現冗餘容錯功能。當主服務器Master出現故障停止服務時,在預轉換角色成爲Master的Slave上執行STOP SLAVE; RESET MASTER SQL語句,在其它兩臺Slave上執行CHANGE MASTER TO SQL語句,執行STOP SLAVE; RESET MASTER SQL語句的Slave服務器即轉換成新的Master,其餘兩臺機器則從新的Master複製數據庫數據(複製的是更新UPDATE、INSERT等操作,並不是簡單的copy),從而實現冗餘容錯。

 

      3.3 系統實現

  完成上述準備後可以開始實現MySQL數據庫的一對多複製,對應用系統的數據庫訪問代碼進行優化,使更新操作UPDATE、INSERT等SQL語句定向到Master服務器,查詢檢索SELECT語句定向到Slave服務器,從而實現負載均衡;當主服務器Master出現故障停止服務時,通過服務器角色轉換實現冗餘容錯;上述所有服務器通過高速核心交換 機連接在一起,協同工作,提供集羣(Cluster)性能。下面,本文就此舉一簡例,具體說明實現(Implementation)步驟。

  3.3.1 準備主服務器

  (1). 在主服務器上創建示例數據庫repl_db

  從本地或遠程終端登錄到Master服務器,執行CREATE DATABASE repl_db;語句,創建示例數據庫repl_db。建立表repl_table:

  mysql>CREATE TABLE repl_table (f1 INT, f2 VARCHAR(20)) ;

  向表中添加數據:

  mysql>INSERT INTO repl_table (f1, f2) VALUES(1, ‘first’);

  (2). 授予Slave複製(Replication)權限

  授予從屬服務器Slave進行復制的權限。假設從屬服務器連接到主服務器複製的用戶名爲“repl”,密碼爲“g00r002b”:

  mysql>GRANT REPLICATION SLAVE ON *.* TO repl@’%’ IDENTIFIED BY ‘g00r002b’;

  刷新系統權限表,鎖定寫入語句操作:

  mysql>FLUSH TABLES WITH READ LOCK;

  這時所有寫入操作都被鎖定,包括支持事務(Transaction)特性的InnoDB類型表的提交(COMMIT)操作也被鎖定,爲數據庫初始複製(copy)做好準備。

  (3). 簡單備份repl_db

  在此,通過tar命令把數據庫初始數據備份到/tmp目錄。

  # tar –cvf /tmp/mysql-data.tar /app/mysql5/data/repl_db

  (4). 記錄主服務器狀態

  執行SHOW MASTER STATUS 語句:

  mysql> SHOW MASTER STATUS;

  -------------------------------------+------------------+-----------------------+---------------------------+

  | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

  +------------------------------------+------------------+-----------------------+--------------------------+

  | mysql-master-bin.000001 | 1027 | | |

  +------------------------------------+------------------+----------------------+---------------------------+

  記下File和Position兩個參數的值,從屬服務器Slave爲了複製(replication)連接到主服務器Master時要用到這兩個參數,如果參數與此不符將導致複製(replication)失敗!

  (5). 釋放主服務器表級寫入鎖定

  mysql>UNLOCK TABLES;

  至此,主服務器解除寫入鎖定,一對多複製準備工作已全部完成,準備接受Slave的複製(replication)連接。

  3.3.2 準備從屬服務器

  (1). 停止從屬服務器的MySQL數據庫服務

  # /app/mysql5/bin/mysqladmin –uroot –p shutdown

  Enter password:

  輸入MySQL系統root用戶密碼,MySQL服務停止。

  (2). 簡單copy數據庫初始數據

  在從屬服務器上執行ftp操作,訪問主服務器,下載/tmp/mysql-data.tar文件,在/app/mysql5/data目錄下執行如下操作,把初始數據copy到Slave服務器:

  [root@FreebsdSlave1 /app/mysql5/data]# tar –xvf /tmp/msyql-data.tar

  其它兩臺Slave服務器執行同樣操作,實現數據庫初始數據的簡單copy。

  (3). 重啓從屬服務器上的MySQL數據庫服務

  # /app/mysql5/bin/mysqld_safe –-user=mysql –-log-bin &

  從屬服務器已啓動,同時啓動二進制更新日誌功能,爲角色轉換做好準備。

  (4). 登錄到從屬服務器Slave的MySQL客戶端

  # /app/mysql/bin/msyql –uroot -p

  (5). 啓動從屬服務器上的複製(replication)線程

  mysql> CHANGE MASTER TO

  -> MASTER_HOST='192.168.1.100',

  -> MASTER_USER='repl',

  -> MASTER_PASSWORD='g00r002b',

  -> MASTER_LOG_FILE=' mysql-master-bin.000001',

  -> MASTER_LOG_POS=1027;

  Query OK, 0 rows affected (0.00 sec)

  mysql> START SLAVE;

  Query OK, 0 rows affected (0.00 sec)

  在所有從屬服務器上執行相同的操作,自此從屬服務器已連接到主服務器,開始真正意義上的replication工作。測試從屬服務器的複製工作是否正常:

  mysql>show slave status/G

  ************************** 1. row ***************************

  Slave_IO_State: Waiting for master to send event

  Master_Host: 192.168.1.100

  Master_User: repl

  Master_Port: 3306

  Connect_Retry: 60

  Master_Log_File: mysql-master-bin.000001

  Read_Master_Log_Pos: 1027

  Relay_Log_File: FreebsdSlave1-relay-bin.000005

  Relay_Log_Pos: 251

  Relay_Master_Log_File: mysql-master-bin.000001

  Slave_IO_Running: Yes

  Slave_SQL_Running: Yes

  看到上述信息說明從屬服務器已啓動了與replication相關的線程I/O和SQL,一對多的replication已經開始工作。

  (6). 功能測試

  在主服務器上寫入新的數據:

  mysql>INSERT INTO repl_table (f1, f2) VALUES(2, ‘second’);

  mysql>SELECT * FROM repl_table;

  +--------+---------+

  | f1 | f2 |

  +--------+----------+

  | 1 | first |

  | 2 | second |

  +-----=--+----------+

  2 rows in set (0.01 sec)

  在Slave上執行相同的查詢操作:

  mysql>SELECT * FROM repl_table;

  +--------+---------+

  | f1 | f2 |

  +--------+----------+

  | 1 | first |

  | 2 | second |

  +--------+----------+

  2 rows in set (0.01 sec)

  得到相同的查詢結果,說明覆制(replication)機制已成功開始工作!

  3.3.3 配置網絡DNS服務器

  在BIND DNS服務器中,爲上述三臺從屬服務器Slave配置同一個名字,客戶端的查詢檢索操作將由DNS服務器定向到其中的一臺Slave。因此,對於同一名字,不同的客戶端會定向到不同的地址,訪問不同的MySQL服務器,從而達到負載均衡的目的。假設用戶爲三臺Slave分配的DNS名字爲mysqlslave.yourdomain,DNS服務器區域文件/var/named/yourdomain.zone中應包含如下數據項[6]:

  sqlmaster.yourdomain. IN A 192.168.1.100

  sqlslave1.yourdomain. IN A 192.168.1.101

  sqlslave2.yourdomain. IN A 192.168.1.102

  sqlslave3.yourdomain. IN A 192.168.1.103

  sqlslave IN CNAME sqlslave1

  sqlslave IN CNAME sqlslave2

  sqlslave IN CNAME sqlslave3

  當客戶端進行查詢操作時,提交給主機sqlslave.yourdomain的請求將由DNS服務器隨機定向到三臺Slave中的一臺,由其執行查詢作業,返回結果。從而在三臺Slave之間實現查詢級別的負載均衡。

  3.3.4 應用系統程序代碼優化

  實際應用中,對數據庫的寫入操作相對查詢操作少得多,因此,優化應用程序的數據庫連接代碼,把寫入操作定向到Master服務器,查詢操作定向到Slave服務器,提供主服務器和從屬服務器之間更新、查詢的負載均衡功能。本文以PHP數據庫連接代碼爲例,簡要介紹代碼優化方法[7]。

  (1). 準備不同的數據庫連接配置文件

  準備兩個數據庫連接文件mysql_connect_master.php和mysql_connect_slave.php,其文件內容如下:

  mysql_connect_master.php文件的內容:

 

  // Connect to the Database Server

  $linkID = @mysql_connect("sqlmaster.yourdomain", "user", "password") or die("Sorry, could not connect to the database!");

  // Select the Database

  @mysql_select_db("repl_db") or die("Sorry, Could not select database!");

  ?>

  mysql_connect_slave.php文件的內容:

 

  // Connect to the Database Server

  $linkID = @mysql_connect("sqlslave.yourdomain", "user", "password") or die("Sorry, could not connect to the database!");

  // Select the Database

  @mysql_select_db("repl_db") or die("Sorry, Could not select database!");

  ?>

  (2). 優化程序SQL語句代碼

  對應用程序中訪問數據庫的代碼段做出如下優化:

 

  ...

  // $sql is the query string to be committed to MySQL server.

  if ( stripos( $sql, " SELECT" ) )

  {

  include_once("./mysql_connect_slave.php");

  ...

  mysql_close();

  }

  else

  {

  include_once("./mysql_connect_master.php");

  ...

  mysql_close();

  }

  ...

  ?>

  說明:每當向MySQL服務器提交數據庫操作時,加入一個if-else判斷語句對變量$sql進行判斷定向,如果是SELECT查詢操作,將其定向到從屬服務器Slave中的一個;如果是其它更新語句,則將其定向到主服務器Master。此處代碼段是應用系統實現負載均衡的關鍵,用戶務必根據自己實際情況,寫出準確無誤的代碼。每次對數據庫操作完畢都要及時釋放數據庫連接,以免更新、查詢操作分別定向失敗,影響系統負載均衡功能。這樣做雖然在一定程度上增加Web服務器或應用服務器的開銷,但與MySQL服務器集羣負載均衡功能帶來的大幅性能提升及冗餘容錯特性相比,這個開銷絕對是物超所值!

 

      3.4 注意事項

  正確部署實現具有負載均衡功能的MySQL服務器集羣必須注意以下事項:

  (1). MySQL數據庫複製(replication)特性是核心

  此處的複製不是簡單的copy,從屬服務器啓動兩個線程(thread):I/O線程和SQL線程,I/O線程接收主服務器對參與複製數據庫的更新操作事件(event),並記入自己的中繼二進制更新日誌文件(hostname-relay-bin.00000n),由SQL線程將更新操作寫入自己的數據庫表項。主從服務器之間複製的不是具體的數據內容,而是具體的以二進制格式記錄的操作事件,因而在一定程度上實現主從服務器之間的數據同步。(這種複製類似於生物學意義上的按基因複製,在英語中replication的主要詞義就是指該種複製。)

  (2). 複製的複雜性

  主從數據庫服務器間的replication要求Master與Slave上的MySQL版本最好一致,主從服務器必須設置相同的字符集,否則很容易造成複製失敗。主服務器上更新權限表內容的FLUSH語句不會被複制[8]。

  (3). 按照範式化要求設計數據庫

  生產環境下基於MySQL服務器的應用系統要想穩定運行,按範式化設計系統數據庫是基本要求,具體內容可參考相關書籍。

  (4). 打開數據庫服務器的遠程用戶連接功能

  打開主從服務器的遠程用戶連接是實現更新、查詢操作分別定向的必要條件,否則,來自應用服務器的連接請求失敗,影響系統應用正常運行。

  (5). 負載均衡功能的實現需要良好的團隊合作

  BIND DNS服務器實現了從屬服務器Slave之間的負載均衡,Slave和Master之間的負載均衡則由應用系統開發人員在程序代碼級實現。整個系統的性能提升和冗餘容錯需要網絡管理和應用系統開發團隊之間的良好合作,否則負載均衡功能的實現就會失敗。

 

      4. 常見問題

  (1). 如何估算MySQL服務器集羣的性能提升量?

  針對本文采用的結構模式,可對應用系統整體性能提升做出大致估算。假設應用系統寫操作佔10%,讀操作佔90%,寫操作耗時是讀操作的2倍,系統的吞吐量(throughput)爲T(用reads/s讀操作次數/秒來衡量)。把寫操作線性轉換爲讀操作,則有:

  T= 2Xwrites + 9Xwrites ==>writes=T/11① (不採用主從複製模式,讀寫操作集中到一個服務器上)

  T= 2Xwrites + 9Xwrites/N ==> writes=T/(2+9/N)② (採用一對多的主從複製模式,讀操作在從屬服務器,寫操作在主服務器)

  其中,writes爲系統單位時間內所能承受的最大寫操作次數,N爲從屬服務器個數,N大於等於2。在不採用主從複製模式時,系統性能writes=T/11;採用本文一對三的複製模式時,系統性能writes=T/5。採用負載均衡模式與不採用系統性能之比爲11:5,即2.2:1,考慮到應用服務器的額外開銷,系統整體性能提升了整整1倍!從②式可以看出,系統整體性能理論極限爲T/2,當然在實際生產環境中不可能達到。具體部署時用戶可以根據自己的實際情況估算出合理的從屬服務器數量,主要影響因素是網絡帶寬和機器整體性能[9]。

  (2). 如何應對主從服務器崩潰?

  當某臺從屬服務器崩潰時,修復故障重啓後重新連接到主服務器,根據其master.info文件更新其數據,保持與主服務器的數據同步。如果主服務器崩潰,在某一從屬服務器上執行STOP SLAVES; GRANT REPLICATION SLAVE ON *.* repl_db TO ‘repl’@’%’ IDENTIFIED BY ‘g00r002b’;RESET MASTER;這三個SQL語句,由於從屬服務器已啓動了二進制更新日誌功能,因此具備了角色轉換的必要條件。更改其主機名、IP地址及server-id與Master一樣,重啓MySQL服務器,系統開始正常對外提供服務。其它兩臺從屬服務器則不需執行任何操作,繼續執行replication過程。BIND DNS服務器和應用程序也不需做任何調整,繼續對系統用戶提供不間斷服務。主服務器排除故障恢復正常後,將其網絡配置改爲與現有Master轉換角色之前一樣的配置,重啓MySQL服務,將其角色轉換爲從屬服務器。也就是說,整個集羣機器的角色可以相互循環轉換,提高系統的冗餘性和可靠性。在此需要注意的是,在應用系統調試運行正常之後,在Slave角色服務器的/etc/my.cnf文件[mysqld]段加入slave-skip-errors=all,保證集羣之間複製(replication)的正常運行。

  5. 結束語

  部署與實現具有負載均衡功能的MySQL服務器集羣是一項複雜的系統工程,需要多方面良好的協同合作才能做好。服務器的搭建配置、BIND DNS服務器的配置部署,以及應用系統程序的開發都要緊緊圍繞實現MySQL服務器集羣負載均衡功能這個目標。必須對主服務器的運行狀態進行動態監控,如果發生故障,立即執行角色轉換過程,確保爲終端用戶提供可靠、不間斷的服務。可以針對具體系統環境寫出監控腳本或程序,確保系統的可靠性與穩定性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章