1. 程式人生 > >FastDFS集群部署

FastDFS集群部署

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集群部署