如何構建日均千萬PV Web站點 (一)


       其實大多數互聯網網站起初的網站架構都是(Linux+Apache+MySQL+PHP). 不過隨着時代的發展,科技的進步.互聯網進入尋常百姓家的生活。所謂的用戶的需求,鑄就了一個個互聯網大牛; http://www.trueland.net/IndustryNews/gjszl.shtml 近日研究機構we are social發布了《2014年全球社會化媒體、數字和移動業務數據洞察》,公布了其對全球互聯網、關鍵社交、數字化業務和移動應用的統計數據。報告指出全球數字化業務正以驚人的趨勢保持高速增長,而促使這一發展趨勢的正是多屏移動設備的推動。


  全球數據概覽

全球數據概覽

報告指出,目前,全世界互聯網人口總數已達25億,這是一個保守估算,按照國際電信聯盟(ITU International Telecommunications Union)估算,全球互聯網用戶數量可能已接近30億。、其實國內著名網站新浪微博也是從一個小網站發展起來的。簡單的LAMP架構。如今,這樣簡單的架構已經無法支撐新浪微博快速發展的業務需求,隨着訪問用戶的逐漸增長,系統不堪重負。

  今天,明則就帶大家一步步地構建日均訪問上千PV的高性能Web站點; 日均千萬PVweb站點如下圖所示:

1、前端DNS,非常簡陋負載均衡器;不過並不影響日均千萬PV訪問網站的效果。

2、LVS具有很好的伸縮縮性、可靠性和管埋性,通過LVS要實現的最終目標是:利用linux 操作系統和LVS集群軟件實現一個高可用、高性能,低成本的服務器應用集群。keepalived:LVS 必備裝備;所以前端LVS應該是雙機熱備的架構; 

3、官方測試Nginx在24G內存的機器上,能夠處理的並發請求連接數達到過200萬。由於Nginx使用基於事件驅動的架構能夠並發處理百萬級別的TCP連接,高度模塊化 的設計和自由的許可證使得擴展Nginx功能的第三方模塊層出不窮,而且優秀的設計帶來了極佳的穩定性,因此其作為Web服務器的反向代理被廣泛應用到大流量的網站上,包括騰訊、新浪、網 易、淘寶等訪問量巨大的網站。

4、使用NGINX將網頁內容動靜分離;可以使NGINX能夠一心一意處理靜態內容的請求;官方測試NGINX處理用戶連接;以及處理靜態網頁內容都是無與倫比的速度;

5、緩存的引入varnish是一款高性能的web-cache server,內存緩存數據;強大的vcl語言,讓用戶能夠隨心所欲對緩存數據進行過濾; 注釋:"比如像一些用戶私密的數據呀,更新比較頻繁的數據..都不應該緩存"

6、如今由於用戶並發訪問量比較大,動輒就10萬、20萬並發都是比較常見的;高並發對於傳統的共享存儲,比如:網絡文件系統NFS、或者集群文件系統、它們都屬於集中式存儲;用戶並發量一上來;必定會產生操作系統文件鎖的機制;性能底下。分布式文件系統的引入:mogilefs 是一款分布式文件系統;適用於處理海量小文件 詳情請參考分布式文件系統 ~MogileFS~

7、構建session集群;為什么需要構建session集群?想象一個場景;當你在購物時,你狂購了一下午的商品,結果你不小心刷新了一下;購物車中的商品全部消失了;你會怎么想?

8、使用haproxy 調度MySQL MMM ,使用MMM將用戶的請求讀寫分離至MySQL DB; 一般的網站;都是8分讀2分寫;所以使用mysql 讀寫分離的機制會大大提高網站性能的;

9、其實我們可以將部分動態內容的計算結果進行緩存,並在隨后需要的時候直接從varnish 緩存服務器取出返回給用戶,對於動態網頁來說,緩存的內容實際上就是動態網頁的輸出的html,我們稱為頁面緩存(page cache) 比如:"像一些新聞信息;廣告..."

10、多級緩存機制;我們還可以在NGINX上做緩存;

 

好吧! 廢話不多說啦! 開始構建千萬PVweb站點吧!

前端 LVS + Keepalived 雙機熱備負載均衡器:

 LVS1 keepalived configure file;

global_defs {
   notification_email {
          firefox@foxmail.com
         firefox@1QQ.com
   }
   notification_email_from kanotify@magedu.com
   smtp_connect_timeout 3
   smtp_server 127.0.0.1
   router_id LVS_DEVEL
}
vrrp_script chk_schedown {
   script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
   interval 2
   weight -2
}
vrrp_instance VI_1 {
    interface eth0
    state MASTER
    priority 101
    virtual_router_id 51
    garp_master_delay 1
    authentication {
        auth_type PASS
        auth_pass password
    }
    track_interface {
       eth0
    }
    virtual_ipaddress {
        172.16.249.100/16 dev eth0 label eth0:0
    }
    track_script {
        chk_schedown
    }
}
vrrp_instance VI_2 {
    interface eth0
    state MASTER
    priority 99
    virtual_router_id 52
    garp_master_delay 1
    authentication {
        auth_type PASS
        auth_pass password
    }
    track_interface {
       eth0
    }
    virtual_ipaddress {
        172.16.249.200/16 dev eth0 label eth0:1
    }
    track_script {
        chk_schedown
    }
}
virtual_server 172.16.249.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP
#    sorry_server 172.16.249.100 1358

virtual_server 172.16.249.200 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP
    sorry_server 172.16.249.200 1358

    real_server 172.16.249.75 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 172.16.249.32 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 172.16.249.33 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 172.16.249.34 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 172.16.249.35 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 172.16.249.36 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

 

 

 

LVS2 keepalived configure file;

global_defs {
   notification_email {
          firefox@foxmail.com
         firefox@1QQ.com
   }
   notification_email_from kanotify@magedu.com
   smtp_connect_timeout 3
   smtp_server 127.0.0.1
   router_id LVS_DEVEL
}
vrrp_script chk_schedown {
   script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
   interval 2
   weight -2
}
vrrp_instance VI_1 {
    interface eth0
    state MASTER
    priority 99
    virtual_router_id 51
    garp_master_delay 1
    authentication {
        auth_type PASS
        auth_pass password
    }
    track_interface {
       eth0
    }
    virtual_ipaddress {
        172.16.249.100/16 dev eth0 label eth0:0
    }
    track_script {
        chk_schedown
    }
}
vrrp_instance VI_2 {
    interface eth0
    state MASTER
    priority 101
    virtual_router_id 52
    garp_master_delay 1
    authentication {
        auth_type PASS
        auth_pass password
    }
    track_interface {
       eth0
    }
    virtual_ipaddress {
        172.16.249.200/16 dev eth0 label eth0:1
    }
    track_script {
        chk_schedown
    }
}
virtual_server 172.16.249.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP
#    sorry_server 172.16.249.100 1358

virtual_server 172.16.249.200 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP
    sorry_server 172.16.249.200 1358

    real_server 172.16.249.75 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 172.16.249.32 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 172.16.249.33 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 172.16.249.34 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 172.16.249.35 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 172.16.249.36 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

 

 

realserver configure file:

# cat realserver.sh
#!/bin/bash
#
# Script to start LVS DR real server.
# description: LVS DR real server
#
.  /etc/rc.d/init.d/functions
VIP=172.16.249.100  

host=`/bin/hostname` case "$1" in start) # Start LVS-DR real server on this machine. /sbin/ifconfig lo down /sbin/ifconfig lo up 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 /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up /sbin/route add -host $VIP dev lo:0 ;; stop) # Stop LVS-DR real server loopback device(s). /sbin/ifconfig lo:0 down echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce ;; status) # Status of LVS-DR real server. islothere=`/sbin/ifconfig lo:0 | grep $VIP` isrothere=`netstat -rn | grep "lo:0" | grep $VIP` if [ ! "$islothere" -o ! "isrothere" ];then # Either the route or the lo:0 device # not found. echo "LVS-DR real server Stopped." else echo "LVS-DR real server Running." fi ;; *) # Invalid entry. echo "$0: Usage: $0 {start|status|stop}" exit 1 ;; esac

 

 
 右邊三台NGINX :realserver configure file:

# cat realserver.sh
#!/bin/bash
#
# Script to start LVS DR real server.
# description: LVS DR real server
#
.  /etc/rc.d/init.d/functions
VIP=172.16.249.200  


host=`/bin/hostname`
case "$1" in
start)
       # Start LVS-DR real server on this machine.
        /sbin/ifconfig lo down
        /sbin/ifconfig lo up
        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
        /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
        /sbin/route add -host $VIP dev lo:0
;;
stop)
        # Stop LVS-DR real server loopback device(s).
        /sbin/ifconfig lo:0 down
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
;;
status)
        # Status of LVS-DR real server.
        islothere=`/sbin/ifconfig lo:0 | grep $VIP`
        isrothere=`netstat -rn | grep "lo:0" | grep $VIP`
        if [ ! "$islothere" -o ! "isrothere" ];then
            # Either the route or the lo:0 device
            # not found.
            echo "LVS-DR real server Stopped."
        else
            echo "LVS-DR real server Running."
        fi
;;
*)
            # Invalid entry.
            echo "$0: Usage: $0 {start|status|stop}"
            exit 1
;;
esac

 其它配置請看 下回分解;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM