高可用性、負載均衡的mysql集群解決方案


高可用性、負載均衡的mysql集群解決方案

 

一、mysql的市場占有率

二、mysql為什么受到如此的歡迎

三、mysql數據庫系統的優缺點

四、網絡服務器的需求

五、什么是mysql的集群

六、什么是負載均衡

七、mysql集群部署和實現方法

八、負載均衡的配置和測試

九、Mysql集群系統的測試(測試方案+測試腳本+測試結果分析)

 

 

mysql的市場占有率

 

MySQL是世界上最流行的開源數據庫,已有1100多萬的擊活安裝,每天超過五萬的下

載。MySQL為全球開發者、DBA和IT管理者在可靠性、性能、易用性方面提供了選

擇。

 

第三方市場調查機構Evans Data Corporation調查顯示,過去兩年內在開發者使用

的所有數據庫中,MySQL已經擁有了25%的市場占有率。開源已經成為當今IT結構中

不可或缺的重要部分,而且開源的市場占有率將繼續增加。如下圖所示:

 

 

 

 

 

mysql為什么受到如此的歡迎

 

Sun公司今天1月份花了10億美元將mysql收購,准備進軍開源和數據庫。

 

數據庫系統

Oracle

SQL Server

MySQL

DB2

是否免費

收費

收費

免費

收費

存儲過程

支持

支持

支持

支持

視圖

支持

支持

支持

支持

快照

支持

支持

不支持

支持

觸發器

支持

支持

支持

支持

安全

復雜查詢

索引

豐富

一般

數據類型

事務處理

 

 

mysql數據庫系統的優缺點

 

每個系統都有自身的不足和發展歷程,mysql也一樣。

 

優點

缺點

1. 源碼公開,免費

2. 跨平台

3. 為多種開發語言和包提供了API

4. 支持多線程

5. 小巧、靈活、速度較快

6. 支持各種字符集

7. 提供各種連接、優化的工具包

 

1. 不完善,很多數據庫特性不支持

2. 只適合中小型應用,對於大型應用,可以跟其他數據庫互補;

3. 數據庫系統數據量只能達到千萬級別;

 

 

網絡服務的需求

 

隨着Internet的飛速發展和對我們生活的深入影響,越來越多的個人在互聯網上購物、娛

樂、休閑、與人溝通、獲取信息;越來越多的企業把他們與顧客和業務伙伴之間的聯絡

搬到互聯網上,通過網絡來完成交易,建立與客戶之間的聯系。互聯網的用戶數和網絡

流量正以幾何級數增長,這對網絡服務的可伸縮性提出很高的要求。例如,比較熱門的Web

站點會因為被訪問次數急劇增長而不能及時處理用戶的請求,導致用戶進行長時間的等待

,大大降低了服務質量。另外,隨着電子商務等關鍵性應用在網上運行,任何例外的服務

中斷都將造成不可估量的損失,服務的高可用性也越來越重要。所以,對用硬件和軟件方

法實現高可伸縮、高可用網絡服務的需求不斷增長,這種需求可以歸結以下幾點:

 

1) 可伸縮性(Scalability),當服務的負載增長時,系統能被擴展來滿足需求,且不降

低服務質量。

2) 高可用性(Availability),盡管部分硬件和軟件會發生故障,整個系統的服務必須是

每天24小時每星期7天可用的。

3) 可管理性(Manageability),整個系統可能在物理上很大,但應該容易管理。

4) 價格有效性(Cost-effectiveness),整個系統實現是經濟的、易支付的。

 

單服務器顯然不能處理不斷增長的負載。這種服務器升級方法有下列不足:一是升級過

程繁瑣,機器切換會使服務暫時中斷,並造成原有計算資源的浪費;二是越往高端的服務

器,所花費的代價越大;三是一旦該服務器或應用軟件失效,會導致整個服務的中斷。

 

通過高性能網絡或局域網互聯的服務器集群正成為實現高可伸縮的、高可用網絡服務的有

效結構。這種松耦合結構比緊耦合的多處理器系統具有更好的伸縮性和性能價格比,組成

集群的PC服務器或RISC服務器和標准網絡設備因為大規模生產,價格低,具有很高的性能

價格比。但是,這里有很多挑戰性的工作,如何在集群系統實現並行網絡服務,它對外是

透明的,它具有良好的可伸縮性和可用性。

 

針對上述需求,我們給出了基於IP層和基於內容請求分發的負載平衡調度解決方法,並在

Linux內核中實現了這些方法,將一組服務器構成一個實現可伸縮的、高可用網絡服務的服

務器集群,我們稱之為Linux虛擬服務器(Linux Virtual Server)。在LVS集群中,使得

服務器集群的結構對客戶是透明的,客戶訪問集群提供的網絡服務就像訪問一台高性能、

高可用的服務器一樣。客戶程序不受服務器集群的影響不需作任何修改。系統的伸縮性通

過在服務機群中透明地加入和刪除一個節點來達到,通過檢測節點或服務進程故障和正

確地重置系統達到高可用性。

 

 

什么是mysql集群

 

分為同步集群和異步集群。

 

同步集群(mysql cluster)

結構:(data + sql + mgm節點)

特點:

1) 內存級別的,對硬件要求較低,但是對內存要求較大。換算比例為:1:1.1;

2) 數據同時放在幾台服務器上,冗余較好;

3) 速度一般;

4) 建表需要聲明為engine=ndbcluster

5) 擴展性強;

6) 可以實現高可用性和負載均衡,實現對大型應用的支持;

7) 必須是特定的mysql版本,如:已經編譯好的max版本;

8) 配置和管理方便,不會丟失數據;

 

 

 

 

 

異步集群(mysql replication)

結構:(master + slave)

特點:

1) 主從數據庫異步數據;

2) 數據放在幾台服務器上,冗余一般;

3) 速度較快;

4) 擴展性差;

5) 無法實現高可用性和負載均衡(只能在程序級別實現讀寫分離,減輕對主數據庫的壓力);

6) 配置和管理較差,可能會丟失數據;

 

什么是負載均衡

 

通過director,將用戶的請求分發到real server服務器上,然后返回給用戶。

負載均衡部署靈活、能夠滿足各種需求。

 

實現方式:

硬件:BIG/IP、Cisco、IBM(昂貴)

 

軟件:LVS(免費)

LVS系統將用戶的請求的數據包在數據層和網絡層進行了封裝和轉發,由三種方式滿足各種需求。

 

1) DR:直接路由

2) Tuning:tcp/ip隧道

3) NAT:網絡地址轉換

 

需求:

免費的軟件包

1) 2台低端的director(active和standby)

2) 心跳線:連接2台director,檢測活動情況

3) 2台以上的real servers

 

通用結構:

 

 

 

 

有興趣的可以分別研究上面的三種LVS結構。

 

mysql集群部署和實現方法

 

1) 假設現在有4台服務器(mysql官方推薦的最小配置)

 

服務器

開啟的服務

角色

192.168.131.164

Ndb1

Mysqld

Mysql API

Ndb_mgmd

管理節點(master)

Heartbeat

Director(master)

192.168.131.26

Ndb2

Mysqld

Mysql API

Ndb_mgmd

管理節點(backup)

Heartbeat

Director(standby)

192.168.131.77

Sql1

Mysqld

Mysql API(realserver)

Ndbd

存儲節點

Arptables

訪問路由

192.168.131.101

Sql2

Mysqld

Mysql API(realserver)

Ndbd

存儲節點

Arptables

訪問路由

 

2)服務器安裝配置和網絡連接

(以下為所有服務器各操作一遍,共4遍)

安裝:

將4台服務器安裝CentOS 5.2,選擇下面的包:

Clustering

Storage Clustering

mysql不需要安裝,但perl-mysql-xxx的所有包需要安裝

開發工具包和類庫

sshd服務

SElinux ==>disable

語言支持包不安裝,默認美國英語

 

 

設定主機名:

Vi /etc/sysconfig/network

Hostname=xxx

:wq

 

檢查主機名:

Uname -a

必須和上表中的一一對應。否則有問題。

 

Vi /etc/hosts

Ndb1 192.168.131.164

Ndb2 192.168.131.26

Sql1 192.168.131.77

Sql2 192.168.131.101

 

 

更新:

#rpm --import http://dries.ulyssis.org/rpm/RPM-GPG-KEY.dries.txt

#yum update -y && yum -y install lynx libawt xorg-x11-deprecated-libs nx freenx arptables_jf httpd-devel

 

下載:

Mysql cluster版本(我下載的5.0.67社區版本):

[root@ndb1 RHEL5]# ls -lh  MySQL* | awk '{print $9}'

MySQL-client-community-5.0.67-0.rhel5.i386.rpm

MySQL-clusterextra-community-5.0.67-0.rhel5.i386.rpm

MySQL-clustermanagement-community-5.0.67-0.rhel5.i386.rpm

MySQL-clusterstorage-community-5.0.67-0.rhel5.i386.rpm

MySQL-clustertools-community-5.0.67-0.rhel5.i386.rpm

MySQL-devel-community-5.0.67-0.rhel5.i386.rpm

MySQL-server-community-5.0.67-0.rhel5.i386.rpm

MySQL-shared-community-5.0.67-0.rhel5.i386.rpm

MySQL-shared-compat-5.0.67-0.rhel4.i386.rpm

MySQL-shared-compat-5.0.67-0.rhel5.i386.rpm

MySQL-test-community-5.0.67-0.rhel5.i386.rpm

perl-HTML-Template-2.9-1.el5.rf.noarch.rpm

[root@ndb1 RHEL5]# 

 

在服務器上安裝以上包,在安裝的過程中如果缺少包或者庫,采用:

yum install xxxx自行安裝。

 

建立目錄:

#mkdir /var/lib/mysql-cluster -p

 

 

以下分別操作:

安裝cluster組件:

#Rpm -Uvh MySQL-xx-xx.rpm,根據不同,可以少安裝部分組件。根據你需要而定。

 

163、26上,我安裝了:

[root@ndb1 RHEL5]# rpm -aq | grep MySQL

MySQL-clusterstorage-community-5.0.67-0.rhel5

MySQL-clustertools-community-5.0.67-0.rhel5

MySQL-clustermanagement-community-5.0.67-0.rhel5

MySQL-shared-community-5.0.67-0.rhel5

perl-DBD-MySQL-3.0007-1.fc6

MySQL-server-community-5.0.67-0.rhel5

[root@ndb1 RHEL5]# 

 

 

101、77上,我安裝了:

[root@sql1 ~]# rpm -aq | grep MySQL

MySQL-clusterstorage-community-5.0.67-0.rhel4

MySQL-devel-community-5.0.67-0.rhel4

MySQL-server-community-5.0.67-0.rhel4

MySQL-client-community-5.0.67-0.rhel4

MySQL-shared-community-5.0.67-0.rhel4

[root@sql1 ~]# 

 

以下在ndb1(164)和ndb2(26)上操作

[root@ndb1 ~]# vi /var/lib/mysql-cluster/config.ini 

[NDBD DEFAULT]

NoOfReplicas=2

DataMemory=800M

IndexMemory=400M

 

[MYSQLD DEFAULT]

 

[NDB_MGMD DEFAULT]

 

[TCP DEFAULT]

 

# Section for the cluster management node

[NDB_MGMD]

# IP address of the management node (this system)

ID=1

HostName=192.168.131.164

 

 

[NDB_MGMD]

# IP address of the management node (this system)

ID=2

HostName=192.168.131.26

 

# Section for the storage nodes

[NDBD]

# IP address of the first storage node

HostName=192.168.131.77

DataDir= /var/lib/mysql-cluster

 

[NDBD]

# IP address of the second storage node

HostName=192.168.131.101

DataDir=/var/lib/mysql-cluster

 

# one [MYSQLD] per storage node

[MYSQLD]

[MYSQLD]

[MYSQLD]

[MYSQLD]

[MYSQLD]

[MYSQLD]

[MYSQLD]

:wq

 

以下在mysql API上操作(這里,我設定了7個API,以后可以隨時加入)

 

Mysqld API的配置文件:

Vi /etc/my.cnf

[root@ndb1 ~]# cat /etc/my.cnf 

[mysqld]

ndbcluster

ndb-connectstring = "host=192.168.131.164,host=192.168.131.26" 

 

[ndb_mgm]

connect-string = "host=192.168.131.164,host=192.168.131.26"

 

[ndbd]

connect-string = "host=192.168.131.164,host=192.168.131.26"

:wq

 

分別啟動ndb_mgmd/ndbd/mysqld

164/26:

ndb_mgmd -f /var/lib/mysql-cluster/config.ini

 

77/101:

Ndbd --initial

 

164/26/77/101:

/etc/rc.d/init.d/mysql start

 

在管理節點ndb1(164)和ndb2(26)上查看各節點的情況:

[root@ndb1 ~]# ndb_mgm

-- NDB Cluster -- Management Client --

ndb_mgm> show

Connected to Management Server at: 192.168.131.164:1186

Cluster Configuration

---------------------

[ndbd(NDB)]     2 node(s)

id=3    @192.168.131.77  (Version: 5.0.67, Nodegroup: 0, Master)

id=4    @192.168.131.101  (Version: 5.0.67, Nodegroup: 0)

 

[ndb_mgmd(MGM)] 2 node(s)

id=1    @192.168.131.164  (Version: 5.0.67)

id=2    @192.168.131.26  (Version: 5.0.67)

 

[mysqld(API)]   7 node(s)

id=5    @192.168.131.101  (Version: 5.0.67)

id=6    @192.168.131.26  (Version: 5.0.67)

id=7    @192.168.131.164  (Version: 5.0.67)

id=8    @192.168.131.77  (Version: 5.0.67)

id=9 (not connected, accepting connect from any host)

id=10 (not connected, accepting connect from any host)

id=11 (not connected, accepting connect from any host)

 

ndb_mgm> 

 

以上說明一切正常。

 

將服務增加到開機啟動服務項中:

164/26:

echo 'ndb_mgmd -f /var/lib/mysql-cluster/config.ini' > /etc/rc.d/init.d/ndb_mgmd
chmod 755 /etc/rc.d/init.d/ndb_mgmd

 

77/101:

Echo 'ndbd' > /etc/rc.d/init.d/ndbd

Chmod 755 /etc/rc.d/init.d/ndbd

Chkconfig --level 2345 ndbd on

 

OK,到此mysql cluster 配置完成。

 

強調:

1)由於數據放在內存中,需要在ndb節點上加大內存的數量。按照1:1.1的比例,如果數據量達到3.6GB,需要4GB的內存。

2)由於NDB和mysqld(API)都很耗費內存,所以建議將NDB放在164和26上。可能啟動的時候會有警告,但是沒關系的。

 

查看數據和內存情況:

77

[root@sql2 ~]# top

top - 16:39:36 up  1:59,  1 user,  load average: 1.37, 0.76, 0.60

Tasks:  80 total,   2 running,  78 sleeping,   0 stopped,   0 zombie

Cpu(s):  4.0%us,  4.0%sy,  0.0%ni, 87.3%id,  2.9%wa,  0.2%hi,  1.5%si,  0.0%st

Mem:   2075600k total,  2005868k used,    69732k free,    68256k buffers

Swap:  2031608k total,        0k used,  2031608k free,  1400812k cached

 

PID USER    PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                2306 mysql     25   0  119m   15m   3952 S   22  0.8         10:20.94 mysqld                                                                 

23791 root      15   0  1587m  484m  31m R   20  23.9        9:34.97 ndbd

 

由於77只有2GB的內存,而在config.ini中,把1.2GB的內存分配給了NDB,所以,加上mysqld用掉的,2GB的內存似乎已經所剩無幾了。

 

查看77上的數據大小:

[root@sql2 ~]# cd /var/lib/mysql-cluster/ndb_4_fs/

[root@sql2 ndb_4_fs]# du -lh

1.3GB

 

連接API創建數據庫:

由於上面4台都做為mysqld 的API,所以創建數據庫的時候,都需要創建一遍。

以下操作在4台API上都需要操作:

# Mysql -uroot -pxxxxxxxxxxxx -A

Mysql> create database testdatabase;

Mysql> grant all on *.testdatabase to root@'192.168.131.%' identified by 'xxxxxxxxxxxxxxx';

Mysql> flush privileges;

Mysql> create table test(int (1));

Mysql> insert into test(1);

Mysql> quit;

 

 

以上做完以后,可以通過任意一台API上創建表,並寫數據到表中,其他數據庫都會同步寫入。

 

分別連接每台服務器進行檢查:

# Mysql -uroot -pxxxxxxxxxxxx -A

Mysql> use testdatabase;

Mysql> select * from test;

如果輸出結果完全相同,表明mysql cluster已經可以正常工作了。

 

在2台API上設置LVS

 

Mysql cluster做好以后,數據庫分別建立同名的數據庫以后,權限分配好,然后只要在一台上寫入數據,其他的NDB就存儲了相同的數據。

 

用 程序連接任意一台API寫數據,如果程序中未設置API的選擇和判斷,只使用了其中一個API,一旦API當機,則無法寫入數據,必須修改程序。即便做了 API的判斷和選擇,因為沒有實現負載均衡,服務器的性能沒有充分利用。高可用性也沒有達到目標。所以,我們現在在2台API之間做LVS。

 

LVS采用 ultramonkey(http://www.ultramonkey.org

 

首先在NDB1(164)和NDB2(26)上下載heartbeat的軟件包:

下載所有的rpm包:

Cd /usr/local/src

Mkdir heartbeat

Cd heartbeat

#Wget xxx.xxx.rpm

 

我下載了如下的軟件包:

[root@ndb1 heartbeat]# ls -lh *.rpm | awk '{print $9}';

arptables-noarp-addr-0.99.2-1.rh.el.um.1.noarch.rpm

heartbeat-1.2.3.cvs.20050927-1.rh.el.um.4.i386.rpm

heartbeat-ldirectord-1.2.3.cvs.20050927-1.rh.el.um.4.i386.rpm

heartbeat-pils-1.2.3.cvs.20050927-1.rh.el.um.4.i386.rpm

heartbeat-stonith-1.2.3.cvs.20050927-1.rh.el.um.4.i386.rpm

ipvsadm-1.21-1.rh.el.1.um.1.i386.rpm

libnet-1.1.2.1-1.rh.el.um.1.i386.rpm

perl-Authen-SASL-2.08-1.rh.el.um.1.noarch.rpm

perl-Convert-ASN1-0.18-1.rh.el.um.1.noarch.rpm

perl-IO-Socket-SSL-0.96-1.rh.el.um.1.noarch.rpm

perl-ldap-0.3202-1.rh.el.um.1.noarch.rpm

perl-Mail-IMAPClient-2.2.9-1.rh.el.um.1.noarch.rpm

perl-Net-SSLeay-1.25-1.rh.el.um.1.i386.rpm

perl-Parse-RecDescent-1.94-1.el5.rf.noarch.rpm

perl-Parse-RecDescent-1.94-1.rh.el.um.1.noarch.rpm

perl-XML-NamespaceSupport-1.08-1.rh.el.um.1.noarch.rpm

perl-XML-SAX-0.12-1.rh.el.um.1.noarch.rpm

[root@ndb1 heartbeat]# 

 

Heartbeat中包含以下幾部分:

1) Master Director(分發器)-- MD

2) Backup Director(備份分發器)-- BD

3) Real server (真實服務器,可以有2個以上)--RS

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

IP設置並確認:

MD:

Eth0:192.168.131.164/24/GW:192.168.131.1

Eth1:10.9.30.1/24

 

MD:

Eth0:192.168.131.26/24/GW:192.168.131.1

Eth1:10.9.30.2

 

VIP:192.168.131.105/24/GW:192.168.131.1 -- 用戶訪問的統一虛擬IP

 

RS1:192.168.131.101/24/GW:192.168.131.1

RS2:192.168.131.77/24/GW:192.168.131.1

。。。

等等

 

以下操作在所有服務器上執行:

 

主機名確認:

分別執行:

#uname -a

主機名對應表中所列。

 

 

在MD和BD修改IP轉發:

#vi modprobe.sh

modprobe ip_vs_dh
modprobe ip_vs_ftp
modprobe ip_vs
modprobe ip_vs_lblc
modprobe ip_vs_lblcr
modprobe ip_vs_lc
modprobe ip_vs_nq
modprobe ip_vs_rr
modprobe ip_vs_sed
modprobe ip_vs_sh
modprobe ip_vs_wlc
modprobe ip_vs_wrr 

:wq


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM