《MYSQL教程搭建MySQL高可用負載均衡集群》要點:
本文介紹了MYSQL教程搭建MySQL高可用負載均衡集群,希望對您有用。如果有疑問,可以聯系我們。
導讀:1、簡介 使用MySQL時隨著時間的增長,用戶量以及數據量的逐漸增加,訪問量更是劇增,最終將會使MySQL達到某個瓶頸,那么MySQL的性能將會...
1、簡介
使用MySQL時隨著時間的增長,用戶量以及數據量的逐漸增加,訪問量更是劇增,最終將會使MySQL達到某個瓶頸,那么MySQL的性能將會大大降低.這一結果也不利于軟件的推廣.
那么如何跨過這個瓶頸,提高MySQL的并發量呢?方法有很多,分布式數據庫、讀寫分離、高可用負載均衡、增加緩存服務器等等.之前的文章里已經介紹了讀寫分離的方案了,接下來我將講解MySQL高可用負載均衡這一方法.
其中實現高可用負載均衡的方法有很多,例如LVS+keepalived組合實現、haproxy+keepalived組合實現等等,這里我們采用haproxy+keepalived組合實現MySQL高可用負載均衡這一技術.
2、基本環境
四臺linux虛擬主機
Linux版本CentOS6.6
MySQL 5.5(已安裝好)
haproxy-1.5.14
keepalived-1.2.19
IP:192.168.95.11(mysql1)、192.168.95.12(mysql2)、192.168.95.13(haproxy+keepalived)、192.168.95.14(haproxy+keepalived)、192.168.95.55(vip)
3、配置MySQL主主復制
詳細配置步驟可以參考這篇文章:
http://www.cnblogs.com/phpstudy2015-6/p/6485819.html#_label7
以下簡要介紹一下mysql的主主復制:
何為主主復制?就是兩個mysql都能讀能寫,數據記錄通過二進制傳達給對方從而保持數據的一致性.
(192.168.95.11主從復制+192.168.95.12主從復制==192.168.95.11、192.168.95.12主主復制)
因此主主復制中必須要解決的事情就是自增主鍵的問題.如果mysql1主鍵id增加到12了,此時二進制數據還沒到達mysql2,那么mysql2恰好要插入數據,那么新數據主鍵id也是12,那不就是亂套了么!解決這一問題我們可以直接更改MySQL中的配置文件即可.
1)、更改配置文件
- ?
- server-id=11???#任意自然數n,只要保證兩臺MySQL主機不重復就可以了.?
- log-bin=mysql-bin???#開啟二進制日志?
- auto_increment_increment=2???#步進值auto_imcrement.一般有n臺主MySQL就填n?
- auto_increment_offset=1???#起始值.一般填第n臺主MySQL.此時為第一臺主MySQL?
- binlog-ignore=mysql???#忽略mysql庫【我一般都不寫】?
- binlog-ignore=information_schema???#忽略information_schema庫【我一般都不寫】?
- replicate-do-db=aa???#要同步的數據庫,默認所有庫?
- ?
- server-id=12?
- log-bin=mysql-bin?
- auto_increment_increment=2?
- auto_increment_offset=2?
- replicate-do-db=aa?
配置好后重啟MySQL
2)、配置192.168.95.11主從復制
1、在192.168.95.12中創建一個192.168.95.11主機中可以登錄的MySQL用戶
????? 用戶:mysql11
????? 密碼:mysql11
mysql>GRANT REPLICATION SLAVE ON *.* TO ‘mysql11’@’192.168.95.11’ IDENTIFIED BY ’mysql11’;
mysql>FLUSH PRIVILEGES;
2、查看192.168.95.12二進制日志
mysql> show master status;

3、告知二進制文件名與位置MYSQL入門
mysql> change master to
??? -> master_host='192.168.95.11',
??? -> master_user='mysql11',
??? ->master_password='mysql11',
??? ->master_log_file='mysql-bin.000097',
??? -> master_log_pos=107;
4、查看結果
mysql> slave start;
mysql> show slave status\G

配置主從復制成功
3)、配置192.168.95.12主從復制
同上

配置主從復制成功.
回到頂部
4、中間件簡述
回到頂部
4.1、Haproxy介紹
Haproxy是一個開源的高性能的反向代理或者說是負載均衡服務軟件之一,它支持雙機熱備、虛擬主機、基于TCP和HTTP應用代理等功能.其配置簡單,而且擁有很好的對服務器節點的健康檢查功能(相當于keepalived健康檢查),當其代理的后端服務器出現故障時,Haproxy會自動的將該故障服務器摘除,當服務器的故障恢復后Haproxy還會自動將RS服務器.
HAProxy特別適用于那些負載特大的web站點,這些站點通常又需要會話保持或七層處理.HAProxy運行在當前的硬件上,完全可以支持數以萬計的并發連接.并且它的運行模式使得它可以很簡單安全的整合進您當前的架構中, 同時可以保護你的web服務器不被暴露到網絡上.
Haproxy軟件引入了frontend,backend的功能,frontend(acl規則匹配)可以根據任意HTTP請求頭做規則匹配,然后把請求定向到相關的backend(server pools等待前端把請求轉過來的服務器組).通過frontend和backup,我們可以很容易的實現haproxy的7層代理功能,haproxy是一款不可多得的優秀代理服務軟件.
回到頂部
4.2、keepalived介紹
keepalived是以VRRP協議為實現基礎的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗余協議.
虛擬路由冗余協議,可以認為是實現路由器高可用的協議,即將N臺提供相同功能的路由器組成一個路由器組,這個組里面有一個master和多個backup,master上面有一個對外提供服務的vip(該路由器所在局域網內其他機器的默認路由為該vip),master會發組播,當backup收不到vrrp包時就認為master宕掉了,這時就需要根據VRRP的優先級來選舉一個backup當master.這樣的話就可以保證路由器的高可用了.
keepalived主要有三個模塊,分別是core、check和vrrp.core模塊為keepalived的核心,負責主進程的啟動、維護以及全局配置文件的加載和解析.check負責健康檢查,包括常見的各種檢查方式.vrrp模塊是來實現VRRP協議的.
5、中間件的安裝與配置(haproxy、keepalived)
百度云下載:http://pan.baidu.com/s/1qYoCjDE? 密碼:7cef
回到頂部
5.1、安裝haproxy
在192.168.95.13、192.168.95.14安裝haproxy(一模一樣安裝)
1)、編譯安裝haproxy
# tar -zxvf haproxy-1.5.14.tar.gz
# cd haproxy-1.5.14
# make TARGET=linux26 ARCH=x86_64
# make install SBINDIR=/usr/sbin/ MANDIR=/usr/share/man/ DOCDIR=/usr/share/doc/
注意:
1、為什么不用configure,請看下圖.haproxy-1.5.14已經存在Makefile文件了.
2、make的時候,target以及arch需要根據自己的linux主機設置
3、make install的時候我增加了一些額外選項.這可加可不加由自己配置,不加的話將會按默認路徑安裝,請看下圖.


2)、提供啟動腳本
將haproxy這個啟動腳本放在/etc/init.d/文件夾下,以便我們可以直接service啟動它
【注意】:此啟動腳本僅僅適合我以上的安裝路徑.假若安裝路徑不同,則需要進行相應的修改方可使用.
- #!/bin/sh?
- #?
- #?haproxy?
- #?
- #?chkconfig:???-?85?15?
- #?description:??HAProxy?is?a?free,?very?fast?and?reliable?solution?\?
- #???????????????offering?high?availability,?load?balancing,?and?\?
- #???????????????proxying?for?TCP?and??HTTP-based?applications?
- #?processname:?haproxy?
- #?config:??????/etc/haproxy/haproxy.cfg?
- #?pidfile:?????/var/run/haproxy.pid?
- ?
- #?Source?function?library.?
- .?/etc/rc.d/init.d/functions?
- ?
- #?Source?networking?configuration.?
- .?/etc/sysconfig/network?
- ?
- #?Check?that?networking?is?up.?
- [?"$NETWORKING"?=?"no"?]?&&?exit?0?
- ?
- exec="/usr/sbin/haproxy"?
- prog=$(basename?$exec)?
- ?
- [?-e?/etc/sysconfig/$prog?]?&&?.?/etc/sysconfig/$prog?
- ?
- cfgfile=/etc/haproxy/haproxy.cfg?
- pidfile=/var/run/haproxy.pid?
- lockfile=/var/lock/subsys/haproxy?
- ?
- check()?{?
- ????$exec?-c?-V?-f?$cfgfile?$OPTIONS?
- }?
- ?
- start()?{?
- ????$exec?-c?-q?-f?$cfgfile?$OPTIONS?
- ????if?[?$??-ne?0?];?then?
- ????????echo?"Errors?in?configuration?file,?check?with?$prog?check."?
- ????????return?1?
- ????fi?
- ?
- ????echo?-n?$"Starting?$prog:?"?
- ????#?start?it?up?here,?usually?something?like?"daemon?$exec"?
- ????daemon?$exec?-D?-f?$cfgfile?-p?$pidfile?$OPTIONS?
- ????retval=$??
- ????echo?
- ????[?$retval?-eq?0?]?&&?touch?$lockfile?
- ????return?$retval?
- }?
- ?
- stop()?{?
- ????echo?-n?$"Stopping?$prog:?"?
- ????#?stop?it?here,?often?"killproc?$prog"?
- ????killproc?$prog?
- ????retval=$??
- ????echo?
- ????[?$retval?-eq?0?]?&&?rm?-f?$lockfile?
- ????return?$retval?
- }?
- ?
- restart()?{?
- ????$exec?-c?-q?-f?$cfgfile?$OPTIONS?
- ????if?[?$??-ne?0?];?then?
- ????????echo?"Errors?in?configuration?file,?check?with?$prog?check."?
- ????????return?1?
- ????fi?
- ????stop?
- ????start?
- }?
- ?
- reload()?{?
- ????$exec?-c?-q?-f?$cfgfile?$OPTIONS?
- ????if?[?$??-ne?0?];?then?
- ????????echo?"Errors?in?configuration?file,?check?with?$prog?check."?
- ????????return?1?
- ????fi?
- ????echo?-n?$"Reloading?$prog:?"?
- ????$exec?-D?-f?$cfgfile?-p?$pidfile?$OPTIONS?-sf?$(cat?$pidfile)?
- ????retval=$??
- ????echo?
- ????return?$retval?
- }?
- ?
- force_reload()?{?
- ????restart?
- }?
- ?
- fdr_status()?{?
- ????status?$prog?
- }?
- ?
- case?"$1"?in?
- ????start|stop|restart|reload)?
- ????????$1?
- ????????;;?
- ????force-reload)?
- ????????force_reload?
- ????????;;?
- ????check)?
- ????????check?
- ????????;;?
- ????status)?
- ????????fdr_status?
- ????????;;?
- ????condrestart|try-restart)?
- ????????[?!?-f?$lockfile?]?||?restart?
- ????????;;?
- ????*)?
- ????????echo?$"Usage:?$0?{start|stop|status|restart|try-restart|reload|force-reload}"?
- ????????exit?2?
- esac?
#給執行權力
#chmod +x /etc/init.d/haproxy
3)、提供配置文件
根據上面的啟動腳本建立相應的目錄以及配置文件
# mkdir /etc/haproxy
# mkdir /var/lib/haproxy
# useradd -r haproxy?????? #建立腳本啟動用戶
# vi /etc/haproxy/haproxy.cfg
【配置文件】MYSQL入門
#這里的配置文件僅僅只是貼出來進行解析說明.
#如果需要這個配置文件最好將注釋解析全部刪除掉,因為我在使用的過程中,正是因為存在注釋解析而導致出錯,刪除后就能正常運行.
#可以下載這個配置文件進行使用,與下面貼出來的配置文件一致,只是不存在注釋解析
#百度云下載該配置文件(不含注釋):鏈接:http://pan.baidu.com/s/1gfOMtKB? 密碼:zl9o
- global?
- ?
- ????log?????????127.0.0.1?local2??????????
- ????chroot??????/var/lib/haproxy??????????
- ????pidfile?????/var/run/haproxy.pid??????
- ????maxconn?????4000??????????????????????
- ????user????????haproxy???????????????????
- ????group???????haproxy?
- ????daemon????????????????????????????????
- ????stats?socket?/var/lib/haproxy/stats?
- ?
- defaults?
- ????mode????????????????????tcp?????????????
- ????log?????????????????????global?
- ????option??????????????????dontlognull?
- ????option??????????????????redispatch??????
- ????retries?????????????????3???????????????
- ????timeout?http-request????10s?
- ????timeout?queue???????????1m?
- ????timeout?connect?????????10s?????????????
- ????timeout?client??????????1m??????????????
- ????timeout?server??????????1m??????????????
- ????timeout?http-keep-alive?10s?
- ????timeout?check???????????10s?????????????
- ????maxconn?????????????????600?????????????
- ?
- listen?stats????????????????????????????????
- ????mode?http?
- ????bind?:8888?
- ????stats?enable?
- ????stats?hide-version?????????????????????
- stats?uri?????/haproxyadmin?stats??????
- ????stats?realm???Haproxy\?Statistics??????
- ????stats?auth????admin:admin??????????????
- ?
- frontend??main??
- bind?0.0.0.0:3306??????????????????????
- ????default_backend?????????????mysql??????
- ?
- backend?mysql?
- ????balance?????leastconn??????????????????
- ????server?mysql1?192.168.95.11:3306?check?port?3306?maxconn?300?
- ????server?mysql2?192.168.95.12:3306?check?port?3306?maxconn?300?
4)、啟動日志
# vi /etc/rsyslog.conf?

#service rsyslog restartMYSQL入門
5)、啟動haproxy
# service haproxy start

6)、測試haproxy
安照配置文件進行相應的測試

打開瀏覽器輸入192.168.95.13:8888/haproxyadmin?stats

5.2、安裝keepalived
官網下載:http://www.keepalived.org/download.html
在192.168.95.13、192.168.95.14安裝keepalived
1)、解決缺少的軟件庫文件
【這一步驟視具體的linux版本而定,有些已經安裝openssl了.具體情況可以執行./configure就能夠確定缺不缺少軟件庫文件了】
首先我們先將keepalived-1.2.19.tar.gz解壓,然后進入目錄./configure查看
# tar -zxvf keepalived-1.2.19.tar.gz
# ./configure --prefix=/usr/local/keepalived? --sbindir=/usr/sbin/ --sysconfdir=/etc/ --mandir=/usr/local/share/man/ --with-kernel-dir=/usr/src/kernels/2.6.32-504.el6.x86_64/


由上圖可見keepalived的安裝需要先安裝軟件OpenSSL
缺少頭文件,只需要安裝openssl和openssl-devel即可
最簡單的方法是:yum -y install openssl openssl-devel
沒網的朋友也不用怕,接下來將介紹的是rpm方法安裝:
#掛載光盤,在光盤中查找軟件.若光盤找不到就直接下載,再傳入linux進行安裝
# mount /dev/cdrom? /home/suifeng2/rom/
# cd rom/
# cd Packages/
# ls |grep openssl

安裝keepalived軟件時存在各種依賴,下圖是我安裝軟件后整理的依賴關系圖:

既然已經知道各軟件依賴,則可按最后面的軟件開始安裝:
(你也可以從前面開始進行安裝,一步一步的查看各個依賴關系)
1、安裝openssl
# rpm -ivh openssl-1.0.1e-30.el6.x86_64.rpm

安裝openssl成功
2、安裝openssl-devel
安裝libsepol-devel:
# rpm -ivh libsepol-devel-2.0.41-4.el6.x86_64.rpm

安裝pkgconfig(libsepol):
# rpm -ivh pkgconfig-0.23-9.1.el6.x86_64.rpm

安裝libselinux-devel:
# rpm -ivh libselinux-devel-2.0.94-5.8.el6.x86_64.rpm

安裝keyutils-libs-devel:
# rpm -ivh keyutils-libs-devel-1.4-5.el6.x86_64.rpm

安裝libcom_err-devel:
# rpm -ivh libcom_err-devel-141.12-21.el6.x86_64.rpm

安裝krb5-devel:
# rpm -ivh krb5-devel-1.10.3-33.el6.x86_64.rpm

安裝zlib-devel:
# rpm -ivh zlib-devel-1.2.3-29.el6.x86_64.rpm

安裝openssl-devel:
# rpm -ivh openssl-devel-1.0.1e-30.el6.x86_64.rpm

2)、編譯安裝keepalived軟件
# cd keepalived-1.2.19
# ./configure --prefix=/usr/local/keepalived? --sbindir=/usr/sbin/ --sysconfdir=/etc/ --mandir=/usr/local/share/man/ --with-kernel-dir=/usr/src/kernels/2.6.32-504.el6.x86_64/
# make && make install
# chkconfig --add keepalived? #添加開機自啟(我暫時沒添加)
# chkconfig keepalived on
【注意】:
1、安裝時./configure中的—prefix后的幾個選擇可選可不選,選了就可以采用service直接啟動了.建議最好都加上吧
2、--with-kernel-dir這個選項根據自己的linux版本進行填寫(在linux中使用命令uname –a可以查到)

3)、創建配置文件
/etc/keepalived/文件夾已存在keepalived.conf文件,我們將它改名為keepalived.conf.back,再建立一個我們自己keepalived.conf配置文件.

vi /etc/keepalived/keepalived.conf(13與14配置文件路徑一致)
【以下是簡單的配置文件,使用時最好去掉注釋】
配置文件下載(不含注釋):
192.168.95.13配置文件:
! Configuration File for keepalived
#簡單的頭部,這里主要可以做郵件通知報警等的設置,此處就暫不配置了;
global_defs {
??????? notificationd LVS_DEVEL
}
#預先定義一個腳本,方便后面調用,也可以定義多個,方便選擇;
vrrp_script chk_haproxy {
??? script "/etc/keepalived/chk.sh"? #具體腳本路徑
??? interval 2? #腳本循環運行間隔
}
#VRRP虛擬路由冗余協議配置
vrrp_instance VI_1 {?? #VI_1 是自定義的名稱;
??? state BACKUP??? #MASTER表示是一臺主設備,BACKUP表示為備用設備【我們這里因為設置為開啟不搶占,所以都設置為備用】
??? nopreempt????? #開啟不搶占
??? interface eth0?? #指定VIP需要綁定的物理網卡
??? virtual_router_id 11?? #VRID虛擬路由標識,也叫做分組名稱,該組內的設備需要相同
??? priority 130?? #定義這臺設備的優先級 1-254;開啟了不搶占,所以此處優先級必須高于另一臺
??? advert_int 1?? #生存檢測時的組播信息發送間隔,組內一致
??? authentication {??? #設置驗證信息,組內一致
??????? auth_type PASS?? #有PASS 和 AH 兩種,常用 PASS
??????? auth_pass asd??? #密碼
??? }
??? virtual_ipaddress {
??????? 192.168.95.55??? #指定VIP地址,組內一致,可以設置多個IP
??? }
??? track_script {??? #使用在這個域中使用預先定義的腳本,上面定義的
??????? chk_haproxy??
??? }
??? notify_backup "/etc/init.d/haproxy restart"?? #表示當切換到backup狀態時,要執行的腳本
??? notify_fault "/etc/init.d/haproxy stop"???? #故障時執行的腳本
}
192.168.95.14配置文件:
配置文件與上面的幾乎一樣,僅僅改變priority 120【只需要比上面的小即可】
4)、創建腳本文件
創建上面配置文件所需的腳本文件(13、14一樣)
(檢測haproxy有沒有發生故障,發生故障則將keepalived停掉,讓出vip)
# vi /etc/keepalived/chk.sh#!/bin/bash
#
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
?????? /etc/init.d/keepalived stop
fi
給執行權限
# chmod +x /etc/keepalived/chk.sh

啟動keepalived:
# service keepalived start

安裝keepalived成功!
回到頂部
6、功能測試
測試之前先在mysql1和mysql2中建立一個mysql用戶,此用戶可以允許13、14linux主機登陸:
用戶:jack
密碼:321
host:192.168.95.%
mysql> GRANT ALL ON *.* TO 'jack'@'192.168.95.%' IDENTIFIED BY '321';
mysql> FLUSH PRIVILEGES;
回到頂部
6.1、流程簡述
大概講述一下整體的運作流程:
首先兩個11,12的mysql以及13、14的haproxy、keepalived都啟動;
keepalived在keepalived群組中獲取虛擬IP,以及檢測haproxy是否被kill;
haproxy負責將進來的數據轉發到11或者12的mysql中.
下圖是我畫的簡單理解圖:(相對來說比較簡潔哈,湊合湊合哈)

接下來我們將一個個功能的進行測試驗證.
回到頂部
6.2、測試haproxy監聽前端端口3306
1、frontend監聽端口3306時,將mysql、haproxy、keepalived全部開啟
2、使用任意一個mysql客戶端登陸用戶jack
登陸成功(windowns上登陸mysql)

3、更改frontend監聽端口為3307,繼續操作登陸測試
登陸失敗

結果:說明了frontend監聽端口的用處,有助于我們理解haproxy用法.
回到頂部
6.3、測試高可用+keepalived不搶占vip
可以通過haproxy監控頁面獲知誰獲取了vip
1、依次啟動13、14的keepalived、haproxy(啟動keepalived后將會自動開啟haproxy)


2、訪問http://192.168.95.55:8888/haproxyadmin?stats
13獲取了vip

3、# kill -9 8923
刷新http://192.168.95.55:8888/haproxyadmin?stats

14獲取了vip,機器正常工作
結果:證明了高可用,掛了一臺另一臺繼續工作
4、重新啟動13的haproxy以及keepalived
并刷新http://192.168.95.55:8888/haproxyadmin?stats


結果:此時vip仍在14手中,證明了keepalived配置了不搶占vip,不必浪費資源去獲取vip.
回到頂部
6.4、測試負載均衡
1、全部正常啟動,此時vip在14手中
2、分別在11、12中開啟抓包
# tcpdump -n -i eth0 host 192.168.95.11 and 192.168.95.14
# tcpdump -n -i eth0 host 192.168.95.12 and 192.168.95.14
3、使用不同客戶端登陸jack用戶,不斷向數據庫添加數據


結果:此時14向11、12都有發送數據,此時證明負載均衡
【我們設置的haproxy中balance方式是最少連接方式,假若采用roundrobin方式測試結果將會更加明顯】
注意:
當某一臺mysql掛了以后,haproxy會將其踢出mysql服務器群組.
當有命令傳來時會將其轉發到正常的服務器上.
當出問題的mysql恢復后,haproxy又會自動地將它放回mysql服務器群組中,并且自動同步沒有同步的數據
測試:
1、全部正常啟動
mysql1、mysql2都正常

?2、將mysql2關掉

mysql2恢復后又將其放回mysql群組里
【當mysql2掛掉時,若有數據插入,將會轉發給mysql1,當mysql恢復后,又會將這些數據同步到mysql2中】
7、總結與建議
在這篇博文中我們不僅僅只關注這一整個mysql高可用負載均衡的實現方式,我們還應該理解haproxy以及keepalived的工作方式.Haproxy和keepalived這兩個工具很強大,了解他們的實現方式,那么就可以以此類推與其他服務器組合構建強大健壯的服務集群.例如它可以與apache組合,構成高可用負載均衡的web集群.
這篇文章中只是簡簡單單的搭建了一個mysql高可用負載均衡的環境,真正應用到生產環境中,還需要根據具體項目進行相應的修改.
最后我的小建議就是看完這篇博客可以去了解了解更多的haproxy和keepalived的相應配置,以及學習與haproxy功能差不多的LVS.
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/5598.html