搭建 Nginx+Keepalived+FastDFS 分布式文件系统高可用负载均衡集群
什么是FastDFS?
fastDFS 是以C语言开发的一项开源轻量级分布式文件系统,他对文件进行管理,主要功能有:文件存储,文件同步,文件访问(文件上传/下载),特别适合以文件为载体的在线服务,如图片网站,视频网站等。
FastDFS是一个开源的分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用。存储节点存储文件,完成文件管理的所有功能:存储、同步和提供存取接口,FastDFS同时对文件的meta data进行管理。所谓文件的meta data就是文件的相关属性,以键值对(key value pair)方式表示,如:width=1024,其中的key为width,value为1024。文件meta data是文件属性列表,可以包含多个键值对。FastDFS系统结构如下图所示:
跟踪器和存储节点都可以由一台多台服务器构成。跟踪器和存储节点中的服务器均可以随时增加或下线而不会影响线上服务。其中跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时增加或减少。
为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。FastDFS中的文件标识分为两个部分:卷名和文件名,二者缺一不可。
client询问tracker上传到的storage,不需要附加参数;
tracker返回一台可用的storage;
client直接和storage通讯完成文件上传。
客户端 client 发起对 FastDFS 的文件传输动作,是通过连接到某一台 Tracker Server 的指定端口来实现的,Tracker Server 根据目前已掌握的信息,来决定选择哪一台 Storage Server ,然后将这个Storage Server 的地址等信息返回给 client,然后 client 再通过这些信息连接到这台 Storage Server,将要上传的文件传送到给 Storage Server上。
client询问tracker下载文件的storage,参数为文件标识(卷名和文件名);
tracker返回一台可用的storage;
client直接和storage通讯完成文件下载。
操作系统环境:centos7.8mini2003
FastDFS 版本:fastdfs-6.06.tar.gz
Nginx 版本: nginx-1.18.0.tar.gz
高可用版本:keepalived-1.4.5.tar.gz
其他依赖工具安装包:
fastdfs_client_java._v1.25.tar.gz
root 系统管理员用户登录安装部署
FastDFS 源码地址:https://github.com/happyfish100/
FastDFS 官方论坛:http://bbs.chinaunix.net/forum-240-1.html
节点名称 | IP 地址 | 端口 | 主机名 | nginx端口 | 配置 |
---|---|---|---|---|---|
跟踪节点1 | 192.168.66.10 | 22122 | dfs-tracker1 | 80 | 2核2G20GB |
跟踪节点2 | 192.168.66.11 | 22122 | dfs-tracker2 | 80 | 2核2G20GB |
节点名称 | IP 地址 | 端口 | 主机名 | nginx | 配置 |
---|---|---|---|---|---|
存储节点组1-1 | 192.168.66.12 | 23000 | dfs-storage-group1-1 | 8888 | 4核4G1TB |
存储节点组1-2 | 192.168.66.13 | 23000 | dfs-storage-group1-2 | 8888 | 4核4G1TB |
存储节点组2-1 | 192.168.66.14 | 23000 | dfs-storage-group2-1 | 8888 | 4核4G1TB |
存储节点组2-2 | 192.168.66.15 | 23000 | dfs-storage-group2-2 | 8888 | 4核4G1TB |
节点名称 | 节点 IP Addr | 主机名 | Nginx端口 | 默认主从 | 配置 |
---|---|---|---|---|---|
VIP | 192.168.66.150 | 虚拟 IP | |||
MASTER | 192.168.66.8 | fdfs-proxy1 | 80 | MASTER | 2核2G20GB |
BACKUP | 192.168.66.9 | fdfs-proxy2 | 80 | BACKUP | 2核2G20GB |
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-96jK6yC4-1609918421683)(assets/image-20201203141929651.png)]
下载安装编译和安装所需的依赖包
# yum install -y make cmake gcc gcc-c++
为避免集群时间不一致不同步导致不可预知的问题,需要同步集群时间,确保集群中的系统时间差组30秒以内。
linux系统的时间分为系统时间 和 硬件时间。 硬件时间 就是指RTC中的时间,hwclock命令就是对这个时间操作。
系统时间是系统开机时读取硬件时间作为系统的时间,此后系统时钟独立运作,在系统关机时再将系统时间写回RTC。
date命令只操作系统时间,hwclock操作硬件时钟,在date 修改时间后,最好用hwclock 同步一下,以免系统非正常关机造成时间不同步。
查看时间
# date
2020年 11月 13日 星期五 20:17:11 CST
# hwclock
2020年11月13日 星期五 20时18分15秒 -0.350529 秒
同步时间,并写入CMOS
# ntpdate ntp1.aliyun.com
13 Nov 20:19:08 ntpdate[17801]: adjust time server 120.25.115.20 offset -0.000921 sec
# date
2020年 11月 13日 星期五 20:19:33 CST
# hwclock
2020年11月13日 星期五 20时19分40秒 -0.943450 秒
使用scp命令实现远程文件拷贝。确保与其他机器网络相通,并同时都需要安装
# yum install -y openssh-clients
拷贝文件,文件传输
# scp /opt/java/jdk-8u261-linux-x64.tar.gz [email protected]:/opt/
[email protected]'s password:
快速配置其他集群机器,减少文件的下载
有些集群必须要配置免密登录,比如hadoop集群,Hadoop集群包含1个主节点和3个从节点,需要实现各节点之间的免密码登录。
每台主机authorized_keys
文件里面包含的主机(ssh密钥),该主机都能无密码登录,所以只要每台主机的authorized_keys
文件里面都放入其他主机(需要无密码登录的主机)的ssh密钥就行了。
# ssh-keygen -t rsa
执行命令后会在~
目录下生成.ssh
文件夹,里面包含id_rsa
和id_rsa.pub
两个文件。
其他节点执行同样操作。
注:使用
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
命令可避免上述交互式操作。
在主节点上将公钥拷到一个特定文件authorized_keys中。
# cd ~/.ssh/
# ll
总用量 12
-rw-------. 1 root root 1679 12月 3 18:18 id_rsa
-rw-r--r--. 1 root root 411 12月 3 18:18 id_rsa.pub
-rw-r--r--. 1 root root 875 12月 3 18:11 known_hosts
# cp id_rsa.pub authorized_keys
# ll
总用量 16
-rw-r--r--. 1 root root 411 12月 3 19:04 authorized_keys
-rw-------. 1 root root 1679 12月 3 18:18 id_rsa
-rw-r--r--. 1 root root 411 12月 3 18:18 id_rsa.pub
-rw-r--r--. 1 root root 875 12月 3 18:11 known_hosts
查看比之前多了一个文件:authorized_keys
将authorized_keys文件拷到集群中的其他节点,并将该节点下的ssh密钥id_rsa.pub加入该文件中。
使用scp命令实现远程文件拷贝,将authorized_keys文件拷贝到其他集群节点:
# scp authorized_keys [email protected]:/root/.ssh/
登录集群中的其他节点,并将公钥追加到authorized_keys文件:
# cd ~/.ssh/
# ll
总用量 12
-rw-r--r--. 1 root root 411 12月 3 19:06 authorized_keys
-rw-------. 1 root root 1679 12月 3 18:20 id_rsa
-rw-r--r--. 1 root root 411 12月 3 18:20 id_rsa.pub
# cat id_rsa.pub >> authorized_keys #使用cat追加方式
依次操作通过authorized_keys文件完成集群其他节点公钥的追加收集后,把收集完所有集群节点公钥最后的authorized_keys文件,通过scp命令远程再依次拷贝回其他节点:
# scp authorized_keys [email protected]:/root/.ssh/
以上步骤操作完成后,可以进行验证ssh免密登录了。
使用ssh 用户名@节点名或ssh ip地址命令验证免密码登录。
# ssh [email protected]
Last failed login: Thu Dec 3 18:10:14 CST 2020 from 192.168.66.10 on ssh:notty
There was 1 failed login attempt since the last successful login.
Last login: Thu Dec 3 16:46:06 2020
可以看到通过ssh已经登录成功了,可以直接从一个节点进入到另一个节点主机,操作另一个主机,可以来回切换,亦可登录回之前节点的主机。
Copyright (C) 2010 Happy Fish / YuQing
这个包是作者从开源项目FastDFS中提取的c公共函数库。这个库非常简单和稳定。函数包括:字符串,记录器,链,哈希,套接字,ini文件读取器,base64编码/解码,URL编码/解码,快速计时器,跳过列表,对象池等。详细信息请参见c头文件。
下载libfastcommon,下载地址:https://github.com/happyfish100/libfastcommon/releases
# cd /opt
# wget https://github.com/happyfish100/libfastcommon/archive/V1.0.43.tar.gz
# tar -zxvf V1.0.43.tar.gz -C /usr/local/src/
如果下载的是zip包,解压方式
# yum install -y unzip
# unzip -n -d /usr/local/src/ libfastcommon-master.zip
# cd /usr/local/src/libfastcommon-master
如果要把文件解压到指定的目录下,需要用到-d参数。
解压的时候,有时候不想覆盖已经存在的文件,那么可以加上-n参数
只看一下zip压缩包中包含哪些文件,不进行解压缩-1参数
查看显示的文件列表还包含压缩比率-v参数
将压缩文件test.zip在指定目录tmp下解压缩,如果已有相同的文件存在,要求unzip命令覆盖原先的文件:unzip -o test.zip -d /tmp/
# cd /usr/local/src/libfastcommon-1.0.43
# ./make.sh && ./make.sh install
mkdir -p /usr/lib64
mkdir -p /usr/lib
mkdir -p /usr/include/fastcommon
install -m 755 libfastcommon.so /usr/lib64
install -m 644 common_define.h hash.h chain.h logger.h base64.h shared_func.h pthread_func.h ini_file_reader.h _os_define.h sockopt.h sched_thread.h http_func.h md5.h local_ip_func.h avl_tree.h ioevent.h ioevent_loop.h fast_task_queue.h fast_timer.h process_ctrl.h fast_mblock.h connection_pool.h fast_mpool.h fast_allocator.h fast_buffer.h skiplist.h multi_skiplist.h flat_skiplist.h skiplist_common.h system_info.h fast_blocked_queue.h php7_ext_wrapper.h id_generator.h char_converter.h char_convert_loader.h common_blocked_queue.h multi_socket_client.h skiplist_set.h fc_list.h json_parser.h buffered_file_writer.h /usr/include/fastcommon
if [ ! -e /usr/lib/libfastcommon.so ]; then ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so; fi
查看安装位置,libfastcommon默认安装到了这个位置:
# cd /usr/lib64/
# ls | grep libfastcommon.so
libfastcommon.so
# ls | grep libfdfsclient.so
libfdfsclient.so
Copyright (C) 2010 Happy Fish / YuQing
下载FastDFS,下载地址: https://github.com/happyfish100/fastdfs/releases
# cd /opt/
# wget https://github.com/happyfish100/fastdfs/archive/V6.06.tar.gz
# tar -zxvf V6.06.tar.gz -C /usr/local/src
编译安装前要确保已经成功安装了libfastcommon
# cd /usr/local/src/fastdfs-6.06
# ./make.sh && ./make.sh install
采用默认安装的方式安装
安装后的相应文件与目录如下:
# ls -la /etc/init.d/fdfs*
-rwxr-xr-x. 1 root root 918 12月 4 10:58 fdfs_storaged ### 是tracker启动脚本
-rwxr-xr-x. 1 root root 920 12月 4 10:58 fdfs_trackerd ### 是storage启动脚本
配置文件样例
# ll /etc/fdfs
-rw-r--r--. 1 root root 1909 12月 4 15:11 client.conf.sample
-rw-r--r--. 1 root root 10246 12月 4 15:11 storage.conf.sample
-rw-r--r--. 1 root root 620 12月 4 15:11 storage_ids.conf.sample
-rw-r--r--. 1 root root 9138 12月 4 15:11 tracker.conf.sample
在/usr/bin/目录下的
# ls -la /usr/bin/fdfs*
-rwxr-xr-x. 1 root root 362240 12月 4 14:30 /usr/bin/fdfs_appender_test
-rwxr-xr-x. 1 root root 362016 12月 4 14:30 /usr/bin/fdfs_appender_test1
-rwxr-xr-x. 1 root root 348896 12月 4 14:30 /usr/bin/fdfs_append_file
-rwxr-xr-x. 1 root root 348512 12月 4 14:30 /usr/bin/fdfs_crc32
-rwxr-xr-x. 1 root root 348936 12月 4 14:30 /usr/bin/fdfs_delete_file
-rwxr-xr-x. 1 root root 349664 12月 4 14:30 /usr/bin/fdfs_download_file
-rwxr-xr-x. 1 root root 349616 12月 4 14:30 /usr/bin/fdfs_file_info
-rwxr-xr-x. 1 root root 364936 12月 4 14:30 /usr/bin/fdfs_monitor
-rwxr-xr-x. 1 root root 349160 12月 4 14:30 /usr/bin/fdfs_regenerate_filename
-rwxr-xr-x. 1 root root 1280136 12月 4 14:30 /usr/bin/fdfs_storaged
-rwxr-xr-x. 1 root root 372112 12月 4 14:30 /usr/bin/fdfs_test
-rwxr-xr-x. 1 root root 367224 12月 4 14:30 /usr/bin/fdfs_test1
-rwxr-xr-x. 1 root root 512352 12月 4 14:30 /usr/bin/fdfs_trackerd
-rwxr-xr-x. 1 root root 349856 12月 4 14:30 /usr/bin/fdfs_upload_appender
-rwxr-xr-x. 1 root root 350880 12月 4 14:30 /usr/bin/fdfs_upload_file
-rwxr-xr-x. 1 root root 1768 12月 4 10:58 restart.sh
-rwxr-xr-x. 1 root root 1680 12月 4 10:58 stop.sh
问题一
# ./make.sh: line 154: perl: command not found
解决方案
# yum -y install perl
问题二
/root/fastdfs-6.06/storage/fdfs_storaged.c:151: undefined reference to `g_exe_name'
storage_dump.o: In function `fdfs_dump_global_vars':
/root/fastdfs-6.06/storage/storage_dump.c:44: undefined reference to `g_exe_name'
collect2: error: ld returned 1 exit status
make: *** [fdfs_storaged] Error 1
make: Nothing to be done for `all'.
解决方案
# ./make.sh clean
所有集群中的跟踪服务器和存储服务器均执行以上安装配置操作。
注意:以上操作无论是配置tracker还是配置storage都是必须的,而tracker和storage的区别主要是在安装完fastdfs之后的配置过程中。
配置FastDFS跟踪器Tracker (192.168.66.10 、192.168.66.11)
复制FastDFS跟踪器样例配置文件,并重命名:
# cd /etc/fdfs/
# cp tracker.conf.sample tracker.conf
修改的内容如下:
# vim /etc/fdfs/tracker.conf
disabled=false #启用配置文件,默认启用
port=22122 #tracker的端口号,一般采用22122这个默认端口
base_path=/fastdfs/tracker #tracker的数据文件和日志目录,默认/home/yuqing/fastdfs
http.server_port=8080 #http_server端口,默认8080
保存退出。其它参数保留默认配置,具体配置解释请参考官方文档说明:http://bbs.chinaunix.net/thread-1941456-1-1.html
与配置基础目录base_path保持一致
# mkdir -p /fastdfs/tracker
默认为22122
# firewall-cmd --zone=public --add-port=22122/tcp --permanent
# firewall-cmd --reload ## 重启防火墙
# /etc/init.d/fdfs_trackerd start
Reloading systemd: [ 确定 ]
Starting fdfs_trackerd (via systemctl): [ 确定 ]
初次成功启动,会在/fastdfs/tracker目录下创建data、logs两个目录。
# cd /fastdfs/tracker
# ll
总用量 0
drwxr-xr-x. 2 root root 60 12月 4 12:28 data
drwxr-xr-x. 2 root root 26 12月 4 12:28 logs
第一次启动成功后,可以使用系统命令启动、重启、停止
# systemctl start fdfs_trackerd ### 也可以通过这个启动
# systemctl restart fdfs_trackerd
# systemctl stop fdfs_trackerd
可以通过以下两个方法查看tracker是否启动成功:
(1)查看22122端口监听情况
# yum install -y net-tools
# netstat -apn|grep fdfs
# netstat -unltp|grep fdfs
tcp 0 0 0.0.0.0:22122 0.0.0.0:* LISTEN 2932/fdfs_trackerd
(2)通过以下命令查看tracker的启动日志,看是否有错误
# tail -100f /fastdfs/tracker/logs/trackerd.log
(3)查看是否活动状态
# systemctl status fdfs_trackerd
● fdfs_trackerd.service - LSB: FastDFS tracker server
Loaded: loaded (/etc/rc.d/init.d/fdfs_trackerd; bad; vendor preset: disabled)
Active: `active (running)` since 五 2020-12-04 14:53:54 CST; 1min 5s ago
Docs: man:systemd-sysv-generator(8)
Process: 3819 ExecStop=/etc/rc.d/init.d/fdfs_trackerd stop (code=exited, status=0/SUCCESS)
Process: 3824 ExecStart=/etc/rc.d/init.d/fdfs_trackerd start (code=exited, status=0/SUCCESS)
CGroup: /system.slice/fdfs_trackerd.service
└─3830 /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
12月 04 14:53:54 fdfs-tracker1.zhledu.com systemd[1]: Stopped LSB: FastDFS tracker server.
12月 04 14:53:54 fdfs-tracker1.zhledu.com systemd[1]: Starting LSB: FastDFS tracker server...
12月 04 14:53:54 fdfs-tracker1.zhledu.com fdfs_trackerd[3824]: Starting FastDFS tracker server:
12月 04 14:53:54 fdfs-tracker1.zhledu.com systemd[1]: Started LSB: FastDFS tracker server.
# /etc/init.d/fdfs_trackerd stop
# systemctl stop fdfs_trackerd ### 也可以通过这个命令
在文件结尾添加以下内容:
# vim /etc/rc.d/rc.local
### FastDFS Tracker
/etc/init.d/fdfs_trackerd start
tracker跟踪器集群中的两台都做如上配置。
配置FastDFS存储 ( 192.168.66.12 、192.168.66.13 、192.168.66.14 、192.168.66.15 )
复制FastDFS存储器样例配置文件,并重命名
# cd /etc/fdfs/
# cp storage.conf.sample storage.conf
以group1中的storage节点的storage.conf为例,修改的内容如下:
# vim /etc/fdfs/storage.conf
disabled=false #启用配置文件
group_name=group1 #组名(第一组为group1,第二组为group2)
port=23000 #storage的端口号,同一个组的storage端口号必须相同
base_path=/fastdfs/storage #设置storage的日志目录
store_path0=/fastdfs/storage #存储路径
store_path_count=1 #存储路径个数,需要和store_path个数匹配
tracker_server=192.168.66.10:22122 #tracker服务器的IP地址和端口
tracker_server=192.168.66.11:22122 #多个tracker直接添加多条配置
http.server_port=8888 #设置http端口号
其它参数保留默认配置,具体配置解释请参考官方文档说明:
http://bbs.chinaunix.net/thread-1941456-1-1.html
参考基础目录base_path配置,与配置文件保持一致
# mkdir -p /fastdfs/storage
默认为23000
# firewall-cmd --zone=public --add-port=23000/tcp --permanent
# firewall-cmd --reload ## 重启防火墙
# /etc/init.d/fdfs_storaged start
Reloading systemd: [ 确定 ]
Starting fdfs_storaged (via systemctl): [ 确定 ]
初次成功启动,会在/fastdfs/storage目录下创建数据目录data 和日志目录logs。各节点启动动,使用命令监听存储节点日志:
# tail -f /fastdfs/storage/logs/storaged.log
可以看到存储节点链接到跟踪器,并提示哪一个为leader跟踪器。同时也会看到同一组中的其他节点加入进来的日志信息。
第一次启动成功后,可以使用系统命令启动、重启、停止
# systemctl start fdfs_storaged ### 也可以通过这个启动
# systemctl restart fdfs_storaged
# systemctl stop fdfs_storaged
可以通过以下两个方法查看tracker是否启动成功:
查看23000端口监听情况
# netstat -unltp|grep fdfs
查看storage存储服务启动状态
# systemctl status fdfs_storaged
# /etc/init.d/fdfs_storaged stop
# systemctl stop fdfs_storaged
# vim /etc/rc.d/rc.local
## FastDFS Storage
/etc/init.d/fdfs_storaged start
依次完成集群中的其他storage存储节点组的配置。完成其他集群存储组节点的配置,在配置时注意组的名称的区别,目前分了两个组一个group1和group2。
所有Storage节点都启动之后,可以在任一Storage节点上使用如下命令查看集群信息:
# /usr/bin/fdfs_monitor /etc/fdfs/storage.conf
通过monitor查看storage是否绑定成功,可以看到存储节点状态为ACTIVE则可。
暂时不需要配置
以上安装和配置都完成后,可以在一台tracker1跟踪服务主机上测试文件上传:192.168.66.10
修改Tracker服务器中的客户端配置文件:
# cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
# vim /etc/fdfs/client.conf
base_path=/fastdfs/tracker
tracker_server=192.168.66.10:22122
tracker_server=192.168.66.11:22122
执行如下文件上传命令:
# /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /opt/V6.06.tar.gz
返回ID号:
group1/M00/00/00/wKhCDF_J7qeAO4xNAAxZcPR00vw.tar.gz
group2/M00/00/00/wKhCDl_J7OaAaJvwAAxZcPR00vw.tar.gz
group2/M00/00/00/wKhCD1_KIJ6AKziFAAxZcPR00vw.tar.gz
能返回以上文件ID,说明文件上传成功
在各个 storage 存储节点上安装Nginx:
192.168.66.12、192.168.66.13、192.168.66.14、192.168.66.15
为什么需要用Nginx访问?需要使用nginx访问FastDFS。
fastdfs-nginx-module作用说明
FastDFS通过Tracker服务器,将文件放在Storage服务器存储,但是同组存储服务器之间需要进入文件复制,有同步延迟的问题。
假设Tracker服务器将文件上传到了192.168.66.12,上传成功后文件ID已经返回给客户端。此时FastDFS存储集群机制会将这个文件同步到同组存储192.168.66.13,在文件还没有复制完成的情况下,客户端如果用这个文件ID在192.168.66.13上取文件,就会出现文件无法访问的错误。
而fastdfs-nginx-module可以重定向文件连接到文件上传时的源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。
下载地址:https://github.com/happyfish100/fastdfs-nginx-module/releases
# wget https://codeload.github.com/happyfish100/fastdfs-nginx-module/tar.gz/V1.22
# tar -zxvf /opt/fastdfs-nginx-module-1.22.tar.gz -C /usr/local/src
解压后的fastdfs-nginx-module在nginx安装时使用,解压目录路径:
/usr/local/src/fastdfs-nginx-module-1.22/src
记住解压路径,后面需要用到。
# yum install -y gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel
下载地址:https://nginx.org/en/download.html
# cd /opt
# wget https://nginx.org/download/nginx-1.18.0.tar.gz
# tar -zxvf nginx-1.18.0.tar.gz -C /usr/local/src/
# cd /usr/local/src/nginx-1.18.0
# ./configure --prefix=/usr/local/nginx --add-module=/usr/local/src/fastdfs-nginx-module-1.22/src
# make && make install
注:- -add-module的值为fastdfs-nginx-module的解压目录路径
修改 fastdfs-nginx-module 配置文件。复制fastdfs-nginx-module源码中的配置文件到/etc/fdfs目录,并修改
# cp /usr/local/src/fastdfs-nginx-module-1.22/src/mod_fastdfs.conf /etc/fdfs/
(1)第一组Storage的mod_fastdfs.conf配置如下:
# vim /etc/fdfs/mod_fastdfs.conf
connect_timeout=10
base_path=/tmp
tracker_server=192.168.66.10:22122
tracker_server=192.168.66.11:22122
storage_server_port=23000
group_name=group1
url_have_group_name = true
store_path0=/fastdfs/storage
group_count = 2
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/fastdfs/storage
[group2]
group_name=group2
storage_server_port=23000
store_path_count=1
store_path0=/fastdfs/storage
完成第一组storage存储集群中的两台服务配置,配置相同。
(2)第二组Storage的mod_fastdfs.conf配置与第一组配置只有group_name不同:
group_name=group2
完成第二组storage存储集群的两台服务配置,配置相同。
复制FastDFS部分配置文件到/etc/fdfs目录
# cd /usr/local/src/fastdfs-6.06/conf
# cp http.conf mime.types /etc/fdfs/
在/fastdfs/storage文件存储目录下创建软连接,将其链接到实际存放数据的目录
# ln -s /fastdfs/storage/data/ /fastdfs/storage/data/M00
去掉 user nobody 注释,并将其修改为 user root,修改监听端口为:8888
# vim /usr/local/nginx/conf/nginx.conf
user root;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main 'remote_addr - remote_user [time_local] "request" '
# 'status body_bytes_sent "$http_referer" '
# '"http_user_agent" "http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 8888;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
重点配置说明:
1、
8888
端口值是要与/etc/fdfs/storage.conf
中的http.server_port=8888
相对应,因为http.server_port
默认为8888
,如果想改成80,则要对应修改过来。2、Storage 对应有多个 group 的情况下,访问路径带 group 名,如
/group1/M00/00/00/xxx
,对应的Nginx配置为:location ~/group([0-9])/M00 {
ngx_fastdfs_module;
}
3、测试检查下载时如发现老报404,将
nginx.conf
第一行user nobody
修改为user root
后重新启动。
# firewall-cmd --zone=public --add-port=8888/tcp --permanent
# firewall-cmd --reload ## 重启防火墙
启动storage存储服务组集群节点中的nginx:
# /usr/local/nginx/sbin/nginx
ngx_http_fastdfs_set pid=5944
测试Nginx是否安装成功
# /usr/local/nginx/sbin/nginx -t
ngx_http_fastdfs_set pid=5948
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
重启Nginx的命令为:
# /usr/local/nginx/sbin/nginx -s reload
设置Nginx开机启动,加入:
# vim /etc/rc.local
## nginx fastdfs storage
/usr/local/nginx/sbin/nginx
使用浏览器测试下载之前通过命令工具上传的文件
http://192.168.66.12:8888/group1/M00/00/00/wKhCDF_J7qeAO4xNAAxZcPR00vw.tar.gz
http://192.168.66.14:8888/group2/M00/00/00/wKhCDl_J7OaAaJvwAAxZcPR00vw.tar.gz
http://192.168.66.14:8888/group2/M00/00/00/wKhCD1_KIJ6AKziFAAxZcPR00vw.tar.gz
如果下载不了,检查下面这个配置参数问题是否修改为 true:
# vim /etc/fdfs/mod_fastdfs.conf
# if the url / uri including the group name
# set to false when uri like /M00/00/00/xxx
# set to true when uri like ${group_name}/M00/00/00/xxx, such as group1/M00/xxx
# default value is false
url_have_group_name = true
参数修改完后,记得重启一下nginx。
**在跟踪器集群节点上安装Nginx:**192.168.66.10、192.168.66.11
在tracker跟踪服务集群上安装的nginx,主要为fastdfs文件系统服务提供http访问的反向代理、负载均衡以及缓存服务。
# yum install -y gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel
下载地址:https://github.com/FRiCKLE/ngx_cache_purge/releases
# cd /opt
# wget https://codeload.github.com/FRiCKLE/ngx_cache_purge/tar.gz/2.3
# tar -zxvf ngx_cache_purge-2.3.tar.gz -C /usr/local/src/
解压路径如下:
# cd /usr/local/src/ngx_cache_purge-2.3
记住解压路径,后面编译安装nginx要用到。
下载地址:https://nginx.org/en/download.html
# cd /opt
# wget https://nginx.org/download/nginx-1.18.0.tar.gz
# tar -zxvf nginx-1.18.0.tar.gz -C /usr/local/src/
# cd /usr/local/src/nginx-1.18.0
# ./configure --prefix=/usr/local/nginx --add-module=/usr/local/src/ngx_cache_purge-2.3
# make && make install
注:- -add-module 的值为 ngx_cache_purge 的解压目录路径
配置Nginx,设置负载均衡以及缓存。去掉 user nobody 注释并,并将 user nobody 修改为:user root,修改端口为:8888
# vim /usr/local/nginx/conf/nginx.conf
user root;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main 'remote_addr - remote_user [time_local] "request" '
# 'status body_bytes_sent "$http_referer" '
# '"http_user_agent" "http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
#配置缓存
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 300m;
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
#配置缓存存储路径、存储方式、分配内存大小、磁盘最大空间、缓存期限
proxy_cache_path /fastdfs/cache/nginx/proxy_cache levels=1:2
keys_zone=http-cache:200m max_size=1g inactive=30d;
proxy_temp_path /fastdfs/cache/nginx/proxy_cache/tmp;
#配置存储服务集群 group1 负载均衡服务器
upstream fdfs_group1 {
server 192.168.66.12:8888 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.66.13:8888 weight=1 max_fails=2 fail_timeout=30s;
}
#配置存储服务集群 group2 负载均衡服务器
upstream fdfs_group2 {
server 192.168.66.14:8888 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.66.15:8888 weight=1 max_fails=2 fail_timeout=30s;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
#配置存储服务集群 group1 的负载均衡参数
location /group1/M00 {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_cache http-cache;
proxy_cache_valid 200 304 12h;
proxy_cache_key $uri$is_args$args;
proxy_pass http://fdfs_group1;
expires 30d;
}
#配置存储服务集群 group2 的负载均衡参数
location /group2/M00 {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_cache http-cache;
proxy_cache_valid 200 304 12h;
proxy_cache_key $uri$is_args$args;
proxy_pass http://fdfs_group2;
expires 30d;
}
#配置清除缓存的访问权限
location ~/purge(/.*) {
allow 127.0.0.1;
allow 192.168.66.0/24;
deny all;
proxy_cache_purge http-cache $1$is_args$args;
}
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
重点配置说明:
#配置缓存
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 300m;
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
#配置缓存存储路径、存储方式、分配内存大小、磁盘最大空间、缓存期限
proxy_cache_path /fastdfs/cache/nginx/proxy_cache levels=1:2
keys_zone=http-cache:200m max_size=1g inactive=30d;
proxy_temp_path /fastdfs/cache/nginx/proxy_cache/tmp;
#配置存储服务集群 group1 负载均衡服务器
upstream fdfs_group1 {
server 192.168.66.12:8888 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.66.13:8888 weight=1 max_fails=2 fail_timeout=30s;
}
#配置存储服务集群 group2 负载均衡服务器
upstream fdfs_group2 {
server 192.168.1.137:8888 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.1.138:8888 weight=1 max_fails=2 fail_timeout=30s;
}
以下是 server 段中的配置:
#修改监听端口:
listen 80;
#配置存储集群组 group1 的负载均衡参数
location /group1/M00 {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_cache http-cache;
proxy_cache_valid 200 304 12h;
proxy_cache_key u r i uri uriis_args$args;
proxy_pass http://fdfs_group1;
expires 30d;
}
#配置存储集群组 group2 的负载均衡参数
location /group2/M00 {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_cache http-cache;
proxy_cache_valid 200 304 12h;
proxy_cache_key u r i uri uriis_args$args;
proxy_pass http://fdfs_group2;
expires 30d;
}
#设置清除缓存的访问权限
location ~/purge(/.*) {
allow 127.0.0.1;
allow 192.168.66.0/24;
deny all;
proxy_cache_purge http-cache 1 1 1is_args$args;
}
按 nginx 配置需要创建相应的缓存目录:
# mkdir -p /fastdfs/cache/nginx/proxy_cache
# mkdir -p /fastdfs/cache/nginx/proxy_cache/tmp
两个tracker跟踪服务集群都做相同配置修改。
# firewall-cmd --zone=public --add-port=80/tcp --permanent
# firewall-cmd --reload ## 重启防火墙
开启两台tracker跟踪服务集群端口
# /usr/local/nginx/sbin/nginx
测试Nginx是否安装成功
# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
重启Nginx的命令为
# /usr/local/nginx/sbin/nginx -s reload
设置Nginx开机启动
# vi /etc/rc.local
/usr/local/nginx/sbin/nginx
前面直接通过访问Storage节点中的Nginx的文件
http://192.168.66.12:8888/group1/M00/00/00/wKhCDF_J7qeAO4xNAAxZcPR00vw.tar.gz
http://192.168.66.14:8888/group2/M00/00/00/wKhCDl_J7OaAaJvwAAxZcPR00vw.tar.gz
http://192.168.66.14:8888/group2/M00/00/00/wKhCD1_KIJ6AKziFAAxZcPR00vw.tar.gz
现在可以通过Tracker中的Nginx来进行访问
(1)通过Tracker1中的Nginx来访问
http://192.168.66.10/group1/M00/00/00/wKhCDF_J7qeAO4xNAAxZcPR00vw.tar.gz
http://192.168.66.10/group2/M00/00/00/wKhCDl_J7OaAaJvwAAxZcPR00vw.tar.gz
http://192.168.66.10/group2/M00/00/00/wKhCD1_KIJ6AKziFAAxZcPR00vw.tar.gz
(2)通过Tracker2中的Nginx来访问
http://192.168.66.11/group1/M00/00/00/wKhCDF_J7qeAO4xNAAxZcPR00vw.tar.gz
http://192.168.66.11/group2/M00/00/00/wKhCDl_J7OaAaJvwAAxZcPR00vw.tar.gz
http://192.168.66.11/group2/M00/00/00/wKhCD1_KIJ6AKziFAAxZcPR00vw.tar.gz
由上面的文件访问效果可以看到,每一个Tracker中的Nginx都单独对后端的Storage组做了负载均衡,但整套FastDFS集群如果想对外提供统一的文件访问地址,还需要对两个Tracker中的Nginx进行HA集群。
另一种设置开机自启动的方式,创建系统服务。
1、在系统服务目录里创建nginx.service文件
vim /usr/lib/systemd/system/nginx.service
2、写入内容如下:
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Description:描述服务
After:描述服务类别
[Service]服务运行参数的设置
Type=forking是后台运行的形式
ExecStart为服务的具体运行命令
ExecReload为重启命令
ExecStop为停止命令
PrivateTmp=True表示给服务分配独立的临时空间
注意:[Service]的启动、重启、停止命令全部要求使用绝对路径
[Install]运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为3
设置开机自启动
# systemctl enable nginx.service
查看nginx状态
# systemctl status nginx.service
很奇怪,明明启动成功了,为什么显示Active: inactive (dead)?
ps aux查看系统有哪些进程正在运行。杀死nginx重启nginx,kill来杀死某一个进程,killall杀死一类进程,pkill踢出某个终端
# pkill -9 nginx
# ps aux | grep nginx
# systemctl restart nginx #重启
# systemctl start nginx 启动
# systemctl stop nginx 停止
再次查看状态,变成了active,搞定。
# service nginx stop
# chkconfig nginx off
# rm -rf /usr/sbin/nginx
# rm -rf /etc/nginx
# rm -rf /etc/init.d/nginx
# rm -rf /usr/local/nginx
# rm -rf /usr/local/src/nginx-1.18.0
# yum remove nginx
如果要重新安装,可以安装上面步骤卸载nginx。
使用Keepalived + Nginx组成的高可用负载均衡集群做两个Tracker节点中Nginx的负载均衡
在Keepalived+Nginx实现高可用负载均衡集群中配置Tracker节点中Nginx的负载均衡反向代理
相关安装和配置,请参考第01章 CentOS7.x 搭建 Keepalived+Nginx 高可用Web负载均衡。就是两台高可用主机192.168.66.8
和192.168.66.9
中的Nginx执行相同的配置。
在两台高可用Nginx配置中增加对两台FastDFS跟踪服务集群的负载均衡反向代理配置,如下:
# vim /usr/local/nginx/conf/nginx.conf
user root;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
## FastDFS Tracker Proxy
upstream fastdfs_tracker {
server 192.168.66.10 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.66.11 weight=1 max_fails=2 fail_timeout=30s;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
## FastDFS Proxy
location /dfs {
root html;
index index.html index.htm;
proxy_pass http://fastdfs_tracker/;
proxy_set_header Host $http_host;
proxy_set_header Cookie $http_cookie;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 300m;
}
}
}
重点配置说明:
## FastDFS Tracker Proxy
upstream fastdfs_tracker {
server 192.168.66.10 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.66.11 weight=1 max_fails=2 fail_timeout=30s;
}
## FastDFS Proxy
location /dfs {
root html;
index index.html index.htm;
proxy_pass http://fastdfs_tracker/;
proxy_set_header Host $http_host;
proxy_set_header Cookie $http_cookie;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 300m;
}
完成两台高可用nginx以上配置修改后,需要重启 nginx,因当时我们配置了nginx状态检查,如果挂了会通过脚本自动重启,因此在这里我们只需要让nginx挂了就行,如下:
# killall nginx
执行一下命令后,nginx会自动重启
使用VIP访问FastDFS集群,通过Keepalived+Nginx组成的高可用负载集群的VIP(192.168.66.150)来访问FastDFS集群中的文件。
http://192.168.66.150/dfs/group1/M00/00/00/wKhCDF_J7qeAO4xNAAxZcPR00vw.tar.gz
http://192.168.66.150/dfs/group2/M00/00/00/wKhCDl_J7OaAaJvwAAxZcPR00vw.tar.gz
http://192.168.66.150/dfs/group2/M00/00/00/wKhCD1_KIJ6AKziFAAxZcPR00vw.tar.gz
注意:千万不要使用kill -9命令强杀FastDFS进程,否则可能会导致binlog数据丢失。
运维之路-CentOS7安装FastDFS:https://blog.csdn.net/wifi74262580/article/details/105251924/
arded_for;
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 300m;
}
}
}
> **重点配置说明:**
>
> \## FastDFS Tracker Proxy
>
> upstream fastdfs_tracker {
>
> server 192.168.66.10 weight=1 max_fails=2 fail_timeout=30s;
>
> server 192.168.66.11 weight=1 max_fails=2 fail_timeout=30s;
>
> }
>
> \## FastDFS Proxy
>
> location /dfs {
>
> root html;
>
> index index.html index.htm;
>
> proxy_pass http://fastdfs_tracker/;
>
> proxy_set_header Host $http_host;
>
> proxy_set_header Cookie $http_cookie;
>
> proxy_set_header X-Real-IP $remote_addr;
>
> proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
>
> proxy_set_header X-Forwarded-Proto $scheme;
>
> client_max_body_size 300m;
>
> }
#### 7.2.2 重启 nginx
完成两台高可用nginx以上配置修改后,需要重启 nginx,因当时我们配置了nginx状态检查,如果挂了会通过脚本自动重启,因此在这里我们只需要让nginx挂了就行,如下:
```shell
# killall nginx
执行一下命令后,nginx会自动重启
使用VIP访问FastDFS集群,通过Keepalived+Nginx组成的高可用负载集群的VIP(192.168.66.150)来访问FastDFS集群中的文件。
http://192.168.66.150/dfs/group1/M00/00/00/wKhCDF_J7qeAO4xNAAxZcPR00vw.tar.gz
http://192.168.66.150/dfs/group2/M00/00/00/wKhCDl_J7OaAaJvwAAxZcPR00vw.tar.gz
http://192.168.66.150/dfs/group2/M00/00/00/wKhCD1_KIJ6AKziFAAxZcPR00vw.tar.gz
注意:千万不要使用kill -9命令强杀FastDFS进程,否则可能会导致binlog数据丢失。
运维之路-CentOS7安装FastDFS:https://blog.csdn.net/wifi74262580/article/details/105251924/