HAproxy+keepalived+mysql構建高可用數(shù)據(jù)庫
1东涡、概況
1.1 應用場景
Nginx/LVS/HAProxy的基于Linux的開源免費的負載均衡軟件暴区。對于大型的,需要進行高并發(fā)的網(wǎng)站或者對網(wǎng)絡不太嚴格的場景,可以使用Nginx;對于大型的Web服務器的時候可以使用Haproxy癌瘾;對性能有嚴格要求的時候可以使用LVS,就單純從負載均衡的角度來說饵溅,LVS也許會成為主流妨退,更適合現(xiàn)在大型的互聯(lián)網(wǎng)公司。本文采用HAproxy+keepalived+mysql主從方案來解決業(yè)務架構高可用蜕企。
1.2 LVS/Nginx/HAProxy特點
LVS
1)抗負載能力強咬荷、是工作在網(wǎng)絡4層之上僅作分發(fā)之用,沒有流量的產(chǎn)生轻掩,這個特點也決定了它在負載均衡軟件里的性能最強的萍丐;
2)配置性比較低,這是一個缺點也是一個優(yōu)點放典,因為沒有可太多配置的東西逝变,所以并不需要太多接觸,大大減少了人為出錯的幾率奋构;
3)工作穩(wěn)定壳影,自身有完整的雙機熱備方案,如LVS+Keepalived和LVS+Heartbeat弥臼,不過我們在項目實施中用得最多的還是LVS/DR+Keepalived宴咧;
4)無流量,保證了均衡器IO的性能不會收到大流量的影響径缅;
5)應用范圍比較廣掺栅,可以對所有應用做負載均衡;
6)軟件本身不支持正則處理纳猪,不能做動靜分離氧卧,這個就比較遺憾了;其實現(xiàn)在許多網(wǎng)站在這方面都有較強的需求氏堤,這個是Nginx/HAProxy+Keepalived的優(yōu)勢所在沙绝。
7)如果是網(wǎng)站應用比較龐大的話,實施LVS/DR+Keepalived起來就比較復雜了鼠锈,特別后面有Windows Server應用的機器的話闪檬,如果實施及配置還有維護過程就比較復雜了。
Nginx
1)工作在網(wǎng)絡的7層之上购笆,可以針對http應用做一些分流的策略粗悯,比如針對域名、目錄結構同欠,它的正則規(guī)則比HAProxy更為強大和靈活样傍,這也是許多朋友喜歡它的原因之一横缔;
2)Nginx對網(wǎng)絡的依賴非常小,理論上能ping通就就能進行負載功能铭乾,這個也是它的優(yōu)勢所在剪廉;
3)Nginx安裝和配置比較簡單娃循,測試起來比較方便炕檩;
4)也可以承擔高的負載壓力且穩(wěn)定,一般能支撐超過幾萬次的并發(fā)量捌斧;
5)Nginx可以通過端口檢測到服務器內(nèi)部的故障笛质,比如根據(jù)服務器處理網(wǎng)頁返回的狀態(tài)碼、超時等等捞蚂,并且會把返回錯誤的請求重新提交到另一個節(jié)點妇押,不過其中缺點就是不支持url來檢測;
6)Nginx僅能支持http和Email姓迅,這樣就在適用范圍上面小很多敲霍,這個它的弱勢;
7)Nginx不僅僅是一款優(yōu)秀的負載均衡器/反向代理軟件丁存,它同時也是功能強大的Web應用服務器肩杈。LNMP現(xiàn)在也是非常流行的web架構,大有和以前最流行的LAMP架構分庭抗爭之勢解寝,在高流量的環(huán)境中也有很好的效果扩然。
8)Nginx現(xiàn)在作為Web反向加速緩存越來越成熟了,很多朋友都已在生產(chǎn)環(huán)境下投入生產(chǎn)了聋伦,而且反映效果不錯夫偶,速度比傳統(tǒng)的Squid服務器更快,有興趣的朋友可以考慮用其作為反向代理加速器觉增。
HAProxy
1)支持兩種代理模式:TCP(四層)和HTTP(七層)HAProxy是支持虛擬主機的兵拢。
2)能夠補充Nginx的一些缺點比如Session的保持,Cookie的引導等工作
3)支持url檢測后端的服務器出問題的檢測會有很好的幫助逾礁。
4)它跟LVS一樣卵佛,本身僅僅就只是一款負載均衡軟件;單純從效率上來講HAProxy更會比Nginx有更出色的負載均衡速度敞斋,在并發(fā)處理上也是優(yōu)于Nginx的截汪。
5)HAProxy可以對Mysql讀進行負載均衡,對后端的MySQL節(jié)點進行檢測和負載均衡植捎,不過在后端的MySQL slaves數(shù)量超過10臺時性能不如LVS衙解。
6)HAProxy的算法現(xiàn)在也越來越多了,算法特別靈活
2焰枢、相關理論
2.1 Keepalived工作原理
keepalived:顧名思義是保持存活蚓峦,常用來搭建設備的高可用舌剂,防止業(yè)務核心設備出現(xiàn)單點故障。keepalived基于VRRP協(xié)議來實現(xiàn)高可用暑椰,主要用作realserver的健康檢查以及負載均衡主機和backup主機之間的故障漂移霍转。如果將TCP/IP劃分為5層,則Keepalived就是一個類似于3~5層交換機制的軟件一汽,具有3~5層交換功能避消,其主要作用是檢測web服務器的狀態(tài),如果某臺web服務器故障召夹,Keepalived將檢測到并將其從系統(tǒng)中剔除岩喷,當該web服務器工作正常后Keepalived自動將其加入到服務器群中,這些工作全部自動完成监憎,而不需要人工干預纱意,只需要人工修復故障的web服務器即可。
三層機理是發(fā)送ICMP數(shù)據(jù)包即PING給某臺服務器鲸阔,如果不通偷霉,則認為其故障,并從服務器群中剔除褐筛;四層機理是檢測TCP端口號狀態(tài)來判斷某臺服務器是否故障类少,如果檢測端口存在異常,則從服務器群中剔除死讹;五層機理是根據(jù)用戶的設定檢查某個服務器應用程序是否正常運行瞒滴,如果不正常,則從服務器群中剔除赞警。
2.2 HAproxy工作原理
Haproxy提供高可用性妓忍、負載均衡以及基于TCP和HTTP應用的代理,支持虛擬主機愧旦,它是免費世剖、快速并且可靠的一種解決方案,反向代理服務器,支持雙機熱備支持虛擬主機,但其配置簡單,擁有非常不錯的服務器健康檢查功能,當其代理的后端服務器出現(xiàn)故障, HAProxy會自動將該服務器摘除,故障恢復后再自動將該服務器加入笤虫。
3旁瘫、架構拓撲
4、資源規(guī)劃
主機名稱IP操作系統(tǒng)
haproxy1192.168.74.126Centos7 64位
haproxy2192.168.74.127Centos7 64位
mysql1192.168.74.128Centos7 64位
mysql2192.168.74.129Centos7 64位
VIP192.168.74.150\
軟/硬件選型
企業(yè)大數(shù)據(jù)系統(tǒng)在軟/硬件選型方面將遵循兩個原則:一是硬件上將遵循“同品牌琼蚯、同型號酬凳、同配置”的原則,不因應用系統(tǒng)或分布式系統(tǒng)的不同而不同遭庶;二是軟件上將遵偱“同操作系統(tǒng)宁仔、同JVM 虛擬機、同系統(tǒng)賬戶體系”的原則峦睡。
推薦硬件選型如表1-1 所示翎苫。
表1-1 推薦硬件選型列表
品牌:用戶自定
設備名:節(jié)點機
配置:
CPU:2個4核权埠,主頻為2.4GHz以上
內(nèi)存:16G
硬盤:500G
網(wǎng)卡:千兆
備注:數(shù)據(jù)中心的所有節(jié)點機器配置基本相同
每個節(jié)點的基礎軟件選型如表1-2所示。
表1-2 節(jié)點基礎軟件選型列表
操作系統(tǒng):Centos7 64位
Mysql:mysql-5.7.X
HAproxy:haproxy-1.8.X
keepalived:keepalived-1.2.X
目錄配置:統(tǒng)一自定安裝目錄煎谍,統(tǒng)一環(huán)境配置
應用服務器對只讀的應用程序連接虛擬IP地址攘蔽,連接到haproxy,然后通過haproxy將TCP協(xié)議轉移到下面的2個MySQL主從數(shù)據(jù)庫服務器中呐粘。Haproxy在此做4層的TCP交換服務满俗。keepalived為了防止haproxy單點故障。這里可以使用兩個VIP(虛擬IP)實現(xiàn)haproxy代理服務器的高可用負載均衡事哭。
5漫雷、安裝介質(zhì)
CentOS操作系統(tǒng)版本:CentOS-7-x86_64-DVD-1511.iso
mysql版本:mysql-5.7.22-linux-glibc2.12-x86_64.tar?
HAproxy版本:haproxy-1.8.14.tar.gz
keepalived版本:keepalived-1.2.7.tar.gz
6瓜富、準備工作(每臺機器)
安裝之前鳍咱,如果之前安裝過mysql,那么需要刪除相應的各種mysql文件与柑,刪除之前請停止mysql服務谤辜。并且不要忘記刪除my.cnf這些配置文件。確保刪除干凈价捧。不然可能會和后面的安裝有沖突丑念。如果是實驗,關閉防火墻结蟋,實際中脯倚,防火墻打開對應端口(注意實際中需要使用的端口不只有3306端口,還有同步需要使用的6677端口)嵌屎。保證服務器之前能互相訪問推正,能ping通。保證固定的ip地址宝惰。保證沒有別的程序占用需要使用的端口植榕。如3306等。這些都確認完畢后再進行安裝尼夺。
6.1關閉防火墻
systemctl stopfirewalld.service
systemctl disablefirewalld.service
6.2掛載光盤(每臺機器)
mount /dev/cdrom /mnt
刪除原有的yum的源
cd /etc/yum.repos.d/
rm -rf *
創(chuàng)建自己的源vi my.repo
[centos-yum]
baseurl=file:///mnt
enabled=1
gpgcheck=0?????????? ??????
6.3NTP服務需要每臺機器進行安裝(時間同步)
yum install ntp
systemctl is-enabledntpd
systemctl enable ntpd
systemctl start ntpd
7尊残、安裝mysql
以下的所有操作需要在所有的集群節(jié)點(128/129)都要進行相同的操作
7.1新增用戶組mysql和用戶msyql
groupadd mysql
useradd -g mysql -s/bin/false mysql
新建文件夾并賦予權限
mkdir /var/lib/mysql
chown root:mysql/var/lib/mysql
7.2將下載后的包上傳至服務器/usr/local下
解壓
cd /usr/local
tar xvf mysql-5.7.22-linux-glibc2.12-x86_64.tar
7.3創(chuàng)建鏈接方便訪問
ln -s /usr/local/mysql-gpl-7.5.4-linux-glibc2.5-x86_64/usr/local/mysql
7.4初始化數(shù)據(jù)庫(這里要注意,如果安裝的版本不同淤堵,數(shù)據(jù)庫初始化的命令可能不同的寝衫,很多之前的版本會使用:scripts/mysql_install_db --user=mysql來初始化,這個已經(jīng)被mysql在新的版本中廢棄了拐邪,所以需要使用下面的命令安裝慰毅,如果需要安裝別的版本請參考mysql官網(wǎng)的對應版本的安裝命令。)
進入剛才創(chuàng)建的目錄的bin目錄下初始化庙睡,正常安裝mysql如何初始化就如何進行安裝就可以了事富,這里還可以設置安裝數(shù)據(jù)庫的data目錄等參數(shù)技俐。
cd /usr/local/mysql/bin
./mysqld --initialize--user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
如果初始化成功之后,系統(tǒng)會提示一個隨機生成的數(shù)據(jù)庫密碼统台,此時需要記住這個密碼雕擂,之后登錄數(shù)據(jù)庫需要使用這個密碼。
192.168.74.128????? ???p.(V9O+2*etk ???????????????????? #記錄192.168.74.128的初始化密碼
192.168.74.129??? ????? vKeCI;+4Igl?? ???????????????????? #記錄192.168.74.129的初始化密碼
7.5修改權限
chown -R root .
chown -R mysql data
chgrp -R mysql .
cpsupport-files/mysql.server /etc/rc.d/init.d/
chmod +x/etc/rc.d/init.d/mysql.server
chkconfig --addmysql.server
7.6配置主節(jié)點
vi /etc/my.cnf
[client]
port = 3306
socket =/tmp/mysql.sock
[mysqld]
basedir=/usr/local/mysql/
datadir=/usr/local/mysql/data
user=root
port=3306
socket=/tmp/mysql.sock
server-id=1
log-bin=mysql-bin
skip-name-resolve
7.7配置從節(jié)點
vi /etc/my.cnf
[client]
port = 3306
socket =/tmp/mysql.sock
[mysqld]
basedir=/usr/local/mysql/
datadir=/usr/local/mysql/data
user=root
port=3306
socket=/tmp/mysql.sock
server-id=2
log-bin=mysql-bin
skip-name-resolve
其中slave的server-id要設置比master大
/etc/init.d/mysql.serverstart
./mysql -uroot -p??? ??????????????????????????? #登錄mysql贱勃,密碼粘貼上面記錄的初始密碼
setpassword=password('123456'); ?????? #修改密碼
./mysql -uroot -p123456??????? ????????????? #測試修改后的密碼是否能夠登錄
7.8在Master服務器上創(chuàng)建MySQL用戶(授權復制用戶)
GRANT ALL PRIVILEGES ON*.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
查看master狀態(tài)
show master status;
在slave添加master配置
命令:change master to
->master_host=' 192.168.74.128',
->master_user=' root',
->master_password='123456',
->master_log_file=' mysql-bin.000010', ???#show master status中File的值
->master_log_pos=154;
????????show master status中Position的值
7.9主從同步測試
命令:show slave status\G
當Slave_IO_Running和Slave_SQL_Running均為Yes時井赌,表示同步成功。
8贵扰、搭建haproxy
8.1上傳haproxy安裝包到/usr/local
在74.126和74.127解壓縮安裝
tar -zxvfhaproxy-1.8.14.tar.tar
cd haproxy-1.8.14
yum install -y gcc
make TARGET=linux310
ARCH=x86_64 # uname -a查看主機信息填寫
make installSBINDIR=/usr/sbin/ MANDIR=/usr/share/man/ DOCDIR=/usr/share/doc/
8.2提供啟動腳本
vim /etc/init.d/haproxy
?#
# haproxy
#
# chkconfig:?? - 85 15
# description:? HAProxy is a free, very fast and reliablesolution \
#?????????????? offering high availability, loadbalancing, and \
#?????????????? proxying for TCP and? HTTP-based applications
# processname: haproxy
# config:????? /etc/haproxy/haproxy.cfg
# pidfile:???? /var/run/haproxy.pid
#Sourcefunction library.
./etc/rc.d/init.d/functions
# Source networkingconfiguration.
. /etc/sysconfig/network
# Check that networkingis 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 configurationfile, 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 configurationfile, 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}"
??????? exit2
esac
8.3提供配置文件
mkdir /etc/haproxy
mkdir /var/lib/haproxy
useradd -r haproxy
vim/etc/haproxy/haproxy.cfg
global
??? log????????127.0.0.1 local2
??? chroot?????/var/lib/haproxy
??? pidfile????/var/run/haproxy.pid
??? maxconn????4000
??? user???????haproxy
??? group??????haproxy
??? daemon
defaults
??? mode??????????????????? tcp
??? log???????????????????? global
??? option????????????????? dontlognull
??? option????????????????? redispatch
??? retries???????????????? 3
??? timeout http-request??? 10s
??? timeoutqueue?????????? 1m
??? timeout connect???????? 10s
??? timeout client????????? 1m
??? timeoutserver????????? 1m
??? timeout http-keep-alive 10s
??? timeout check?????????? 10s
??? maxconn???????????????? 600
listen stats
??? mode http
??? bind :6677
??? stats enable
??? stats hide-version?????????????
??? stats uri???? /haproxyadmin?stats
??? stats realm?? Haproxy\ Statistics
??? stats auth??? admin:admin
? ??statsadmin if TRUE
frontend? main
??? bind?*:3306
??? default_backend???????????? mysql
backend mysql
??? balance????leastconn
??? server m1 192.168.74.128:3306 check port3306 maxconn 300
??? server m2 192.168.74.129:3306 check port3306 maxconn 300
8.4修改日志系統(tǒng)
###Provides UDP syslog
reception //去掉下面兩行注釋仇穗,開啟UDP監(jiān)聽
$ModLoad imudp
$UDPServerRun 514
local2.*
/var/log/haproxy.log //添加此行
service rsyslog restart
8.5啟動測試haproxy
service haproxy start
chkconfig --add haproxy
chkconfig haproxy on
netstat -tnlp
mysql -P3306 -uroot
-p123456 -h192.168.74.129 # 查看
server_id,判斷是否成功
9戚绕、搭建keepalived
9.1上傳keepalived安裝包到/usr/local
在74.126和74.127解壓縮安裝
tar xfkeepalived-1.2.7.tar.gz
cd keepalived-1.2.7
./configure --prefix=/usr/local/keepalived--sbindir=/usr/sbin/ --sysconfdir=/etc/ --mandir=/usr/local/share/man/
make && makeinstall
chkconfig --addkeepalived
chkconfig keepalived on
可能會報錯1
!!! OpenSSL isnot properly installed on your system. !!!
!!! Can notinclude OpenSSL headers files.
解決方法:
yum -y installopenssl-devel
可能會報錯2
configure: error: Poptlibraries isrequired
解決方法:
yum?install
popt-devel
9.2提供配置文件
vim
/etc/keepalived/keepalived.conf # 兩個機器配置文件不同
! Configuration Filefor keepalived
global_defs {??????????
notification_email{????????? #忽略
???? acassen@firewall.loc
???? failover@firewall.loc
???? sysadmin@firewall.loc
?? }
?? notification_email_fromAlexandre.Cassen@firewall.loc
?? smtp_server 192.168.200.1
?? smtp_connect_timeout 30
?? router_id LVS_DEVEL
}
vrrp_script chk_haproxy{
??? script"/etc/keepalived/chk.sh"???? #檢查haproxy的腳本
??? interval 2????????????????????????? #每兩秒檢查一次
}
vrrp_instance VI_1 {
??? stateBACKUP??????????????????????? #定義為BACKUP節(jié)點
??? nopreempt?????????????????????????? #開啟不搶占纹坐,另一個不寫
??? interface ens33
??? virtual_router_id 51
??? priority 100??????????????????????? #開啟了不搶占,所以此處優(yōu)先級必須高于另一臺舞丛,另一個寫99
??? advert_int 1
??? authentication {
??????? auth_type PASS
??????? auth_pass abcd
??? }
??? virtual_ipaddress {
??????? 192.168.74.150??? ??????????????#配置VIP
??? }
??? track_script {
??????? chk_haproxy???????????????????? #調(diào)用檢查腳本
??? }
??? notify_backup "/etc/init.d/haproxyrestart"
??? notify_fault "/etc/init.d/haproxystop"
}
9.3創(chuàng)建check文件
vim/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
service keepalivedstart
10耘子、測試
ip addr # 查看是否綁定了虛ip
tcpdump-nn -i ens33 vrrp #抓包查看
http://192.168.74.128:6677/haproxyadmin?stats
# 通過haproxy查看狀態(tài)
10.1測試無誤后,重啟MySQL球切、Haproxy谷誓、Keepalived,順序依次為MySQL吨凑、Haproxy捍歪、Keepalived
/etc/init.d/mysql.serverstart
service haproxy start
service keepalivedstart
10.2測試mysql數(shù)據(jù)同步
通過對數(shù)據(jù)庫進行增刪改查操作,這里就不演示了
10.3測試mysql高可用
/etc/init.d/mysql.serverstop?? 停止服務測試效果鸵钝,VIP是否還能夠連上數(shù)據(jù)庫
mysql -uroot -p123456-h192.168.74.150
10.4測試haproxyl高可用
service haproxy stop????? 停止服務測試效果
http://192.168.74.126:6677/haproxyadmin?stats是否還能夠訪問
mysql -uroot -p123456-h192.168.74.150
10.5測試mysql高可用
service keepalived stop 停止服務測試效果
ip addr??? 查看VIP
mysql -uroot -p123456
-h192.168.74.150 連接數(shù)據(jù)庫