介绍
-
简介
FastDFS 是一个开源的高性能分布式文件系统(DFS)。 它的主要功能包括:文件存储,文件同步和文件访问, 以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size <500MB) 为载体的在线服务。
-
FastDFS 系统有三个角色
Tracker Server跟踪服务器
主要做调度工作,起到均衡的作用;负责管理所有的 storage server和 group,每个 storage 在启动后会 连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳。Storage Server存储服务器
主要提供容量和备份服务;以 group 为单位,每个 group 内可以有多台 storage server,数据互为备份。Client客户端
上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。
-
FastDFS的存储策略
为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。
存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的 文件容量。
一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器 起到了冗余备份和负载均衡的作用。
在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服 务。当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个 新的卷,这样就扩大了存储系统的容量。
-
FastDFS的上传过程
FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提 供给用户使用。
Storage Server会定期的向Tracker Server发送自己的存储信息。当Tracker Server Cluster中的Tracker Server 不止一个时,各个Tracker之间的关系是对等的,所以客户端上传时可以选择任意一个Tracker。
当Tracker收到客户端上传文件的请求时,会为该文件分配一个可以存储文件的group,当选定了group后就要决 定给客户端分配group中的哪一个storage server。当分配好storage server后,客户端向storage发送写 文件请求,storage将会为文件分配一个数据存储目录。然后为文件分配一个fileid,最后根据以上的信息生 成文件名存储文件。
-
FastDFS的文件同步
写文件时,客户端将文件写至group内一个storage server即认为写文件成功,storage server写完文件后,会由 后台线程将文件同步至同group内其他的storage server。
每个storage写文件后,同时会写一份binlog,binlog里不包含文件数据,只包含文件名等元信息,这份binlog 用于后台同步,storage会记录向group内其他storage同步的进度,以便重启后能接上次的进度继续同步; 进度以时间戳的方式进行记录,所以最好能保证集群内所有server的时钟保持同步。
storage的同步进度会作为元数据的一部分汇报到tracker上,tracke在选择读storage的时候会以同步进度作为 参考。
-
FastDFS的文件下载
客户端uploadfile成功后,会拿到一个storage生成的文件名,接下来客户端根据这个文件名即可访问到该文件。
-
结构介绍
部署
环境准备
名称 | IP地址 | 应用 |
---|---|---|
tracker01 | 192.168.66.41 | FastDFS、libfastcommon、nginx、keepalived |
tracker02 | 192.168.66.42 | FastDFS、libfastcommon、nginx、keepalived |
storage01 | 192.168.66.31 | FastDFS,libfastcommon,nginx,fastdfs-nginx-module |
storage02 | 192.168.66.32 | FastDFS,libfastcommon,nginx,fastdfs-nginx-module |
VIP | 192.168.66.100 |
基础环境
-
安装常用工具
yum -y install bash-completion bash-completion-extras vim net-tools.x86_64 yum-utils lsof unzip zip
-
关闭selinux
setenforce 0 vim /etc/selinux/config SELINUX=disabled getenforce
-
优化文件打开数
vim /etc/security/limits.conf * soft nofile 655360 * hard nofile 655360 * soft nproc 131072 * hard nproc 131072 * soft core unlimited * hard core unlimited root soft nofile 655360 root hard nofile 655360 root soft core unlimited
优化系统参数
vi /etc/sysctl.conf # see details in https://help.aliyun.com/knowledge_detail/39428.html # see details in https://help.aliyun.com/knowledge_detail/41334.html #仅在内存不足的情况下--当剩余空闲内存低于vm.min_free_kbytes limit时,使用交换空间。 vm.swappiness = 0 #单个进程可分配的最大文件数 fs.nr_open=2097152 #系统最大文件句柄数 #计算grep -r MemTotal /proc/meminfo | awk '{printf("%d",$2/10)}' fs.file-max=1048576 #backlog 设置 net.core.somaxconn=32768 net.ipv4.tcp_max_syn_backlog=16384 net.core.netdev_max_backlog=16384 #TCP Socket 读写 Buffer 设置 net.core.rmem_default=262144 net.core.wmem_default=262144 net.core.rmem_max=16777216 net.core.wmem_max=16777216 net.core.optmem_max=16777216 net.ipv4.neigh.default.gc_stale_time=120 #TIME-WAIT Socket 最大数量、回收与重用设置 net.ipv4.tcp_max_tw_buckets=1048576 net.ipv4.tcp_tw_reuse=1 # FIN-WAIT-2 Socket 超时设置 #net.ipv4.tcp_fin_timeout=30 #解决大量state=TIME_WAIT问题 net.ipv4.tcp_tw_recycle=0 net.ipv4.tcp_timestamps=0 net.ipv4.conf.all.accept_redirects=0 #net.ipv4.ip_local_port_range = 1024 65000 #TCP 连接追踪设置 net.nf_conntrack_max=1000000 net.netfilter.nf_conntrack_max=1000000 net.netfilter.nf_conntrack_tcp_timeout_time_wait=30 #开启动网络转发功能 net.ipv4.ip_forward = 1 #支持网桥过滤器 net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 sysctl -p
-
指定时间
yum -y install chrony systemctl restart chronyd date
-
安装依赖包
yum -y install gcc gcc-c++ perl openssl openssl-devel pcre pcre-devel zlib zlib-devel libevent libevent-devel
-
安装libfastcommon
tar -zxvf libfastcommon-1.0.42.tar.gz -C /data/ mv /data/libfastcommon-1.0.42/ /data/libfastcommon cd /data/libfastcommon ./make.sh && ./make.sh install
-
安装FastDFS
tar -zxvf fastdfs-6.04.tar.gz -C /data/ mv /data/fastdfs-6.04/ /data/fastdfs cd /data/fastdfs ./make.sh && ./make.sh install cd /data/fastdfs/conf cp -p http.conf mime.types /etc/fdfs/ cp -p mime.types /etc/fdfs/
安装环境
tracker端
tracker安装
-
修改配置文件
cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf vim /etc/fdfs/tracker.conf #false表示有效启用配置文件 disabled=false #设置超时时间 connect_timeout = 10 #设置tracker的端口号 port=22122 bind_addr= #tracker服务工作目录和日志目录 base_path=/data/fastdfs/tracker-work #0:轮询的上传,交替上传数据 #1: 指定group进行上传 #2:平衡的去上传,尽量平衡各个节点的容量,默认就是2 store_lookup=2 #当store_lookup设置成1的时候,这个参数才有效 store_group=group2 #设置http端口号 http.server_port=8080 mkdir -p /data/fastdfs/tracker-work
-
配置启动
在运行tracker之前,先把防火墙对应的端口打开
firewall-cmd --zone=public --add-port=22122/tcp --permanent firewall-cmd --reload systemctl enable fdfs_trackerd.service systemctl start fdfs_trackerd.service systemctl status fdfs_trackerd.service netstat -unltp | grep fdfs
trackerd节点安装nginx
-
安装nginx
useradd -s /sbin/nologin nginx tar -xvf nginx-1.16.1.tar.gz -C /data/ mv /data/nginx-1.16.1/ /data/nginx-install cd /data/nginx-install ./configure --prefix=/data/nginx --user=nginx --group=nginx --with-http_ssl_module --with-stream make && make install
-
修改配置文件
vim /data/nginx/conf/nginx.conf upstream fdfs_group_server { server 192.168.66.31:8888 weight=1 max_fails=2 fail_timeout=30s; server 192.168.66.32:8888 weight=1 max_fails=2 fail_timeout=30s; server 192.168.66.32:8888 weight=1 max_fails=2 fail_timeout=30s; server 192.168.66.32:8888 weight=1 max_fails=2 fail_timeout=30s; } server { listen 8000; server_name localhost; #设置的负载均衡参数 location ~/group[0-9]/M0[0-9] { proxy_pass http://fdfs_group_server; }
-
启动
vim /usr/lib/systemd/system/nginx.service [Unit] Description=nginx After=network.target [Service] Type=forking ExecStart=/data/nginx/sbin/nginx ExecReload=/data/nginx/sbin/nginx -s reload ExecStop=/data/nginx/sbin/nginx -s quit PrivateTmp=true [Install] WantedBy=multi-user.target systemctl daemon-reload systemctl start nginx.service systemctl enable nginx.service systemctl status nginx.service
trackerd节点安装keepalived
-
安装keepalived
yum install -y keepalived
-
修改配置文件
vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id LVS_OPENSTACK vrrp_iptables } vrrp_instance VI_1 { state MASTER(BACKUP) interface ens32 virtual_router_id 51 priority 100(备50) advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { VIP/24 } }
-
启动
systemctl restart keepalived
启动时会自动添加一个drop的防火墙规则,需要清空
iptables -F systemctl status keepalived systemctl enable keepalived
查看vip
ip add | grep 66.100
storage端(存储的机器)
storage安装
-
修改配置文件
cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf vim /etc/fdfs/storage.conf #启用配置文件 disabled=false #第一(卷)组为group1 group_name=group1 bind_addr = #设置storage的端口号 port=23000 #服务工作目录和日志目录 base_path=/data/fastdfs/storage-work #存储路径个数,需要和store_path个数匹配 store_path_count=1 #存储路径,如果不存在的话他就会使用base_path,生产建议分开 store_path0=/data/fastdfs/storage-data #tracker1服务器的IP地址和端口号 tracker_server=192.168.66.41:22122 #tracker2服务器的IP地址和端口号 tracker_server=192.168.66.42:22122 http.server_port=8888 mkdir -p /data/fastdfs/storage-work mkdir -p /data/fastdfs/storage-data
-
配置启动
#在运行tracker之前,先把防火墙对应的端口打开 firewall-cmd --zone=public --add-port=22122/tcp --permanent firewall-cmd --reload
vim /etc/rc.d/init.d/fdfs_storaged PRG=/usr/bin/fdfs_storaged CONF=/etc/fdfs/storage.conf service fdfs_storaged start service fdfs_storaged stop systemctl start fdfs_storaged.service systemctl status fdfs_storaged.service systemctl enable fdfs_storaged.service netstat -unltp | grep fdfs
-
查看集群状态
fdfs_monitor /etc/fdfs/storage.conf list
storage节点安装nginx、fastdfs-nginx-module
-
解压模块
tar -xvf fastdfs-nginx-module-1.22.tar.gz -C /usr/local/src vim /usr/local/src/fastdfs-nginx-module-1.22/src/config ngx_module_incs="/usr/include" CORE_INCS="$CORE_INCS /usr/include"
-
安装nginx
useradd -s /sbin/nologin nginx tar -xvf nginx-1.16.1.tar.gz -C /data/ mv /data/nginx-1.16.1/ /data/nginx-install cd /data/nginx-install ./configure --prefix=/data/nginx --user=nginx --group=nginx --with-http_ssl_module --with-stream --add-module=/usr/local/src/fastdfs-nginx-module-1.22/src make && make install
-
修改配置文件
cp /usr/local/src/fastdfs-nginx-module-1.22/src/mod_fastdfs.conf /etc/fdfs/ vim /etc/fdfs/mod_fastdfs.conf connect_timeout=10 #storage日志目录和storage.conf一样 base_path=/data/fastdfs/mod-work # tracker1服务器IP和端口 tracker_server=192.168.66.41:22122 # tracker2服务器IP和端口 tracker_server=192.168.66.42:22122 #组名,根据实际情况修改 group_name=group1 #从文件扩展名查找文件类型 url_have_group_name = true #url里面包含group_name store_path_count=1 #storage存储路径storage.conf一样 store_path0=/data/fastdfs/storage-data #如果fastdfs为多group安装,还需设置以下配置: #group个数 group_count = 2 #在末尾添加如下: [group1] group_name=group1 storage_server_port=23000 store_path_count=1 store_path0=/data/fastdfs/storage-data [group2] group_name=group2 storage_server_port=23000 store_path_count=1 store_path0=/data/fastdfs/storage-data mkdir -p /data/fastdfs/mod-work vim /data/nginx/conf/nginx.conf server { listen 8888; server_name localhost; location ~/group[0-9]/M0[0-9] { ngx_fastdfs_module; }
-
启动
vim /usr/lib/systemd/system/nginx.service [Unit] Description=nginx After=network.target [Service] Type=forking ExecStart=/data/nginx/sbin/nginx ExecReload=/data/nginx/sbin/nginx -s reload ExecStop=/data/nginx/sbin/nginx -s quit PrivateTmp=true [Install] WantedBy=multi-user.target systemctl daemon-reload systemctl start nginx.service systemctl enable nginx.service systemctl status nginx.service
Client配置(于tracker端一起)
-
修改配置文件
cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf vim /etc/fdfs/client.conf base_path=/data/fastdfs/client-work # tracker服务器IP和端口 tracker_server=192.168.66.41:22122 # tracker服务器IP和端口 tracker_server=192.168.66.42:22122 # tracker服务器的http端口号,必须和tracker的设置对应起来 http.tracker_server_port = 8000 mkdir -p /data/fastdfs/client-work
-
测试
fdfs_test /etc/fdfs/client.conf upload ngx_cache_purge-2.3.tar.gz
fdfs_upload_file /etc/fdfs/client.conf cxk
#返回ID表示成功 如:group1/M00/00/00/xx.tar.gz
喜欢的亲可以关注点赞评论哦!以后每天都会更新的哦!本文为小编原创文章; 文章中用到的文件、安装包等可以加小编联系方式获得;
欢迎来交流小编联系方式VX:CXKLittleBrother 进入运维交流群