前言
??互聯(lián)網(wǎng)應用中,隨著站點對硬件性能、響應速度、服務穩(wěn)定性、數(shù)據(jù)可靠性等要求越來越高,單臺服務器已經無法滿足負載均衡及高可用的要求。
??如果使用小型機、大型機,價格比較昂貴,所以大多數(shù)企業(yè)會使用多臺相對廉價的普通服務器構建服務群集。通過整合多臺服務器,使用LVS來達到服務器的高可用和負載均衡,并已同一個IP地址對外提供相同的服務。
??在企業(yè)中常用的一種群集技術——LVS(Linux Virtual Server,Linux虛擬服務器)。
一、企業(yè)群集應用概述
1. 群集的含義
??Cluster(集群、群集),由多臺主機構成,但對外只表現(xiàn)為要給整體,只提供一個訪問入口(域名和IP地址),相當于一個大型計算機。
1.1 群集的特點
- 由多臺主機構成;
- 都干同樣的一件事;
- 對外展現(xiàn)是一個整體。
1.2 擴展服務器的方式
- 縱向擴展:添加服務器硬件。
- 橫向擴展:添加服務器的數(shù)量。
2. 群集的類型
??根據(jù)群集所針對的目標差異,可分為三種類型:負載均衡群集、高可用群集、高性能運算群集。
2.1 負載均衡群集(Load Balance Cluster)
??提高應用系統(tǒng)的響應能力、盡可能處理更多的訪問請求減少延遲為目標,獲得高并發(fā)、高負載(LB)的整體性能。
??LB的負載分配依賴于主節(jié)點的分流算法,將來自客戶機的訪問請求分擔給多個服務器節(jié)點,從而緩解整個系統(tǒng)的負載壓力。根據(jù)軟件類來分應用,代表是LVS、Nginx、HAproxy;根據(jù)硬件類來分應用,代表的是F5、綠盟。
2.2 高可用群集(High Availability Cluster)
??提高應用系統(tǒng)的可靠性、盡可能地減少中斷時間為目標,確保服務的連續(xù)性,達到高可用(HA)的容錯效果。
??HA的工作方式包括雙工和主從兩種模式,雙工即所有節(jié)點同時在線主從則只有主節(jié)點在線,但當出現(xiàn)故障時從節(jié)點能自動切換為主節(jié)點。應用代表是Keepalived、heartbeat。
2.3 高性能運算群集(High Performance Computer Cluster)
?? 以提高應用系統(tǒng)的CPU運算速度、擴展硬件資源和分析能力為目標,獲得相當于大型、超級計算機的高性能運算(HPC)能力。
??高性能依賴于分布式運算、并行計算,通過專用硬件和軟件將多個服務器的CPU、內存等資源整合在一起,實現(xiàn)只有大型、超級計算機才具備的計算能力。主要代表云計算、網(wǎng)格計算等。
3. 負載均衡的結構
第一層:載調度器 (Load Balancer或Director)
??訪問整個群集系統(tǒng)的唯一入口,對外使用所有服務器共有的VIP地址,也稱為群集 IP地址。通常會配置主、備兩臺調度器實現(xiàn)熱備份,當主調度器失效以后能夠平滑替換至備用調度器,確保高可用性。
第二層:服務器池(Server Pool)
??群集所提供的應用服務、由服務器池承擔,其中每個節(jié)點具有獨立的RIP地址(真實IP),只處理調度器分發(fā)過來的客戶機請求。當某個節(jié)點暫時失效時,負載調度器的容錯機制會將其隔離,等待錯誤排除以后再重新納入服務器池。
第三層:共享存儲(Share Storage)
??為服務器池中的所有節(jié)點提供穩(wěn)定、一致的文件存取服務,確保整個群集的統(tǒng)一性共享存儲可以使用 NAS設備,或者提供NFS共享服務的專用服務器。
4. 負載均衡集群工作模式分析
??負載均衡集群是目前企業(yè)用得最多的群集類型。在生產環(huán)境中,集群的負載調度技術有三種工作模式分別是NAT模式、TUN模式、DR模式。
4.1 NAT模式(地址轉換)
??類似于防火墻的私有網(wǎng)絡結構,負載調度器作為所有服務器節(jié)點的默認網(wǎng)關,即作為客戶機的訪問入口,也是各節(jié)點回應客戶機的訪問出口服務器節(jié)點使用私有IP地址,也就是說調度器會承載雙向數(shù)據(jù)的負載壓力,可能會成為整個集群的性能瓶頸。
??由于節(jié)點服務器都處于內網(wǎng)環(huán)境,使用私網(wǎng)IP地址,所以安全性尚可。
4.2 TUN模式(IP隧道)
??IP Tunnel,簡稱TUN模式。采用開放式的網(wǎng)絡結構,負載調度器僅作為客戶幾的訪問入口,各節(jié)點通過各自的Internet連接直接回應客戶機,而不再經過負載調度器。
?? 由于服務器節(jié)點分散在不同為的公網(wǎng)環(huán)境中,需要具有獨立的公網(wǎng)IP地址,調度器通過專用IP隧道與節(jié)點服務器相互通信。因此IP隧道模式的成本較高、安全性較低,且IP隧道需要更多的封裝和解封裝過程,性能也會收到影響。
4.3 DR模式(直接路由)
??Direct Routing,簡稱DR模式。采用半開放式的網(wǎng)絡結構,與TUN模式的結構類似,但各節(jié)點并不是分散在各地,而是與調度器位于同一個物理網(wǎng)絡負載調度器與各節(jié)點服務器通過本地網(wǎng)絡連接,不需要建立專用的IP隧道。
??節(jié)點服務器與調度器是部署在同一個局域網(wǎng)內,因此不需要建立專用的IP隧道。DR模式是企業(yè)的首選。
二、LVS-NAT 的部署
1. 關于 LVS 虛擬服務器
??針對Linux內核開發(fā)的負載均衡解決方案。1998年5月,由我國的章文嵩博士創(chuàng)建。它的官方網(wǎng)站: http://www.linuxvirtualserver.org/。LVS(Linux Virtual Server)實際上相當于基于IP地址的虛擬化應用,為基于IP地址和內容請求分發(fā)的負載均衡提出了一種高效的解決方法。
??LVS現(xiàn)在已成為 Linux 內核的一部分,默認編譯為 ip_vs 模塊必要時能夠自動調用。在 CentOS 7 系統(tǒng)中,以下操作可以手動加載ip_vs 模塊,并查看當前系統(tǒng)中 ip_vs 模塊的版本信息。
###確認內核對LVS的支持
[root@localhost ~]# modprobe ip_vs
[root@localhost ~]# cat /proc/net/ip_vs
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConns
一次性加載所有模塊的方式。
###進入所有模塊目錄
[root@localhost ~]#cd /usr/lib/modules/3.10.0-1160.el7.x86_64/kernel/net/netfilter/ipvs/
###查詢方式
[root@localhost ipvs]#for i in $(ls *);do echo $i | awk -F. '{print $1}';done
[root@localhost ipvs]#for i in $(ls * | awk -F. '{print $1}');do echo $i;done
[root@localhost ipvs]#ls * | grep -o "^[^.]*"
[root@localhost ipvs]#for i in $(ls *); do echo ${i%%.*};done
2. LVS的負載調度算法
2.1 輪詢(Round Robin)
??將收到的訪問請求按照順序輪流分配給群集中的各節(jié)點(真實服務器),均等地對待每一臺服務器,而不管服務器實際的連接數(shù)和系統(tǒng)負載。
2.2 加權輪詢(Weighted Round Robin)
??根據(jù)調度器設置的權重值來分發(fā)請求,權重值高的節(jié)點優(yōu)先獲得任務,分配的請求數(shù)越多。
??保證性能強的服務器承擔更多的訪問流量。
2.3 最少連接(Least Connections)
??根據(jù)真實服務器已建立的連接數(shù)進行分配,將收到的訪問請求優(yōu)先分配給連接數(shù)最少的節(jié)點。
2.4 加權最少連接(Weighted Least Connections)
??在服務器節(jié)點的性能差異較大時,可以為真實服務器自動調整權重。
??性能較高的節(jié)點將承擔更大比例的活動連接負載。
3. 使用 ipvsadm 工具
??LVS群集創(chuàng)建與管理流程:常見虛擬服務器——>添加刪除服務器節(jié)點——>查看群集及節(jié)點情況——>保存負載分配策略。
ipvsadm工具選項說明
選項 | 含義 |
---|---|
-A |
添加虛擬服務器 |
-D |
刪除整個虛擬服務器 |
-s |
指定負載調度算法(輪詢:rr、加權輪詢:wrr、最少連接:lc、加權最少連接:wlc) |
-a |
表示添加真實服務器(節(jié)點服務器) |
-d |
刪除某一個節(jié)點 |
-t |
指定VIP地址及TCP端口 |
-r |
指定RIP地址及TCP端口 |
-m |
表示使用NAT群集模式 |
-g |
表示使用DR模式 |
-i |
表示使用TUN模式 |
-w |
設置權重(權重為0時表示暫停節(jié)點) |
-p 60 |
表示保持長連接60秒 |
-l |
列表查看LVS虛擬服務器(默認為查看所有) |
-n |
以數(shù)字形式顯示地址、端口等信息,常與- l選項組合使用 |
4. LVS-NAT 部署實戰(zhàn)
4.1 配置環(huán)境
LVS調度器作為Web服務器池的網(wǎng)關,LVS兩塊網(wǎng)卡,分別連接外網(wǎng),使用輪詢(rr)調度算法。
LVS負載調度器:ens32:192.168.145.20 ens36:12.0.0.20(vmnet1)
Web 節(jié)點服務器1:192.168.145.30
Web 節(jié)點服務器2:192.168.145.45
tomcat 多實例服務器:192.168.145.60
客戶端(win10):12.0.0.120 (vmnet1)
4.2 部署服務器
配置ip地址和網(wǎng)卡
LVM負載調度器
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.145.20
NETMASK=255.255.255.0
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
NAME=ens36
DEVICE=ens36
ONBOOT=yes
IPADDR=12.0.0.20
NETMASK=255.255.255.0
[root@localhost ~]# systemctl restart network
[root@localhost ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.145.20 netmask 255.255.255.0 broadcast 192.168.145.255
inet6 fe80::c8e2:a658:18d3:92cd prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:20:88:32 txqueuelen 1000 (Ethernet)
RX packets 1293 bytes 117773 (115.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 896 bytes 105284 (102.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 12.0.0.20 netmask 255.255.255.0 broadcast 12.0.0.255
inet6 fe80::e7d:fb55:adfc:c796 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:20:88:3c txqueuelen 1000 (Ethernet)
RX packets 419 bytes 59274 (57.8 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 143 bytes 19410 (18.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Web服務器1
[root@localhost conf]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=192.168.145.45
NETMASK=255.255.255.0
GATEWAY=192.168.145.20
[root@localhost conf]# systemctl restart network
Web服務器2
[root@localhost conf]# vim /etc/sysconfig/network-scripts/ifcfg-ens32
IPADDR=192.168.145.60
NETMASK=255.255.255.0
GATEWAY=192.168.145.20
[root@localhost conf]# systemctl restart network
Web服務器1(192.168.145.30)配置
環(huán)境配置
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# setenforce 0
setenforce: SELinux is disabled
編譯安裝nginx
[root@localhost ~]# yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
[root@localhost ~]# useradd -M -s /sbin/nologin nginx
[root@localhost ~]# cd /opt/
[root@localhost opt]# ls
nginx-1.24.0.tar.gz rh
[root@localhost opt]# tar xf nginx-1.24.0.tar.gz
[root@localhost opt]# ls
nginx-1.24.0 nginx-1.24.0.tar.gz rh
[root@localhost opt]# cd nginx-1.24.0/
[root@localhost nginx-1.24.0]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-file-aio \ #啟用文件修改支持
--with-http_stub_status_module \ #啟用狀態(tài)統(tǒng)計
--with-http_gzip_static_module \ #啟用 gzip靜態(tài)壓縮
--with-http_flv_module \ #啟用 flv模塊,提供對 flv 視頻的偽流支持
--with-http_ssl_module #啟用 SSL模塊,提供SSL加密功能
--with-stream #啟用 stream模塊,提供4層調度
###編譯安裝
[root@localhost nginx-1.24.0]# make -j2 && make install
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-stream
添加nginx服務
###把nginx服務的可執(zhí)行程序文件放入路徑環(huán)境變量的目錄中便于系統(tǒng)識別
[root@localhost ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
###修改nginx服務的配置文件
[root@localhost nginx-1.24.0]# vim /lib/systemd/system/nginx.service
[Unit] #服務的說明
Description=nginx #描述服務
After=network.target #依賴,當依賴的服務啟動之后再啟動自定義的服務
[Service] #服務運行參數(shù)的設置
Type=forking #是后臺運行的形式,使用此啟動類型應同時指定
PIDFile=/usr/local/nginx/logs/nginx.pid #PID文件位置以便systemd能夠跟蹤服務的主進程
ExecStart=/usr/local/nginx/sbin/nginx #服務的具體運行命令
ExecReload=/bin/kill -s HUP $MAINPID #重啟命令
ExecStop=/bin/kill -s QUIT $MAINPID #停止命令
PrivateTmp=true #給服務分配獨立的臨時空間
[Install] #服務安裝的相關設置
WantedBy=multi-user.target #可設置為多用戶
###給予文件權限
[root@localhost ~]# chmod 754 /lib/systemd/system/nginx.service
###啟動nginx服務
[root@localhost ~]# systemctl start nginx.service
###開機自啟nginx服務
[root@localhost ~]# systemctl enable nginx.service
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecrReload=/bin/kill -s HUP $MAINPID
ExecrStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Web服務器2(192.168.145.45)配置
環(huán)境配置
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# setenforce 0
setenforce: SELinux is disabled
編譯安裝nginx
[root@localhost ~]# yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
[root@localhost ~]# useradd -M -s /sbin/nologin nginx
[root@localhost ~]# cd /opt/
[root@localhost opt]# ls
nginx-1.24.0.tar.gz rh
[root@localhost opt]# tar xf nginx-1.24.0.tar.gz
[root@localhost opt]# ls
nginx-1.24.0 nginx-1.24.0.tar.gz rh
[root@localhost opt]# cd nginx-1.24.0/
[root@localhost nginx-1.24.0]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-file-aio \ #啟用文件修改支持
--with-http_stub_status_module \ #啟用狀態(tài)統(tǒng)計
--with-http_gzip_static_module \ #啟用 gzip靜態(tài)壓縮
--with-http_flv_module \ #啟用 flv模塊,提供對 flv 視頻的偽流支持
--with-http_ssl_module #啟用 SSL模塊,提供SSL加密功能
--with-stream #啟用 stream模塊,提供4層調度
###編譯安裝
[root@localhost nginx-1.24.0]# make -j2 && make install
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-stream
添加nginx服務
###把nginx服務的可執(zhí)行程序文件放入路徑環(huán)境變量的目錄中便于系統(tǒng)識別
[root@localhost ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
###修改nginx服務的配置文件
[root@localhost nginx-1.24.0]# vim /lib/systemd/system/nginx.service
[Unit] #服務的說明
Description=nginx #描述服務
After=network.target #依賴,當依賴的服務啟動之后再啟動自定義的服務
[Service] #服務運行參數(shù)的設置
Type=forking #是后臺運行的形式,使用此啟動類型應同時指定
PIDFile=/usr/local/nginx/logs/nginx.pid #PID文件位置以便systemd能夠跟蹤服務的主進程
ExecStart=/usr/local/nginx/sbin/nginx #服務的具體運行命令
ExecReload=/bin/kill -s HUP $MAINPID #重啟命令
ExecStop=/bin/kill -s QUIT $MAINPID #停止命令
PrivateTmp=true #給服務分配獨立的臨時空間
[Install] #服務安裝的相關設置
WantedBy=multi-user.target #可設置為多用戶
###給予文件權限
[root@localhost ~]# chmod 754 /lib/systemd/system/nginx.service
###啟動nginx服務
[root@localhost ~]# systemctl start nginx.service
###開機自啟nginx服務
[root@localhost ~]# systemctl enable nginx.service
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecrReload=/bin/kill -s HUP $MAINPID
ExecrStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
tomcat服務器(192.168.145.60)配置
安裝jdk
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# cd /opt/
[root@localhost opt]# ls
apache-tomcat-9.0.16.tar.gz jdk-8u91-linux-x64.tar.gz rh
###解壓
[root@localhost opt]# tar xf jdk-8u91-linux-x64.tar.gz
[root@localhost opt]# mv jdk1.8.0_91/ /usr/local/
[root@localhost opt]# cd
[root@localhost ~]# vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_91
export JRE_HOME=$JAVA_HOME/jre
export CATALINA=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=%JAVA_HOME/bin:$JRE_HOME/bin:$PATH
###加載文件
[root@localhost ~]# source /etc/profile
[root@localhost ~]# java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
安裝 tomcat
[root@localhost opt]# tar zxvf apache-tomcat-9.0.16.tar.gz
###創(chuàng)建目錄
[root@localhost opt]# mkdir /usr/local/tomcat
###移動tomcat到/usl/local/tomcat/改名為tomcat1
[root@localhost opt]# mv apache-tomcat-9.0.16 /usr/local/tomcat/tomcat1
###復制 tomcat1 改名為 tomcat2
[root@localhost opt]# cd /usr/local/tomcat/
[root@localhost tomcat]# ls
tomcat1
[root@localhost tomcat]# cp -a tomcat1/ tomcat2/
[root@localhost tomcat]# ls
tomcat1 tomcat2
配置tomcat環(huán)境變量
[root@localhost ~]# vim /etc/profile.d/tomcat.sh
#tomcat1
export CATALINA_HOME1=/usr/local/tomcat/tomcat1
export CATALINA_BASE1=/usr/local/tomcat/tomcat1
export TOMCAT_HOME1=/usr/local/tomcat/tomcat1
#tomcat2
export CATALINA_HOME2=/usr/local/tomcat/tomcat2
export CATALINA_BASE2=/usr/local/tomcat/tomcat2
export TOMCAT_HOME2=/usr/local/tomcat/tomcat2
[root@localhost ~]# source /etc/profile.d/tomcat.sh
修改 tomcat2 中的 server.xml 文件,要求各 tomcat 實例配置不能有重復的端口號
[root@localhost ~]# vim /usr/local/tomcat/tomcat2/conf/server.xml
###22行,修改Server prot,默認為8005 -> 修改為8006
<Server port="8006" shutdown="SHUTDOWN">
###69行,修改Connector port,HTTP/1.1 默認為8080 -> 修改為8081
<Connector port="8081" protocol="HTTP/1.1"
###116行,修改Connector port AJP/1.3,默認為8009 -> 修改為8010
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
修改各 tomcat 實例中的 startup.sh 和 shutdown.sh 文件
[root@localhost ~]# vim /usr/local/tomcat/tomcat1/bin/startup.sh
# -----------------------------------------------------------------------------
# Start Script for the CATALINA Server
# -----------------------------------------------------------------------------
##添加以下內容
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1
[root@localhost ~]# vim /usr/local/tomcat/tomcat1/bin/shutdown.sh
# -----------------------------------------------------------------------------
# Stop script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1
[root@localhost ~]# vim /usr/local/tomcat/tomcat2/bin/startup.sh
# -----------------------------------------------------------------------------
# Start Script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2
[root@localhost ~]# vim /usr/local/tomcat/tomcat1/bin/shutdown.sh
# -----------------------------------------------------------------------------
# Stop script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2
啟動各 tomcat 中的 /bin/startup.sh
[root@localhost ~]# /usr/local/tomcat/tomcat1/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat/tomcat1
Using CATALINA_HOME: /usr/local/tomcat/tomcat1
Using CATALINA_TMPDIR: /usr/local/tomcat/tomcat1/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/tomcat/tomcat1/bin/bootstrap.jar:/usr/local/tomcat/tomcat1/bin/tomcat-juli.jar
Tomcat started.
[root@localhost ~]# /usr/local/tomcat/tomcat2/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat/tomcat2
Using CATALINA_HOME: /usr/local/tomcat/tomcat2
Using CATALINA_TMPDIR: /usr/local/tomcat/tomcat2/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/tomcat/tomcat2/bin/bootstrap.jar:/usr/local/tomcat/tomcat2/bin/tomcat-juli.jar
Tomcat started
[root@localhost ~]# netstat -lntp | grep java
tcp6 0 0 :::8080 :::* LISTEN 12737/java
tcp6 0 0 :::8081 :::* LISTEN 12802/java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 12737/java
tcp6 0 0 127.0.0.1:8006 :::* LISTEN 12802/java
tcp6 0 0 :::8009 :::* LISTEN 12737/java
tcp6 0 0 :::8010 :::* LISTEN
動靜分離設置
Tomcat服務器
配置測試文件tomcat1
[root@localhost ~]# mkdir /usr/local/tomcat/tomcat1/webapps/test /usr/local/tomcat/tomcat2/webapps/test
[root@localhost ~]# vim /usr/local/tomcat/tomcat1/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test2 page</title>
</head>
<body>
<h1>動態(tài)頁面2</h1>
</body>
</html>
##備份
[root@localhost ~]# cp /usr/local/tomcat/tomcat1/conf/server.xml /usr/local/tomcat/tomcat1/conf/server.xml.bak
[root@localhost ~]# vim /usr/local/tomcat/tomcat1/conf/server.xml
###刪除前面的 HOST 配置
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/tomcat1/webapps/test" path="" reloadable="true" />
</Host>
配置測試文件tomcat2
[root@localhost ~]# vim /usr/local/tomcat/tomcat2/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test3 page</title>
</head>
<body>
<h1>動態(tài)頁面3</h1>
</body>
</html>
###備份
[root@localhost ~]# cp /usr/local/tomcat/tomcat2/conf/server.xml /usr/local/tomcat/tomcat2/conf/server.xml.bak
[root@localhost ~]#vim /usr/local/tomcat/tomcat2/conf/server.xml
###刪除前面的 HOST 配置
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/tomcat2/webapps/test" path="" reloadable="true" />
</Host>
重新啟動服務
[root@localhost ~]# /usr/local/tomcat/tomcat1/bin/shutdown.sh
[root@localhost ~]# /usr/local/tomcat/tomcat1/bin/startup.sh
[root@localhost ~]# /usr/local/tomcat/tomcat2/bin/shutdown.sh
[root@localhost ~]# /usr/local/tomcat/tomcat2/bin/startup.sh
Web服務器1
準備靜態(tài)頁面和靜態(tài)圖片
[root@localhost ~]# echo '<html><body><h1>這是靜態(tài)頁面1</h1></body></html>' > /usr/local/nginx/html/index.html
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
http {
......
#gzip on;
#配置負載均衡的服務器列表,weight參數(shù)表示權重,權重越高,被分配到的概率越大
upstream tomcat_server {
server 192.168.145.60:8080 weight=1;
server 192.168.145.60:8081 weight=1;
}
server {
listen 80;
server_name www.accp.com;
charset utf-8;
#access_log logs/host.access.log main;
#配置Nginx處理動態(tài)頁面請求,將 .jsp文件請求轉發(fā)到Tomcat 服務器處理
location ~ .*\.jsp$ {
proxy_pass http://tomcat_server;
#設置后端的Web服務器可以獲取遠程客戶端的真實IP
##設定后端的Web服務器接收到的請求訪問的主機名(域名或IP、端口),默認HOST的值為proxy_pass指令設置的主機名。如果反向代理服務器不重寫該請求頭的話,那么后端真實服務器在處理時會認為所有的請求都來自反向代理服務器,如果后端有防攻擊策略的話,那么機器就被封掉了。
proxy_set_header HOST $host;
##把$remote_addr賦值給X-Real-IP,來獲取源IP
proxy_set_header X-Real-IP $remote_addr;
##在nginx 作為代理服務器時,設置的IP列表,會把經過的機器ip,代理機器ip都記錄下來
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#配置Nginx處理靜態(tài)圖片請求
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {
root /usr/local/nginx/html/img;
expires 10d;
}
location / {
root html;
index index.html index.htm;
}
......
}
......
}
重啟服務
[root@localhost img]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost img]# systemctl restart nginx.service
Web服務器2
準備靜態(tài)頁面和靜態(tài)圖片
[root@localhost ~]# echo '<html><body><h1>這是靜態(tài)頁面1</h1></body></html>' > /usr/local/nginx/html/index.html
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
http {
......
#gzip on;
#配置負載均衡的服務器列表,weight參數(shù)表示權重,權重越高,被分配到的概率越大
upstream tomcat_server {
server 192.168.145.60:8080 weight=1;
server 192.168.145.60:8081 weight=1;
}
server {
listen 80;
server_name www.accp.com;
charset utf-8;
#access_log logs/host.access.log main;
#配置Nginx處理動態(tài)頁面請求,將 .jsp文件請求轉發(fā)到Tomcat 服務器處理
location ~ .*\.jsp$ {
proxy_pass http://tomcat_server;
#設置后端的Web服務器可以獲取遠程客戶端的真實IP
##設定后端的Web服務器接收到的請求訪問的主機名(域名或IP、端口),默認HOST的值為proxy_pass指令設置的主機名。如果反向代理服務器不重寫該請求頭的話,那么后端真實服務器在處理時會認為所有的請求都來自反向代理服務器,如果后端有防攻擊策略的話,那么機器就被封掉了。
proxy_set_header HOST $host;
##把$remote_addr賦值給X-Real-IP,來獲取源IP
proxy_set_header X-Real-IP $remote_addr;
##在nginx 作為代理服務器時,設置的IP列表,會把經過的機器ip,代理機器ip都記錄下來
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#配置Nginx處理靜態(tài)圖片請求
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {
root /usr/local/nginx/html/img;
expires 10d;
}
location / {
root html;
index index.html index.htm;
}
......
}
......
}
重啟服務
[root@localhost img]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost img]# systemctl restart nginx.service
LVS負載調度器(ens32:192.168.145.20;ens36:12.0.0.20)
關閉環(huán)境配置
[root@localhost ~]# systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0
配置SNAT轉發(fā)規(guī)則
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.145.0/24 -o ens32 -j SNAT --to-source 12.0.0.20
加載LVS內核模塊
###加載 ip_vs模塊
[root@localhost ~]# modprobe ip_vs
###查看 ip_vs版本信息
[root@localhost ~]# cat /proc/net/ip_vs
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
安裝ipvsadm 管理工具(本地yum源安裝)
[root@localhost ~]# yum -y install ipvsadm
###啟動服務前須保存負載分配策略
[root@localhost ~]# ipvsadm-save > /etc/sysconfig/ipvsadm
###啟動服務
[root@localhost ~]# systemctl start ipvsadm.service
配置負載分配策略(NAT模式只要在服務器上配置,節(jié)點服務器不需要特殊配置)
#清除原有策略
[root@localhost ~]# ipvsadm -C
[root@localhost ~]# ipvsadm -A -t 12.0.0.20:80 -s rr
[root@localhost ~]# ipvsadm -a -t 12.0.0.20:80 -r 192.168.145.45:80 -m
[root@localhost ~]# ipvsadm -a -t 12.0.0.20:80 -r 192.168.145.30:80 -m
###啟動策略
[root@localhost ~]# 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.145.30:http Masq 1 0 0
-> 192.168.145.45:http Masq 1 0 0
###查看節(jié)點狀態(tài),Masq代表 NAT模式
[root@localhost ~]# ipvsadm -ln
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.145.30:http Masq 1 0 0
-> 192.168.145.45:http Masq 1 0 0
###保存策略
[root@localhost ~]# ipvsadm-save > /opt/ipvsadm
ipvsadm -d -t 12.0.0.20:80 -r 192.168.145.45:80 #刪除群集中某一節(jié)點服務器
ipvsadm -D -t 12.0.0.20:80 #刪除整個虛擬服務器
systemctl stop ipvsadm #停止服務(清空策略),如果selinux沒關閉/etc/sysconfig/ipvsadm內容也會清空
systemctl start ipvsadm #啟動服務(根據(jù)/etc/sysconfig/ipvsadm恢復策略)
ipvsadm-restore < /opt/ipvsadm #恢復LVS 策略
使用win系統(tǒng)虛擬機測試
修改ip地址、子網(wǎng)掩碼、默認網(wǎng)關
文章來源:http://www.zghlxwxcb.cn/news/detail-474829.html
在一臺IP為12.0.0.120的客戶機使用瀏覽器訪問 http://12.0.0.20/ ,不斷刷新瀏覽器測試負載均衡效果,刷新間隔需長點(或者關閉Web服務的連接保持)。
文章來源地址http://www.zghlxwxcb.cn/news/detail-474829.html
到了這里,關于【集群】LVS負載均衡群集的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!