CentOS7 部署 fastDFS 集群

本贴最后更新于 1792 天前,其中的信息可能已经水流花落

1. 部署前准备

1.1 服务器信息

主机名 IP 地址 相关服务和角色
node01 10.40.96.4 keepalived + ipvsadm
node02 10.40.96.5 keepalived + ipvsadm
node03 10.40.96.6 Nginx cache + fastdfs Tracker
node04 10.40.96.7 Nginx cache + fastdfs Tracker
node05 10.40.96.8 Group1/fastdfs-nginx-module + fastdfs Storage
node06 10.40.96.9 Group1/fastdfs-nginx-module + fastdfs Storage
node07 10.40.96.10 Group2/fastdfs-nginx-module + fastdfs Storage
node08 10.40.96.11 Group2/fastdfs-nginx-module + fastdfs Storage
-- 10.40.96.30 VIP

1.2 集群架构图

fastDFS集群架构

1.3 下载源文件到对应节点

源文件 存放节点
tengine-2.2.3.tar.gz node01 - node08
ngx_cache_purge-2.3.tar.gz node03、node04
FastDFS_v5.08.tar.gz node03 - node08
libfastcommon-master.zip node03 - node08
fastdfs-nginx-module_v1.16.tar.gz node05 - node08

2. 编译安装服务

2.1 安装 FastDFS

在 node03 - node08 节点上编译安装 fastdfs,执行如下脚本

#!/bin/bash # @Author zhanjie.me # @email i@zhanjie.me set -e # 设置源文件存放目录 src_dir=/usr/local/src # 安装make、cmake 和 gcc 编译器 yum install -y make cmake gcc gcc-c++ # 安装FastDFS核心库 cd $src_dir && \ unzip libfastcommon-master.zip && \ cd libfastcommon-master && \ ./make.sh && \ ./make.sh install # 为fastdfs主程序引用库文件 ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so || true ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so || true ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so || true ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so || true # FastDFS主程序安装 cd $src_dir && \ tar zxf FastDFS_v5.08.tar.gz && \ cd FastDFS && \ ./make.sh && \ ./make.sh install echo "=============Install Success!============="

2.1.1 分发执行脚本

for ((i=3;i<9;i++));do rsync -avzP fastDFS_install.sh root@node0$i:~/ ;done
for ((i=3;i<9;i++));do ssh root@node0$i bash /root/fastDFS_install.sh ;done

2.2 安装 tengine

我们在此处使用 tengine 代替原版 nginx

在 node03、node04 上扩展 ngx_cache_purge 安装 tengine

在 node05 - node08 上扩展 fastdfs-nginx-module、ngx_cache_purge 安装 tengine

执行脚本如下

#!/bin/bash # @Author zhanjie.me # @email i@zhanjie.me set -e name=`basename $0` # 设置源文件存放目录 src_dir=/usr/local/src case $1 in 0) echo 0 cd $src_dir && \ tar zxf tengine-2.2.3.tar.gz configure_command="./configure --prefix=/usr/local/tengine" ;; 1) echo 1 cd $src_dir && \ tar zxf tengine-2.2.3.tar.gz && \ tar zxf ngx_cache_purge-2.3.tar.gz configure_command="./configure --prefix=/usr/local/tengine --add-module=${src_dir}/ngx_cache_purge-2.3" ;; 2) echo 2 cd $src_dir && \ tar zxf tengine-2.2.3.tar.gz && \ tar zxf ngx_cache_purge-2.3.tar.gz && \ tar zxf fastdfs-nginx-module_v1.16.tar.gz && \ sed -i "s#/usr/local/include#/usr/include#g" fastdfs-nginx-module/src/config && \ mkdir -p /etc/fdfs && \ cp fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs configure_command="./configure --prefix=/usr/local/tengine --add-module=${src_dir}/ngx_cache_purge-2.3 --add-module=${src_dir}/fastdfs-nginx-module/src" ;; *) echo "Usage: bash $name [0|1|2]" exit 1 ;; esac # 安装make、cmake 和 gcc 编译器 yum install -y make cmake gcc gcc-c++ # 安装依赖 yum install -y pcre-devel openssl-devel # 编译安装tengine cd ${src_dir}/tengine-2.2.3 && \ bash -c \ "$configure_command && make && make install" # 注入启动文件 cat > /usr/lib/systemd/system/tengine.service << EOF [Unit] Description=The nginx HTTP and reverse proxy server After=syslog.target network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/usr/local/tengine/logs/nginx.pid ExecStartPre=/usr/local/tengine/sbin/nginx -t ExecStart=/usr/local/tengine/sbin/nginx -c /usr/local/tengine/conf/nginx.conf ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target EOF systemctl daemon-reload echo "=========Install Success============"

2.2.1 分发执行脚本

for ((i=3;i<9;i++)); do rsync -avzP tengine_install.sh root@node0$i:~/ ;done

针对 node03、node04 节点执行:

for ((i=3;i<5;i++)); do ssh root@node0$i bash /root/tengine_install.sh 1 ;done

针对 node05 - node08 节点执行:

for ((i=5;i<9;i++)); do ssh root@node0$i bash /root/tengine_install.sh 2 ;done

2.3 安装 keepalived

在 node01、node02 上安装 keepalived、ipvsadm

yum install -y keepalived ipvsadm

3. 配置服务

3.1 配置 fastdfs-tracker 服务

分别在 node03、node04 节点上执行如下操作

创建 base_path 目录

[root@node03 ~]# mkdir /var/data/fastdfs-tracker

生成配置文件

[root@node03 ~]# cd /etc/fdfs/ [root@node03 fdfs]# ls client.conf.sample storage.conf.sample tracker.conf.sample [root@node03 fdfs]# cp tracker.conf.sample tracker.conf

修改 base_url 路径

[root@node03 fdfs]# vim tracker.conf ... # the base path to store data and log files base_path=/var/data/fastdfs-tracker ...

设置服务开机启动

[root@node03 ~]# systemctl enable fdfs_trackerd.service

启动服务

[root@node03 ~]# systemctl start fdfs_trackerd [root@node03 ~]# systemctl status fdfs_trackerd.service

3.2 配置 fastdfs-storage 服务

分别在 node05-node08 节点上执行如下操作

创建 base_path 目录

mkdir -p /var/data/fastdfs-storage/base

创建 store_path0 目录

mkdir -p /var/data/fastdfs-storage/store

生成配置文件

[root@node05 ~]# cd /etc/fdfs/ [root@node05 fdfs]# cp storage.conf.sample storage.conf

修改 group_name,base_path, store_path0 和 tracker_server

[root@node05 fdfs]# vim storage.conf ... group_name=group1 #在node07、node08上为group2 base_path=/var/data/fastdfs-storage/base store_path0=/var/data/fastdfs-storage/store tracker_server=10.40.96.6:22122 tracker_server=10.40.96.7:22122 # the port of the web server on this storage server http.server_port=80 ...

为 store_path0 生成虚拟目录 M00

ln -s /var/data/fastdfs-storage/store/data /var/data/fastdfs-storage/store/data/M00

设置服务开机启动

[root@node05 ~]# systemctl enable fdfs_storaged.service

启动服务

[root@node05 fdfs]# systemctl start fdfs_storaged [root@node05 fdfs]# systemctl status fdfs_storaged

3.3 配置 fastdfs-storage 节点上的 nginx(tengine)服务

在 node05-node08 节点上执行如下操作

生成 http.conf 配置文件

cp /usr/local/src/FastDFS/conf/http.conf /etc/fdfs/

生成 mime.types 配置文件

cp /usr/local/src/FastDFS/conf/mime.types /etc/fdfs/

生成 fastdfs-nginx-module 的配置文件

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

修改配置文件

vim /etc/fdfs/mod_fastdfs.conf ... connect_timeout=10 #node05、node06 对应 group 1 #node07、node08 对应 group 2 group_name=group1/2 group_count = 2 tracker_server=10.40.96.6:22122 tracker_server=10.40.96.7:22122 url_have_group_name = true [group1] group_name=group1 storage_server_port=23000 store_path_count=1 store_path0=/var/data/fastdfs-storage/store [group2] group_name=group2 storage_server_port=23000 store_path_count=1 store_path0=/var/data/fastdfs-storage/store

修改 nginx(tengine)配置文件

listen 80; location ~ /group([0-9])/M00 { add_header Content-Disposition "attachment;filename=$arg_attname"; ngx_fastdfs_module; }

配置开机启动并启动服务

systemctl enable tengine systemctl start tengine

3.4 配置 fastdfs-tracker 节点上的 nginx(tengine)服务

创建缓存目录

mkdir -p /var/data/cache/nginx/proxy_cache

修改 nginx.conf 文件

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 /var/log/nginx/access.log main; sendfile on; keepalive_timeout 65; #设置缓存 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; #设置缓存存储路径、存储方式、分配内存大小、磁盘最大空间、缓存期限 #levels=1:2 表示缓存文件有两级目录 1表示第一级目录名为1位数,2表示第二级目录名为2位数 proxy_cache_path /var/data/cache/nginx/proxy_cache levels=1:2 #keys_zone 缓存区域名字,分配200m空间,最大缓存1g,有效期30天 keys_zone=http-cache:200m max_size=1g inactive=30d; proxy_temp_path /var/data/cache/nginx/proxy_cache/tmp; #设置 group1 的服务器 upstream fdfs_group1 { server 10.40.96.8:80 weight=1 max_fails=2 fail_timeout=30s; server 10.40.96.9:80 weight=1 max_fails=2 fail_timeout=30s; } #设置 group2 的服务器 upstream fdfs_group2 { server 10.40.96.10:80 weight=1 max_fails=2 fail_timeout=30s; server 10.40.96.11:80 weight=1 max_fails=2 fail_timeout=30s; } server { listen 80; #charset koi8-r; #access_log logs/host.access.log main; #access_log "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G" main; server_name localhost; 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; } 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 10.40.96.0/20; deny all; proxy_cache_purge http-cache $1$is_args$args; } } }

配置开机启动并启动服务

systemctl enable tengine systemctl start tengine

3.5 配置 keepalived 服务

在 node01、node02 上执行如下操作

开启网络转发

# open ip_forward echo "1" > /proc/sys/net/ipv4/ip_forward # edit sysctl.conf vi /etc/sysctl.conf net.ipv4.ip_forward = 1 sysctl -p

修改 keepalived.conf

node01 节点:

! Configuration File for keepalived global_defs { ## keepalived 自带的邮件提醒需要开启 sendmail 服务。建议用独立的监控或第三方 SMTP router_id node01 ## 标识本节点的字条串,通常为 hostname } ## 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称 vrrp_instance VI_1 { state MASTER ## 主节点为 MASTER,对应的备份节点为 BACKUP interface eth1 ## 绑定虚拟 IP 的网络接口,与本机 IP 地址所在的网络接口相同,我的是 eth1 virtual_router_id 96 ## 虚拟路由的 ID 号,两个节点设置必须一样,可选 IP 最后一段使用, 相同的 VRID 为一个组,他将决定多播的 MAC 地址 mcast_src_ip 10.40.96.4 ## 本机 IP 地址 priority 100 ## 节点优先级,值范围 0-254,MASTER 要比BACKUP 高 nopreempt ## nopreempt 解决异常恢复后再次抢占的问题 advert_int 1 ## 组播信息发送间隔,两个节点设置必须一样,默认 1s ## 设置验证信息,两个节点必须一致 authentication { auth_type PASS auth_pass zhanjie.me } ## 虚拟 IP 池, 两个节点设置必须一样 virtual_ipaddress { 10.40.96.30/20 dev eth1 label eth1:1 } } ## 定义lvs virtual_server 10.40.96.30 80 { delay_loop 6 #(每隔6秒查询realserver状态) lb_algo wlc #(lvs 算法) lb_kind DR #(Direct Route) persistence_timeout 60 #(同一IP的连接60秒内被分配到同一台realserver) protocol TCP #(用TCP协议检查realserver状态) real_server 10.40.96.6 80 { weight 100 #(权重) TCP_CHECK { connect_timeout 10 #(10秒无响应超时) delay_before_retry 3 connect_port 80 } } real_server 10.40.96.7 80 { weight 100 #(权重) TCP_CHECK { connect_timeout 10 #(10秒无响应超时) delay_before_retry 3 connect_port 80 } } }

node02 节点:

! Configuration File for keepalived global_defs { ## keepalived 自带的邮件提醒需要开启 sendmail 服务。建议用独立的监控或第三方 SMTP router_id node02 ## 标识本节点的字条串,通常为 hostname } ## 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称 vrrp_instance VI_1 { state BACKUP ## 主节点为 MASTER,对应的备份节点为 BACKUP interface eth1 ## 绑定虚拟 IP 的网络接口,与本机 IP 地址所在的网络接口相同,我的是 eth1 virtual_router_id 96 ## 虚拟路由的 ID 号,两个节点设置必须一样,可选 IP 最后一段使用, 相同的 VRID 为一个组,他将决定多播的 MAC 地址 mcast_src_ip 10.40.96.5 ## 本机 IP 地址 priority 90 ## 节点优先级,值范围 0-254,MASTER 要比BACKUP 高 nopreempt ## nopreempt 解决异常恢复后再次抢占的问题 advert_int 1 ## 组播信息发送间隔,两个节点设置必须一样,默认 1s ## 设置验证信息,两个节点必须一致 authentication { auth_type PASS auth_pass zhanjie.me } ## 虚拟 IP 池, 两个节点设置必须一样 virtual_ipaddress { 10.40.96.30/20 dev eth1 label eth1:1 } } ## 定义lvs virtual_server 10.40.96.30 80 { delay_loop 6 #(每隔6秒查询realserver状态) lb_algo wlc #(lvs 算法) lb_kind DR #(Direct Route) persistence_timeout 60 #(同一IP的连接60秒内被分配到同一台realserver) protocol TCP #(用TCP协议检查realserver状态) real_server 10.40.96.6 80 { weight 100 #(权重) TCP_CHECK { connect_timeout 10 #(10秒无响应超时) delay_before_retry 3 connect_port 80 } } real_server 10.40.96.7 80 { weight 100 #(权重) TCP_CHECK { connect_timeout 10 #(10秒无响应超时) delay_before_retry 3 connect_port 80 } } }

配置 keepalived 开机启动,并启动服务

systemctl enable keepalived.service systemctl start keepalived.service

3.6 配置 lvs_real-server

在 node03、node04 上执行如下操作

为 look 网卡加类型配置

echo "TYPE=Loopback" >> /etc/sysconfig/network-scripts/ifcfg-lo

新建 lvs_reald 服务

[root@node03 ~]# vim /etc/init.d/lvs_reald #!/bin/bash ### BEGIN INIT INFO # Provides: # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start realserver # Description: Start realserver ### END INIT INFO # change the VIP to proper value VIP=10.40.96.30 case "$1" in start) echo "Start REAL Server" /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce ;; stop) /sbin/ifconfig lo:0 down echo "Stop REAL Server" echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce ;; restart) $0 stop $0 start ;; *) echo "Usage: $0 {start|stop}" exit 1 ;; esac exit 0
[root@node03 ~]# chmod a+x /etc/init.d/lvs_reald

配置开机启动并启动服务

chkconfig lvs_reald on service lvs_reald start
  • FastDFS

    FastDFS 是用 C 语言编写的一款开源分布式文件系统。FastDFS 为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用 FastDFS 很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。

    17 引用 • 10 回帖 • 1 关注
  • HA
    5 引用
  • 高可用
    5 引用 • 16 回帖
  • LVS
    3 引用 • 1 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...