日均百萬PV架構第三彈(分佈內容爲王)

接續接上篇 緩存時代來臨 爲藍本,繼續改造我們的百萬級站點架構,這次我們

拿之前存儲靜態內容的 nfs 開刀,衆所周知 nfs 的多臺集羣節點下可能由於多重

原因(磁盤io , 網絡帶寬, 併發場景),不適合做文件共享系統的基礎結構.

互聯網站點中,存在大量圖片或其他靜態內容,並且這些內容一般在1M之內,對於

海量小文件,我們將採用mogilefs分佈式文件系統來完成.其中概念自行google.


# mogilefs分佈式文件系統工作流程

wKioL1Nuf-HyFqN6AANj5XoyLgs681.jpg


架構已經愈發複雜,我們需要從新梳理一下.從下表中應該很容易看出第三彈的

任務,重新規劃如下:
   # 羅馬數字表示在何階段規劃,(*)代表已廢棄
   slave1.king.com
       172.16.43.1
       DNS輪詢 -> slave1.king.com , slave2.king.com(I)
       haproxy七層代理流量分離 -> imgs , text , dynamic(I)
       keepalived 爲haproxy HA(I)

   slave2.king.com
       172.16.43.2
       haproxy七層代理流量分離 -> imgs , text , dynamic(I)
       keepalived 爲haproxy HA(I)

   slave3.king.com
       172.16.43.3
       nginx虛擬主機組 -> imgs1.king.com , imgs2.king.com
                        text1.king.com , text2.king.com
                        dynamic1.king.com(I)
       php-fpm模塊(I)
       mysql數據庫(I)
       nfs /nfsshared(*)           New!!
       varnish imgs 緩存(II)
       memcache session, key/value cache(II)
       mogilefs tracker node(III)  New!!
       mogilefs store node(III)    New!!

   slave4.king.com
       172.16.43.4
       nginx虛擬主機 -> dynamic2.king.com(I)
       php-fpm模塊(I)
       mysql-proxy(I)
       mysql數據庫(I)
       varnish text 緩存(II)
       memcache session, key/value cache(II)
       mogilefs tracker node(III)  New!!
       mogilefs store node(III)    New!!


# 新規劃內容如下

wKioL1Nuf7ygAqz8AARuoP4qkG0838.jpg


操作過程

1. 安裝配置階段(slave3.king.com , slave4.king.com)
# 準備如下包,因爲我們要安裝tracker節點和store節點
MogileFS-Server-2.46-2.el6.noarch.rpm
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm
MogileFS-Utils-2.19-1.el6.noarch.rpm
perl-MogileFS-Client-1.14-1.el6.noarch.rpm
perl-Net-Netmask-1.9015-8.el6.noarch.rpm
perl-Perlbal-1.78-1.el6.noarch.rpm
#
# 安裝mogilefs以及創建store目錄,改變權限
yum -y install *.rpm perl-IO-AIO -y
mkdir /dfs/mogdata/dev1 -pv (slace4上建dev2)
chown -R mogilefs.mogilefs /var/run/mogilefsd /dfs/mogdata
#
# mysql -e 授權  建庫(僅slave3執行)
mysql -e "create database mogilefs;"
mysql -e "grant all on *.* to 'root'@'172.16.%.%' identified by '';"
mysql -e "grant all on mogilefs.* 'moguser'@'172.16.%.%' identified by 'mogpass';"
mysql -e "flush privileges;"
#
# 初始化mogilefs所需數據庫(僅slave3執行)
mogdbsetup --dbhost=172.16.43.3 --dbport=3306 --dbname=mogilefs --dbuser=moguser --dbpass=mogpass --yes

wKiom1NugF6QKoRuAANrCA9qI4w367.jpg

# 接 1. 安裝配置階段(slave3.king.com , slave4.king.com) 操作
# mogilefs配置文件
vim /etc/mogilefs/mogilefsd.conf
# Enable daemon mode to work in background and use syslog
daemonize = 1
# Where to store the pid of the daemon (must be the same in the init script)
pidfile = /var/run/mogilefsd/mogilefsd.pid
# Database connection information
db_dsn = DBI:mysql:mogilefs:host=172.16.43.3
db_user = moguser
db_pass = mogpass
# IP:PORT to listen on for mogilefs client requests
listen = 172.16.43.3:7001
# Optional, if you don't define the port above.
conf_port = 7001
# Number of query workers to start by default.
query_jobs = 10
# Number of delete workers to start by default.
delete_jobs = 1
# Number of replicate workers to start by default.
replicate_jobs = 5
# Number of reaper workers to start by default.
# (you don't usually need to increase this)#
reaper_jobs = 1
#
# store配置文件
vim /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /dfs/mogdata
#
# 分別啓動tracker以及store服務 (觀察7001與7500,7501端口)
service mogilefsd start
service mogstored start

# 觀察服務啓動情況

wKioL1NugPWyKpIjAAKIfy5Gl6Q348.jpg

2. 添加分佈式文件系統(slave3.king.com)
# 添加分佈式節點信息
mogadm --tracker=172.16.43.3:7001 host add 172.16.43.3 --ip=172.16.43.3 --status=alive
mogadm --tracker=172.16.43.4:7001 host add 172.16.43.4 --ip=172.16.43.4 --status=alive
mogadm --tracker=172.16.43.3:7001 host list
#
# 添加分佈式設備節點信息
mogadm --tracker=172.16.43.3:7001 device add 172.16.43.3 1
mogadm --tracker=172.16.43.4:7001 device add 172.16.43.4 2
mogadm --tracker=172.16.43.3:7001 device list
#
# 添加分佈式域節點信息
mogadm --tracker=172.16.43.3:7001 domain add images
mogadm --tracker=172.16.43.3:7001 domain add text
mogadm --tracker=172.16.43.3:7001 domain list

# mogilefs 所需 host , device , domain 添加準備就緒情況

wKiom1NugU6Ab4ggAAT17qDgDDU945.jpg

3. ngxin反向代理解析文件
# 將第三方模塊編譯進nginx,先將之前的nginx服務停止,防止意外
service nginx stop
cd nginx-1.4.7
./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/nginx --conf-path=/etc/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --with-pcre --add-module=/root/mogilefs/nginx-mogilefs-module-master
make && make install
#
nginx-mogilefs-module-master.zip
#
http {
upstream mogcluster {
    server 172.16.43.3:7001;
    server 172.16.43.4:7001;
}
#
# 之前的系統圖片設置到images與imgs考慮程序一致性,這裏
location /images/ {
    mogilefs_tracker mogcluster;
    mogilefs_domain images;
    mogilefs_methods GET PUT DELETE;
    mogilefs_pass {
        proxy_pass $mogilefs_path;
        proxy_hide_header Content-Type;
        proxy_buffering off;
    }
}
#
location /imgs/ {
    mogilefs_tracker mogcluster;
    mogilefs_domain images;
    mogilefs_methods GET PUT DELETE;
    mogilefs_pass {
        proxy_pass $mogilefs_path;
        proxy_hide_header Content-Type;
        proxy_buffering off;
    }
}
#
# 之前系統靜態文件分爲html,css,js等目錄,所以這裏需要目錄定位
location ~* ^(/(static|css|js)/.*)$ {
    mogilefs_tracker mogcluster;
    mogilefs_domain text;
    mogilefs_pass $1 {
        proxy_pass $mogilefs_path;
        proxy_hide_header Content-Type;
        proxy_buffering off;
    }
}
}
4. 以上一篇架構爲例,添加測試文件
mogupload --trackers=172.16.43.3:7001 --domain=images --key='/2.jpg' --file='./imgs/2.jpg'
mogupload --trackers=172.16.43.3:7001 --domain=images --key='/1.jpg' --file='./images/1.jpg'
mogupload --trackers=172.16.43.3:7001 --domain=text --key='static/index.html' --file='./static/index.html'
mogupload --trackers=172.16.43.3:7001 --domain=text --key='css/test.css' --file='./css/test.css'
mogupload --trackers=172.16.43.3:7001 --domain=text --key='js/test.js' --file='./js/test.js'

wKioL1Nugg3w9_dqAAVWg1tLfwU710.jpg

# 測試

service nginx restart
service varnish restart
使用瀏覽器隱身模式訪問

wKiom1NugmfiT7thAAeJ5BJ4Xjs584.jpg


最後附完整slave3.king.com中nginx的配置文件

#user  nobody;
worker_processes  1;
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
    #access_log  logs/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    #keepalive_timeout  0;
    keepalive_timeout  5;
    gzip  on;
    upstream mogcluster {
        server 172.16.43.3:7001;
        server 172.16.43.4:7001;
    }
    server {
    listen  80;
    server_name dynamic1.king.com;
    access_log  /var/log/nginx/dynamic1.access.log;
    location ~ \.php$ {
        root        /nfsshared/html;
        fastcgi_pass    172.16.43.3:9000;
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include     fastcgi_params;
    }
    location / {
        root    /nfsshared/html;
        index   index.php index.html index.htm;
    }
    }
    server {
        listen       80;
        server_name  imgs1.king.com;
        access_log  /var/log/nginx/imgs1.access.log;
        location /images/ {
            mogilefs_tracker mogcluster;
            mogilefs_domain images;
            mogilefs_methods GET PUT DELETE;
            mogilefs_pass {
                proxy_pass $mogilefs_path;
                proxy_hide_header Content-Type;
                proxy_buffering off;
            }
        }
        location /imgs/ {
            mogilefs_tracker mogcluster;
            mogilefs_domain images;
            mogilefs_methods GET PUT DELETE;
            mogilefs_pass {
                proxy_pass $mogilefs_path;
                proxy_hide_header Content-Type;
                proxy_buffering off;
            }
        }
        error_page  404              /404.html;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {
        listen       80;
        server_name  imgs2.king.com;
        access_log  /var/log/nginx/imgs2.access.log;
        location /images/ {
            mogilefs_tracker mogcluster;
            mogilefs_domain images;
            mogilefs_methods GET PUT DELETE;
            mogilefs_pass {
                proxy_pass $mogilefs_path;
                proxy_hide_header Content-Type;
                proxy_buffering off;
            }
        }
        location /imgs/ {
            mogilefs_tracker mogcluster;
            mogilefs_domain images;
            mogilefs_methods GET PUT DELETE;
            mogilefs_pass {
                proxy_pass $mogilefs_path;
                proxy_hide_header Content-Type;
                proxy_buffering off;
            }
        }
        error_page  404              /404.html;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {
        listen       80;
        server_name  text1.king.com;
        access_log  /var/log/nginx/text1.access.log;
        location ~* ^(/(static|css|js)/.*)$ {
            mogilefs_tracker mogcluster;
            mogilefs_domain text;
            mogilefs_pass $1 {
                proxy_pass $mogilefs_path;
                proxy_hide_header Content-Type;
                proxy_buffering off;
            }
        }
        location / {
            index  index.html index.htm;
        }
        error_page  404              /404.html;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {
        listen       80;
        server_name  text2.king.com;
        access_log  /var/log/nginx/text2.access.log;
        location ~* ^(/(static|css|js)/.*)$ {
            mogilefs_tracker mogcluster;
            mogilefs_domain text;
            mogilefs_pass $1 {
                proxy_pass $mogilefs_path;
                proxy_hide_header Content-Type;
                proxy_buffering off;
            }
        }
        location / {
            index  index.html index.htm;
        }
        error_page  404              /404.html;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}



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