搭建基於lvs+nginx的負載均衡服務集群

来源:https://www.cnblogs.com/greatsql/archive/2022/12/23/17000777.html
-Advertisement-
Play Games

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

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 如果說電子游戲是第九藝術,那麼,編程技術則配得上第十藝術的雅稱。藝術發展的普遍規律就是要給與人們對於藝術作品的更高層感受,而Matz的Ruby語言則正是這樣一件藝術品。 無論是語法還是理念,都讓Ruby開發者感受到款待,如此,Ruby代碼就像活了過來,它們時而高聲,卻藏不住優雅,時而細語,卻意外地鏗 ...
  • 大家好,我是棧長。 今天給大家通報一則框架更新消息,時隔 2021.x 版本發佈一年,Spring Cloud 2022.0.0 最新版發佈了,來看下最新的 Spring Cloud 版本情況: Spring Cloud 無疑是現在 Java 微服務事實上的標準,完全基於 Spring Boot 構 ...
  • 前幾篇博文中介紹了Transformer,由於其優越的性能表現,在工業界使用的越來越廣泛,同時,配合遷移學習理論,越來越多的Transformer預訓練模型和源碼庫逐漸開源,Huggingface就是其中做的最為出色的一家機構。Huggingface是一家在NLP社區做出傑出貢獻的紐約創業公司,其所... ...
  • 歷時9個月的時間,對iNeuOS工業互聯網操作系統進行全面重構,發佈內部測試版本。重構的主要目的:工程化的框架優化,更好的聚焦工業領域業務發展。重構也是保障產品能夠可持續發展的重要手段,同時兼顧產品的安全性和穩定性。 ...
  • 目錄 一、什麼是dapper 二、實現問題與思路 & 源碼參考 三、小結 一、什麼是dapper dapper是個組件,一個dll文件,可以通過NuGet下載。 作用:快速訪問資料庫並自動完成資料庫表對象到C#類對象的欄位映射。 應用:對於要完成簡單的查詢、報表之類的應用是非常快捷、方便的。 比較: ...
  • 摘要:為解決用戶自定義處理設備數據以及自定義協議設備快速接入IOT平臺的訴求,華為IoT邊緣提供ModuleSDK,用戶可通過集成SDK讓設備以及設備數據快速上雲。 本文分享自華為雲社區《【華為雲IoTEdge開發實戰】Java開發如何通過IoT邊緣ModuleSDK進行進程應用的開發》,作者: 華 ...
  • 0.腳本作者 Lucifer([email protected]) yuanzijian([email protected]) 1.達夢一鍵安裝腳本完整版附件內容(附件在本文末尾) 1.1.腳本文件夾soft 1.DMShellInstall:資料庫安裝腳本,詳細使用看README.md2.DMCh ...
  • 如有問題請及時指正 select version(); 數據準備 -- 1.學生表 -- S# 學生編號,Sname 學生姓名,Sage 出生年月,Ssex 學生性別 CREATE TABLE `Student` ( `S#` varchar(10) NOT NULL, `Sname` varcha ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...