自从上次搭建完小型架构以后,还是比较稳定的,但有一个让人担心的烦恼,那就是机器的负载都很高,基本上都是百分之七八十的占用,不管是CPU还是内存,所以决定进行一次大规模的优化,决定优化完后在把成绩告诉老大,眼瞅着过年了,到时候没准多发点奖金啊,一想到奖金就来精神了,立马行动。

       重新设计架构图如下:

项目成长记(四)——  小型架构优化_架构

主要的优化点:

   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


上面只是觉得应该设置的地方,具体应该设置多少,还是应该根据实际环境,通过基准测试来确认。


       好了,就优化这些吧,现在速度已经明显上来了,这下老大应该满意了,赶紧去跟老大汇报情况:“老大,咱们都系统已经很稳定了,不出意外应该没问题”,老大立马回了一句:“意外是什么?”,“我靠,嘴贱”,心里暗骂,“那就是机器挂了,机房完蛋了,地球毁灭了”,我半开玩笑的说,这个时候老板来了,听到我刚说的话,接着说:”那怎么行,机器挂了,机房挂了就出问题,那我岂不是得天天烧香给机器还有机房,咱们做的可是跟钱打交道的,只要有人或者我就要服务一直在,我给你们提供足够的资金,把服务给我搞的天衣无缝!!“,老板说完,我不知道是该哭还是该笑,这时候说给钱了,早干嘛去了,唉~~,看来要项目要真正的成长起来真不容易,看来我又要继续”苦逼了“。

欲知后事如何,请听下回分解……