STF 更新到 2.0 版本,支持使用 redis 队列做任务分发,比原先的 Q4M 容易上手多了;新增了 cluster 概念,虽然目前看没什么用,不过估计以后肯定要在这方面做文章的。

部署步骤如下:

    # 因为 stf 要求在 Perl5.12 以上运行,CentOS6 还是 5.10 的老版本,所以直接用 Debian 测试了
    apt-get install -y memcached redis-server libmysqlclient-dev libdbd-mysql-perl
    # 设置 mysql-server 包安装时需要的问答
    echo mysql-server-5.5 mysql-server/root_password select 123456 | debconf-set-selections
    echo mysql-server-5.5 mysql-server/root_password_again select 123456 | debconf-set-selections
    apt-get install mysql-server-5.5
    # 系统依赖解决,开始 perl 部分
    git clone git://github.com/stf-storage/stf.git
    cd stf
    cpanm Redis Data::Dumper::Concise
    cpanm --installdeps .
    # 创建 mysql 库和用户
    mysql -uroot -p -e 'create database stf'
    mysql -uroot -p -e 'grant all privileges on stf.* to stf@"%" identified by "654321"'
    # 默认监听本机,分布式系统肯定是要放开这个的
    sed -i 's/127.0.0.1/0.0.0.0/' /etc/mysql/my.cnf
    service mysql restart
    # 导入 sql 建表
    mysql -ustf -p stf < misc/stf.sql
    # 给 worker 和 dispatcher 设置队列使用 redis
    export STF_QUEUE_TYPE=Redis
    export STF_REDIS_HOSTPORT=192.168.0.101:6379
    # 所有的角色都要有自己独有的 hostid
    export STF_HOST_ID=1
    export STF_HOME=/root/stf
    # 启动 dispatcher,这里目前还只会用 plack,不知道怎么用 nginx/apache
    export USE_PLACK_REPROXY=1
    # 研究阶段可以打开 debug 看系统是怎么分发怎么平衡怎么确定使用哪个storage的file的过程
    export STF_DEBUG=1
    plackup -a etc/dispatcher.psgi
    # 启动 worker
    ./bin/stf-worker
    # 启动管理界面网站,可以通过 web 添加 cluster 和 storage
    plackup -a etc/admin.psgi -p 9000 &
    # 一个 cluster 下至少需要有 3 个 storage,这里用三个目录三个端口来模拟
    mkdir -p /data{1,2,3}
    export STF_STORAGE_ROOT=/data1
    plackup -a etc/storage.psgi -p 8888 &
    export STF_STORAGE_ROOT=/data2
    plackup -a etc/storage.psgi -p 8889 &
    export STF_STORAGE_ROOT=/data3
    plackup -a etc/storage.psgi -p 8890 &

然后上 9000 端口的 web 添加 cluster 和 storage,如下截图:

cluster

storage

最后测试一下上传下载,如果上面 psgi 是 DEBUG 运行的,就可以看到详细的过程了。

    lwp-request -m PUT http://192.168.0.101/bucket
    ^D
    lwp-request -m PUT http://192.168.0.101:5000/bucket/test.txt
    test
    ^D
    lwp-request http://192.168.0.101:5000/bucket/test.txt
    ls /data1/p/e/g/k/pegkuclninhsyqxftuzpwcuhgughpa.txt
    ls /data2/p/e/g/k/pegkuclninhsyqxftuzpwcuhgughpa.txt

2013 年 03 月 20 日更新

前面测试记录的,都是纯 perl 的部分。实际运用的时候,有些地方是可以用 nginx 来替代的。

源代码包中,apache-sample.conf 比 nginx-sample.conf 要全面的多。不过其实还是 nginx 配置起来容易,比如给 dispatcher.psgi 加上 nginx 代理,只需要这样就可以了:

server {
    listen 80;
    server_name stf;
    location / {
        proxy_pass http://192.168.0.101:5000/;
    }
    location /reproxy {
        internal;
        set $reproxy $upstream_http_x_reproxy_url;
        proxy_pass $reproxy;
    }
}

然后我们就可以直接通过 http://192.168.0.101/bucket/test.txt 来访问了。