• 如何构建日均千万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
    复制代码

     其它配置请看 下回分解;

  • 相关阅读:
    Algs4-1.3.44文本编辑器的缓冲区
    Algs4-1.3.42复制栈
    Algs4-1.3.41复制队列采用for方式实现
    Algs4-1.3.39环形缓冲区
    Algs4-1.3.40前移编码
    Algs4-1.3.38删除第k个元素-数组实现
    安全测试的一些漏洞和测试方法
    Java内存自动回收,为什么会有内存泄露?
    三款主流静态源代码安全检测工具比较
    Fortify源码安全检测工具
  • 原文地址:https://www.cnblogs.com/pricks/p/3836200.html
Copyright © 2020-2023  润新知