利用FastDFS构建分布式文件系统集群

在这里,按以下配置fdfs的集群:

跟踪服务器:
Tracker Server1 IP:  192.168.50.232
Tracker Server2 IP:  192.168.50.233
存储服务器:
Storage Server1 IP:  192.168.50.232
Storage Server2 IP:  192.168.50.233

一、在各自的机器上安装fdfs,主要步骤如下

安裝libfastcommon

sudo wget https://github.com/happyfish100/libfastcommon/archive/master.zip
sudo unzip master.zip
sudo ./make.sh 
sudo ./make.sh install

安裝FastFDS

sudo wget https://github.com/happyfish100/fastdfs/archive/master.zip
sudo unzip master.zip 
cd fastdfs-master
sudo ./make.sh
sudo ./make.sh install

二、配置fdfs

1.修改tracker.conf的配置(/etc/fdfs/tracker.conf)
在192.168.50.232的机器上修改tracker.conf的配置如下:
bind_addr=192.168.50.232
base_path=/home/data/fastdfs 该目录根据实际需要自行修改
use_storage_id = true
id_type_in_filename = id
http.server_port=8088 端口可根据实际需要自行修改

在192.168.50.233的机器上修改tracker.conf的配置如下:
bind_addr=192.168.50.233
base_path=/home/data/fastdfs 该目录根据实际需要自行修改
use_storage_id = true
id_type_in_filename = id
http.server_port=8088 端口可根据实际需要自行修改


2.修改storage.conf的配置(/etc/fdfs/storage.conf)
在192.168.50.232的机器上修改tracker.conf的配置如下:
bind_addr=192.168.50.232
base_path=/home/data/fastdfs 该目录根据实际需要自行修改
store_path0=/home/data/fastdfs
tracker_server=192.168.50.232:22122
tracker_server=192.168.50.233:22122
http.server_port=8088 端口可根据实际需要自行修改

在192.168.50.233的机器上修改tracker.conf的配置如下:
bind_addr=192.168.50.233
base_path=/home/data/fastdfs 该目录根据实际需要自行修改
store_path0=/home/data/fastdfs
tracker_server=192.168.50.232:22122
tracker_server=192.168.50.233:22122
http.server_port=8088 端口可根据实际需要自行修改

3.修改storage_ids.conf的配置(/etc/fdfs/storage_ids.conf)都配置成一样即可
 100001   group1  192.168.50.232
 100002   group1  192.168.50.233

 4.启动服务,先分别启动tracker.conf,再分别启动storage_ids.conf

 /usr/bin//fdfs_trackerd /etc/fdfs/tracker.conf start
 /usr/bin/fdfs_storaged /etc/fdfs/storage.conf start

 ps -ef | grep fdfs查看是否启动成功,在/home/data/fastdfs/logs下,也就是上面我们配置的数据目录下可以看到报错或者启动的日志

5.修改测试
tracker_server=192.168.50.233:22122
base_path=/home/data/fastdfs
use_storage_id = true
http.tracker_server_port=8088

测试:sudo fdfs_test /etc/fdfs/client.conf upload client.conf

三、php擴展安裝

cd /home/fastdfs/fastdfs-master/php_client/
phpize
./configure --with-php-config=/usr/bin/php-config
make
make install
sudo sh -c "cat /home/fastdfs/fastdfs-master/php_client/fastdfs_client.ini >> /usr/local/php/etc/php.ini"
然后重启php即可

 

四,應用例子

本人封裝好的類:

<?php

/**
 * Created by PhpStorm.
 * User: tjj
 * Date: 17-4-11
 * Time: 上午10:15
 */
class fdsf
{

    public function __construct()
    {

    }

    /**
     * 输出fdfs的版本号
     */
    public function get_client_version()
    {
        return fastdfs_client_version();
    }

    /**
     * 获取错误记录数
     * 返回值:int
     */
    public function fastdfs_get_last_error_no()
    {
        return fastdfs_get_last_error_no();
    }

    /**
     * 获取错误信息
     * 返回值:string
     */
    public function fastdfs_get_last_error_info()
    {
        return fastdfs_get_last_error_info();
    }

    /**
     * 连接到所有的tracker
     * 返回值:boolean
     */
    public function fastdfs_tracker_make_all_connections()
    {
        return fastdfs_tracker_make_all_connections();
    }

    /**
     * 获得小组统计信息
     * 返回值:array
     */
    public function fastdfs_tracker_list_groups($group_name = '', $tracker_server = array())
    {
        if ($group_name) {
            return fastdfs_tracker_list_groups($group_name);
        }

        if ($group_name && $tracker_server) {
            return fastdfs_tracker_list_groups($group_name, $tracker_server);
        }
        return fastdfs_tracker_list_groups();

    }

    /**
     * 获取一个tracker server连接
     * 返回值:array
     */
    public function fastdfs_tracker_get_connection()
    {
        return fastdfs_tracker_get_connection();
    }

    /**
     * 状态测试
     * 返回值:boolean
     */
    public function fastdfs_active_test($obj)
    {
        return fastdfs_active_test($obj);
    }

    /**
     * 连接服务器
     * 返回值:array
     */
    public function fastdfs_connect_server($ip_addr = '', $port = 0)
    {
        if ($ip_addr && $port) {
            return fastdfs_connect_server($ip_addr, $port);
        }
        return array();
    }

    /**
     * 断开服务器链接
     * 返回值:boolean
     */
    public function fastdfs_disconnect_server($server)
    {
        return fastdfs_disconnect_server($server);
    }

    /**
     * 获取上传服务器的信息列表
     * 返回值:array
     */
    public function fastdfs_tracker_query_storage_store_list($group_name = '', $tracker_server = array())
    {
        if ($group_name) {
            return fastdfs_tracker_query_storage_store_list($group_name);
        }

        if ($group_name && $tracker_server) {
            return fastdfs_tracker_query_storage_store_list($group_name, $tracker_server);
        }

        return fastdfs_tracker_query_storage_store_list();
    }


    /**
     * 获取storage信息
     * 返回值:array
     */
    public function fastdfs_tracker_query_storage_store($group_name = '', $tracker_server = array())
    {
        if ($group_name) {
            return fastdfs_tracker_query_storage_store($group_name);
        }

        if ($group_name && $tracker_server) {
            return fastdfs_tracker_query_storage_store($group_name, $tracker_server);
        }

        return fastdfs_tracker_query_storage_store();
    }

    /**
     * 上传本地文件到服务器
     * 返回值:array
     */
    public function fastdfs_storage_upload_by_filename($local_filename = '', $file_ext_name = null, $meta_list = array(), $group_name = null, $tracker_server, $storage_server)
    {
        return fastdfs_storage_upload_by_filename($local_filename, $file_ext_name, $meta_list, $group_name, $tracker_server, $storage_server);
    }

    /**
     * 上传本地文件到服务器2
     * 返回值:array
     */
    public function fastdfs_storage_upload_by_filename1($local_filename, $file_ext_name = null, $meta_list = array(), $group_name = null, $tracker, $storage)
    {
        return fastdfs_storage_upload_by_filename1($local_filename, $file_ext_name, $meta_list, $group_name, $tracker, $storage);
    }

    /**
     * 上传本地文件到服务器(filebuff)
     * 返回值:array
     */
    public function fastdfs_storage_upload_by_filebuff($content, $file_ext_name = null, $meta_list = array())
    {
        return fastdfs_storage_upload_by_filebuff($content, $file_ext_name, $meta_list);
    }


    /**
     * 以主从文件的形式上传文件。
     * 参数:$local_filename:要上传的从文件;$group:主文件所诉组;$master_filename:主文件的fastdfs路径;$prefix_name:附加名称。
     * 返回值:array
     */
    public function fastdfs_storage_upload_slave_by_filename($local_filename, $group_name, $master_filename, $prefix_name)
    {
        return fastdfs_storage_upload_slave_by_filename($local_filename, $group_name, $master_filename, $prefix_name);
    }

    /**
     * 以主从文件的形式上传文件2。
     * 参数:$local_filename:要上传的从文件;$master_file_id;$prefix_name:附加名称。
     * 返回值:array
     */
    public function fastdfs_storage_upload_slave_by_filename1($local_filename, $master_file_id, $prefix_name)
    {
        return fastdfs_storage_upload_slave_by_filename1($local_filename, $master_file_id, $prefix_name);
    }

    /**
     * 通过文件名得到文件详细信息
     * 返回值:array
     */
    public function fastdfs_get_file_info($group_name, $remote_filename)
    {
        if ($group_name && $remote_filename) {
            return fastdfs_get_file_info($group_name, $remote_filename);
        }
        return array();
    }

    /**
     * 通过文件名得到文件详细信息
     * 返回值:int
     */
    public function fastdfs_storage_file_exist($group_name, $remote_filename)
    {
        if ($group_name && $remote_filename) {
            return fastdfs_storage_file_exist($group_name, $remote_filename);
        }
        return 0;
    }

    /**
     * 删除storaged 文件详细信息
     * 返回值:boolean
     */
    public function fastdfs_storage_delete_file($group_name, $remote_filename)
    {
        if ($group_name && $remote_filename) {
            return fastdfs_storage_delete_file($group_name, $remote_filename);
        }
        return false;
    }

    /**
     * 删除storaged 文件详细信息
     * 返回值:boolean
     */
    public function fastdfs_storage_delete_file1($slave_file_id)
    {
        if ($slave_file_id) {
            return fastdfs_storage_delete_file1($slave_file_id);
        }
        return false;
    }

    /**
     * 由主文件名产生从文件名
     * 返回值:string
     */
    public function fastdfs_gen_slave_filename($master_filename, $prefix_name)
    {
        if ($master_filename && $prefix_name) {
            return fastdfs_gen_slave_filename($master_filename, $prefix_name);
        }
        return false;
    }

    /**
     * 获取token
     * 返回值:string
     */
    public function fastdfs_http_gen_token($remote_filename, $ts)
    {
        if ($remote_filename && $ts) {
            return fastdfs_http_gen_token($remote_filename, $ts);
        }
        return false;
    }

    /**
     * 获取文件内容
     * 返回值:string
     */
    public function fastdfs_storage_download_file_to_buff($group_name, $filename)
    {
        if ($group_name && $filename) {
            return fastdfs_storage_download_file_to_buff($group_name, $filename);
        }
        return false;
    }

    /**
     * 获取文件内容to文件
     * 返回值:string
     */
    public function fastdfs_storage_download_file_to_file($group_name, $filename, $local_filename)
    {
        if ($group_name && $filename && $local_filename) {
            return fastdfs_storage_download_file_to_file($group_name, $filename, $local_filename);
        }
        return false;
    }


    public function fastdfs_storage_set_metadata($group_name, $filename, $meta_list,$flag)
    {
        return fastdfs_storage_set_metadata($group_name, $filename, $meta_list,$flag);
    }


    public function fastdfs_storage_upload_slave_by_filebuff($content, $group_name,$master_filename,$prefix_name,$file_ext_name)
    {
        return fastdfs_storage_upload_slave_by_filebuff($content, $group_name,$master_filename,$prefix_name,$file_ext_name);
    }


}





上傳示例:

upload_test.php

<html>
<head>

</head>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
    <input name="file_name" type="file">
    <input name="ttt" type="text">
    <input type="submit">
</form>
</body>
</html>

upload.php

<?php
/**
 * Created by PhpStorm.
 * User: tjj
 * Date: 17-4-12
 * Time: 上午11:28
 */

include_once("./fdfs.php");
if ($_FILES["file_name"]["error"] == 0) {
    $f = new fdsf();
    //tracker server
    $tracker = $f->fastdfs_tracker_get_connection();
    /*var_dump($tracker);
    $f->fastdfs_active_test($tracker);
    var_dump($f->fastdfs_get_last_error_info());
    exit;*/
    if (!$f->fastdfs_active_test($tracker)) {
        echo "fastdfs_active_test errno: " . $f->fastdfs_get_last_error_no() . ", error info: " . $f->fastdfs_get_last_error_info();
    }
    $server = fastdfs_connect_server($tracker['ip_addr'], $tracker['port']);
    //storage server
    $storage = $f->fastdfs_tracker_query_storage_store();
    if (!$storage) {
        echo "fastdfs_tracker_query_storage_store errno: " . $f->fastdfs_get_last_error_no() . ", error info: " . $f->fastdfs_get_last_error_info();
        exit(1);
    }
    $server = $f->fastdfs_connect_server($storage['ip_addr'], $storage['port']);
    if (!$server) {
        echo "fastdfs_connect_server errno: " . $f->fastdfs_get_last_error_no() . ", error info: " . $f->fastdfs_get_last_error_info();
        exit(1);
    }
    if (!$f->fastdfs_active_test($server)) {
        echo "fastdfs_active_test errno: " . $f->fastdfs_get_last_error_no() . ", error info: " . $f->fastdfs_get_last_error_info();
        exit(1);
    }
    $storage['sock'] = $server['sock'];

    $file_info = $f->fastdfs_storage_upload_by_filebuff(file_get_contents($_FILES["file_name"]["tmp_name"]), "jpg");
    if ($file_info) {
        $group_name = $file_info['group_name'];
        $remote_filename = $file_info['filename'];
        file_put_contents('./upload.txt', "group_name={$group_name}|remote_filename={$remote_filename}\n", FILE_APPEND);
    };
    var_dump($file_info);
}

下載示例download.php

<?php
/**
 * Created by PhpStorm.
 * User: tjj
 * Date: 17-4-12
 * Time: 下午12:00
 */
include_once("fdfs.php");
$f = new fdsf();
//tracker server
$tracker = $f->fastdfs_tracker_get_connection();
if (!$f->fastdfs_active_test($tracker)) {
    echo "fastdfs_active_test errno: " . $f->fastdfs_get_last_error_no() . ", error info: " . $f->fastdfs_get_last_error_info();
}
$server = fastdfs_connect_server($tracker['ip_addr'], $tracker['port']);
//storage server
$storage = $f->fastdfs_tracker_query_storage_store();
if (!$storage) {
    echo "fastdfs_tracker_query_storage_store errno: " . $f->fastdfs_get_last_error_no() . ", error info: " . $f->fastdfs_get_last_error_info();
    exit(1);
}
$server = $f->fastdfs_connect_server($storage['ip_addr'], $storage['port']);
if (!$server) {
    echo "fastdfs_connect_server errno: " . $f->fastdfs_get_last_error_no() . ", error info: " . $f->fastdfs_get_last_error_info();
    exit(1);
}
if (!$f->fastdfs_active_test($server)) {
    echo "fastdfs_active_test errno: " . $f->fastdfs_get_last_error_no() . ", error info: " . $f->fastdfs_get_last_error_info();
    exit(1);
}
$storage['sock'] = $server['sock'];

$local_filename = 'test.jpg';
echo 'storage_download_file_to_file result: ' .
    $f->fastdfs_storage_download_file_to_file("group1","M00/00/00/oYYBAFj5sbWAAJLFAAAFtidO_ME83.jpg" , $local_filename) . "\n";

PS:其实,我们可以在测试的时候发现,在web访问时,nginx并没有轮询选择tracker,而是根据自己本身所在的服务选择自己的tracker,但是储存器storager是有实现了轮询。所以当192.168.50.232上tracker的挂掉,也就192.168.50.232上的nginx上访问的用户会出现通信失败的错误。tracker结合nginx的轮询,我们下回分解

转载于:https://my.oschina.net/u/2394701/blog/884620

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值