項目成長記(四)—— 小型架構優化

       自從上次搭建完小型架構以後,還是比較穩定的,但有一個讓人擔心的煩惱,那就是機器的負載都很高,基本上都是百分之七八十的佔用,不管是CPU還是內存,所以決定進行一次大規模的優化,決定優化完後在把成績告訴老大,眼瞅着過年了,到時候沒準多發點獎金啊,一想到獎金就來精神了,立馬行動。

       重新設計架構圖如下:

wKiom1LH4nKzLJs7AAChyRvKKSc190.jpg

主要的優化點:

   1、在負載均衡服務器上加上了web緩存

   2、在php服務器上加上了zendopcache(這個在項目成長記(二)中已經講過了,這裏就省略了)

   3、mysql配置優化(針對集羣)

   4、利用現有的機器組成一個Memcached集羣(也就是說這個Memcached機器不是機器)


下面就具體說一下升級點:

   一、web緩存

#Nginx主要通過proxy_cache模塊來實現緩存
worker_processes  8;    #CPU多少核就寫多少,利用cpu多核的優勢
error_log  logs/error.log warn; #隨時記錄錯誤
pid        logs/nginx.pid;
worker_rlimit_nofile 51200;
events {
    use epoll;
    worker_connections  51200;   #允許更多的請求量
}
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"';
    sendfile       on;
    tcp_nopush     on;
    tcp_nodelay    on;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;
    client_max_body_size 8m;
    #關閉header頭顯示Nginx的版本號
    server_tokens off;
    keepalive_timeout  60;
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 256k;
    fastcgi_buffers 2 256k;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 256k;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
    gzip  on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 2;
    gzip_types text/plain application/x-javascript text/css application/xml text/javascript;
    gzip_vary on;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
    upstream p2pwd {
            server 192.168.1.99 weight=1 max_fails=2 fail_timeout=30s;
            server 192.168.1.115 weight=1 max_fails=2 fail_timeout=30s;
        }
    #proxy_temp_path和proxy_cache_path必須是在一個分區,proxy_temp用於存儲臨時文件
    proxy_temp_path /data/soft/cache/proxy_temp_path;
    #levels用於設置目錄結構(第一層是一個字符,第二層是2個字符,最多可以設置3層),
    #keys_zone設置名稱和熱點內容存放的內存大小(Nginx會把熱點鍵和數據信息放到內存中),
    #inactive是多長時間沒有訪問就刪掉,max_size是硬盤緩存的大小
    proxy_cache_path /data/soft/cache/proxy_cache_path levels=1:2
     keys_zone=p2pwd:200m inactive=1d max_size=30g;
    server {
        listen       80;
        server_name  a.bcd.com;
        root /data/www/domain;
        index index.html index.php;
        access_log  logs/a.access.log  main;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
        location ~ .*\.(gif|jpg|png|swf|bmp|jpeg|js|css)$ {
            proxy_cache p2pwd;
            #設置狀態碼對應的緩存時間
            proxy_cache_valid 200 304 12h;
            proxy_cache_valid any 1m;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
            #設置緩存鍵
            proxy_cache_key $host$uri$is_args$args;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_pass http://p2pwd;
        }
    }
}

當然這裏沒有刪除緩存的功能,這個需要nginx編譯一個第三方模塊叫ngx_cache_purge,可以參考修改,這裏還有一個緩存方式fastcgi_cache模塊,他和proxy_cache基本一樣,只是他負責緩存動態的內容,比如php生成的內容。


二、opcache和Memcached在前面的章節已經說過,這裏不在贅述,但是需要說的一點是Memcached本身就支持分佈式,可以通過編程語言實現分佈式,比如php可以通過Memcached::addServers ( array$servers )添加多個服務器,就算有一臺掛了也不怕。還有一個地方就是php.ini文件裏,有一個expose_php On配置,爲了安全把這個On改成Off可以隱藏header頭裏顯示PHP信息。


三、MySQL優化

#mysql5.5以後innodb優化的已經很好了,完全可以代替MyISAM了,所以下面主要針對Innodb引擎
[mysqld]
basedir = /data/soft/mysql
datadir = /data/soft/mysql/data
port = 3306
server_id = 1
socket = /tmp/mysqld.sock
default_storage_engine = InnoDB
log-bin = binlog
expire_logs_days = 14
max_binlog_size = 5G
binlog_cache_size = 10M
max_binlog_cache_size = 20M
slow_query_log
long_query_time = 1
slow_query_log_file = /data/soft/mysql/data/slow.log
open_files_limit = 65535
innodb = FORCE
#innoDB控制日誌刷新頻度,1是默認值,對於寫入頻率大並且對數據安全性沒有那麼苛刻,可以考慮設置成2,可以大幅度提高寫入性能
innodb_flush_log_at_trx_commit = 1
innodb_buffer_pool_size = 5G
innodb_log_file_size = 1G
innodb_file_per_table = 1
innodb_flush_method = 0_DIRECT
#query_cache_size設置0的原因就是我這裏寫入的要求比較多,緩存的話反而性能降低
query_cache_type = 0
query_cache_size = 0
thread_cache_size = 64
table_definition_cache = 512
table_open_cache = 512
#設置連接最大數,可以設置大一點,但是不宜太大,可以避免造成瓶頸
max_connections = 2000
sort_buffer_size = 10M
#一次請求
max_allowed_packet = 6M
#sql_mode設置用於設置很多安全方面的東西,具體可以百度一下
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES


上面只是覺得應該設置的地方,具體應該設置多少,還是應該根據實際環境,通過基準測試來確認。


       好了,就優化這些吧,現在速度已經明顯上來了,這下老大應該滿意了,趕緊去跟老大彙報情況:“老大,咱們都系統已經很穩定了,不出意外應該沒問題”,老大立馬回了一句:“意外是什麼?”,“我靠,嘴賤”,心裏暗罵,“那就是機器掛了,機房完蛋了,地球毀滅了”,我半開玩笑的說,這個時候老闆來了,聽到我剛說的話,接着說:”那怎麼行,機器掛了,機房掛了就出問題,那我豈不是得天天燒香給機器還有機房,咱們做的可是跟錢打交道的,只要有人或者我就要服務一直在,我給你們提供足夠的資金,把服務給我搞的天衣無縫!!“,老闆說完,我不知道是該哭還是該笑,這時候說給錢了,早幹嘛去了,唉~~,看來要項目要真正的成長起來真不容易,看來我又要繼續”苦逼了“。

欲知後事如何,請聽下回分解……

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