lvs-dr實踐-week17


1、結合圖形描述LVS的工作原理;

lvs工作流程:

ipvs是工作于input鏈上,監聽目標地址上對應的目標端口,如果這個端口對應的服務定義為集群服務, 就強行修改報文的流程,完成轉發, 通過postrouting送出去, 為了讓后端主機能夠接收, 此時需要讓RS也具有目標ip地址, 要么修改目標ip地址
支持基于TCP,UDP,SCTP,AH,EST,AH_EST等協議的眾多服務;

lvs-nat:

多目標的DNAT:通過將請求報文的目標地址和目標端口修改為挑選出的某RS的RIP和PORT實現轉發; 

            注意: lvs-nat 需開啟連接追蹤機制, 并發能力有限

            (1) RIP和DIP必須在同一IP網絡, 且使用私網地址,RS的網關應該指向DIP(保證響應報文必須經由VS);
            (2) 請求和響應報文都要經由director轉發;極高負載的場景中,Director可能會成為系統性能瓶頸;
            (3) 支持端口映射;
            (4) VS必須為Linux,RS可以是任意的OS;
            (5) RS的RIP與Director的DIP必須在同一IP網絡;

            補充: 調度器上需要兩塊網卡,一個配置vip 一個配置dip

mark

lvs-dr:direct routing 直接路由

通過為請求報文重新封裝一個MAC首部進行轉發,源MAC是DIP所在接口的MAC,目標MAC是挑選出的某RS的RIP所在接口的MAC地址;IP首部不會發生變化(源IP為CIP,目標IP始終為VIP);  

(1) 確保前端路由器將目標IP為VIP的請求報文一定會發送給Director;
    解決方案:
        在路由器上靜態綁定VIP和Director的MAC地址;
        禁止RS響應VIP的ARP請求,禁止RS的VIP進行通告
            (a) arptables; 
            (b) 修改各RS的內核參數,并把VIP綁定在l0的別名上,實現禁止其響應;
                arp_ignore, arp_announce
(2) RS的RIP可以使用私有地址,也可以使用公網地址;
(3) RS跟Director必須在同一物理網絡中;RS的網關必須不能指向DIP
(4) 請求報文必須由Director調度,但響應報文必須不能經由Director;
(5) 不支持端口映射;
(6) 各RS可以使用大多數的OS;一般是linux

情形1: RIP DIP VIP 都在一個網絡, 都是公網IP 地址
mark
情形2: VIP 是公網ip地址, RIP,DIP是私有地址, 情況要復制些, RS要通過另一個路由出去
mark
注意:
一個路由其可以有多個網絡接口
一個交換機可以承載多個ip網絡
所以路由器1和路由器2可以使用同一個
私網交換機和公網交換機也可以用同一個

lvs-tun:ip tunnel,ip隧道

轉發方式:不修改請求報文的IP首部(源IP為CIP,目標IP為VIP),而是在原有的IP首部之外再次封裝一個IP首部(源IP為DIP,目標IP為RIP);

    (1) RIP,DIP,VIP全得是公網地址;
    (2) RS的網關不能也不可能指向DIP;
    (3) 請求報文經由Director調度,但響應報文將直接發給CIP;
    (4) 不支持端口映射;
    (5) RS的OS必須支持IP隧道功能;

       注意: 容易超出MTU,  弊端比較大

mark

lvs-fullnat:非標準模型, ipvs默認不支持,ipvsadm也不支持, nat模型的擴展

通過同時修改請求報文的源IP地址(cip-->dip)和目標IP地址(vip --> rip)實現轉發;

(1) VIP是公網地址;RIP和DIP是私網地址,且通常不在同一IP網絡中,但需要通過路由互相通信;
(2) RS收到的請求報文的源IP為DIP,因此其響應報文將發送給DIP;
(3) 請求報文和響應報文都必須經由director;
(4) 支持端口映射;
(5) RS可使用任意OS;

mark

2、搭建一套LVS-DR模型的高性能集群,并實現以下功能:

(1)、wordpress程序通過nfs共享給各個realserver;
(2)、后端realserver中的nginx和php分離

拓撲:
mark

系統: CentOS 6.6
DR: dip:172.16.0.31 vip: 172.16.0.40
RS1: nginx+php-fpm 172.16.0.32
RS2: nginx+php-fpm 172.16.0.33
NFS(WordPress共享): 172.16.0.34
mysql: 172.16.0.35

一. 配置NFS

1. 安裝nfs
[root@localhost ~]# yum -y install nfs-utils rpcbind
2. 創建共享目錄
[root@localhost ~]# mkdir /data
[root@localhost ~]# cd /data
3. 下載wordpress
[root@localhost data]# wget https://cn.wordpress.org/wordpress-4.7.4-zh_CN.zip
[root@localhost data]# unzip wordpress-4.7.4-zh_CN.zip
4. 創建帳號和用戶組,并授權(不需要寫入權限,此步可省略)
[root@localhost data]# useradd -r nginx
[root@localhost data]# chown -R nginx.nginx /data/wordpress
[root@localhost data]# ll
total 9036
drwxr-xr-x. 5 nginx nginx    4096 Apr 23 21:24 wordpress
5. 配置共享
[root@localhost data]# vim /etc/exports
/data/wordpress/ 172.16.0.0/16(rw)
6. 啟動nfs
[root@localhost data]# service rpcbind start
[root@localhost data]# service nfs start
7. 查看共享
[root@localhost data]# showmount -e 172.16.0.34
Export list for 172.16.0.34:
/data/wordpress 172.16.0.0/16

備注:
驗證過程: 隨便在rs上面注冊了一個centos賬號,確實無法在/wordpress目錄中創建目錄和文件,應用的是nfs服務器上的nfsnobody權限

[centos@localhost wordpress]$ mkdir test
mkdir: cannot create directory `test': Permission denied
[centos@localhost wordpress]$ touch aaaaa
touch: cannot touch `aaaaa': Permission denied

之所以可以發布博客是因為,wordrpress是一個php程序,博客中的文章是動態生成的,并沒有存放在某個目錄下,而是在mysql的wp_posts表中, 在該表上可以查看到剛剛發布的博客文章
另: php-fpm工作進程是以apache用戶運行的,該用戶對當前的nfs共享目錄,權限應用的也是nfsnobody的權限
因此在本例wordprss的部署中nginx和php-fpm都沒有對用戶權限進行特殊設置,不能寫入到nfs共享目錄

二. 安裝mysql

#安裝mysql,并創建授權wordpress帳號
[root@localhost ~]# yum -y install mysql-server
[root@localhost ~]# service mysqld start
[root@localhost ~]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.1.73 Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database wpdb;
Query OK, 1 row affected (0.00 sec)

mysql> grant all on wpdb.* to 'wpuser'@'172.16.%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye

三. 在rs1,rs2上配置nginx+php-fpm

1. 配置nginx的yum源
[root@localhost ~]# vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=1


2. yum安裝相關服務
[root@localhost ~]# yum -y install nginx php-fpm php-mysql nfs-utils  

3. 創建wordpress目錄并掛載wordpress共享目錄
[root@localhost ~]# mkdir /wordpress
[root@localhost ~]# mount -t nfs 172.16.0.34:/data/wordpress /wordpress

4. 配置nginx配置文件   
[root@localhost ~]# vim /etc/nginx/conf.d/wordpress.conf
server
{
        listen 80 default_server;
        server_name www.magedu.com;
        root /wordpress/;
        index index.php index.html index.htm;
        location / {
        }

        location ~ \.php$ {
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME
/wordpress/$fastcgi_script_name;
                include fastcgi_params;
        }
}  

5. 啟動nginx
[root@localhost conf.d]# service nginx start  

6. 啟動php-fpm
[root@localhost conf.d]# service php-fpm start  

7. 準備rs上的lvs腳本并執行
[root@localhost ~]# cat lvs-rs.sh
#!/bin/bash
# desc: lvs-dr rs scripts
# han

vip=172.16.0.40

case $1 in
start)
        echo "正在配置lvs Realserver..."
        #配置虛擬ip
        ifconfig lo:0 $vip netmask 255.255.255.255 broadcast $vip up
        #從哪個接口進來, 就從哪個接口出去, 以保證響應報文源ip是vip
        route add -host $vip dev lo:0


        #限制所有接口的響應級別
        echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
        #為以防萬一,再調一個接口限制響應級別,理論上不需要,約定俗成的做法
        echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

        #限制所有接口的通告級別
        echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
        #為以防萬一,再調一個接口限制通告級別,理論上不需要,約定俗成的做法
        echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
        ;;
stop)
        echo "正在停止lvs Realserver..."
        ifconfig lo:0 down

        echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
        ;;
*)
        echo "Usage: $0 (start|stop)"
        exit 1
esac

[root@localhost ~]# chmod +x lvs-rs.sh
[root@localhost ~]# ./lvs-rs.sh start
正在配置lvs Realserver...
[root@localhost ~]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0C:29:9C:AA:F7
          inet addr:172.16.0.32  Bcast:172.16.0.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe9c:aaf7/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:30200 errors:0 dropped:0 overruns:0 frame:0
          TX packets:19649 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:31501521 (30.0 MiB)  TX bytes:1459483 (1.3 MiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

lo:0      Link encap:Local Loopback
          inet addr:172.16.0.40  Mask:255.255.255.255
          UP LOOPBACK RUNNING  MTU:65536  Metric:1

四.配置director

1. 安裝ipvsadm
[root@localhost ~]# yum -y install ipvsadm

2. 在外網網卡配置vip
[root@localhost ~]# ifconfig eth0:0 172.16.0.40 netmask 255.255.255.255 broadcast 172.16.0.40
[root@localhost ~]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0C:29:90:D1:68
          inet addr:172.16.0.31  Bcast:172.16.255.255  Mask:255.255.0.0
          inet6 addr: fe80::20c:29ff:fe90:d168/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:5762 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3349 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:6405520 (6.1 MiB)  TX bytes:269286 (262.9 KiB)

eth0:0    Link encap:Ethernet  HWaddr 00:0C:29:90:D1:68
          inet addr:172.16.0.40  Bcast:172.16.0.40  Mask:255.255.255.255
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

3. 添加集群規則
[root@localhost ~]# ipvsadm -A -t 172.16.0.40:80 -s rr
#此處因為是rr算法,權重不起作用
[root@localhost ~]# ipvsadm -a -t 172.16.0.40:80 -r 172.16.0.32 -g -w 1
[root@localhost ~]# ipvsadm -a -t 172.16.0.40:80 -r 172.16.0.33 -g -w 2
[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  172.16.0.40:80 rr
  -> 172.16.0.32:80               Route   1      0          0
  -> 172.16.0.33:80               Route   2      0          0

五. 安裝配置wordpress(nfs服務器)

1. 準備wordpress主配置文件
[root@localhost ~]# cd /data/wordpress
[root@localhost wordpress]# cp wp-config-sample.php wp-config.php
[root@localhost wordpress]# vim wp-config.php
/** WordPress數據庫的名稱 */
define('DB_NAME', 'wpdb');

/** MySQL數據庫用戶名 */
define('DB_USER', 'wpuser');

/** MySQL數據庫密碼 */
define('DB_PASSWORD', '123456');

/** MySQL主機 */
define('DB_HOST', '172.16.0.35');

mark
mark
mark
mark

六. 驗證lvs

多次刷新頁面

[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  172.16.0.40:80 rr
  -> 172.16.0.32:80               Route   1      3          3
  -> 172.16.0.33:80               Route   2      2          4

可以看到兩臺服務器的活動連接數和非活動連接數大致相等

原創文章,作者:hansj,如若轉載,請注明出處:http://www.www58058.com/76773

(0)
hansjhansj
上一篇 2017-05-23
下一篇 2017-05-23

相關推薦

  • shell進階之循環

    循環執行,將某代碼段重復運行多次

    重復運行多少次:

    循環次數事先已知

    循環次數事先未知

    有進入條件和退出條件

    for, while, until

    Linux干貨 2017-12-24
  • Linux前端包管理器—yum

    Yum(Yellow dog Updater, Modified)由Duke University團隊,修改Yellow Dog Linux的Yellow Dog Updater開發而成,是一個基于RPM包管理的字符前端軟件包管理器。能夠從指定的服務器自動下載RPM包并且安裝,可以處理依賴性關系,并且一次安裝所有依賴的軟件包,無須繁瑣地一次次下載、安裝。 介…

    Linux干貨 2016-08-29
  • grep,egrp,fgrep 命令與正則表達式

    一 簡介     grep (global search regular expression(RE) and print out the line,全面搜索正則表達式并把行打印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,并把匹配的行打印出來。 Unix的grep家族包括grep、egrep和fgrep…

    Linux干貨 2016-01-19
  • 初窺門徑shell腳本

    1.什么是shell腳本    首先它是一個腳本,并不能作為正式的編程語言。因為是跑在linux的shell中,所以叫shell腳本。確切的說shell腳本就是一些命令的集合。 2.寫腳本前的一些細節及建議   Shell腳本通常都是以.sh 為后綴名的,這個并不是說不帶.sh這個腳本就不能執行,只是大家的一個習慣而已…

    Linux干貨 2016-08-12
  • LVS之nat&dr

    Evernote Export 負載均衡集群設計時的要點:        (1)session保持            session sticky(ip hash)            sess…

    Linux干貨 2016-12-01
  • N25-第二周作業

    N25-第二周作業 博客作業 1、linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示 linux上處理目錄的常用命令: ls :列出目錄 cd :切換目錄 pwd:顯示當前工作路徑 mkdir:創建目錄 rm:刪除文件或目錄 rmdir:刪除空文件 mv:剪切、重命名文件、目錄 cp:復制文件或目錄 touch:創建空文件 ls:= li…

    Linux干貨 2017-02-08

評論列表(1條)

  • 馬哥教育
    馬哥教育 2017-06-20 10:01

    寫的很棒,完全可以當范文來讓大家學習來,希望可以再接再厲,繼續保持

欧美性久久久久