搭建基於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
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...