拓撲圖以下:html
爲了便於之後的維護與運維,採用了比較簡單的技術,但要明白,技術簡單只是相對於使用者,開發者簡化了用戶使用配置,可是功能仍是很強大的。對於負載均衡,咱們採用haproxy技術,高可用性採用keepalived技術。前端
注:Haproxy可提供高可用性、負載均衡以及基於TCP和HTTP應用的代理,支持虛擬主機,而且它是免費的。linux
Haproxy並無使用多進程或多線程,而是實現一種事件驅動、單一進程模型,這樣就沒必要受內存等限制,可是一般來講,它的擴展性會比較差。nginx
Keepalived是一個相似於layer3,4,5交換機制的軟件,也就是日常說的第3,4,5層web
交換。redis
Layer3,4&5工做在IP/TCP協議棧的IP層,TCP層apache
Layer3:keepalived使用layer3的方式工做時,keepalived會按期向服務器羣中的服務器發送一個ICMP數據包,因此,layer3的方式是以服務器的IP地址是否有效做爲服務器工做正常與否的標準vim
Layer4:Layer4主要以TCP端口的狀態來決定服務器工做正常與否。windows
Layer5:Layer5就是工做在具體的應用層,它將根據用戶的設定檢查服務器程序運行是否正常,若是與用戶設定不相符,則會把此服務器從服務器羣中剔除。後端
Keepalived主要用於RealServer的健康狀態檢查以及LoadBalance主機和Slave主機之間failover的實現
Haproxy配置(Master)
注:本實驗只是一個測試環境,對於WEB服務器等只是簡單的實現。
以圖中環境鏈接好服務器,IP等,咱們將會以haproxy—keepalived順序進行配置。
注:請自行下載所需軟件,最好使用最新版本。
注:配置以前要先關閉iptables與selinux
1.更改主機名
咱們以10.1.13.231服務器爲Keepalived主服務器,命名爲Master.KPLD;
10.1.13.232爲輔服務器,命名爲:slave.KPLD
[root@localhost ~]# cat /etc/hosts
127.0.0.1 localhost Master.KPLD localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@localhost ~]# cat/etc/sysconfig/network
NETWORKING=yes
HOSTNAME=Master.KPLD
2.解壓安裝haproxy軟件包
# tar zxvf haproxy-1.3.20.tar.gz
[root@Master ~]# tar -zxvfhaproxy-1.3.20.tar.gz
[root@Master ~]# cd haproxy-1.3.20
[root@Master haproxy-1.3.20]# uname -r
2.6.32-279.el6.x86_64 //這裏要查看一下內核版本號,安裝haproxy的時候,要指定正確版本號的
[root@Master haproxy-1.3.20]# vim Makefile
64 PREFIX = /usr/local修改成: 64PREFIX = /usr/local/haproxy
由於解壓以後的文件是通過編譯過的,有人直接在安裝的時候使用—prefix=指明安裝路徑,我作了幾回,發現是不能成功的,因此要想把安裝文件放在一個目錄下,只能修改Makefile文件
[root@Master haproxy-1.3.20]# make TARGET=linux26 //對應上面的內核版本
[root@Master haproxy-1.3.20]# make install
[root@Master haproxy-1.3.20]# mkdir /usr/local/haproxy/etc //建立配置文件目錄
[root@Master haproxy-1.3.20]# cp -p examples/haproxy.cfg/usr/local/haproxy/etc/ //haproxy源碼下有提供配置文件模板,咱們只須要copy過去,修改便可
3.Haproxy服務配置
[root@Masteretc]# vim haproxy.cfg
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
#log loghost local0 info
maxconn 4096
chroot /usr/share/haproxy
uid 99
gid 99
daemon //配置haproxy進入後臺運行模式
nbproc 2 //建立2個進程進入deamon模式運行
pidfile /usr/local/haproxy/haproxy.pid
#debug
#quiet
defaults
log global
mode http //默認模式mode
option httplog
option dontlognull //自動結束完成的連接
retries 3
option redispatch //當serverid對應的服務器掛掉後,強制定向到其餘健康的服務器
maxconn 2000
contimeout 5000
clitimeout 50000
srvtimeout 50000
stats uri /haproxy_stats //訪問統計頁面的url
stats realm user \ passwd //統計頁面密碼框提示文本
stats auth haproxy:haproxy //統計頁面用戶名與密碼
stats hide-version //隱藏haproxy版本信息
listen www.rhel.com 0.0.0.0:80
cookie SERVERID rewrite
balanceroundrobin
# balance source //最好使用這個,能夠保證同一臺客戶機,固定訪問一臺服務器
server 192.168.1.10 192.168.1.10:80 cookie 192.168.1.10 check inter 2000 rise 2fall
server 192.168.1.20 192.168.1.20:80 cookie192.168.1.20 check inter 2000 rise 2 fall 5
// 服務器定義,checkinter 2000指檢測心中頻率,rise指3次正解認爲服務器可用,fall 5指失敗5次認爲服務器不可用,也可設置權值weigth 數字
在配置以後,須要建立一個文件,與配置想對應
[root@Master etc]# mkdir /usr/share/haproxy
4.日誌配置
[root@Masteretc]# vim /etc/rsyslog.conf //日誌配置文件
添加此兩行內容
local0.*/var/log/haproxy.log //增長local0的日誌文件,下同
local1.* /var/log/haproxy.log
[root@Master etc]# vim/etc/sysconfig/rsyslog
修改此行:SYSLOGD_OPTIONS="-r -m 0"
[root@Master etc]# servicersyslog restart //重啓日誌進程
重啓以後就能夠看到/var/log/已經出現了haproxy.log這個文件
5.啓動haproxy服務器
[root@Master ~]#/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/etc/haproxy.cfg
能夠查看一下進程
[root@Mastersbin]# netstat -tulpn | grep haproxy
tcp 0 0 0.0.0.0:10001 0.0.0.0:* LISTEN 3451/./haproxy
udp 0 00.0.0.0:49372 0.0.0.0:* 3451/./haproxy
[root@Mastersbin]#
即啓動成功
6.開啓路由轉發功能
[root@Mastersbin]# echo "1">/proc/sys/net/ipv4/ip_forward
7.Haproxy(Slave)
Slave的安裝與Master的安裝是同樣的,咱們只須要修改Slave的主機名便可,這裏不在贅述
注:httpd服務器只是在此階段進行測試使用,到後端Nginx服務器搭建以後,此httpd服務器要關閉!
1.修改Web1與Web2主機名
[root@localhost~]# hostname Web1.KPLD //如須要可配置成永久主機名
root@Web1 ~]#yum install httpd –y //安裝apache
root@Web1 ~]# echo "Web1.KPLD">/var/www/html/index.html
[root@Web1 ~]#service httpd start
Web2.rhel.com的配置基本同樣,須要修改一下主機名,建立index.html網頁時更改一下內容
[root@Web2 ~]# echo "Web2.KPLD">/var/www/html/index.html
一.測驗Haproxy服務是否安裝成功
在地址欄中輸入Master/Slave的ip地址(這裏的Master與Slave是對keepalived高可用所說的,對haproxy負載均衡無關係)
點擊刷新
由於咱們採用的是輪詢,因此會在兩個服務器之間進行輪詢查看.
咱們也可使圖形界面查看Haproxy服務下配置的服務器使用狀態
在更高的版本中,增長了更高級的功能,好比,能夠直接下架服務器。
咱們已經實如今haproxy的負載均衡,可是,咱們不能夠一下發布兩個地址,因此要使用keepalived高可用特性來實現虛擬ip,達到高可用性的目的.
1.keepalived的安裝
[root@Master ~]# yum install kernel-devel openssl-devel popt-devel //安裝依賴文件
[root@Master ~]# tar -zxvf keepalived-1.2.2.tar.gz
[root@Master ~]# cd keepalived-1.2.2
[root@Master keepalived-1.2.2]# ./configure--with-kernel-dir=/usr/src/kernels/2.6.32-279.el6.x86_64/
若是出現如下提示,即爲成功
Keepalivedconfiguration
------------------------
Keepalivedversion : 1.2.2
Compiler : gcc
Compilerflags : -g -O2
Extra Lib : -lpopt -lssl -lcrypto
Use IPVSFramework : Yes
IPVS sync daemonsupport : Yes
IPVS uselibnl : No
Use VRRPFramework : Yes
Use Debugflags : No
[root@Masterkeepalived-1.2.2]#
[root@Masterkeepalived-1.2.2]# make && make install
[root@Masterkeepalived-1.2.2]# cp keepalived/etc/init.d/keepalived.rh.init/etc/init.d/keepalived //copy啓動腳本
[root@Masterkeepalived-1.2.2]# chmod +x /etc/init.d/keepalived //可執行權限
[root@Masterkeepalived-1.2.2]# chkconfig --level 35 keepalived on //在35級別開機啓動
[root@Masterkeepalived-1.2.2]# cp keepalived/etc/init.d/keepalived.sysconfig/etc/sysconfig/keepalived //copy啓動初始化文件
[root@Masterkeepalived-1.2.2]# cp /usr/local/sbin/keepalived /usr/sbin/ //copy啓動文件
2.keepalived服務配置
[root@Master keepalived-1.2.2]# vim/usr/local/etc/keepalived/keepalived.conf
! ConfigurationFile for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instanceVI_1 {
state MASTER
interface eth2
virtual_router_id 60
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.1.13.230
}
}
virtual_server 10.1.13.230 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 10.1.13.231 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 10.1.13.232 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
因爲在啓動腳本/etc/init.d/keepalived的配置中,默認的配置文件爲config:/etc/keepalived/keepalived.conf,因此,咱們要創建一個連接
[root@Masterkeepalived]# ln -s /usr/local/etc/keepalived/keepalived.conf/etc/keepalived/keepalived.conf
啓動keepalived便可
[root@Masterkeepalived-1.2.2]# service keepalived start
Slave的配置與Master的配置基本相同,只要修改幾個方面便可,這裏再也不貼出完整代碼,只寫出差別的部分
1.將一處state MASTER 修改成state BACKUP
2.將一處priority 100 修改成priority 50
本公司並沒有此服務器,公司真正的服務器爲IIS,我的不喜歡windows服務器方面,因此測試時沒有使用IIS
1.安裝依賴軟件
[root@localhost~]# yum install gcc openssl-devel pcre-devel zlib-devel
2.建立Nginx用戶
# useradd nginx-s /sbin/nologin
3.解壓軟件並安裝
# tar -zxvfnginx-1.4.2.tar.gz
# cd nginx-1.4.2
# ./configure--user=nginx --group=nginx --prefix=/usr/local/nginx--with-http_stub_status_module --with-http_ssl_module
# make&& make install
注:--user,--group:分別指定啓動nginx的賬戶與組
--with-http_stub_status_module:安裝容許狀態模塊
--with-http_ssl_module:安裝ssl模塊
4.啓動nginx
#/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
注:在web1與web2中各作一個主頁,web1中內容爲Web1.KPLD,web2中內容爲Web2.KPLD
5.配置靜態路由
因爲咱們的服務器是內部網絡,不能與外部網絡相通,可是Keepalived配置時咱們使用的是DR模型,因此,當一個請求到達時,是由內部服務器直接返回給客戶端,因此,咱們必然要保證內部主機能夠與外網相連通
在/etc/rc.local中添加以下路由
route add defaultgw 192.168.200.253
6.除了配置在web服務器上配置IP以外,還須要對內網作SNAT,可在兩臺Keepalived上作SNAT
iptables -t nat -A POSTROUTING -s 192.168.200.0/24 -j SNAT--to 10.1.13.231-10.1.13.232
測試Keepalived
因爲設定的是Master爲keepalived爲主服務器,因此能夠在Master上查看是否有虛擬地址
[root@Master keepalived]# ip addr
應該能找到以下內容
2: eth2:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
link/ether 00:0c:29:3a:4d:dd brdff:ff:ff:ff:ff:ff
inet 10.1.13.231/24 brd 10.1.13.255 scopeglobal eth2
inet 10.1.13.230/32 scope global eth2 //能夠看出,虛擬IP出現。
inet6 fe80::20c:29ff:fe3a:4ddd/64 scopelink
valid_lft forever preferred_lft forever
也能夠安裝ipvsadm來查看配置
[root@Masterkeepalived]# yum install ipvsadm
使用ipvsadm –L來查看
如今使用虛擬ip地址來查看網頁
如今咱們來測試一下高可用性,把Master的keepalived stop,看會不會進行vip的轉移
在Master上關閉keepalived服務,查看Slave上ip addr是否出現vip
[root@Master keepalived]# servicekeepalived stop
在Slave上查看
[root@Slave ~]# ip addr
2: eth1:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
link/ether 08:00:27:a5:0e:93 brdff:ff:ff:ff:ff:ff
inet 10.1.13.232/24 brd 10.1.13.255 scopeglobal eth1
inet 10.1.13.230/24 scope global secondaryeth1 //虛擬IP出現
inet6 fe80::a00:27ff:fea5:e93/64 scope link
valid_lft forever preferred_lftforever
再經過瀏覽器查看網頁,自行查看。
也是正常的,高可用性也是成功的.
Keepalived配置出現的問題及解決方法
錯誤一:
configure: error:
!!!OpenSSL is not properly installed on your system. !!!
!!!Can not include OpenSSL headers files. !!!
安裝openssl-devel
yum install openssl-devel
錯誤二:
configure: error: Popt libraries isrequired
安裝popt開發包
yum install popt-devel
錯誤三:
[root@Master keepalived-1.2.2]# servicekeepalived start
Starting Keepalived for LVS: /bin/bash:keepalived: command not found
[FAILED]
解決方法:
[root@Slave ~]# cp/usr/local/sbin/keepalived /usr/sbin/
錯誤四:
Ipvs協議不可用
Dec31 10:51:02 Slave Keepalived_healthcheckers: Registering Kernel netlink commandchannel
Dec 31 10:51:02 SlaveKeepalived_healthcheckers: Opening file '/etc/keepalived/keepalived.conf'.
Dec 31 10:51:02 SlaveKeepalived_healthcheckers: Configuration is using : 14529 Bytes
Dec 31 10:51:02 Slave Keepalived:Healthcheck child process(19805) died: Respawning
Dec 31 10:51:02 Slave Keepalived: StartingHealthcheck child process, pid=19807
Dec 31 10:51:02 SlaveKeepalived_healthcheckers: IPVS: Can't initialize ipvs: Protocol not available
Dec 31 10:51:02 SlaveKeepalived_healthcheckers: Netlink reflector reports IP 10.1.13.232 added
解決方法:
手動加載ip_vs模塊
modprobe ip_vs
modprobe ip_vs_wrr
而且加入開機啓動
#cat /etc/rc.local
/sbin/modprobeip_vs
/sbin/modprobe ip_vs_wrr
錯誤五:
Master服務器與Slave服務器都出現虛擬IP地址,並用當主服務器斷開後,從服務器不能切換,日誌顯示以下
Dec 18 22:37:24 localhost Keepalived_vrrp:bogus VRRP packet received on eth1 !!!
Dec 18 22:37:24 localhost Keepalived_vrrp:VRRP_Instance(VI_1) ignoring received advertisment...
Dec 18 22:37:25 localhost Keepalived_vrrp:ip address associated with VRID not present in received packet : 10.1.13.230
Dec 18 22:37:25 localhost Keepalived_vrrp:one or more VIP associated with VRID mismatch actual MASTER advert
出現這個緣由主要是virtual_router_id配置不正確,默認狀況下是51,可是有些狀況下須要更改,好比修改成:virtual_router_id 60 ,切換就會成功了