Docker搭建非集群FastDFS文件系统(详细教程+原理讲解)
1.修改hosts将文件服务器的IP映射到自定义域名,因为Storage Server的配置文件storage.conf和Tacker Server的配置文件client.conf都需要去配置Tracker Server所在的服务器地址。加入Tarcker Server所在服务器的IP发生变化,就只需要修改所有服务器上的/etc/hosts即可。192.168.110.133是我宿主机的IP,ww
1.修改hosts
将文件服务器的IP映射到自定义域名,因为Storage Server
的配置文件storage.conf
和Tacker Server
的配置文件client.conf
都需要去配置Tracker Server
所在的服务器地址。加入Tarcker Server
所在服务器的IP发生变化,就只需要修改所有服务器上的/etc/hosts
即可。
192.168.110.133
是我宿主机的IP,www.quincy-fastdfs.com
是我自定义的域名。接下来将会将这个IP域名的映射添加到所有提供服务的节点(例如所有的Tracker Server
和Storage Server
节点)以及需要访问服务的节点(例如虚拟机外的物理主机)所在服务器(容器)内的hosts映射表上。
所有容器在创建时必须使用--add-host
参数指定自定义的域名与IP之间的映射。若在容器启动后修改/etc/hosts,仅本次启动有效,重启就还原。
到达容器内的的TCP包的源地址都是docker0网桥的IP(即127.0.0.1),当Storage Server注册到Tracker Server时就会出现问题,因为Tracker Server会根据TCP的表头数据中的源地址确认Storage Server的IP,所以在宿主机中增加NAT的转发规则。
# 在宿主机上查看IP
ifconifg
# 在宿主机上修改hosts
sudo vim /etc/hosts
# 添加路由规则
# 172.17.0.3位Tracker Server所在容器的IP
# 192.168.110.133位宿主机的IP
# 当Tracker Server搭建在真是的物理机上无需添加一下规则
# 有多少台Storage Server就需要添加多少条以下规则,只需要改变终点IP,源IP都是Docker所在宿主机的IP
# 当宿主机IP发生变化时,也需要更重新改路由规则
sudo iptables -t nat -A POSTROUTING -p tcp -m tcp -d 172.17.0.3 --dport 22122 -j SNAT --to 192.168.110.133
iptables –[A|I 链] [-i|o 网络接口] [-p 协议] [-s 来源ip/网域] [-d 目标ip/网域] –j[ACCEPT|DROP]
参数 作用 -P 设置默认策略:iptables -P INPUT (DROP|ACCEPT) -F 清空规则链 -L 查看规则链 -A 在规则链的末尾加入新规则 -I num 在规则链的头部加入新规则 -D num 删除某一条规则 -s 匹配来源地址IP/MASK,加叹号"!"表示除这个IP外。 -d 匹配目标地址 -i 网卡名称 匹配从这块网卡流入的数据 -o 网卡名称 匹配从这块网卡流出的数据 -p 匹配协议,如tcp,udp,icmp –dport num 匹配目标端口号 –sport num 匹配来源端口号 参考链接:
https://www.zsythink.net/archives/1199/https://www.cnblogs.com/whych/p/9147900.html
http://www.choupangxia.com/2020/07/23/docker-fastdfs-storage-ip/
https://blog.csdn.net/chj_1224365967/article/details/109206131
# 需要访问的服务的节点
# Window的shosts所在目录
C:\Windows\System32\drivers\etc\hosts
# Linux的hosts所在目录
/etc/hosts
2.在宿主机上创建FastDFS存放数据的挂载目录
挂载目录的目的时候方便宿主机以挂载目录为中介访问容器内的文件。
在FastDFS容器创建成功后
tracker
和storage
会根据在base_path
(tracker
的base_path
默认容器路径为/fastdfs/tracker
,storage
的base_path
默认路径为/fastdfs/storage
)的目录下自动创建data
和logs
两个目录。data
用于存储分组信息和存储服务列表,logs
用于存储日志文件。storage
的配置文件storage.conf
中可以通过配置base_path0
(storage
的base_path
0默认路径为/fastdfs/store_path
)指定storage
具体文件的存储路径,否则base_path0
将会直接使用base_path
的存储路径做为具体文件的存储路径。
需要注意的是,容器挂载到宿主机的目录下的数据不会随着容器的删除而删除,因为这部分数据已经做了持久化,若需要删除需要手动rm -rf
。
sudo rm -rf /usr/local/server/
# 以下创建的三个目录均在宿主机上,通过docker挂载的方式将对应容器内的指定目录映射到以下三个目录上
sudo \
mkdir -p /usr/local/server/fastdfs/tracker \
mkdir -p /usr/local/server/fastdfs/storage \
mkdir -p /usr/local/server/fastdfs/store_path \
mkdir -p /usr/local/server/fastdfs/nginx
# (base_path的目录结构)以tacker server为例
${base_path}
|__data
| |__storage_groups.dat:存储分组信息
| |__storage_servers.dat:存储服务器列表
|__logs
| |__trackerd.log: tracker server 日志文件
3.创建tracker容器(跟踪服务器容器)
镜像采用
season/fastdfs:1.2
不要用lastest
, 因为lastest
不包含nginx
服务,其他fasdfs
镜像均没有season
的精简。
season/fastdfs:1.2
知识代表fastdfs
这个镜像文件的版本是1.2
,并非说明FastDFS
是V1.2
版本。
所有容器在创建时必须使用--add-host
参数指定自定义的域名与IP之间的映射。若在容器启动后修改/etc/hosts,仅本次启动有效,重启就还原。
**nginx.conf
中listen 80
端口值是要与/etc/fdfs/storage.conf
中的http.server_port=80
相对应。**如果/etc/fdfs/storage.conf
中的http.server_port
改成其它端口,则需要将两者统一。
sudo docker run \
-id \
--name tracker \
-p 22122:22122 \
--restart=always \
--net bridge \
--add-host www.quincy-fastdfs.com:192.168.110.133 \
-v /usr/local/server/fastdfs/tracker:/fastdfs/tracker \
-v /etc/localtime:/etc/localtime \
season/fastdfs:1.2 tracker
# 进入tracker容器
sudo docker exec -it tracker bash
#查看FastDFS版本
fdfs_test
# 退出tracker容器
exit
4.创建storage容器(存储服务器容器)
sudo docker run \
-id \
--name storage \
-p 23000:23000 \
--restart=always \
--net bridge \
--add-host www.quincy-fastdfs.com:192.168.110.133 \
-v /usr/local/server/fastdfs/storage:/fastdfs/storage \
-v /usr/local/server/fastdfs/store_path:/fastdfs/store_path \
-v /etc/localtime:/etc/localtime \
-e GROUP_NAME="group1" \
-e TRACKER_SERVER="www.quincy-fastdfs.com:22122" \
season/fastdfs:1.2 storage
配置文件storage.conf
默认将数据保存在容器内的base_path0=/fastdfs/store_path/
的路径下,如果base_path0
的值为空,则默认将存储数据保存在base_path=/fastdfs/storage
。
(选做)如果需要更改数据存储(区别data
目录存储的分组信息和存储服务列表,这里说的数据存储是指用户上传的文件数据)路径,只需要修改base_path0
,随后重启tracker
和storage
即可。
(选做)切记修改配置文件成功后,要先清除storage
默认初始化的数据目录/fastdfs/store_path
,然后在容器内手动创建base_path0
,最后**分别进入tracker
和storage
的终端重启服务。**如果只重启storage
,而tracker
关于storage
的配置文件没有刷新,可能会出现找不到storage
的数据存储目录的情况。
(选做)storage
重启后理论上会根据新的配置文件在新设置的base_path0
目录下重新mkdir
存储数据的两级目录(每级目录中默认创建256个子目录)。如果storage
的日志没有输出这部分的内容,就算服务都启动成功,在tracker
的客户端中上传文件大概率会出错。
这里我采用保持默认的base_path0=/fastdfs/store_path/data
存放storage
的存储上传文件的数据,所以选做步骤并没有经过验证。
5.修改client.conf配置文件
# 进入tracker节点终端
sudo docker exec -it tracker bash
# 在容器中将tracker下的client.conf复制到挂载目录下
cp /etc/fdfs/client.conf /fastdfs/tracker/
# 退出容器
exit
# 在宿主机中修改配置文件client.conf(增加Tracker Server的地址和端口)
sudo vim /usr/local/server/fastdfs/tracker/client.conf
# 再次从宿主机中进入容器终端
sudo docker exec -it tracker bash
# 在容器中将处于挂载目录下的配置文件client.conf拷贝并覆盖/etc/fdfs/client.conf下的配置文件
mv -f /fastdfs/tracker/client.conf /etc/fdfs/client.conf
# 在容器中输出日志文件,检查是否成功修改文件
cat /etc/fdfs/client.conf
# 返回宿主机
exit
# 如果前面没有添加路由规则则需要执行该步骤,否则可以跳过
# 添加路由规则
# 到达容器内的的TCP包的源地址都是docker0网桥的IP(即127.0.0.1),当Storage Server注册到Tracker Server时就会出现问题,因为Tracker Server会根据TCP的表头数据中的源地址确认Storage Server的IP,所以在宿主机中增加NAT的转发规则
sudo iptables -t nat -A POSTROUTING -p tcp -m tcp -d 172.17.0.3 --dport 22122 -j SNAT --to 192.168.110.133
# 再次从宿主机中进入容器终端
sudo docker exec -it tracker bash
# 重新启动连接客户端
fdfs_monitor /etc/fdfs/client.conf
[2022-04-03 18:08:14] DEBUG - base_path=/fastdfs/client, connect_timeout=30, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0
server_count=1, server_index=0
tracker server is 192.168.110.133:22122
group count: 1
Group 1:
group name = group1
disk total space = 10015 MB
disk free space = 2947 MB
trunk free space = 0 MB
storage server count = 1
active server count = 1
storage server port = 23000
storage HTTP port = 8888
store path count = 1
subdir count per path = 256
current write server index = 0
current trunk file id = 0
Storage 1:
id = 192.168.110.133
ip_addr = 192.168.110.133 (www.quincy-fastdfs.com) ACTIVE
http domain =
version = 4.08
join time = 2022-04-03 18:05:38
up time = 2022-04-03 18:05:38
total storage = 10015 MB
free storage = 2947 MB
upload priority = 10
store_path_count = 1
subdir_count_per_path = 256
storage_port = 23000
storage_http_port = 8888
current_write_path = 0
source storage id=
if_trunk_server= 0
total_upload_count = 0
success_upload_count = 0
total_append_count = 0
success_append_count = 0
total_modify_count = 0
success_modify_count = 0
total_truncate_count = 0
success_truncate_count = 0
total_set_meta_count = 0
success_set_meta_count = 0
total_delete_count = 0
success_delete_count = 0
total_download_count = 0
success_download_count = 0
total_get_meta_count = 0
success_get_meta_count = 0
total_create_link_count = 0
success_create_link_count = 0
total_delete_link_count = 0
success_delete_link_count = 0
total_upload_bytes = 0
success_upload_bytes = 0
total_append_bytes = 0
success_append_bytes = 0
total_modify_bytes = 0
success_modify_bytes = 0
stotal_download_bytes = 0
success_download_bytes = 0
total_sync_in_bytes = 0
success_sync_in_bytes = 0
total_sync_out_bytes = 0
success_sync_out_bytes = 0
total_file_open_count = 0
success_file_open_count = 0
total_file_read_count = 0
success_file_read_count = 0
total_file_write_count = 0
success_file_write_count = 0
last_heart_beat_time = 2022-04-03 18:08:12
last_source_update = 1970-01-01 08:00:00
last_sync_update = 1970-01-01 08:00:00
last_synced_timestamp = 1970-01-01 08:00:00
6.文件上传测试
# 从宿主机中进入tracker终端
sudo docker exec -it tracker bash
# 在根目录创建一个txt文件
echo "niceyoo" > niceyoo.txt
# 通过 fdfs_upload_file 命令将 niceyoo.txt 文件上传至服务器
fdfs_upload_file /etc/fdfs/client.conf niceyoo.txt
文件上传成功,在FastDFS分布式文件系统中的路径位group1/M00/00/00/rBEABGJJcquAC3VRAAAACBfWGpM964.txt
,如下图。
7.配置Nginx
FastDFS 通过 Tracker 服务器,将文件放在 Storage 服务器存储, 但是同组存储服务器之间需要进行文件复制, 有同步延迟的问题。
假设 Tracker 服务器将文件上传到了 192.168.51.128,上传成功后文件 ID已经返回给客户端。
此时 FastDFS 存储集群机制会将这个文件同步到同组存储 192.168.51.129,在文件还没有复制完成的情况下,客户端如果用这个文件 ID 在 192.168.51.129 上取文件,就会出现文件无法访问的错误。
而 fastdfs-nginx-module 可以重定向文件链接到源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。
参考链接:https://www.cnblogs.com/chiangchou/p/fastdfs.html#_label1_5
season/fastdfs:1.2
已经包含了nginx
,并且nginx
已经添加了fastdfs-nginx-module-master/src
模块。
# 本质上tracker、storage和fastdfs-nginx都是同一份镜像文件,知识创建不同容器时使用不同的配置文件,以提供相应的服务,所以可以直接在storage中查看已经安装的nginx版本
# 在storage中查看nginx版本
nginx -V
# 在宿主机中登录超级用户
su root
# 从宿主机中进入容器终端
sudo docker exec -it storage bash
# 将容器storage中的nginx.conf配置文件复制到挂载目录
cp /etc/nginx/conf/nginx.conf /fastdfs/storage
# 退出容器
exit
# 在宿主机中查看挂载目录
ls -l /usr/local/server/fastdfs/storage
# 在宿主机中修改配置文件nginx.conf
sudo vim /usr/local/server/fastdfs/storage/nginx.conf
# 在宿主机中将配置文件nginx.conf移动到nginx挂载目录
sudo mv -f /usr/local/server/fastdfs/storage/nginx.conf /usr/local/server/fastdfs/nginx
在80端口下添加ngx_fastdfs_module
模块。
location / {
root /fastdfs/store_path/data;
ngx_fastdfs_module;
}
创建nginx
容器,将主机的/usr/local/server/fastdfs/nginx
挂载到nginx
容器上。
注意需要替换Tracker Server
的IP地址。
必须将storage
的文件存储目录所对应的宿主机挂载目录(这里storage
用于真正存储文件数据的宿主机目录为/usr/local/server/fastdfs/store_path
)也同时挂载到fastdfs_nginx
容器内部的/fastdfs/store_path
之下,只有这样fastdfs-nginx-module
在重定向文件链接到源服务器取文件时才能够真正访问storage
的文件存储目录。
既要区分fastdfs_nginx
容器与storage
容器的/fastdfs/store_path
从容器的角度是独立的,又要认清两者都挂载到宿主机同一个目录之下,所以本质上访问的是同一份数据文件。
在创建fastdfs_nginx
容器时必须将宿主机配置好的nginx.conf
文件直接挂载到容器内部的/etc/nginx/conf/nginx.conf
文件之上,只有这样容器启动的时候使用的配置文件才是经过修改的。
sudo docker run \
-id \
--name fastdfs_nginx \
-p 8888:80 \
--restart=always \
--net bridge \
--add-host www.quincy-fastdfs.com:192.168.110.133 \
-v /usr/local/server/fastdfs/store_path:/fastdfs/store_path \
-v /usr/local/server/fastdfs/nginx/nginx.conf:/etc/nginx/conf/nginx.conf \
-v /etc/localtime:/etc/localtime \
-e TRACKER_SERVER="www.quincy-fastdfs.com:22122" \
season/fastdfs:1.2 nginx
需要注意的是,在根目录下的
/nginx-1.8.0
是nginx的源码,不是已经编译并安装到Ubantu系统上的组件。进过编译并安装的nginx
组件位于/etc/nginx
目录下。nginx -t # 验证配置文件;无法验证其它文件的情况
nginx -s reload # 重新加载;可以重启其它文件启动的情况
nginx -s stop # 快速停止
nginx -s quit # 正常停止
nginx -V # 查看版本
nginx -c conf/web01.conf # 使用另一个配置文件
8.尝试使用Web访问上传的文件
# 在同一局域网的浏览器中访问
http://192.168.110.133:8888/group1/M00/00/00/rBEABGJJcquAC3VRAAAACBfWGpM964.txt
# 在没有配置好hosts映射的终端中访问
curl -i http://192.168.110.133:8888/group1/M00/00/00/rBEABGJJcquAC3VRAAAACBfWGpM964.txt
# 在配置好hosts映射的终端中访问
curl -i http://www.quincy-fastdfs.com:8888/group1/M00/00/00/rBEABGJJcquAC3VRAAAACBfWGpM964.txt
更多推荐
所有评论(0)