部署分布式存储系统FastDFS

原创
2015/08/28 15:13
阅读数 7.8K

FastDFS是分布式存储系统,可以提供图片服务。

在本机使用vmware虚拟机安装,供使用8台机器,架构如下:

第一天:

准备了VMWARE虚拟机,linux操作系统,当时想选择centos6.5,但是安装后有问题,本人又不喜欢centos7,选择了ubuntu14.04 server版,共创建复制了11台机器。

下载了FastDFS   5.05版本相关软件。


第二天:

准备了Ansible 自动化运维工具,并熟悉各种模块,本来就这几台机器,手工在每台机器上操作,也安装fastdfs成功了。但本着学习的目的,还是撑着使用ansible来复制文件,修改文件熟悉,运行命令,运行脚本等操作,因为不熟悉,和碰到几个问题,还有就是网速慢,折腾了一天,今天碰到的最大的两个问题记录下来,

第一个:

ansible在ubuntu中执行需要root权限时,即使提供了sudo参数和密码,也无法成功的原因,是因为命令中没有使用sudo的原因,例如:

ansible all -a "sudo apt-get install gcc " --sudo --ask-sudo-pass 正确

写成

ansible all -a "apt-get install gcc" --sudo --ask-sudo-pass   错误

因为不熟悉,简单的问题,折腾的我还是很难受。晚上思考后,发现是这样解决的,第二天测试通过,当时为这个问题专门百度和加群解决,发现时间浪费了不少,可是没有人回答。

第二个:

2,获取某个文件的第二行第二列的写法如下:

`sed -n "2,1p" /etc/hosts | awk '{print $2}'`

其中sed -n "2,1p"  /etc/hosts代表从文件/etc/hosts打印第二行到第一行,因1<2,所以第一行不打印,如果第二个参数为3,就打印第二行,第三行。

p参数代表打印,-n参数代表静默

awk '{print $2}'

代表打印给出的文本第二列。$0代表全部,$1代表第1列。

这个问题是因为我想更改主机名称。


第三天

今天开始安装Tracker Server,安装两台,

tracker server配置文件

# bind an address of this host

# empty for bind all addresses of this host

bind_addr=192.168.127.133

#绑定地址,对于多网卡,特别有用

# the tracker server port

port=22122

#绑定端口,如果此处修改,用的tracker server的端口都需要修改

# connect timeout in seconds

# default value is 30s

connect_timeout=30

#连接超时时间

# network timeout in seconds

# default value is 30s

network_timeout=60

#网络超时时间

# the base path to store data and log files

base_path=/mnt/fastdfs_tracker

#存储基本路径

# max concurrent connections this server supported

max_connections=256

#最大并发连接数

# accept thread count

# default value is 1

# since V4.07

accept_threads=1


# work thread count, should <= max_connections

# default value is 4

# since V2.00

work_threads=4


# the method of selecting group to upload files

# 0: round robin

# 1: specify group

# 2: load balance, select the max free space group to upload file

store_lookup=0

#上传文件选择group策略

# which group to upload file

# when store_lookup set to 1, must set store_group to the group name

store_group=group2

#

# which storage server to upload file

# 0: round robin (default)

# 1: the first server order by ip address

# 2: the first server order by priority (the minimal)

store_server=0

#上传文件选择存储服务器策略

在编译安装track server是,碰到这样的问题,

无法找到文件 "logger.h"

答案是百度到的,需要安装另一个包libfastcommon。

在启动tracker server时报错如下:

/usr/bin/fdfs_trackerd: error while loading shared libraries: libfastcommon.so: 

网上提到这个问题还是很多的,我的解决方法如下:

首先,我安装是默认安装,在./configure时未加任何参数。

然后,在/usr/lib64目录下可以找到该libfastcommon.so,

建立软连接,

sudo ln -sv /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so

sudo ldconfig

这样我的问题就解决了。


第四天

今天安装storage server,4台

安装步骤同昨天安装tracker server,不同的是配置文件不一样,昨日使用的tracker.conf,今天的为storage.conf

Storage Server配置文件

# the name of the group this storage server belongs to

#

# comment or remove this item for fetching from tracker server,

# in this case, use_storage_id must set to true in tracker.conf,

# and storage_ids.conf must be configed correctly.

group_name=group1

#group的名称,此处为划分group项,重要参数,如果想让这台存储机器化到group1,就写group1

# bind an address of this host

# empty for bind all addresses of this host

bind_addr=


# if bind an address of this host when connect to other servers 

# (this storage server as a client)

# true for binding the address configed by above parameter: "bind_addr"

# false for binding any address of this host

client_bind=true


# the storage server port

port=23000


# connect timeout in seconds

# default value is 30s

connect_timeout=30


# network timeout in seconds

# default value is 30s

network_timeout=60


# heart beat interval in seconds

heart_beat_interval=30


# disk usage report interval in seconds

stat_report_interval=60


# the base path to store data and log files

base_path=/mnt/fastdfs_storage_info

#存储基本路径

# max concurrent connections the server supported

# default value is 256

# more max_connections means more memory will be used

max_connections=256

#最大并发连接数

# the buff size to recv / send data

# this parameter must more than 8KB

# default value is 64KB

# since V2.00

buff_size = 256KB

# path(disk or mount point) count, default value is 1

store_path_count=1

#存储路径数量

# store_path#, based 0, if store_path0 not exists, it's value is base_path

# the paths must be exist

store_path0=/mnt/fastdfs_storage_data

#store_path1=/mnt/fastdfs_storage_data1

#这里根据实际来选择,如果机器挂载两块硬盘做存储,可以设置两个存储路径

# subdir_count  * subdir_count directories will be auto created under each 

# store_path (disk), value can be 1 to 256, default value is 256

subdir_count_per_path=256


# tracker_server can ocur more than once, and tracker_server format is

#  "host:port", host can be hostname or ip address

tracker_server=192.168.127.133:22122

#tracker server地址

#tracker_server=192.168.127.134:22122


还需要安装nginx,我使用源码编译。

安装步骤很简单,下载zlib、pcre、openssl、fastdfs-nginx-module、nginx

以上压缩包全部解压缩。

进入nginx源码目录

配置如下:

./configure --prefix=/usr/local/nginx --add-module=/root/fastdfs-nginx-module/src --with-http_ssl_module --with-pcre=/root/pcre-8.37 --with-openssl=/root/openssl-1.0.2d --with-zlib=/root/zlib-1.2.8

make

make install

安装目录在/usr/local/nginx

今天还碰到一个问题,意思是无法找到libfdfsclient.so,处理方法同libfastcommon.so

nginx配置

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

cp fastdfs-5.05/conf/{anti-steal.jpg,http.conf,mime.types} /etc/fdfs/

touch /var/log/mod_fastdfs.log

chown nobody.nobody /var/log/mod_fastdfs.log


server {

listen 80;

server_name localhost;

location /G1/M00{

root /data2/;

ngx_fastdfs_module;

}

}


配置mod_fastdfs.conf

connect_timeout=2

network_timeout=30

base_path=/tmp

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.1.131:22122

tracker_server=192.168.1.132:22122

storage_server_port=23000

group_name=G1

url_have_group_name = true

store_path_count=1

store_path0=/data2/

log_level=info

log_filename=/var/log/mod_fastdfs.log

response_mode=proxy

if_alias_prefix=

#include http.conf

flv_support = true

flv_extension = flv

group_count = 2

[group1]

group_name=G1

storage_server_port=23000

store_path_count=1

store_path0=/data2/

[group2]

group_name=G2

storage_server_port=23000

store_path_count=1

store_path0=/data2/


第五天

今天安装了ntp时间服务器,因现在为测试,将ntp服务合并到admin服务器上。

全部机器都安装ntp,安装很简单,一个命令就可以。

命令为:sudo apt-get install ntp

安装完毕后,差别主要在配置文件上,

服务器的配置文件如下:

关键配置项,其中restrict项限制本地网络不能修改

server time.windows.com prefer

server 127.127.1.0

fudge 127.127.1.0  stratum 10

#不允许来自公网ipv4和ipv6客户端访问

restrict -4 default kod notrap nomodify nopeer noquery 

restrict -6 default kod notrap nomodify nopeer noquery

#

restrict 192.168.127.0 mask 255.255.255.0 nomodify

restrict 127.0.0.1

restrict ::1

ntp客户端配置文件如下:

关键配置,这里只配置了本地的ntp server

# Specify one or more NTP servers.

server 192.168.127.101

restrict 127.0.0.1

restrict ::1

在安装时间服务器的时候,顺便有设置时区的问题,ubuntu设置时区很简单:

ubuntu时区调整命令:

dpkg-reconfigure tzdata

第六天

今天安装redis,我使用的ubuntu,安装redis很简单,

使用命令:

sudo apt-get install redis-server

安装完成后,可以参考redis.io官网进行配置,生产环境可以做主从,如果对丢失数据有苛刻性,可以使用mysql做为辅助,网上的例子很多,我使用默认配置。

我使用redis主要用来存放图片名称和图片路径的关系。

第七天

今天安装fastdfs监控,fastdfs-zyc

1,安装jdk1.6+

到jdk官方网站可以下载所需的的jdk,

http://www.oracle.com/technetwork/java/javase/downloads/index.html

上传到服务器,解压缩jdk

tar -zxf jdk-7u11-linux-x64.gz

mv jdk1.7.0_11/ /usr/local

配置java全局环境变量

vim /etc/profile

添加:

export JAVA_HOME=/usr/local/jdk1.7.0_11

export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin

输入以下命令生效,source /etc/profile

2,安装tomcat6+(适配jdk版本)

tomcat官方网站http://tomcat.apache.org/ 下载最新的tomcat.本文以tomcat7.0.35为例

tar -zxvf apache-tomcat-7.0.35.tar.gz

进入/usr/local/ apache-tomcat-7.0.35/bin目录,

执行:./startup.sh 看启动是否正常 ,正常启动出现如下信息

Using CATALINA_BASE:   /usr/local/apache-tomcat-7.0.35

Using CATALINA_HOME:   /usr/local/apache-tomcat-7.0.35

Using CATALINA_TMPDIR: /usr/local/apache-tomcat-7.0.35/temp

Using JRE_HOME:        /usr/local/jdk1.7.0_11

Using CLASSPATH:       /usr/local/apache-tomcat-7.0.35/bin/bootstrap.jar:/usr/local/apache-tomcat-7.0.35/bin/tomcat-juli.jar

 

 linux 防火墙8080(使用tomcat默认端口)端口

vim /etc/sysconfig/iptables

-A INPUT -i eth0 -p tcp -m tcp --dport 8080 -j ACCEPT

重启 防火墙服务

service iptables restart

在浏览器内访问:http:// {serviceIp}:8080/看能否出现tomcat的默认页面



3,安装mysql

yum install mysql-server

b)修改数据库字符集设置

 mysql配置文件/etc/my.cnf中加入default-character-set=utf8

c)启动mysql 服务

  service mysqld start或者/etc/init.d/mysqld start

d)添加mysql到启动项

  chkconfig --add mysqld

e)创建toot管理员

mysqladmin -u root password 1qazxsw2 

f)使用root登录 ,创建fastdfs数据库

  mysql -uroot -p

mysql > create database fastdfs;

远程访问

   开放防火墙的端口号

vim /etc/sysconfig/iptables

-A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT



4,上传fastdfs-zyc到tomcat webapps目录下,fastdfs-zyc下载地址:https://github.com/canmind/fastdfs-zyc

unzip fastdfs-zyc.zip

5,导入监控系统默认的表结构及初始化数据

mysql -uroot -p --default-character-set UTF8 fastdfs < fdfs.sql

6,修改数据库配置连接

修改application.properties 

datasource.url=jdbc:mysql://localhost:3306/fastdfs?useUnicode=true&characterEncoding=UTF-8

datasource.username=root

datasource.password=1qazxsw2

7,修改企业邮箱配置

mail.smtp.host=demo.temp.com

mail.smtp.username=demo

mail.smtp.password=demo

8,修改fastdfs_client.conf

配置 tracker_server ip= 192.168.20.140:22122

9,修改config.xml配置storage节点

<?xml version="1.0" encoding="UTF-8"?>

<root>

    <server>

        <ip>192.168.20.141</ip>

        <port>22</port>

        <username>root</username>

        <password>1qazxsw2</password>

        <logpath>/usr/local/nginx-1.3.4/logs/</logpath>

    </server>

    <server>

        <ip>192.168.20.144</ip>

        <port>22</port>

        <username>root</username>

        <password>1qazxsw2</password>

        <logpath>/usr/local/nginx-1.3.4/logs/</logpath>

    </server>

    <!--    方式1

        <ssh>/Users/Chen/.ssh/id_rsa</ssh>

        <ip>192.168.40.53</ip>

        <port>22</port>

        <username>root</username>

        <logpath>/usr/local/nginx-1.3.4/logs/</logpath>

    </server>

    -->

    <!--方式2

        <ip>192.168.40.53</ip>

        <username>root</username>

        <password>vivame@2012</password>

        <logpath>/usr/local/nginx-1.3.4/logs/</logpath>

    </server>

    -->

</root>


11,重新启动tomcat即可访问监控系统。


第八天

今天安装文件去重模块,作为文件存储服务器,如果没有去重功能,随着文件容量的增大,会发现文件重复的会有很多。

fastdfs天生支持去重的是fastdht。

FastDHT 是一个基于键值对的高效分布式 hash 系统, 可以存储文件名和 file_id的映射表、 session

数据、用户相关数据等等,底层采用 Berkeley DB 做数据库来持久存储数据(也可以使用 SSDB),数

据同步方式是使用自己的 binlog 复制方式

FastDHT 集群由一个或者多个组 group 组成,每个组可以有一台或者多台组成,同组服务器上

存储的数据是相同的,数据同步只在同组的服务器之间进行;组内各个服务是对等的,对数据进行

存取时,可以根据 key 的 hash 值来决定使用哪台机器(具体参考

https://github.com/happyfish100/fastdht),数据同步采用推(Push)的方式,由源服务器主动

将数据同步到本组的其他服务器

可以独立部署 FastDHT 集群,也可以整合到 storage server 上面

先安装 berkeley-db

网上教程一大堆

我安装还是很简单的,但以前折腾了一天,如果按网上教程的版本来安装,不会出问题,就是害怕版本不匹配,总会发生莫名奇妙的问题。

https://github.com/happyfish100/下载最新的libfastcomm,fastdht,先编译安装libfastcomm,再安装fastdht。

安装很简单,下面是配置文件

先配置fdht_servers.conf

group_count = 1

group0 = 192.168.127.135:11411

group0 = 192.168.127.136:11411

再配置fdhtd.conf

我按最简单配置,就只配置了

base_path项

最后配置storage.conf,这个是fastdht和fastdfs发生关系的地方。

修改并新增如下项:

check_file_duplicate=1

keep_alive=1

#include /etc/fdht/dfht_servers.conf

最后启动fdhtd服务并重启storage服务

/usr/local/bin/fdhtd /etc/fdht/fdhtd.conf start

fdfs_storaged /etc/fdfs/storage.conf restart



展开阅读全文
打赏
0
6 收藏
分享
加载中

引用来自“longfirst”的评论

引用来自“徐留白”的评论

请问下,这里的redis你是作何使用, 场景是怎样的?

redis用来存图片和存储的映射关系
方便私信个qq吗?沟通交流下,谢谢!
2015/09/18 11:43
回复
举报

引用来自“longfirst”的评论

引用来自“徐留白”的评论

请问下,这里的redis你是作何使用, 场景是怎样的?

redis用来存图片和存储的映射关系
我也是这个场景,感觉方案非常相似,fdfs上加了mysql和redis,用来存储原始文件和fdfs生的文件id的映射关系。
2015/09/18 11:43
回复
举报
longfirst博主

引用来自“徐留白”的评论

请问下,这里的redis你是作何使用, 场景是怎样的?

redis用来存图片和存储的映射关系
2015/09/17 17:12
回复
举报
请问下,这里的redis你是作何使用, 场景是怎样的?
2015/09/17 16:19
回复
举报
更多评论
打赏
4 评论
6 收藏
0
分享
返回顶部
顶部