用haproxy結合keepalived實現基於LNMP的負載均衡和高可用
今天我們講haproxy結合keepalived實現LNMP的負載均衡和高可用,現在的公司大部分都基於haproxy實現負載均衡。下面以一個事例去給大家詳細講解如何去實現:
一、用haproxy結合keepalived實現基於lnmp的負載均衡和高可用服務,要求:
(1)實現動靜分離,圖片和css,js都分離到專門的靜態服務器上
(2)只允許172.17網段用戶訪問
(3)對於動態請求,要求實現基於cookie的會話保持
整體架構如下:
1、實驗前需要關閉防火墻和selinux,以及同步時間。
關閉防火墻:iptables -F
關閉selinux:setenforce 0
同步時間:ntpdate 172.17.0.1(局域網的網關)
2、配置主服務器
(1)配置主keepalived
vim /etc/keepalived/keepalived.conf(基於NAT模式)
global_defs { #全局設置
notification_email {
root@localhost #郵件地址
}
notification_email_from root
smtp_server 127.0.0.1 #發送郵件的地址
smtp_connect_timeout 30
router_id KEEPALIVED_LVS
}
vrrp_instance VI_1 {
state MASTER #級別為MASTER
interface eth1 #對外的網卡
virtual_router_id 74 #VIP組號,做實驗的時候不要和別人是一個組
priority 200 #優先級
advert_int 1
authentication { #組內驗證
auth_type PASS
auth_pass magedu
}
virtual_ipaddress {
172.17.177.176 #對外的VIP
}
}
vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 75
priority 200
advert_int 1
authentication {
auth_type PASS
auth_pass magedu
}
virtual_ipaddress {
192.168.153.153 #對內的DIP的VIP,因為是兩個調度器,所以要讓DIP的地址也漂
}
}
主要是實現VIP對外,然後再生成一個DIP的VIP對內
啟動服務systemctl start keepalived
開啟路由轉發vim /etc/sysctl.conf
net,ipv4,ip_forward=1
sysctl -p 生效
(2)配置主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
stats socket /var/lib/haproxy/stats
defaults(默認的就行)
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
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 3000
frontend http
bind 172.17.177.176:80 #80端口綁定到VIP上
stats enable #啟動監控頁面
stats uri /haproxy #監控頁面的路徑
stats auth admin:admin #監控頁面的賬號密碼
stats refresh #10s監控頁面每10秒自動刷新一次
stats admin if TRUE #能修改監控頁面
acl imagejingtai path_end -i .jpj .png .bmp .gif .js .css #匹配靜態頁面
acl imagephp path_end -i .php #匹配動態php頁面
use_backend webserver1 if imagephp #如果匹配到imagephp就調度到webserver1中
acl host src 172.17.0.0/16 #匹配172.17這個網段
block if ! host #如果不是host裏面的網段就都拒絕
default_backend webserver #默認的backend是webserver
backend webserver1 #後端的服務器
balance roundrobin #使用的算法
server web1 192.168.153.177:80 check weight 1
backend webserver2
balance roundrobin
server web2 192.168.153.176:80 check weight 1
backend webserver
balance roundrobin
cookie SRV insert nocache #基於cookie驗證
server http1 192.168.153.177:80 check weight 1 cookie srv1 #基於cookie的srv1驗證保持會話
server http1 192.168.153.176:80 check weight 1
啟動服務systemctl start haproxy
查看80端口是否監聽在VIP上 ss -ntl
3、配置從的服務器
(1)配置從的keepalived
vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
root@localhost
}
notification_email_from root
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id KEEPALIVED_LVS
}
vrrp_instance VI_1 {
state BACKUP #MASTER需要改成BACKUP
interface eth1
virtual_router_id 74
priority 190 #優先級需要調小
advert_int 1
authentication {
auth_type PASS
auth_pass magedu
}
virtual_ipaddress {
172.17.177.176
}
}
vrrp_instance VI_2 {
state BACKUP #MASTER需要改成BACKUP
interface eth0
virtual_router_id 75
priority 190 #優先級需要調小
advert_int 1
authentication {
auth_type PASS
auth_pass magedu
}
virtual_ipaddress {
192.168.153.153
}
}
啟動服務systemctl start keepalived
開啟路由轉發vim /etc/sysctl.conf
net,ipv4,ip_forward=1
sysctl -p 生效
(2)配置從的haproxy(和主的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
stats socket /var/lib/haproxy/stats
defaults(默認的就行)
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
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 3000
frontend http
bind 172.17.177.176:80 #80端口綁定到VIP上
stats enable #啟動監控頁面
stats uri /haproxy #監控頁面的路徑
stats auth admin:admin #監控頁面的賬號密碼
stats refresh #10s監控頁面每10秒自動刷新一次
stats admin if TRUE #能修改監控頁面
acl imagejingtai path_end -i .jpj .png .bmp .gif .js .css #匹配靜態頁面
acl imagephp path_end -i .php #匹配動態php頁面
use_backend webserver1 if imagephp #如果匹配到imagephp就調度到webserver1中
acl host src 172.17.0.0/16 #匹配172.17這個網段
block if ! host #如果不是host裏面的網段就都拒絕
default_backend webserver #默認的backend是webserver
backend webserver1 #後端的服務器
balance roundrobin #使用的算法
server web1 192.168.153.177:80 check weight 1
backend webserver2
balance roundrobin
server web2 192.168.153.176:80 check weight 1
backend webserver
balance roundrobin
cookie SRV insert nocache #基於cookie驗證
server http1 192.168.153.177:80 check weight 1 cookie srv1 #基於cookie的srv1驗證保持會話
server http1 192.168.153.176:80 check weight 1
啟動服務service haproxy start
4、配置後端的web服務器
需要提前搭建好基於LNMP實現的小米電子商務網站(前面的博客有如何搭建LNMP實現小米電子商務網站)
(1)NAT模式
把80,3306,9000端口開開
systemctl start nginx php-fpm mariadb
然後把路由指向DIP的VIP
ip route add default via 192.168.153.153
(2)DR模式
在調度器keepalived中不用配置DIP的VIP,因為把網關指向路由器就行
ip route add default via 172.17.0.1
還要在回環網卡上加入VIP地址
ifconfig lo:0 172.17.166.165 broadcast 172.17.166.165 netmask 255.255.255.255 up
添加路由,讓VIP走lo:0
route add -host 172.17.166.165 dev lo:0
只回答目標IP地址是來訪網絡接口本地地址的ARP查詢請求
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
對查詢目標使用最適當的本地地址.在此模式下將忽略這個IP數據包的源地址並嘗試選擇與能與該地址通信的本地地址.
5、然後就可以去測試看VIP會不會飄逸,關閉主的服務器,然後看能不能訪問web服務器
還可以訪問http://192.168.153.177/haproxy去管理後臺web服務器
到此為止就完全實現負載均衡和高可用,後端web服務器多臺時候就在haproxy中多加幾個server就可以了!
用haproxy結合keepalived實現基於LNMP的負載均衡和高可用