码迷,mamicode.com
首页 > 其他好文 > 详细

FastDFS集群部署

时间:2017-11-28 21:49:41      阅读:340      评论:0      收藏:0      [点我收藏+]

标签:nginx   fastdfs   ha   keepalived   集群   

集群部署

部署环境

IP地址

计算机名

部署的服务

172.16.10.10

node1.fastdfs

StorageGroup1

172.16.10.11

node2.fastdfs

StorageGroup1

172.16.10.12

node3.fastdfs

StorageGroup2

172.16.10.13

node4.fastdfs

StorageGroup2

172.16.10.17

node5.fastdfs

Tracker1

172.16.10.18

node6.fastdfs

Tracker2

172.16.10.14

node1.nginx

nginx keepalived

172.16.10.15

node2.nginx

nginx keepalived

172.16.10.16VIP



服务器操作系统:CentOS Linux release 7.3.1611 (Core)

SELinux:关闭

Iptables:清空

时间:保持同步

FastDFS版本:v5.082016-02-14最新版本)

Hosts文件解析:

172.16.10.10 node1.fastdfs
172.16.10.11 node2.fastdfs
172.16.10.12 node3.fastdfs
172.16.10.13 node4.fastdfs
172.16.10.17 node5.fastdfs
172.16.10.18 node6.fastdfs
172.16.10.14 node1.nginx
172.16.10.15 node2.nginx

使用的软件包:

FastDFS_v5.08.tar.gz

fastdfs-nginx-module_v1.16.tar.gz

libfastcommon-master.zip

nginx-1.6.2.tar.gz

ngx_cache_purge-2.3.tar.gz

架构图如下所示

技术分享图片

环境部署

tracker节点和storage节点安装FastDFS

tarcker节点和storage节点执行以下操作(172.16.10.10172.16.10.11172.16.10.12172.16.10.13172.16.10.17172.16.10.18

安装基础开发包

yum -y install gcc gcc-c++

首先需要安装libfastcommon

下载地址:https://github.com/happyfish100/libfastcommon,在源码包的INSTALL文件有说明

下载完成后解压进入到解压后目录执行以下命令

./make.sh
./make.sh install

安装成功后会生成一个文件:/usr/lib64/libfastcommon.so

我们需要创建软链接,因为FastDFS程序设置的目录不是这里

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

 安装FastDFS

下载完成后进入安装目录执行以下命令

./make.sh
./make.sh install

安装完成后会配置文件在:/etc/fdfs

配置tracker节点

tarcker节点执行下面命令(172.16.10.17172.16.10.18

创建的数据存储和日志存储目录

mkdir -pv /data/fastdfs-tracker

重命名tarcker配置文件

cd /etc/fdfs && mv tracker.conf.sample tracker.conf

修改tracker.conf配置文件

    修改base_path的值为刚创建的目录

    修改store_lookup的值为0

    说明:store_lookup的值默认为22代表负载均衡模式,0代表轮询模式,1代表指定节点,为方便一会测试,我们选改为0。另外store_group这人选项只有当store_lookup值为1的时候才会生效

启动fdfs_trackerd服务

service fdfs_trackerd start

 启动成功后在刚创建的目录下面会生成datalogs两个目录

/data/fastdfs-tracker
├── data
│   ├── fdfs_trackerd.pid
│   └── storage_changelog.dat
└── logs
└── trackerd.log

日志输出内容大概如下图所示

技术分享图片

查看是否监听22122端口

配置开机自启动

chkconfig fdfs_trackerd on

配置storage节点

storage节点执行以下操作(172.16.10.10172.16.10.11172.16.10.12172.16.10.13

创建数据存储目录和日志存储目录

mkdir -p /data/fastdfs-storage

重命名tarcker配置文件

cd /etc/fdfs/ && mv storage.conf.sample storage.conf

修改配置文件

    修改base_path路径为刚创建的路径

    修改store_path0路径为刚创建的路径

    修改tracker_server后面的IP的端口为tarcker服务器的IP和监听的端口,就算在同一台机器也不可以使用127.0.0.1,另外我们还需要再增加一个tarcker_server的选项,指定不同的tarcker,如下所示

base_path=/data/fastdfs-storage
store_path0=/data/fastdfs-storage
tracker_server=172.16.10.17:22122
tracker_server=172.16.10.18:22122

注意:配置文件里面有一项为group_name,用于指定group名,我们有两个分组,这里需要注意不同的storage节点,这里的名称都不一样,其它都一样,默认为group1,如果在是在172.16.10.12节点和172.16.10.13节点安装这里需要改成group2

启动服务

service fdfs_storaged start

启动成功后在刚创建的目录下面会生成datalogs两个目录,并且data目录里面会有很多子目录,最的会监听23000端口

日志说明:下面日志说明了客户端启动连接两台tracker server成功,选举172.16.10.13leader,最后说明连接同一个groupstorage server成功

技术分享图片

加入开机自启动

chkconfig fdfs_storaged on

第一次测试

主要测试tracker server的高可用,我们可以试图关掉storage server选择出来的leader,这样正常情况下会触发重新选举出新的leader,并且会报错连接不上被关掉的tracker server,如果再把关掉的tracker server启动的话会提示连接成功的信息,这些都能在日志里面体现

在集群内任何的storage server节点执行以下命令

fdfs_monitor /etc/fdfs/storage.conf

会输出同样的信息,信息中包含有两个group,并且会输出每个group内的storage信息

客户端上传图片测试

在任何一台tracker节点测试

重命名客户端配置文件

cd /etc/fdfs/ && mv client.conf.sample client.conf

修改配置文件

修改base_path的值为tracker配置文件里面的base_path一样的路径

修改tracker_servertracker监控的IP和端口,如果都在本机也不可以使127.0.0.1

如下所示

base_path=/data/fastdfs-tracker
tracker_server=172.16.10.17:22122
tracker_server=172.16.10.18:22122

上传图片测试,执行下面命令

fdfs_upload_file client.conf test.png

fdfs_upload_file     命令

client.conf          指定的客户端配置文件

test.png             指定图片路径

上传成功后会返回一个类似下面的路径

group1/M00/00/00/rBAKCloXyT2AFH_AAAD4kx1mwCw538.png

group1      代表上传到了group1的内的storage节点

M00         代表磁盘目录,如果只有一个磁盘那么只有M00,多个就是M01……

00/00       代表磁盘目录,每个目录下又有00FF256个目录,两级目录就有256*256个目录

rBAKCloXyT2AFH_AAAD4kx1mwCw538.png         这是最终上传上去的文件

最终我们知道我们的图片被上传到了哪几台服务器的哪个目录,我们可以直接在服务器上找到我们上传的图片,同一个group内的图片一样的因为我们前面在配置tracker节点的时候我们配置的为0模式(轮询)因此我们上传的时候一次为group1一次为group2,如果有一个group宕机,那么就始终在另外的group如下图所示

技术分享图片

这时候我们的group1里面所有storageM00号磁盘上面的00/00目录下面将有rBAKClobtG6AS0JKAANxJpb_3dc838.pngrBAKC1obtHCAEMpMAANxJpb_3dc032.pnggroup2里面所有storageM00号磁盘上面的00/00目录下面将有rBAKDFobtG-AIj2EAANxJpb_3dc974.pngrBAKDVobtHGAJgzTAANxJpb_3dc166.png

如下图所示

技术分享图片

技术分享图片

说明:如果同一组的其中一台storage发生故障,那么上传的文件只能存放到同一组的其它设备上面,等故障恢复后会自动将数据同步到该故障设备上面,不需要人工干预

加入开机自启动

chkconfig fdfs_storaged on

Nginx结合

前面我们测试只是用客户端测试,我们需要使用http的方式来上传和下载,因此我们还需要搭建Nginxapache,这里我们就使用,使用最多的Nginx

在所有的storage节点部署Nginx

将所有源码包复制到/usr/local/src目录下面,然后解压

进入到/usr/local/src/fastdfs-nginx-module/src/

cd /usr/local/src/fastdfs-nginx-module/src

修改config文件里面的/usr/local/include/fastdfs/usr/include/fastdfs

修改config文件里面的/usr/local/include/fastcommon//usr/include/fastcommon/

进入到Nginx解压后的目录执行下面命令

yum -y install zlib-devel openssl-devel
./configure --prefix=/usr/local/nginx --with-pcre --add-module=/usr/local/src/fastdfs-nginx-module/src
make
make install

添加nginx可执行文件到环境变量

cat >> /etc/profile.d/nginx.sh << EOF
#!/bin/sh

PATH=$PATH:/usr/local/nginx/sbin
export PATH
EOF

刷新环境变量

source /etc/profile.d/nginx.sh

 复制配置文件

cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
cp /usr/local/src/FastDFS/conf/{http.conf,mime.types} /etc/fdfs/

创建Nginx配置文件

nginx.conf/usr/local/nginx/conf/nginx.conf

worker_processes  2;
worker_rlimit_nofile 51200;
 
events {
    use epoll;
    worker_connections  51200;
}
 
 
http {
    include       mime.types;
    default_type  application/octet-stream;
 
    client_max_body_size 50m;
 
    sendfile        on;
    tcp_nopush     on;
 
    keepalive_timeout  60;
 
    gzip  on;
    server_tokens off;
   
    include vhost/*.conf;
 
}

FastDFS.conf/usr/local/nginx/conf/vhost/FastDFS.conf

server {
    listen 9000;
   
    location ~/group[1-3]/M00 {
        ngx_fastdfs_module;
    }
}

更改Linux最大可打开文件数量

编辑/etc/security/limits.conf在文件最后加入以下内容

* soft nofile 65536
* hard nofile 65536

注销,重新登录即可

编辑/etc/fdfs/mod_fastdfs.conf配置文件

    修改connect_timeout10

    修改tracker_servertaacker监听的服务器IP和地址,不可以使用127.0.0.1

    修改url_have_group_nametrue

    修改store_path0的路径为storage配置文件配置的路径

    修改group_count2(因为我们就只有两个组)

在最后增加以下配置

[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/data/fastdfs-storage
 
[group2]
group_name=group2
storage_server_port=23000
store_path_count=1
store_path0=/data/fastdfs-storage

如下所示

connect_timeout=10
tracker_server=172.16.10.17:22122
tracker_server=172.16.10.18:22122
group_name=group1
url_have_group_name = true
store_path0=/data/fastdfs-storage
group_count = 2
 
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/data/fastdfs-storage
 
[group2]
group_name=group2
storage_server_port=23000
store_path_count=1
store_path0=/data/fastdfs-storage

 Nginx启动,停止,重启,Reload,配置检查脚本,脚本名(/etc/init.d/nginx

#!/bin/bash
# chkconfig: - 30 21
# description: http service.
# Source Function Library
. /etc/init.d/functions
# Nginx Settings
 
NGINX_SBIN="/usr/local/nginx/sbin/nginx"
NGINX_CONF="/usr/local/nginx/conf/nginx.conf"
NGINX_PID="/usr/local/nginx/logs/nginx.pid"
RETVAL=0
prog="Nginx"
 
start() {
        echo -n $"Starting $prog: "
        mkdir -p /dev/shm/nginx_temp
        daemon $NGINX_SBIN -c $NGINX_CONF
        RETVAL=$?
        echo
        return $RETVAL
}
 
stop() {
        echo -n $"Stopping $prog: "
        killproc -p $NGINX_PID $NGINX_SBIN -TERM
        rm -rf /dev/shm/nginx_temp
        RETVAL=$?
        echo
        return $RETVAL
}
 
reload(){
        echo -n $"Reloading $prog: "
        killproc -p $NGINX_PID $NGINX_SBIN -HUP
        RETVAL=$?
        echo
        return $RETVAL
}
 
restart(){
        stop
        start
}
 
configtest(){
    $NGINX_SBIN -c $NGINX_CONF -t
    return 0
}
 
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  reload)
        reload
        ;;
  restart)
        restart
        ;;
  configtest)
        configtest
        ;;
  *)
        echo $"Usage: $0 {start|stop|reload|restart|configtest}"
        RETVAL=1
esac
 
exit $RETVAL

 nginx添加以系统服务,并设置开机自启动,最后再启动

chkconfig --add nginx
chkconfig nginx on
service nginx start

测试:通过任何一个存储节点的Nginx都可以访问到我们上传的所有图片

在所有tracker节点部署Nginx

/usr/local/src目录下解压nginx-1.6.2.tar.gzngx_cache_purge-2.3.tar.gz

安装依赖包

yum -y install zlib-devel openssl-devel

进入到/usr/local/src/nginx-1.6.2这个目录执行下面命令进行安装

./configure --prefix=/usr/local/nginx --with-pcre --add-module=/usr/local/src/ngx_cache_purge-2.3
make
make install

添加nginx可执行文件到环境变量:参考在storage节点部署Nginx

编辑Nginx配置文件(nginx.conf

worker_processes  2;
worker_rlimit_nofile 51200;
 
events {
    use epoll;
    worker_connections  51200;
}
 
 
http {
    include       mime.types;
    default_type  application/octet-stream;
 
    client_max_body_size 50m;
 
    sendfile        on;
    tcp_nopush     on;
 
    keepalive_timeout  60;
 
    gzip  on;
    server_tokens off;
 
    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 /data/cache/nginx/proxy_cache levels=1:2
    keys_zone=http-cache:200m max_size=1g inactive=30d; 
    proxy_temp_path /data/cache/nginx/proxy_cache/tmp;
   
    include vhost/*.conf;
}

创建缓存目录和子配置文件目录

mkdir -p /data/cache/nginx/proxy_cache/tmp
mkdir /usr/local/nginx/conf/vhost

修改子配置文件(/usr/local/nginx/conf/vhost/FastDFS.conf

upstream fdfs_group1 { 
    server 172.16.10.10:8888 weight=1 max_fails=2 fail_timeout=30s; 
    server 172.16.10.11:8888 weight=1 max_fails=2 fail_timeout=30s; 
} 
 
upstream fdfs_group2 { 
    server 172.16.10.12:8888 weight=1 max_fails=2 fail_timeout=30s; 
    server 172.16.10.13:8888 weight=1 max_fails=2 fail_timeout=30s; 
} 
 
server { 
    listen       8000; 
 
    location /group1/M00 { 
        proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_cache http-cache; 
        proxy_cache_valid 200 304 12h; 
        proxy_cache_key $uri$is_args$args; 
        proxy_pass http://fdfs_group1; 
        expires 30d; 
    } 
 
    location /group2/M00 { 
        proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_cache http-cache; 
        proxy_cache_valid 200 304 12h; 
        proxy_cache_key $uri$is_args$args; 
        proxy_pass http://fdfs_group2; 
        expires 30d; 
     }
 
    location ~/purge(/.*) { 
        allow all; 
        proxy_cache_purge http-cache $1$is_args$args; 
    }
}

 Nginx启动,停止,重启,Reload,配置检查脚本,脚本名(/etc/init.d/nginx:参考在storage节点部署Nginx

nginx添加以系统服务,并设置开机自启动,最后再启动:参考在storage节点部署Nginx

测试:通过两中中的任意一台trackr节点的8000端口去访问后端任何group里面的图片都没有问题

nginx节点部署Nginx+keepalived高可用

172.16.10.17172.16.10.18上面执行下面操作

安装软件

yum -y install nginx keepalived

node1Keepalived配置

! Configuration File for keepalived
 
global_defs {
   router_id NodeA
}
 
vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh"
    interval 2
    weight 20
}
 
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1314
    }
    track_script {
        chk_nginx
    }
    virtual_ipaddress {
        172.16.10.16/24
    }
}

 node2Keepalived配置

! Configuration File for keepalived
 
global_defs {
   router_id NodeB
}
 
vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh"
    interval 2
    weight 20
}
 
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1314
    }
    track_script {
        chk_nginx
    }
    virtual_ipaddress {
        172.16.10.16/24
    }
}

 nginx_check.sh脚本内容(/etc/keepalived/nginx_check.sh

#!/bin/bash
 
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ];then
    nginx
    sleep 2
    if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
        pkill keepalived
    fi
fi

 nginx.conf的配置

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
 
include /usr/share/nginx/modules/*.conf;
 
events {
    worker_connections 51200;
    use epoll;
}
 
http {
    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  /var/log/nginx/access.log  main;
 
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;
 
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
 
    include /etc/nginx/conf.d/*.conf;
}
FastDFS.conf的配置(/etc/nginx/conf.d/FastDFS.conf)
upstream tracker_server {
    server 172.16.10.17:8000;
    server 172.16.10.18:8000;
}
 
server {
    listen 80;
 
    location /fastdfs {
        proxy_pass http://tracker_server/;
        proxy_set_header Host $http_host;
        proxy_set_header Cookie $http_cookie;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        client_max_body_size 300m;
    }
}

启动Keepalived

systemctl start keepalived

配置开机自启动

systemctl enable nginx
systemctl enable keepalived

检查VIP

ip addr

集群测试

关闭集群中一半相同功能的服务器,集群可以照常运行

如:

1172.16.10.11172.16.10.13172.16.10.15172.16.10.18

2172.16.10.10172.16.10.12172.16.10.14172.16.10.17

集群启动顺序

1.      首先启动所有节点的Nginx

2.      再启动Tracker节点

3.      最后启动Storage节点


FastDFS集群部署

标签:nginx   fastdfs   ha   keepalived   集群   

原文地址:http://blog.51cto.com/270142877/2045450

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!