设为首页 收藏本站
查看: 1270|回复: 0

[经验分享] 轻量级分布式文件系统fastDFS分布式的构建

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2019-2-1 06:35:57 | 显示全部楼层 |阅读模式

FastDFS是一个国产开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用。



官方论坛: http://www.csource.org

下载地址: http://sourceforge.net/projects/fastdfs/files/



github软件仓库

libfastcommon FastDFSFastDHT的通用函数库,地址:https://github.com/happyfish100/libfastcommon.git

FastDFS FastDFS主代码,地址: https://github.com/happyfish100/fastdfs.git

fastdfs-nginx-module FastDFSnginx模块,地址:https://github.com/happyfish100/fastdfs-nginx-module.git

nginx清除缓存模块 ngx_cache_purge-2.1 http://labs.frickle.com/nginx_ngx_cache_purge/



.安装

本安装使用 CentOS 6.6 x86_64版操作系统,按照以下网络结构进行部署:



1.下载安装文件



FastDFS 5.x 取消了对 libevent 的依赖,添加了对 libfastcommon 的依赖。

本部署说明用到的软件版本:

    libfastcommon v1.13

    FastDFS v5.06

    fastdfs-nginx-module v1.17

    可从上面的sourceforgegithub中下载,或者直接下载本文附带的压缩包。详细的安装说明可参照代码中的INSTALL



2.安装FastDFS

在每一台trackerstorage服务器上执行

# tar xjvf fdfs-5.06.tar.bz2

# yum install -y gcc perl   # 安装依赖的软件包

# cd ~/fdfs-5.06/libfastcommon && ./make.sh && ./make.sh install

# cd ~/fdfs-5.06/fastdfs && ./make.sh && ./make.sh install



确认make没有错误后,执行安装,64位系统默认会复制到/usr/lib64下。

这时候需要设置环境变量或者创建软链接

export LD_LIBRARY_PATH=/usr/lib64/

ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so



安装完成后,所有可执行文件在目录/usr/bin下,以fdfs_开头:

# ls /usr/bin/fdfs_*

/usr/bin/fdfs_appender_test   /usr/bin/fdfs_download_file  /usr/bin/fdfs_test1

/usr/bin/fdfs_appender_test1  /usr/bin/fdfs_file_info      /usr/bin/fdfs_trackerd

/usr/bin/fdfs_append_file     /usr/bin/fdfs_monitor        /usr/bin/fdfs_upload_appender

/usr/bin/fdfs_crc32           /usr/bin/fdfs_storaged       /usr/bin/fdfs_upload_file

/usr/bin/fdfs_delete_file     /usr/bin/fdfs_test





配置文件在目录/etc/fdfs下:

# ls /etc/fdfs/

client.conf.sample  http.conf  mime.types  storage.conf.sample  tracker.conf  tracker.conf.sample



.FastDFS配置

1.配置Tracker跟踪器

开放tracker监听端口访问(适用于CentOS 7,省略)

firewall-cmd --zone=public --add-port=22122/tcp --permanent

firewall-cmd --reload



修改配置文件

mkdir -p /data/fastdfs

cd /etc/fdfs

cp tracker.conf.sample tracker.conf

cp /root/fdfs/fastdfs/conf/http.conf .

cp /root/fdfs/fastdfs/conf/mime.types .

sed -i 's:base_path=.*:base_path=/data/fastdfs:g' tracker.conf

sed -i 's:http.server_port=.*:http.server_port=80:g' tracker.conf



启动tracker:

# /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf

# ps aux |grep fdfs

root     26350  0.0  0.0  78732  2840 ?        Sl   11:28   0:00 /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf

root     26358  0.0  0.0 103252   812 pts/0    S+   11:28   0:00 grep fdfs

# ss -tunlp |grep 26350

tcp    LISTEN     0      1024                   *:22122                 *:*      users:(("fdfs_trackerd",26350,5))





2.配置Storage存储节点:

开放tracker监听端口访问(省略)

firewall-cmd --zone=public --add-port=23000/tcp --permanent

firewall-cmd --reload



修改配置文件

mkdir -p /data/fastdfs

cd /etc/fdfs

cp storage.conf.sample storage.conf

cp /root/fdfs-5.06/fastdfs/conf/http.conf ./

cp /root/fdfs-5.06/fastdfs/conf/mime.types ./

sed -i 's:base_path=.*:base_path=/data/fastdfs:g' storage.conf

sed -i 's:store_path0=.*:store_path0=/data/fastdfs:g' storage.conf

sed -i 's/tracker_server=.*/tracker_server=192.168.23.72:22122/g' storage.conf

sed -i 's:http.server_port=.*:http.server_port=80:g' storage.conf



启动storage

/usr/bin/fdfs_storaged /etc/fdfs/storage.conf

检查启动进程:

# ps aux |grep fdfs

root     26285  0.5  1.7  80852 66756 ?        Sl   11:38   0:00 /usr/bin/fdfs_storaged /etc/fdfs/storage.conf

root     26295  0.0  0.0 103252   804 pts/0    S+   11:38   0:00 grep fdfs



检测监听端口:

# ss -tunlp |grep 26285

tcp    LISTEN     0      1024                   *:23000                 *:*      users:(("fdfs_storaged",26285,5))





3.client客户端配置

在tracker, storage之外的一台主机上安装FastDFS,然后执行:

mkdir -p /data/fastdfs

cd /etc/fdfs

cp client.conf.sample client.conf

sed -i 's:base_path=.*:base_path=/data/fastdfs:g' client.conf

sed -i 's/tracker_server=.*/tracker_server=192.168.23.72:22122/g' client.conf



FastDFS测试

上传测试:

#  /usr/bin/fdfs_test /etc/fdfs/client.conf upload  install.log

This is FastDFS client test program v5.06



Copyright (C) 2008, Happy Fish / YuQing



FastDFS may be copied only under the terms of the GNU General

Public License V3, which may be found in the FastDFS source kit.

Please visit the FastDFS Home Page http://www.csource.org/

for more detail.



[2015-06-30 01:39:23] DEBUG - base_path=/data/fastdfs, connect_timeout=30, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0



tracker_query_storage_store_list_without_group:

        server 1. group_name=, ip_addr=192.168.23.73, port=23000

        server 2. group_name=, ip_addr=192.168.23.78, port=23000



group_name=group1, ip_addr=192.168.23.73, port=23000

storage_upload_by_filename

group_name=group1, remote_filename=M00/00/00/wKgXSVWR80-AKrL0AAAhTq9t0dk472.log

source ip address: 192.168.23.73

file timestamp=2015-06-30 09:39:27

file size=8526

file crc32=2943209945

example file url: http://192.168.23.73/group1/M00/00/00/wKgXSVWR80-AKrL0AAAhTq9t0dk472.log

storage_upload_slave_by_filename

group_name=group1, remote_filename=M00/00/00/wKgXSVWR80-AKrL0AAAhTq9t0dk472_big.log

source ip address: 192.168.23.73

file timestamp=2015-06-30 09:39:27

file size=8526

file crc32=2943209945

example file url: http://192.168.23.73/group1/M00/00/00/wKgXSVWR80-AKrL0AAAhTq9t0dk472_big.log



客户端监控:

[root@instance-mysql ~]# fdfs_monitor /etc/fdfs/client.conf

[2015-06-30 07:14:29] DEBUG - base_path=/data/fastdfs, connect_timeout=30, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0



server_count=1, server_index=0



tracker server is 192.168.23.72:22122



group count: 1



Group 1:

group name = group1

disk total space = 76102 MB

disk free space = 64333 MB

trunk free space = 0 MB

storage server count = 2

active server count = 2

storage server port = 23000

storage HTTP port = 80

store path count = 1

subdir count per path = 256

current write server index = 1

current trunk file id = 0



        Storage 1:

                id = 192.168.23.73

                ip_addr = 192.168.23.73  ACTIVE

                http domain =

                version = 5.06

                join time = 2015-06-29 11:38:37

                up time = 2015-06-29 11:38:37

                total storage = 76102 MB

                free storage = 70521 MB

                upload priority = 10

                store_path_count = 1

                subdir_count_per_path = 256

                storage_port = 23000

                storage_http_port = 80

                current_write_path = 0

                source storage id =

                if_trunk_server = 0

                connection.alloc_count = 256

                connection.current_count = 1

                connection.max_count = 3

                total_upload_count = 4

                success_upload_count = 4

                total_append_count = 0

                success_append_count = 0

                total_modify_count = 0

                success_modify_count = 0

                total_truncate_count = 0

                success_truncate_count = 0

                total_set_meta_count = 4

                success_set_meta_count = 4

                total_delete_count = 0

                success_delete_count = 0

                total_download_count = 0

                success_download_count = 0

                total_get_meta_count = 0

                success_get_meta_count = 0

                total_create_link_count = 0

                success_create_link_count = 0

                total_delete_link_count = 0

                success_delete_link_count = 0

                total_upload_bytes = 541576

                success_upload_bytes = 541576

                total_append_bytes = 0

                success_append_bytes = 0

                total_modify_bytes = 0

                success_modify_bytes = 0

                stotal_download_bytes = 0

                success_download_bytes = 0

                total_sync_in_bytes = 706836

                success_sync_in_bytes = 706836

                total_sync_out_bytes = 0

                success_sync_out_bytes = 0

                total_file_open_count = 8

                success_file_open_count = 8

                total_file_read_count = 0

                success_file_read_count = 0

                total_file_write_count = 12

                success_file_write_count = 12

                last_heart_beat_time = 2015-06-30 15:14:14

                last_source_update = 2015-06-30 13:56:47

                last_sync_update = 2015-06-30 13:56:29

                last_synced_timestamp = 2015-06-30 13:56:25 (0s delay)

        Storage 2:

                id = 192.168.23.78

                ip_addr = 192.168.23.78  ACTIVE

                http domain =

                version = 5.06

                join time = 2015-06-29 03:39:48

                up time = 2015-06-29 03:39:48

                total storage = 76102 MB

                free storage = 64333 MB

                upload priority = 10

                store_path_count = 1

                subdir_count_per_path = 256

                storage_port = 23000

                storage_http_port = 80

                current_write_path = 0

                source storage id = 192.168.23.73

                if_trunk_server = 0

                connection.alloc_count = 256

                connection.current_count = 1

                connection.max_count = 3

                total_upload_count = 2

                success_upload_count = 2

                total_append_count = 0

                success_append_count = 0

                total_modify_count = 0

                success_modify_count = 0

                total_truncate_count = 0

                success_truncate_count = 0

                total_set_meta_count = 2

                success_set_meta_count = 2

                total_delete_count = 0

                success_delete_count = 0

                total_download_count = 0

                success_download_count = 0

                total_get_meta_count = 0

                success_get_meta_count = 0

                total_create_link_count = 0

                success_create_link_count = 0

                total_delete_link_count = 0

                success_delete_link_count = 0

                total_upload_bytes = 706738

                success_upload_bytes = 706738

                total_append_bytes = 0

                success_append_bytes = 0

                total_modify_bytes = 0

                success_modify_bytes = 0

                stotal_download_bytes = 0

                success_download_bytes = 0

                total_sync_in_bytes = 541772

                success_sync_in_bytes = 541772

                total_sync_out_bytes = 0

                success_sync_out_bytes = 0

                total_file_open_count = 10

                success_file_open_count = 10

                total_file_read_count = 0

                success_file_read_count = 0

                total_file_write_count = 14

                success_file_write_count = 14

                last_heart_beat_time = 2015-06-30 15:14:12

                last_source_update = 2015-06-30 13:56:25

                last_sync_update = 2015-06-30 13:56:52

                last_synced_timestamp = 2015-06-30 13:56:47 (0s delay)



.安装nginx

配置storage的 nginx 服务器和tracker的反向代理服务器

防火墙开放http服务(适用于CentOS 7,此处省略)

firewall-cmd --permanent --zone=public --add-service=http

firewall-cmd --reload



1.安装并启用nginx  在三台服务器上都需要安装

安装nginx-1.9

编译环境:

# yum groupinstall Development Tools

# yum install openssl-devel libxslt-devel  gd-devel  perl-ExtUtils-Embed  libunwind  geoip-devel gperftools



创建nginx管理用户:

# useradd -M -s /sbin/nologin nginx



# id nginx

uid=500(nginx) gid=500(nginx) groups=500(nginx)



源码编译安装nginx:

官方提示说pcre模块版本在4.4 - 8.32 实际使用8.36 ,zlib模块源码要用1.1.3 — 1.2.7版本,实际使用1.2.8编译完成并未报错.

pcre-8.37.tar.gz

zlib-1.2.8.tar.gz



这里使用的是源码,而非编译后的安装目录哦!

解压pcre源码:

tar xvf pcre-8.37.tar.gz  -C /opt/test



解压zlib源码:

tar xvf zlib-1.2.8.tar.gz -C /opt/test



mkdir -pv /var/lib/nginx/tmp/{client_body,proxy,fastcgi,uwsgi,scgi}

mkdir /run/lock/subsys/ -p

mkdir -pv /var/log/nginx/



后续就能进行nginx-1.9的编译:

./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/ --conf-path=/usr/local/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/var/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_ssl_module --with-pcre=/opt/test/pcre-8.37/ --with-zlib=/opt/test/zlib-1.2.8/ --with-mail --with-mail_ssl_module --with-http_spdy_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module --with-http_perl_module --with-mail --with-mail_ssl_module --with-google_perftools_module --add-module=/root/fdfs-5.06/fastdfs-nginx-module/src/

编译完成后执行:

make && make install



设置nginx的环境变量:

echo "export PATH=/usr/local/nginx:$PATH" > /etc/profile.d/nginx.sh

source /etc/profile.d/nginx.sh



查看nginx的版本:

# nginx -v

nginx version: nginx/1.9.2



配置nginx启动脚本(省略)

chkconfig --add nginx

chkconfig nginx on



2.fastdfs模块配置

fastdfs-nginx-module用于解决同步延迟问题:



同组之间的服务器需要复制文件,有延迟的问题.

假设Tracker服务器将文件上传到了192.168.1.80,文件ID已经返回客户端,

这时,后台会将这个文件复制到192.168.1.30,如果复制没有完成,客户端就用这个ID在192.168.1.30取文件,肯定会出现错误

这个fastdfs-nginx-module可以重定向连接到源服务器取文件,避免客户端由于复制延迟的问题,出现错误。



fastdfs-nginx-module模块只需要安装到storage上。

cp /root/fdfs-5.06/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/

touch /data/fastdfs/logs/mod_fastdfs.log

chown nginx:nginx /data/fastdfs/logs/mod_fastdfs.log

vi /etc/fdfs/mod_fastdfs.conf

修改配置文件:

connect_timeout=2

network_timeout=30

base_path=/data/fastdfs                              #保存日志目录

load_fdfs_parameters_from_tracker=true

storage_sync_file_max_delay = 86400

use_storage_id = false

storage_ids_filename = storage_ids.conf

tracker_server=192.168.23.72:22122            #tracker 服务器的 IP 地址以及端口号

storage_server_port=23000                         #storage 服务器的端口号

group_name=group1                                  #当前服务器的 group 名

url_have_group_name = true                      #文件 url 中是否有 group

store_path0=/data/fastdfs                          #存储路径

log_filename=/data/fastdfs/logs/mod_fastdfs.log  #日志文件名



3.Storage服务器nginx配置

server{} 里添加:对应的是url_have_group_name = true

location /group1/M00 {

   alias /data/fastdfs/data;

   ngx_fastdfs_module;

}



配置启用google-perftools:

如果使用googler开发的google-perftools优化Nginx和MySQL的内存管理,性能将会有一定程度的提升。特别是对高并发下的服务器,效果更明显

mkdir /tmp/tcmalloc

chmod 0777 /tmp/tcmalloc



配置nginx.conf,在pid文件下面加入:

#pid        logs/nginx.pid;

google_perftools_profiles /tmp/tcmalloc;



启动nginx服务:

# lsof -n | grep tcmalloc

nginx     13789   nginx   12w      REG              253,0        0    1837560 /tmp/tcmalloc.13789



    if ($request_filename ~* \.(png)|(jpg)|(txt)|(log)$) {

                    set $sign 1;

                }

                if ($args ~* ^flag=(.*)$) {

                    set $flag $sign$1;

                }

                if ($flag = "1flag") {

                    add_header Content-Disposition "attachment;";

                }

注解:

    通过nginx提供的正则匹配判断get参数中的flag字段内容

    如果flag为download则下载图片,否则浏览器呈现图片

    指定指定文件的下载,防止信息泄露



完整的nginx.conf的配置文件:

# sed -e "s/#.*//g" nginx.conf |awk '{if (length !=0) print $0}' |sed '/^ *$/d'

worker_processes  3;

google_perftools_profiles /tmp/tcmalloc;

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server_tokens off;

    server {

        listen       80;

        server_name  localhost;

        location / {

            root   html;

            index  index.html index.htm;

        }

        location /group1/M00 {

            alias /data/fastdfs/data;

            ngx_fastdfs_module;

                if ($request_filename ~* \.(png)|(jpg)|(txt)|(log)$) {

                    set $sign 1;

                }

                if ($args ~* ^flag=(.*)$) {

                    set $flag $sign$1;

                }

                if ($flag = "1flag") {

                    add_header Content-Disposition "attachment;";

                }

                if ($request_method !~ ^(GET|HEAD|POST)$ ) {

                        return 444;

                }



                if ($http_user_agent ~* LWP::Simple|BBBike|wget) {

                        return 403;

                }



                if ($http_user_agent ~* Sosospider|YodaoBot) {

                        return 403;

                }

        }

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   html;

        }

    }

}







4.安装nginx反向代理及缓存服务器

以下操作在 192.168.23.72 上操作

# mkdir -pv /var/cache/nginx/proxy_cache

1.编译安装nginx

./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/ --conf-path=/usr/local/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/var/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_ssl_module --with-pcre=/opt/test/pcre-8.37/ --with-zlib=/opt/test/zlib-1.2.8/ --with-mail --with-mail_ssl_module --with-http_spdy_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module --with-http_perl_module --with-mail --with-mail_ssl_module --with-google_perftools_module --add-module=/root/ngx_cache_purge-2.3

需要ngx_cache_purge模块;

make && make install



2.nginx.conf配置文件

user  nobody;

worker_processes  3;

#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

google_perftools_profiles /tmp/tcmalloc;



events {

    worker_connections  65535;

}



http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    tcp_nopush     on;

    keepalive_timeout  65;

    server_tokens off;

    server_names_hash_bucket_size 128;

    client_header_buffer_size 32k;

    large_client_header_buffers 4 32k;

    client_max_body_size 300m;

    proxy_redirect off;

    proxy_set_header Host $http_host;

    proxy_set_header X-Real-IP $remote_addr;

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_connect_timeout 90;

    proxy_send_timeout 90;

    proxy_read_timeout 90;

    proxy_buffer_size 16k;

    proxy_buffers 4 64k;

    proxy_busy_buffers_size 128k;

    proxy_temp_file_write_size 128k;

    #设置缓存存储路径、存储方式、分配内存大小、磁盘最大空间、缓存期限

    proxy_cache_path  /var/cache/nginx/proxy_cache  levels=1:2

    keys_zone=http-cache:500m max_size=10g inactive=30d;

    proxy_temp_path /var/cache/nginx/proxy_cache/tmp;

    #设置 group1 的服务器

    upstream fdfs_group1 {

        server 192.168.23.73:80 weight=1 max_fails=2 fail_timeout=30s;

        server 192.168.23.78:80 weight=1 max_fails=2 fail_timeout=30s;

    }

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status $body_bytes_sent "$http_referer" '

                      '"$http_user_agent" "$http_x_forwarded_for"';

    server {

        listen       80;

        server_name  localhost;



        #设置 group1 的反向代理参数

        location /group1/M00 {

        proxy_next_upstream http_502 http_504 error timeout invalid_header;

        proxy_cache http-cache;

        proxy_cache_valid 200 304 12h;

        proxy_cache_key $uri$is_args$args;

        proxy_pass http://fdfs_group1;

        add_header  X-Via  $server_addr;

        add_header  X-Cache-Status $upstream_cache_status;

        expires 7d;

    }

    #设置清除缓存的访问权限

        location ~ /purge(/.*) {

        allow 127.0.0.1;

        allow 192.168.23.0/24;

        deny all;

        proxy_cache_purge http-cache $1$is_args$args;

    }

    }

}



配置浏览器端查看是否命中缓存

可以使用Chrome浏览器的开发工具,查看响应的头部信息来查看是否命中缓存,要启用此功能,修改nginx的主配置文件如下:

在location /group1/M00 段增加这2个行

        add_header  X-Via  $server_addr;

        add_header  X-Cache-Status $upstream_cache_status;



.优化部分



1、Tracker优化

1)    max_connections=10000或更大响应参数增大内存消耗增加该参数需修改单一进程同时可打开文件数量(* soft nofile 65536 * hard nofile 65536)的限制后生效。

2)    work_threads=12 cpu数量此处设置cpu核心数量

3)    thread_stack_size=256

测试配置如下

    work_threads=12

    thread_stack_size=256

    max_connections=65535



2、Storage优化

work_threads= work_threads + 1 + (disk_reader_threads + disk_writer_threads) * store_path_count= 15



disk_rw_separated:磁盘读写是否分离

disk_reader_threads:单个磁盘读线程数

disk_writer_threads:单个磁盘写线程数

如果磁盘读写混合,单个磁盘读写线程数为读线程数和写线程数之后

对于单盘挂载方式,磁盘读写线程分别设置为1即可

如果磁盘做了RAID,那么需要酌情加大读写线程数,这样才能最大程度地发挥磁盘性能

buff_size=512增大提升磁盘IO的另外一个技巧,一次尽可能多写入或多读取。也就是说,将程序的读写buffer设置得尽可能大一些。例如日志或者redo log的写入,不是每次调用都直接写磁盘,而是先缓存到内存中,等buffer满了再写入磁盘,也可以定时写入磁盘。

测试配置如下

    thread_stack_size=512KB

    disk_reader_threads = 4

    disk_writer_threads = 4

    buff_size=512

    max_connections=65535

    accept_threads=10

    work_threads=16a



以上配置压力测试上传并发2w 事务平均响应时间0.46秒,4w事务平均响应时间2.2秒。



.FastDFS使用流程

1.上传文件


FastDFS 提供了多种方式上传文件:

使用 fdfs_upload_file 上传
使用 C 语言客户端接口上传
使用 PHP 客户端接口上传
使用 Java 客户端接口上传
使用 Python 客户端接口上传
使用.NET 客户端接口上传

根据具体情况选择使用。上传均支持断点续传。

如果Java的客户端,在API的配置文件中配置 tracker服务器,如果有多个tracker服务器,就配置多台

WEB-INF/classes/fdfs_client.conf
connect_timeout = 2
network_timeout = 30
charset = UTF-8
http.tracker_http_port = 8080
http.anti_steal_token = no
http.secret_key = FastDFS1234567890
tracker_server = 192.168.23.72:22122



































0629-FastDFS分布式文件系统

2015年6月29日

11:18



FastDFS是一个国产开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用。



官方论坛: http://www.csource.org

下载地址: http://sourceforge.net/projects/fastdfs/files/



github软件仓库

libfastcommon FastDFSFastDHT的通用函数库,地址:https://github.com/happyfish100/libfastcommon.git

FastDFS FastDFS主代码,地址: https://github.com/happyfish100/fastdfs.git

fastdfs-nginx-module FastDFSnginx模块,地址:https://github.com/happyfish100/fastdfs-nginx-module.git

nginx清除缓存模块 ngx_cache_purge-2.1 http://labs.frickle.com/nginx_ngx_cache_purge/



.安装

本安装使用 CentOS 6.6 x86_64版操作系统,按照以下网络结构进行部署:



1.下载安装文件



FastDFS 5.x 取消了对 libevent 的依赖,添加了对 libfastcommon 的依赖。

本部署说明用到的软件版本:

    libfastcommon v1.13

    FastDFS v5.06

    fastdfs-nginx-module v1.17

    可从上面的sourceforgegithub中下载,或者直接下载本文附带的压缩包。详细的安装说明可参照代码中的INSTALL



2.安装FastDFS

在每一台trackerstorage服务器上执行

# tar xjvf fdfs-5.06.tar.bz2

# yum install -y gcc perl   # 安装依赖的软件包

# cd ~/fdfs-5.06/libfastcommon && ./make.sh && ./make.sh install

# cd ~/fdfs-5.06/fastdfs && ./make.sh && ./make.sh install



确认make没有错误后,执行安装,64位系统默认会复制到/usr/lib64下。

这时候需要设置环境变量或者创建软链接

export LD_LIBRARY_PATH=/usr/lib64/

ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so



安装完成后,所有可执行文件在目录/usr/bin下,以fdfs_开头:

# ls /usr/bin/fdfs_*

/usr/bin/fdfs_appender_test   /usr/bin/fdfs_download_file  /usr/bin/fdfs_test1

/usr/bin/fdfs_appender_test1  /usr/bin/fdfs_file_info      /usr/bin/fdfs_trackerd

/usr/bin/fdfs_append_file     /usr/bin/fdfs_monitor        /usr/bin/fdfs_upload_appender

/usr/bin/fdfs_crc32           /usr/bin/fdfs_storaged       /usr/bin/fdfs_upload_file

/usr/bin/fdfs_delete_file     /usr/bin/fdfs_test





配置文件在目录/etc/fdfs下:

# ls /etc/fdfs/

client.conf.sample  http.conf  mime.types  storage.conf.sample  tracker.conf  tracker.conf.sample



.FastDFS配置

1.配置Tracker跟踪器

开放tracker监听端口访问(适用于CentOS 7,省略)

firewall-cmd --zone=public --add-port=22122/tcp --permanent

firewall-cmd --reload



修改配置文件

mkdir -p /data/fastdfs

cd /etc/fdfs

cp tracker.conf.sample tracker.conf

cp /root/fdfs/fastdfs/conf/http.conf .

cp /root/fdfs/fastdfs/conf/mime.types .

sed -i 's:base_path=.*:base_path=/data/fastdfs:g' tracker.conf

sed -i 's:http.server_port=.*:http.server_port=80:g' tracker.conf



启动tracker:

# /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf

# ps aux |grep fdfs

root     26350  0.0  0.0  78732  2840 ?        Sl   11:28   0:00 /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf

root     26358  0.0  0.0 103252   812 pts/0    S+   11:28   0:00 grep fdfs

# ss -tunlp |grep 26350

tcp    LISTEN     0      1024                   *:22122                 *:*      users:(("fdfs_trackerd",26350,5))





2.配置Storage存储节点:

开放tracker监听端口访问(省略)

firewall-cmd --zone=public --add-port=23000/tcp --permanent

firewall-cmd --reload



修改配置文件

mkdir -p /data/fastdfs

cd /etc/fdfs

cp storage.conf.sample storage.conf

cp /root/fdfs-5.06/fastdfs/conf/http.conf ./

cp /root/fdfs-5.06/fastdfs/conf/mime.types ./

sed -i 's:base_path=.*:base_path=/data/fastdfs:g' storage.conf

sed -i 's:store_path0=.*:store_path0=/data/fastdfs:g' storage.conf

sed -i 's/tracker_server=.*/tracker_server=192.168.23.72:22122/g' storage.conf

sed -i 's:http.server_port=.*:http.server_port=80:g' storage.conf



启动storage

/usr/bin/fdfs_storaged /etc/fdfs/storage.conf

检查启动进程:

# ps aux |grep fdfs

root     26285  0.5  1.7  80852 66756 ?        Sl   11:38   0:00 /usr/bin/fdfs_storaged /etc/fdfs/storage.conf

root     26295  0.0  0.0 103252   804 pts/0    S+   11:38   0:00 grep fdfs



检测监听端口:

# ss -tunlp |grep 26285

tcp    LISTEN     0      1024                   *:23000                 *:*      users:(("fdfs_storaged",26285,5))





3.client客户端配置

在tracker, storage之外的一台主机上安装FastDFS,然后执行:

mkdir -p /data/fastdfs

cd /etc/fdfs

cp client.conf.sample client.conf

sed -i 's:base_path=.*:base_path=/data/fastdfs:g' client.conf

sed -i 's/tracker_server=.*/tracker_server=192.168.23.72:22122/g' client.conf



FastDFS测试

上传测试:

#  /usr/bin/fdfs_test /etc/fdfs/client.conf upload  install.log

This is FastDFS client test program v5.06



Copyright (C) 2008, Happy Fish / YuQing



FastDFS may be copied only under the terms of the GNU General

Public License V3, which may be found in the FastDFS source kit.

Please visit the FastDFS Home Page http://www.csource.org/

for more detail.



[2015-06-30 01:39:23] DEBUG - base_path=/data/fastdfs, connect_timeout=30, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0



tracker_query_storage_store_list_without_group:

        server 1. group_name=, ip_addr=192.168.23.73, port=23000

        server 2. group_name=, ip_addr=192.168.23.78, port=23000



group_name=group1, ip_addr=192.168.23.73, port=23000

storage_upload_by_filename

group_name=group1, remote_filename=M00/00/00/wKgXSVWR80-AKrL0AAAhTq9t0dk472.log

source ip address: 192.168.23.73

file timestamp=2015-06-30 09:39:27

file size=8526

file crc32=2943209945

example file url: http://192.168.23.73/group1/M00/00/00/wKgXSVWR80-AKrL0AAAhTq9t0dk472.log

storage_upload_slave_by_filename

group_name=group1, remote_filename=M00/00/00/wKgXSVWR80-AKrL0AAAhTq9t0dk472_big.log

source ip address: 192.168.23.73

file timestamp=2015-06-30 09:39:27

file size=8526

file crc32=2943209945

example file url: http://192.168.23.73/group1/M00/00/00/wKgXSVWR80-AKrL0AAAhTq9t0dk472_big.log



客户端监控:

[root@instance-mysql ~]# fdfs_monitor /etc/fdfs/client.conf

[2015-06-30 07:14:29] DEBUG - base_path=/data/fastdfs, connect_timeout=30, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0



server_count=1, server_index=0



tracker server is 192.168.23.72:22122



group count: 1



Group 1:

group name = group1

disk total space = 76102 MB

disk free space = 64333 MB

trunk free space = 0 MB

storage server count = 2

active server count = 2

storage server port = 23000

storage HTTP port = 80

store path count = 1

subdir count per path = 256

current write server index = 1

current trunk file id = 0



        Storage 1:

                id = 192.168.23.73

                ip_addr = 192.168.23.73  ACTIVE

                http domain =

                version = 5.06

                join time = 2015-06-29 11:38:37

                up time = 2015-06-29 11:38:37

                total storage = 76102 MB

                free storage = 70521 MB

                upload priority = 10

                store_path_count = 1

                subdir_count_per_path = 256

                storage_port = 23000

                storage_http_port = 80

                current_write_path = 0

                source storage id =

                if_trunk_server = 0

                connection.alloc_count = 256

                connection.current_count = 1

                connection.max_count = 3

                total_upload_count = 4

                success_upload_count = 4

                total_append_count = 0

                success_append_count = 0

                total_modify_count = 0

                success_modify_count = 0

                total_truncate_count = 0

                success_truncate_count = 0

                total_set_meta_count = 4

                success_set_meta_count = 4

                total_delete_count = 0

                success_delete_count = 0

                total_download_count = 0

                success_download_count = 0

                total_get_meta_count = 0

                success_get_meta_count = 0

                total_create_link_count = 0

                success_create_link_count = 0

                total_delete_link_count = 0

                success_delete_link_count = 0

                total_upload_bytes = 541576

                success_upload_bytes = 541576

                total_append_bytes = 0

                success_append_bytes = 0

                total_modify_bytes = 0

                success_modify_bytes = 0

                stotal_download_bytes = 0

                success_download_bytes = 0

                total_sync_in_bytes = 706836

                success_sync_in_bytes = 706836

                total_sync_out_bytes = 0

                success_sync_out_bytes = 0

                total_file_open_count = 8

                success_file_open_count = 8

                total_file_read_count = 0

                success_file_read_count = 0

                total_file_write_count = 12

                success_file_write_count = 12

                last_heart_beat_time = 2015-06-30 15:14:14

                last_source_update = 2015-06-30 13:56:47

                last_sync_update = 2015-06-30 13:56:29

                last_synced_timestamp = 2015-06-30 13:56:25 (0s delay)

        Storage 2:

                id = 192.168.23.78

                ip_addr = 192.168.23.78  ACTIVE

                http domain =

                version = 5.06

                join time = 2015-06-29 03:39:48

                up time = 2015-06-29 03:39:48

                total storage = 76102 MB

                free storage = 64333 MB

                upload priority = 10

                store_path_count = 1

                subdir_count_per_path = 256

                storage_port = 23000

                storage_http_port = 80

                current_write_path = 0

                source storage id = 192.168.23.73

                if_trunk_server = 0

                connection.alloc_count = 256

                connection.current_count = 1

                connection.max_count = 3

                total_upload_count = 2

                success_upload_count = 2

                total_append_count = 0

                success_append_count = 0

                total_modify_count = 0

                success_modify_count = 0

                total_truncate_count = 0

                success_truncate_count = 0

                total_set_meta_count = 2

                success_set_meta_count = 2

                total_delete_count = 0

                success_delete_count = 0

                total_download_count = 0

                success_download_count = 0

                total_get_meta_count = 0

                success_get_meta_count = 0

                total_create_link_count = 0

                success_create_link_count = 0

                total_delete_link_count = 0

                success_delete_link_count = 0

                total_upload_bytes = 706738

                success_upload_bytes = 706738

                total_append_bytes = 0

                success_append_bytes = 0

                total_modify_bytes = 0

                success_modify_bytes = 0

                stotal_download_bytes = 0

                success_download_bytes = 0

                total_sync_in_bytes = 541772

                success_sync_in_bytes = 541772

                total_sync_out_bytes = 0

                success_sync_out_bytes = 0

                total_file_open_count = 10

                success_file_open_count = 10

                total_file_read_count = 0

                success_file_read_count = 0

                total_file_write_count = 14

                success_file_write_count = 14

                last_heart_beat_time = 2015-06-30 15:14:12

                last_source_update = 2015-06-30 13:56:25

                last_sync_update = 2015-06-30 13:56:52

                last_synced_timestamp = 2015-06-30 13:56:47 (0s delay)



.安装nginx

配置storage的 nginx 服务器和tracker的反向代理服务器

防火墙开放http服务(适用于CentOS 7,此处省略)

firewall-cmd --permanent --zone=public --add-service=http

firewall-cmd --reload



1.安装并启用nginx  在三台服务器上都需要安装

安装nginx-1.9

编译环境:

# yum groupinstall Development Tools

# yum install openssl-devel libxslt-devel  gd-devel  perl-ExtUtils-Embed  libunwind  geoip-devel gperftools



创建nginx管理用户:

# useradd -M -s /sbin/nologin nginx



# id nginx

uid=500(nginx) gid=500(nginx) groups=500(nginx)



源码编译安装nginx:

官方提示说pcre模块版本在4.4 - 8.32 实际使用8.36 ,zlib模块源码要用1.1.3 — 1.2.7版本,实际使用1.2.8编译完成并未报错.

pcre-8.37.tar.gz

zlib-1.2.8.tar.gz



这里使用的是源码,而非编译后的安装目录哦!

解压pcre源码:

tar xvf pcre-8.37.tar.gz  -C /opt/test



解压zlib源码:

tar xvf zlib-1.2.8.tar.gz -C /opt/test



mkdir -pv /var/lib/nginx/tmp/{client_body,proxy,fastcgi,uwsgi,scgi}

mkdir /run/lock/subsys/ -p

mkdir -pv /var/log/nginx/



后续就能进行nginx-1.9的编译:

./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/ --conf-path=/usr/local/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/var/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_ssl_module --with-pcre=/opt/test/pcre-8.37/ --with-zlib=/opt/test/zlib-1.2.8/ --with-mail --with-mail_ssl_module --with-http_spdy_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module --with-http_perl_module --with-mail --with-mail_ssl_module --with-google_perftools_module --add-module=/root/fdfs-5.06/fastdfs-nginx-module/src/

编译完成后执行:

make && make install



设置nginx的环境变量:

echo "export PATH=/usr/local/nginx:$PATH" > /etc/profile.d/nginx.sh

source /etc/profile.d/nginx.sh



查看nginx的版本:

# nginx -v

nginx version: nginx/1.9.2



配置nginx启动脚本(省略)

chkconfig --add nginx

chkconfig nginx on



2.fastdfs模块配置

fastdfs-nginx-module用于解决同步延迟问题:



同组之间的服务器需要复制文件,有延迟的问题.

假设Tracker服务器将文件上传到了192.168.1.80,文件ID已经返回客户端,

这时,后台会将这个文件复制到192.168.1.30,如果复制没有完成,客户端就用这个ID在192.168.1.30取文件,肯定会出现错误

这个fastdfs-nginx-module可以重定向连接到源服务器取文件,避免客户端由于复制延迟的问题,出现错误。



fastdfs-nginx-module模块只需要安装到storage上。

cp /root/fdfs-5.06/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/

touch /data/fastdfs/logs/mod_fastdfs.log

chown nginx:nginx /data/fastdfs/logs/mod_fastdfs.log

vi /etc/fdfs/mod_fastdfs.conf

修改配置文件:

connect_timeout=2

network_timeout=30

base_path=/data/fastdfs                                           #保存日志目录

load_fdfs_parameters_from_tracker=true

storage_sync_file_max_delay = 86400

use_storage_id = false

storage_ids_filename = storage_ids.conf

tracker_server=192.168.23.72:22122                     #tracker 服务器的 IP 地址以及端口号

storage_server_port=23000                                     #storage 服务器的端口号

group_name=group1                                                 #当前服务器的 group 名

url_have_group_name = true                                   #文件 url 中是否有 group

store_path0=/data/fastdfs                                        #存储路径

log_filename=/data/fastdfs/logs/mod_fastdfs.log    #日志文件名



3.Storage服务器nginx配置

server{} 里添加:对应的是url_have_group_name = true

location /group1/M00 {

   alias /data/fastdfs/data;

   ngx_fastdfs_module;

}



配置启用google-perftools:

如果使用googler开发的google-perftools优化Nginx和MySQL的内存管理,性能将会有一定程度的提升。特别是对高并发下的服务器,效果更明显

mkdir /tmp/tcmalloc

chmod 0777 /tmp/tcmalloc



配置nginx.conf,在pid文件下面加入:

#pid        logs/nginx.pid;

google_perftools_profiles /tmp/tcmalloc;



启动nginx服务:

# lsof -n | grep tcmalloc

nginx     13789   nginx   12w      REG              253,0        0    1837560 /tmp/tcmalloc.13789



    if ($request_filename ~* \.(png)|(jpg)|(txt)|(log)$) {

                    set $sign 1;

                }

                if ($args ~* ^flag=(.*)$) {

                    set $flag $sign$1;

                }

                if ($flag = "1flag") {

                    add_header Content-Disposition "attachment;";

                }

注解:

    通过nginx提供的正则匹配判断get参数中的flag字段内容

    如果flag为download则下载图片,否则浏览器呈现图片

    指定指定文件的下载,防止信息泄露



完整的nginx.conf的配置文件:

# sed -e "s/#.*//g" nginx.conf |awk '{if (length !=0) print $0}' |sed '/^ *$/d'

worker_processes  3;

google_perftools_profiles /tmp/tcmalloc;

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server_tokens off;

    server {

        listen       80;

        server_name  localhost;

        location / {

            root   html;

            index  index.html index.htm;

        }

        location /group1/M00 {

            alias /data/fastdfs/data;

            ngx_fastdfs_module;

                if ($request_filename ~* \.(png)|(jpg)|(txt)|(log)$) {

                    set $sign 1;

                }

                if ($args ~* ^flag=(.*)$) {

                    set $flag $sign$1;

                }

                if ($flag = "1flag") {

                    add_header Content-Disposition "attachment;";

                }

                if ($request_method !~ ^(GET|HEAD|POST)$ ) {

                        return 444;

                }



                if ($http_user_agent ~* LWP::Simple|BBBike|wget) {

                        return 403;

                }



                if ($http_user_agent ~* Sosospider|YodaoBot) {

                        return 403;

                }

        }

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   html;

        }

    }

}







4.安装nginx反向代理及缓存服务器

以下操作在 192.168.23.72 上操作

# mkdir -pv /var/cache/nginx/proxy_cache

1.编译安装nginx

./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/ --conf-path=/usr/local/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/var/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_ssl_module --with-pcre=/opt/test/pcre-8.37/ --with-zlib=/opt/test/zlib-1.2.8/ --with-mail --with-mail_ssl_module --with-http_spdy_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module --with-http_perl_module --with-mail --with-mail_ssl_module --with-google_perftools_module --add-module=/root/ngx_cache_purge-2.3

需要ngx_cache_purge模块;

make && make install



2.nginx.conf配置文件

user  nobody;

worker_processes  3;

#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

google_perftools_profiles /tmp/tcmalloc;



events {

    worker_connections  65535;

}



http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    tcp_nopush     on;

    keepalive_timeout  65;

    server_tokens off;

    server_names_hash_bucket_size 128;

    client_header_buffer_size 32k;

    large_client_header_buffers 4 32k;

    client_max_body_size 300m;

    proxy_redirect off;

    proxy_set_header Host $http_host;

    proxy_set_header X-Real-IP $remote_addr;

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_connect_timeout 90;

    proxy_send_timeout 90;

    proxy_read_timeout 90;

    proxy_buffer_size 16k;

    proxy_buffers 4 64k;

    proxy_busy_buffers_size 128k;

    proxy_temp_file_write_size 128k;

    #设置缓存存储路径、存储方式、分配内存大小、磁盘最大空间、缓存期限

    proxy_cache_path  /var/cache/nginx/proxy_cache  levels=1:2

    keys_zone=http-cache:500m max_size=10g inactive=30d;

    proxy_temp_path /var/cache/nginx/proxy_cache/tmp;

    #设置 group1 的服务器

    upstream fdfs_group1 {

        server 192.168.23.73:80 weight=1 max_fails=2 fail_timeout=30s;

        server 192.168.23.78:80 weight=1 max_fails=2 fail_timeout=30s;

    }

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status $body_bytes_sent "$http_referer" '

                      '"$http_user_agent" "$http_x_forwarded_for"';

    server {

        listen       80;

        server_name  localhost;



        #设置 group1 的反向代理参数

        location /group1/M00 {

        proxy_next_upstream http_502 http_504 error timeout invalid_header;

        proxy_cache http-cache;

        proxy_cache_valid 200 304 12h;

        proxy_cache_key $uri$is_args$args;

        proxy_pass http://fdfs_group1;

        add_header  X-Via  $server_addr;

        add_header  X-Cache-Status $upstream_cache_status;

        expires 7d;

    }

    #设置清除缓存的访问权限

        location ~ /purge(/.*) {

        allow 127.0.0.1;

        allow 192.168.23.0/24;

        deny all;

        proxy_cache_purge http-cache $1$is_args$args;

    }

    }

}



配置浏览器端查看是否命中缓存

可以使用Chrome浏览器的开发工具,查看响应的头部信息来查看是否命中缓存,要启用此功能,修改nginx的主配置文件如下:

在location /group1/M00 段增加这2个行

        add_header  X-Via  $server_addr;

        add_header  X-Cache-Status $upstream_cache_status;



.优化部分



1、Tracker优化

1)    max_connections=10000或更大响应参数增大内存消耗增加该参数需修改单一进程同时可打开文件数量(* soft nofile 65536 * hard nofile 65536)的限制后生效。

2)    work_threads=12 cpu数量此处设置cpu核心数量

3)    thread_stack_size=256

测试配置如下

    work_threads=12

    thread_stack_size=256

    max_connections=65535



2、Storage优化

work_threads= work_threads + 1 + (disk_reader_threads + disk_writer_threads) * store_path_count= 15



disk_rw_separated:磁盘读写是否分离

disk_reader_threads:单个磁盘读线程数

disk_writer_threads:单个磁盘写线程数

如果磁盘读写混合,单个磁盘读写线程数为读线程数和写线程数之后

对于单盘挂载方式,磁盘读写线程分别设置为1即可

如果磁盘做了RAID,那么需要酌情加大读写线程数,这样才能最大程度地发挥磁盘性能

buff_size=512增大提升磁盘IO的另外一个技巧,一次尽可能多写入或多读取。也就是说,将程序的读写buffer设置得尽可能大一些。例如日志或者redo log的写入,不是每次调用都直接写磁盘,而是先缓存到内存中,等buffer满了再写入磁盘,也可以定时写入磁盘。

测试配置如下

    thread_stack_size=512KB

    disk_reader_threads = 4

    disk_writer_threads = 4

    buff_size=512

    max_connections=65535

    accept_threads=10

    work_threads=16a



以上配置压力测试上传并发2w 事务平均响应时间0.46秒,4w事务平均响应时间2.2秒。



.FastDFS使用流程

1.上传文件


FastDFS 提供了多种方式上传文件:

使用 fdfs_upload_file 上传
使用 C 语言客户端接口上传
使用 PHP 客户端接口上传
使用 Java 客户端接口上传
使用 Python 客户端接口上传
使用.NET 客户端接口上传

根据具体情况选择使用。上传均支持断点续传。

如果Java的客户端,在API的配置文件中配置 tracker服务器,如果有多个tracker服务器,就配置多台

WEB-INF/classes/fdfs_client.conf
connect_timeout = 2
network_timeout = 30
charset = UTF-8
http.tracker_http_port = 8080
http.anti_steal_token = no
http.secret_key = FastDFS1234567890
tracker_server = 192.168.23.72:22122







运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-670170-1-1.html 上篇帖子: fastDFS文件服务器服务器实现双机热备 下篇帖子: FastDFS分布式文件系统配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表