docker搭建高可用與負載均衡(一)lvs+keepalived+nginx+apache

1.需求分析

網站建設是企業、組織、個人宣傳和分享交流的重要的平臺,尤其是在如今的信息化時代下,所有行業都在互聯網的影響下實現數字化、在線化。在網站的建設中,網站的部署和發佈是非常重要的一環,尤其是企業網站,隨着企業的影響力和業務規模的擴大,企業的服務器需要承載的訪問量和負載也日益增多,這就對企業提供網絡服務提出了新的標準。因此,爲使得企業網絡可以承載更多的訪問量和業務需求,我們就需要搭建web集羣,實現企業集羣負載均衡和高可用。

1.1功能需求

1.1.1網站搭建

網站開發測試完成後,需要正式發佈上線,此時,我們需要配置web服務器,提供網絡服務。當訪問量較少時,我們可以部署單臺節點的服務器站點,同時對服務器配置定期備份任務以及定期維護。

1.1.2負載均衡

當訪問量越來越多時,單臺節點的服務器無法承受超負載的HTTP(s)請求時,此時爲滿足外部的訪問量,同時爲了方便管理、提高擴展性和安全性以及減少企業開支,通常就需要採用增加服務器部署站點配置負載均衡集羣的方法,來提高企業網站的網絡服務能力。

1.1.3高可用

當負載均衡的服務器節點越來越多時,網站規模也越來越大,負載均衡分發器承擔的網絡流量最大,其在整個集羣中的重要性也就不言而喻,一旦節點出現故障甚至宕機,整個集羣將無法對外提供服務。因此,除了負載均衡之外,我們同時會部署負載均衡的高可用,即負載均衡器的主備部署。

1.2性能和安全性需求

對物理服務器硬件的需求以及web站點服務器的需求需要根據實際情況分析,在這裏我採用的是實驗環境,故該部分不做過多解釋。

2.系統設計

2.1系統結構圖表

在這裏插入圖片描述

系統地址以及軟件分佈表

容器(Container) 操作系統(OS) IP地址 安裝軟件
宿主機(docker) CentOS7.6.1810 172.18.74.188 Docker+LVS
lvs-k CentOS7.6.1810 172.17.0.8 LVS+keepalived
lvs-k1 CentOS7.6.1810 172.17.0.7 LVS+keepalived
nginx CentOS7.6.1810 172.17.0.5 nginx
nginx1 CentOS7.6.1810 172.17.0.4 nginx
web CentOS7.6.1810 172.17.0.2 apache+php
web1 CentOS7.6.1810 172.17.0.3 apache+php
VIP 172.17.0.9

OS內核版本信息
在這裏插入圖片描述

2.2 Docker構建集羣

2.2.1 Docker概念

Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發佈到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口

2.2.2 docker特點

Docker的特點 develop, deploy, and run
Docker是開發人員和系統管理員 使用容器開發,部署和運行應用程序的平臺。使用Linux容器部署應用程序稱爲容器化。容器不是新的,但它們用於輕鬆部署應用程序。
容器化越來越受歡迎,因爲容器是:
靈活:即使是最複雜的應用也可以集裝箱化。
輕量級:容器利用並共享主機內核。
可互換:您可以即時部署更新和升級。
便攜式:您可以在本地構建,部署到雲,並在任何地方運行。
可擴展:您可以增加並自動分發容器副本。
可堆疊:您可以垂直和即時堆疊服務。

2.2.3爲什麼要使用 Docker?

作爲一種新興的虛擬化方式,Docker 跟傳統的虛擬化方式相比具有衆多的優勢。
首先,Docker 容器的啓動可以在秒級實現,這相比傳統的虛擬機方式要快得多。其次,Docker 對系統資源的利用率很高,一臺主機上可以同時運行數千個 Docker 容器。
容器除了運行其中應用外,基本不消耗額外的系統資源,使得應用的性能很高,同時系統的開銷儘量小。傳統虛擬機方式運行 10 個不同的應用就要起 10 個虛擬機,而Docker 只需要啓動 10 個隔離的應用即可。
具體說來,Docker 在如下幾個方面具有較大的優勢。
更快速的交付和部署
對開發和運維(devop)人員來說,最希望的就是一次創建或配置,可以在任意地方正常運行。
開發者可以使用一個標準的鏡像來構建一套開發容器,開發完成之後,運維人員可以直接使用這個容器來部署代碼。Docker 可以快速創建容器,快速迭代應用程序,並讓整個過程全程可見,使團隊中的其他成員更容易理解應用程序是如何創建和工作的。Docker 容器很輕很快!容器的啓動時間是秒級的,大量地節約開發、測試、部署的時間。
更高效的虛擬化
Docker 容器的運行不需要額外的 hypervisor 支持,它是內核級的虛擬化,因此可以實現更高的性能和效率。
更輕鬆的遷移和擴展
Docker 容器幾乎可以在任意的平臺上運行,包括物理機、虛擬機、公有云、私有云、個人電腦、服務器等。這種兼容性可以讓用戶把一個應用程序從一個平臺直接遷移到另外一個。
更簡單的管理
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分發和更新,從而實現自動化並且高效的管理。

對比傳統虛擬機總結
特性 容器 虛擬機
啓動 秒級 分鐘級
硬盤使用 一般爲 MB 一般爲 GB
性能 接近原生 弱於
系統支持量 單機支持上千個容器 一般幾十個

根據我的實驗情況來看,使用docker這項新技術可以使我更加快捷方便的搭建網絡集羣,(雖然在掌握docker這門新技術花了幾天時間),而且用docker模擬可以使網絡的效果更加直觀。將來用於實際部署應用時也會非常的便捷,這得益於它的便攜式和靈活性以及強大的移植功能。

2.2 docker架構

在這裏插入圖片描述

2.2.4 Docker核心概念

在這裏我只簡單介紹兩個概念。
1)Images 鏡像,os組合
基本操作如下:

$ docker images  #列出本地主機上的鏡像
$ docker run -t -i ubuntu:15.10 /bin/bash 
$ docker pull ubuntu:13.10
$  docker search httpd
$ docker run httpd
$ docker tag 860c279d2fec runoob/centos:dev
$ docker build -t runoob/centos:6.7 .

2)Containers 容器
我自己的理解是鏡像的進程態,container與vm的區別如下

在這裏插入圖片描述
在這裏插入圖片描述

2.2.5 docker 網絡

1.橋接模式(default)
Docker容器的默認網絡模式爲橋接模式,如圖所示:
在這裏插入圖片描述
2.HOST模式
在這裏插入圖片描述
3.Container模式
在這裏插入圖片描述
4.None

獲取獨立的network namespace,但不爲容器進行任何網絡配置,之後用戶可以自己進行配置,容器內部只能使用loopback網絡設備,不會再有其他的網絡資源

2.3 LVS+keepalive負載均衡原理介紹

LB集羣的架構和原理很簡單,就是當用戶的請求過來時,會直接分發到Director Server上,然後它把用戶的請求根據設置好的調度算法,智能均衡地分發到後端真正服務器(real server)上。爲了避免不同機器上用戶請求得到的數據不一樣,需要用到了共享存儲,這樣保證所有用戶請求的數據是一樣的。
LVS是 Linux Virtual Server 的簡稱,也就是Linux虛擬服務器。這是一個由章文嵩博士發起的一個開源項目,它的官方網站是http://www.linuxvirtualserver.org 現在 LVS 已經是 Linux 內核標準的一部分。使用 LVS 可以達到的技術目標是:通過 LVS 達到的負載均衡技術和 Linux 操作系統實現一個高性能高可用的 Linux 服務器集羣,它具有良好的可靠性、可擴展性和可操作性。從而以低廉的成本實現最優的性能。LVS 是一個實現負載均衡集羣的開源軟件項目,LVS架構從邏輯上可分爲調度層、Server集羣層和共享存儲。

在這裏插入圖片描述

  1. 當用戶向負載均衡調度器(Director Server)發起請求,調度器將請求發往至內核空間
  2. PREROUTING鏈首先會接收到用戶請求,判斷目標IP確定是本機IP,將數據包發往INPUT鏈
  3. IPVS是工作在INPUT鏈上的,當用戶請求到達INPUT時,IPVS會將用戶請求和自己已定義好的集羣服務進行比對,如果用戶請求的就是定義的集羣服務,那麼此時IPVS會強行修改數據包裏的目標IP地址及端口,並將新的數據包發往POSTROUTING鏈
  4. POSTROUTING鏈接收數據包後發現目標IP地址剛好是自己的後端服務器,那麼此時通過選路,將數據包最終發送給後端的服務器

LVS可以實現負載均衡,但是不能夠進行健康檢查,比如一個rs出現故障,LVS 仍然會把請求轉發給故障的rs服務器,這樣就會導致請求的無效性。keepalive 軟件可以進行健康檢查,而且能同時實現 LVS 的高可用性,解決 LVS 單點故障的問題,其實 keepalive 就是爲 LVS 而生的。
在本次實驗中,採用的是LVS的DR方式實現四層上負載均衡
重將請求報文的目標MAC地址設定爲挑選出的RS的MAC地址
2.4 Nginx負載均衡原理
Nginx除了作爲常規的Web服務器外,還會被大規模的用於反向代理前端,因爲Nginx的異步框架可以處理很大的併發請求,把這些併發請求hold住之後就可以分發給後臺服務端(backend servers, 後面簡稱backend)來做複雜的計算、處理和響應,並且在業務量增加的時候可以方便地擴容後臺服務器。
在這裏插入圖片描述
從原理上理解,lvs解決的是四層的負載均衡,nginx解決的是七層的負載均衡

3.系統實現

3.1網絡環境以及服務器配置

在實際搭建的過程中,因爲校園網賬號只有一個,同時爲實現在校園網內訪問,我搭建了一個nat服務器,或者說是跳板機,來解決集羣搭建中的網絡問題。具體方法如下:

1.服務器配置雙網卡,ip地址如下:
在這裏插入圖片描述
在這裏插入圖片描述
1.配置雙網卡間的iptables規則,並執行連接校園網的認證腳本,測試服務器上網情況

在nat服務其中設置iptables規則
讓發送至內網網卡的數據全部通過 ens160(內網網卡地址)
iptables -A FORWARD -i ens160 -j ACCEPT
修改數據報頭信息 ens32(外網網卡地址)
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o ens32 -j MASQUERADE
開啓Linux的路由功能
echo 1 > /proc/sys/net/ipv4/ip_forward # 打開路由功能
cat /proc/sys/net/ipv4/ip_forward
#查看是否啓用路由功能,結果爲1,代表已啓用,0代表未啓用
在這裏插入圖片描述
4.在需要聯網的虛擬機上配置網關爲內網網卡的地址
在這裏插入圖片描述

5.配置完後重啓網卡,即可訪問外網systemctl restart network

在這裏插入圖片描述

3.2安裝Docker CE

1.清除已存在的docker環境

$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine

2.repository 配置yum源
新主機上首次安裝Docker CE 需要設置Docker repository(存儲庫)
安裝所需的包。yum-utils提供了yum-config-manager 效用,並device-mapper-persistent-data和lvm2由需要 devicemapper存儲驅動程序。

$ sudo yum install -y yum-utils \
  device-mapper-persistent-data \
lvm2

使用以下命令設置穩定存儲庫。即使您還想從邊緣或測試存儲庫安裝構建,您始終需要穩定的存儲 庫。

$ sudo yum-config-manager \
 --add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
yum makecache fast

3.安裝Docekr CE

$ sudo yum install docker-ce -y

4.啓動Docker

$ sudo systemctl start docker

3.3容器的基本操作

1.創建並運行容器,若沒有鏡像將從docker hub上下載並運行
以下命令爲創建一個可以運行內核服務的容器
$ docker run --privileged --name=container_name --hostname=host_name -p port:port -it -d centos:latest(image) /usr/sbin/init
2. 開啓和停止容器
$ docker start/stop container_name/container_id
3.進入容器
$ docker exec -it container_name /bin/bash
4.查看docker鏡像
$ docker images
5.查看docker容器
$ docker container ls
$ docker container ls -a
6.刪除docker容器
$ docker stop container_name/container_id
$ docker rm container_name/container_id
7.創建自定義鏡像
$docker commit -m "comment" -a "author" container_model image_name
就像這樣

3.4容器準備

最終需要六個容器,如圖所示:
在這裏插入圖片描述
其中在創建容器時,最方便的時可以根據自己自定義的image去創建容器,這大大減少了集羣搭建的工作量,就像這樣,搭建好一個容器環境後打包爲鏡像,再次創建運行新的容器,使用時只需要簡單的修改以下配置即可。
在這裏插入圖片描述

3.4.1 web 服務器

$ yum install -y httpd php
$ systemctl start httpd
vim /var/www/html/index.html
This is web(1) master!

3.4.2 Nginx負載均衡器

$  yum install epel-release -y
$  yum install nginx -y
vim /etc/nginx/nginx.conf

在httpd中加入以下內容:

upstream myweb{
        server 172.17.0.2:80;
        server 172.17.0.3:80;
    }
    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
      #proxy_set_header Host $host;
      #proxy_set_header X-Real-IP $remote_addr;
    	#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://myweb;
}

$ systemctl start nginx
Nginx作爲lvs的Real server節點2臺配置腳本:

#vim /usr/local/sbin/lvs_dr_rs.sh

#! /bin/bash
vip=172.17.0.7
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

2節點rs 上分別執行腳本:
bash /usr/local/sbin/lvs_dr_rs.sh

3.4.3 LVS +keepalived上的配置
Lvs + keepalived的2個節點安裝
$ yum install ipvsadm keepalived -y
keepalived節點配置(2節點):
主節點( MASTER )配置文件

vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.17.0.9
    }
}

virtual_server 172.17.0.9 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 0
    protocol TCP

    real_server 172.17.0.4 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }

    real_server 172.17.0.5 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

從節點( BACKUP )配置文件
拷貝主節點的配置文件keepalived.conf,然後修改如下內容:

state MASTER -> state BACKUP
priority 100 -> priority 90

keepalived的2個節點執行如下命令,開啓轉發功能:

#echo 1 > /proc/sys/net/ipv4/ip_forward

啓動keepalive
先主後從分別啓動keepalive

service keepalived start

3.4.4 問題解決
3.4.4.1. Docker warning的問題解決
在這裏插入圖片描述
解決辦法:

#vi /etc/sysctl.conf
或者
#vi /usr/lib/sysctl.d/00-system.conf
添加如下代碼:
    net.ipv4.ip_forward=1
重啓network服務
#systemctl restart network
查看是否修改成功
#sysctl net.ipv4.ip_forward
如果返回爲“net.ipv4.ip_forward = 1”則表示成功了

3.4.2 keepalived服務問題

在配置啓動keepalive時,啓動時並沒有報錯,然而在測試環節卻不起作用,查看keepalived的狀態,可以看出keepalive一直是stopping的狀態,無法正常服務。這個問題一直困擾着我,無法解決。
在這裏插入圖片描述
直到看到了一篇博文
https://www.cnblogs.com/XiongMaoMengNan/p/8056211.html

先在宿主機上安裝並以root來啓動ipvsadm,每次要在容器中運行ipvs都需要先在宿主機上啓動ipvsadm。如果直接進行2步操作將報出如下錯誤:

Can’t initialize ipvs: Protocol not available
Are you sure that IP Virtual Server is built in the kernel or as module?

在宿主機上仍是出錯,
在這裏插入圖片描述

3.4.4.3 解決ipvsadm啓動出錯的問題

解決方法見以下鏈接
https://blog.csdn.net/qq_37165604/article/details/79963894

$ ipvsadm --save > /etc/sysconfig/ipvsadm

此時ipvsadm啓動正常
再次啓動keepalived
在這裏插入圖片描述

4.系統測試

4.1 web服務器測試

在這裏插入圖片描述

4.2 nginx負載均衡測試

在nginx 服務器上使用的是輪詢,採用weight 1:1的方式,在nginx上進行訪問,輪詢比例1:1,結果如下圖
在這裏插入圖片描述

在nginx1上進行的是1:2的輪詢方式,在nginx1上訪問結果如下
在這裏插入圖片描述
4.3 高可用測試

在lvs-k(master)與lvs-k1(backup)安裝和配置好keepalived後,正常訪問vip時,訪問結構如下

在這裏插入圖片描述

模擬nginx(master)單點故障的狀態,即在nginx上執行systemctl stop nginx將nginx服務器關閉,再次在客戶端上訪問vip結果如下:
在這裏插入圖片描述

從圖中可以看出,當nginx服務器出現故障時,client端實際訪問的是nginx1服務器。
同時可以從lvs-k服務器的keepalived的健康狀態檢測中看到,服務器檢測到了nignx服務器的宕機情況,並將vip轉移至nginx1上,如圖所示:

在這裏插入圖片描述

模擬lvs-k(master)宕機的情況,當master和backup正常工作時,keepalived的狀態如下圖:

在這裏插入圖片描述
在這裏插入圖片描述
當在lvs-k上執行systemctl stop keepalived時,此時可以看到lvs-k1開始服務。
在這裏插入圖片描述

5.總結
在搭建平臺系統和撰寫課程設計論文的過程中,發現如果能夠熟練掌握其中的原理,所有的配置都十分的簡單,重點是要理解各項技術和軟硬件實現的原理,才能達到事半功倍的效果。首先,去查看其他博客的操作時,應該邊看邊思考,不要一味照搬,因爲可能博主跟你要做集羣的環境和配置思路上有所差異,應該學習他們的配置原理和思路,進而設計自己的系統平臺架構;其次,在學習的過程中,遇到問題先根據掌握的知識進行思考,然後再進行查資料,要明白自己那塊兒知識掌握了,用已知去探索未知,可以更快的掌握一門新的技術。最後,遇到問題並不可怕,只要放平心態,探索問題的本質,很快就可以將問題解決。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章