GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 作者:蟹黃瓜子 文章來源:社區投稿 1.基於四層+七層的負載均衡 實現負載均衡的方式有很多,例如基於DNS的負載均衡、基於四層交換技術的負載均衡、基於七 ...
- GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。
- GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。
- 作者:蟹黃瓜子
- 文章來源:社區投稿
1.基於四層+七層的負載均衡
實現負載均衡的方式有很多,例如基於DNS的負載均衡、基於四層交換技術的負載均衡、基於七層交換技術的負載均衡,其中nginx大家不陌生,我們可以通過配置實現負載均衡,可是問題也很明顯,如果nginx宕機了,那麼如何進行負載?這個時候會想多來幾台nginx,綜合考慮,今天介紹一種基於四層+七層交換技術的負載均衡,以虛擬ip來負載給我們多台nginx,再由nginx來實現負載均衡過程。本文采用CentOS 7.6作為操作系統示例。
2.nginx部署安裝
2.1.環境準備
VMware創建2台虛擬機,XShell工具連接虛擬機進行操作,以下操作集群2台設備都需要完成:
- 1、靜態分配ip,可自定:
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
- 2、為機子安裝環境,採用yum源安裝,註意設置yum源:
[root@localhost ~]# yum install -y gcc
[root@localhost ~]# yum install -y pcre pcre-devel
[root@localhost ~]# yum install -y zlib zlib-devel
[root@localhost ~]# yum install -y openssl openssl-devel
2.2.安裝
- 下載“nginx-1.8.0.tar.gz”文件並解壓:
[root@localhost ~]# wget http://nginx.org/download/nginx-1.8.0.tar.gz
[root@localhost ~]# tar -zxvf nginx-1.8.0.tar.gz
- 進入目錄:
[root@localhost ~]# cd nginx-1.8.0/
[root@localhost nginx-1.8.0]#
- 通過configure進行安裝:
[root@localhost nginx-1.8.0]# ./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi
- 進行編譯安裝:
[root@localhost nginx-1.8.0]# make
[root@localhost nginx-1.8.0]# make install
- 在
/var/
下創建temp目錄和nginx目錄::
[root@localhost /]# mkdir -p /var/temp/nginx/
[root@localhost nginx]# pwd
/var/temp/nginx
[root@localhost ~]# cd /var/run/
[root@localhost run]# mkdir nginx
- 查看nginx的安裝目錄並運行:
[root@localhost nginx]# pwd
/usr/local/nginx
[root@localhost nginx]# cd sbin/
[root@localhost sbin]# ./nginx
# 64519是nginx主進程的進程id,64520是nginx工作進程的進程id
[root@localhost sbin]# ps aux|grep nginx
root 64519 0.0 0.0 24892 772 ? Ss 09:36 0:00 nginx: master process ./nginx
nobody 64520 0.0 0.1 27404 1520 ? S 09:36 0:00 nginx: worker process
root 64531 0.0 0.0 112808 964 pts/1 R+ 09:36 0:00 grep --color=auto nginx
-
註意:執行./nginx啟動nginx,這裡可以-c指定載入的nginx配置文件,如下:
./nginx -c /usr/local/nginx/conf/nginx.conf
如果不指定-c,nginx在啟動時預設載入conf/nginx.conf文件,此文件的地址也可以在編譯安裝nginx時指定./configure的參數(--conf-path= 指向配置文件(nginx.conf))
3.lvs部署安裝
3.1.環境準備
VMware創建1台虛擬機,XShell工具連接虛擬機進行操作:
- 1、配置ip:
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
- 2、安裝依賴,靜等安裝成功出現“Complete”即可:
[root@localhost ~]# yum install -y gcc gcc-c++ makepcre pcre-devel kernel-devel openssl-devel libnl-devel popt*
3.2.安裝
- LVS是Linux Virtual Server的簡寫,意即Linux虛擬伺服器,是一個虛擬的伺服器集群系統。本項目在1998年5月由章文嵩博士成立,是中國國內最早出現的自由軟體項目之一。
- centos6.5自帶lvs,本系統採用centos7.6,檢查linux內核是否集成lvs模塊::
[root@localhost ~]# cat /etc/system-release
CentOS Linux release 7.9.2009 (Core)
# centos7已經沒有集成modprobe的“-l”參數了
[root@localhost ~]# modprobe -l | grep ipvs
modprobe: invalid option -- 'l'
[root@localhost ~]#
# 可以使用如下命令:
[root@localhost ~]# find /lib/modules/$(uname -r)/ -iname "**.ko*" | cut -d/ -f5-
.........略..................
kernel/net/netfilter/ipvs/ip_vs.ko.xz
kernel/net/netfilter/ipvs/ip_vs_dh.ko.xz
kernel/net/netfilter/ipvs/ip_vs_ftp.ko.xz
kernel/net/netfilter/ipvs/ip_vs_lblc.ko.xz
kernel/net/netfilter/ipvs/ip_vs_lblcr.ko.xz
kernel/net/netfilter/ipvs/ip_vs_lc.ko.xz
kernel/net/netfilter/ipvs/ip_vs_nq.ko.xz
kernel/net/netfilter/ipvs/ip_vs_pe_sip.ko.xz
kernel/net/netfilter/ipvs/ip_vs_rr.ko.xz
kernel/net/netfilter/ipvs/ip_vs_sed.ko.xz
kernel/net/netfilter/ipvs/ip_vs_sh.ko.xz
kernel/net/netfilter/ipvs/ip_vs_wlc.ko.xz
kernel/net/netfilter/ipvs/ip_vs_wrr.ko.xz
.........略..................
- 拉取lvs的管理工具ipvsadm,並解壓:
[root@localhost ~]# cd /usr/local/
[root@localhost local]# wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz
[root@localhost local]# tar zxvf ipvsadm-1.26.tar.gz
- 進入目錄後編譯安裝:
[root@localhost local]# cd ipvsadm-1.26/
[root@localhost ipvsadm-1.26]# make
[root@localhost ipvsadm-1.26]# make install
- 驗證是否安裝成功:
[root@localhost ipvsadm-1.26]# ipvsadm -h
ipvsadm v1.26 2008/5/15 (compiled with popt and IPVS v1.2.1)
Usage:
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine]
ipvsadm -D -t|u|f service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
.........略..................
4.lvs實現四層負載DR模式與Nginx七層進行整合
- 在lvs虛擬機的eth33(自己網卡名字)上綁定虛擬ip假設為:192.168.1.200:
[root@localhost ~]# cd /etc/sysconfig/network-scripts
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens33:0
[root@localhost network-scripts]# vi ifcfg-ens33:0
# 將以下配置拷貝進去
DEVICE="ens33:0"
BOOTPROTO="static"
ONBOOT="yes"
IPADDR=192.168.1.200
NETMASK=255.255.255.255
BROADCAST=192.168.1.200
# 刷新
[root@localhost network-scripts]# systemctl restart network
- 添加路由規則:
[root@localhost network-scripts]# route add -host 192.168.1.200 dev ens33:0
- 啟用系統的包轉發功能,參數值為1時啟用ip轉發,為0時禁止ip轉發:
[root@localhost network-scripts]# echo "1" >/proc/sys/net/ipv4/ip_forward
- 清除原有轉發規則:
[root@localhost network-scripts]# ipvsadm --clear
-
添加虛擬IP規則:
-
- -s rr表示採用輪詢策略
- :80表示負載轉發的埠是80
[root@localhost network-scripts]# ipvsadm -A -t 192.168.1.200:80 -s rr
- 給虛擬IP中添加服務規則(1.13和1.14為兩台nginx伺服器):
[root@localhost network-scripts]# ipvsadm -a -t 192.168.1.200:80 -r 192.168.1.13:80 -g
[root@localhost network-scripts]# ipvsadm -a -t 192.168.1.200:80 -r 192.168.1.14:80 -g
- 在新加虛擬IP記錄中添加兩條新的Real Server記錄,-g表示指定LVS 的工作模式為直接路由模式。lvs進行負載轉發需要保證lvs負載的埠要和nginx服務的埠的一致,這裡都為80
- 重啟lvs
[root@localhost network-scripts]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP localhost.localdomain:http rr
-> 192.168.1.13:http Route 1 0 0
-> 192.168.1.14:http Route 1 0 0
- 在lvs的DR和TUn模式下,用戶的訪問請求到達真實伺服器後,是直接返回給用戶的,而不再經過前端的Director Server,因此,就需要在每個Real server節點上增加虛擬的VIP地址,這樣數據才能直接返回給用戶
- 迴環設備(nginx)上綁定了一個虛擬IP地址:
[root@localhost sbin]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@localhost network-scripts]# vi ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.1.200
BROADCAST=192.168.1.200
NETMASK=255.255.255.255
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
ONBOOT=yes
NAME=loopback
[root@localhost network-scripts]# systemctl restart network
[root@localhost sbin]# /sbin/route add -host 192.168.1.200 dev lo:0
-
關閉arp解析:
-
- arp_announce :定義不同級別:當ARP請求通過某個埠進來是否利用這個介面來回應。 0 -利用本地的任何地址,不管配置在哪個介面上去響應ARP請求; 1 - 避免使用另外一個介面上的mac地址去響應ARP請求; 2 - 儘可能使用能夠匹配到ARP請求的最佳地址。
- arp_ignore:當ARP請求發過來後發現自己正是請求的地址是否響應; 0 - 利用本地的任何地址,不管配置在哪個介面上去響應ARP請求; 1 - 哪個介面上接受ARP請求,就從哪個埠上回應。
[root@localhost conf]# pwd
/proc/sys/net/ipv4/conf
[root@localhost conf]# echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
[root@localhost conf]# echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
[root@localhost conf]# echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
[root@localhost conf]# echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
#使用修改生效
[root@localhost conf]# sysctl -p
- 驗證,通過vip是否可以訪問到兩台nginx
- 還可以通過七層部署負載幾台tomcat來測試:
[root@localhost conf]# vi nginx.conf
# 配置如下
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
upstream tomcat_server_pool{
server 192.168.1.20:8080 weight=10;
server 192.168.1.21:8080 weight=10;
}
server {
listen 80;
server_name localhost;
location / {
root html;
proxy_pass http://tomcat_server_pool;
index index.html index.htm;
}
}
- 驗證效果,此時通過lvs即可對Tomcat進行訪問了,不管哪一臺Tomcat宕機,或哪一臺nginx宕機,都不會影響訪問。那麼如果lvs所在的機器宕機了呢?入口沒了就找不到nginx了,這個時候可以通過keepalived的心跳機制來實現lvs的主備操作,以此來檢測主機是否還存活,如果宕機,備機就作為主機使用了,幾台先講到這,下次有機會繼續說部署方案。
Enjoy GreatSQL