Linux-安装FastDFS

x33g5p2x  于2021-09-27 转载在 Linux  
字(11.5k)|赞(0)|评价(0)|浏览(196)

在学习前必须将docker安装好,可以参考我博客里Docker安装教程,自行查找

部署结构图

最小化部署图

注意:为了做到高可用,一个group建议分为两台以上的机器。

为了简化FastDFS的搭建我们使用dokcer容器来搭建

FastDFS单机搭建

需要准备Centos7并安装Docker 我的ip是 192.168.66.67

准备工作

安装FastDFS镜像

docker pull morunchang/fastdfs

可以通过docker images查看是否拉取下来

创建 tracker 容器

docker run -d --name tracker  --restart=always  --network=host morunchang/fastdfs sh tracker.sh

创建 storage 容器

docker run -d --name storage  --restart=always   --network=host -e TRACKER_IP=192.168.66.67:22122 -e GROUP_NAME=group1 morunchang/fastdfs sh storage.sh
  • 使用的网络模式是–net=host, 192.168.66.66是宿主机的IP 更改为你自己的
  • group1是组名,即storage的组

默认访问端口是8080 如果不想使用8080 端口访问那么进入 storage容器里吧 nginx 的端口号监听 改了就行

docker exec -it storage bash

修改 nginx

vi etc/nginx/conf/nginx.conf
listen       8021;  #设置监听端口
         location ~ /M00 {       
         add_header Cache-Control no-store;  #关闭nginx缓存    否则数据不同步
         root /data/fast_data/data;
         ngx_fastdfs_module;       
                    
        }

然后 重启nginx

/etc/nginx/sbin/nginx  -c  /etc/nginx/conf/nginx.conf
/etc/nginx/sbin/nginx -s reload

一直使用 直到出现下面这种情况 ok

nginx: [emerg] bind() to 0.0.0.0:8021 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:8021 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:8021 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:8021 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:8021 fai

FastDFS集群

  • 3 组tracker
  • 3 个storage节点
  • 1 组group
  • 轮询存储策略
  • Keepalived+Nginx高可用+负载均衡
  • Nginx缩略图+缓存

环境准备

VM 虚拟机搭建

名称IP
服务器系统Centos7
服务器1 nginx+keepalved192.168.66.67
服务器2 nginx+keepalved192.168.66.68
服务器3 nginx+keepalved192.168.66.69
对外统一IP(vip) keepalved192.168.66.70

搭建集群

搭建前必须 看的内容

特别注意不要 把storage和tracker 的容器重启 包括 重启服务器 否则/etc下面的数据同步配置 一切恢复默认配置 需要从新配置

如果你不配置 你会发现访问的时候某明奇妙么的404 时而可以访问 时而不能访问

解决办法:

在全部服务器 需要配置的文件中/etc 下面有两个 文件 而且都在storage容器里

docker exec -it storage bin/bash 启动storage容器

vi /etc/fdfs/storage.conf 和 vi /etc/fdfs/mod_fastdfs.conf

可以看到 关联的服务器器 配置都编程本机的了

tracker_server=192.168.66.67:22122
tracker_server=192.168.66.67:22122
tracker_server=192.168.66.67:22122

改为 其他服务器

tracker_server=192.168.66.67:22122
tracker_server=192.168.66.68:22122
tracker_server=192.168.66.69:22122

然后重启服务

usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart

以上配置好了 你在404 来找我 (亲自测试 10遍 )

还有就是容器 重启动的话(服务器重启) 那么容器内服务也要手动启动 不要想着 靠 配置自动重启 不靠谱 有时莫名其妙的启动失败

我们手动重启

tracker

docker exec -it   tracker  bin/bash
/etc/nginx/sbin/nginx -s reload

storage

docker exec -it   storage  bin/bash
usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart

/etc/nginx/sbin/nginx  -c  /etc/nginx/conf/nginx.conf

/etc/nginx/sbin/nginx -s reload

如果执行上面的命令出现

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

表示你docker 没启动

systemctl restart docker

还有就是 如果你发现你配置都没问题就是死活上传失败

来回执行下面命令 看报不报错 报错看报错内容解决

usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart

/etc/nginx/sbin/nginx  -c  /etc/nginx/conf/nginx.conf

/etc/nginx/sbin/nginx -s reload

如果还不行

在监控前先删除访问记录

cat /dev/null >  etc/nginx/logs/access.log

然后在 各 storage 容器 执行 tail -f etc/nginx/logs/access.log 来开启实时监控 看访问情况 看看到底是那个一个没有启动

好了 就这么多 切记 否则 你会发现昨天好好的今天 怎么死活都访问不了 我明明配置好了啊

以上能解决你百分之95的 错误 其他错误 一定就是你配置文件有问题 仔细检查 有可能就是一个标点符号写错误

亲自测试 至少10遍

我们开始搭建集群 FastDFS

192.168.66.67

创建 tracker 容器

docker run -d --name tracker  --restart=always  --network=host morunchang/fastdfs sh tracker.sh

创建 storage 容器

docker run -d --name storage  --restart=always   --network=host -e TRACKER_IP=192.168.66.67:22122 -e GROUP_NAME=group1 morunchang/fastdfs sh storage.sh

192.168.66.68

创建 tracker 容器

docker run -d --name tracker  --restart=always  --network=host morunchang/fastdfs sh tracker.sh

创建 storage 容器

docker run -d --name storage  --restart=always   --network=host -e TRACKER_IP=192.168.66.68:22122 -e GROUP_NAME=group1 morunchang/fastdfs sh storage.sh

192.168.66.69

创建 tracker 容器

docker run -d --name tracker  --restart=always  --network=host morunchang/fastdfs sh tracker.sh

创建 storage 容器

docker run -d --name storage  --restart=always   --network=host -e TRACKER_IP=192.168.66.69:22122 -e GROUP_NAME=group1 morunchang/fastdfs sh storage.sh

修改所有服务器 storage容器的 配置文件

docker exec -it storage bin/bash (进入容器)

vi /etc/fdfs/storage.conf

tracker_server=192.168.66.67:22122
tracker_server=192.168.66.68:22122
tracker_server=192.168.66.69:22122

storage.conf 除了以上配置建议修改 (优化)

max_connections=512     #最大线程数  如果人多的话建议改大点  disk_reader_threads每+1 这个总线程就要+256
buff_size = 2048 KB    #上传图片 缓存区  建议大一点
accept_threads=10      #排队中 的线程  建议大一点 否则有可能人多的时候 访问失败了 
work_threads=4    	   #工作线程 也就是一直保持活动状态的  建议和 cpu的核一样
disk_reader_threads = 2   # 每个存储基路径的磁盘读取器线程数  这个建议也大一点 提高访问速度 不建议太大

vi /etc/fdfs/mod_fastdfs.conf

tracker_server=192.168.66.67:22122
tracker_server=192.168.66.68:22122
tracker_server=192.168.66.69:22122

vi /data/fastdfs/conf/client.conf

tracker_server=192.168.66.67:22122
tracker_server=192.168.66.68:22122
tracker_server=192.168.66.69:22122
mkdir  -p  /home/yuqing/fastdfs    #创建client的默认存储路径

重启启动服务

usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart

/etc/nginx/sbin/nginx  -c  /etc/nginx/conf/nginx.conf

/etc/nginx/sbin/nginx -s reload

以上内容都完事的话 那么 这些storage服务之间的数据就会开始同步了

我们可以利用入门案例里的SpringBoot项目 来进行测试 无效修改项目直接上传文件就行 向192.168.66.67上传文件

返回 的url如下

http://192.168.66.67:8080/group1/M00/00/00/wKhCQ1_LrZCAD3H6AAQplCTU_z8232.jpg

然后我们使用其他服务访问看看

http://192.168.66.68:8080/group1/M00/00/00/wKhCQ1_LrZCAD3H6AAQplCTU_z8232.jpg

http://192.168.66.69:8080/group1/M00/00/00/wKhCQ1_LrZCAD3H6AAQplCTU_z8232.jpg

发现也是能访问到的 端口8080是fastDfs默认的端口 后面我们会改成80的 这里不用担心

到这里我们发现一个问题的是 我们始终都是在使用 192.168.66.67 这个服务 我们另外2个服务除了同步数据 作为备份服务没啥用了

如果在访问量特别大的情况下 192.168.66.67肯定是撑不住的 我们可以使用 nginx的负载均衡 来让备用服务也参与进来

在入门案例中我们创建了 tracker容器 但是根本就是摆设 此刻我们的 tracker容器就 可以派上用处了 而我们只用容器里的ngxin做反向代理 其他的都不需要 重要事情说三遍 注意 注意 注意 很多人都在瞎配置 导致 根本就无法实现 负载均衡

修改所有服务 storage 里的nginx

docker exec -it storage bin/bash

vi etc/nginx/conf/nginx.conf
listen       8888;
 
         location ~ /M00 {
         
 				 add_header Cache-Control no-store;  #关闭nginx缓存
                    root /data/fast_data/data;
                    ngx_fastdfs_module;
        }

其他的内容都不要默认就行

listen 8888; 必须 和 storage 里的 storage.conf 内的 http.server_port 一致

启动服务

usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart

/etc/nginx/sbin/nginx  -c  /etc/nginx/conf/nginx.conf

/etc/nginx/sbin/nginx -s reload

修改所有服务tracker里的nginx

docker exec -it tracker bin/bash (进入容器)

vi etc/nginx/conf/nginx.conf

http {
	#限流  每秒200个线程
 	limit_req_zone $binary_remote_addr zone=allips:10m rate=200r/s;
 	#复制均衡配置
       upstream fastdfs {
            server 192.168.66.67:8888;
            server 192.168.66.68:8888;
            server 192.168.66.69:8888;
        }

	server {
        listen       80;  
        location / {
        add_header Cache-Control no-store;  #关闭nginx缓存
        #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
        proxy_next_upstream http_502 http_504 error timeout invalid_header;
		#负载均衡
	
    # 防止转发后请求头  数据丢失
	  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_pass   http://fastdfs/$args;     #get请求带参数
             proxy_pass   http://fastdfs
            index  index.html index.htm;
        }

        location = /favicon.ico {
            log_not_found off;
            access_log off;
          }

        
.....

把 location ~ /M00删除

listen 80; 用于外网访问的端口 必须和storage里的client.conf内http.tracker_server_port保持一致 默认是80

然后执行 下面命令 启动nginx

/etc/nginx/sbin/nginx

我们在游览器中直接访问 http://192.168.66.67:8000/ 如果能进入 nginx初始化的页面代表 配置没问题

http://192.168.66.67:80/group1/M00/00/00/wKhCQ1_LrZCAD3H6AAQplCTU_z8232.jpg

http://192.168.66.68:80/group1/M00/00/00/wKhCQ1_LrZCAD3H6AAQplCTU_z8232.jpg

http://192.168.66.69:80/group1/M00/00/00/wKhCQ1_LrZCAD3H6AAQplCTU_z8232.jpg

测试是否实现了负载均衡 我们一直访问一个 地址 比如:

http://192.168.66.67:80/group1/M00/00/00/wKhCQ1_LrZCAD3H6AAQplCTU_z8232.jpg

进入192.168.66.67 和 192.168.66.68 和 192.168.66.69 中的storage里 然后使用下面的命令来监控访问情况

docker exec -it   storage  bin/bash

在监控前先删除访问记录

cat /dev/null >  etc/nginx/logs/access.log

开启实时监控

tail -f etc/nginx/logs/access.log

访问20次看看 是不是在这些服务器之间来回跳转请求 而不是一直死磕在192.168.66.67里

通过上面我们完成了 负载均衡 但是还面临一个新的问题及时 如果 主服务器宕机了那么 不就完了

就拿上面3个服务器来说 在同一时间 我们只能有一个是主服务器 对外提供访问的 比如 192.168.66.67 这个服务器

那么 192.168.66.67 宕机了 怎么办呢? 很简单 就是将ip转移就行了 下面就会教你怎么ip漂移的

keepalived实现高可用(vip)

简单来说就是 你有3台服务器 192.168.66.67(主) ,192.168.66.68(副) 192.168.66.69 (副) vip 虚拟地址是192.168.66.70 (用来漂移ip的)

如果主服务器宕机了 那么 vip 虚拟地址自动漂移绑定到其他副服务器上 当做主服务器使用

而我们以后绑定域名也是绑定 vip 这个地址 192.168.66.70

注意 : 绑定vip 虚拟地址的电脑或者服务器 必须是在一个路由(同一个网络)下的才有效 才能实现自动漂移绑定

当然如果你不想有这个局限性那么 可以使用 HeartBeat 但是这个配置比较难

每个服务器都要下载和配置 keepalived 才能实现地址漂移

下载地址

http://www.keepalived.org/download.html

我下载的是 keepalived-1.2.18.tar.gz

链接:https://pan.baidu.com/s/17MpeV2GX_S9ZcEaJuR66xw
提取码:1234

上传到这个 /usr/local/src目录下

解压安装

cd /usr/local/src

tar -zxvf keepalived-1.2.18.tar.gz

cd /usr/local/src/keepalived-1.2.18

yum install gcc   

yum install openssl-devel -y

./configure --prefix=/usr/local/keepalived

make && make install

执行下面命令

mkdir /etc/keepalived
 
 cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

复制 keepalived 服务脚本到默认的地址

cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/

cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

ln -s /usr/local/sbin/keepalived /usr/sbin/

rm -rf /sbin/keepalived    # 如果有就删没有跳过

ln -s /usr/local/keepalived/sbin/keepalived /sbin/

设置 keepalived 服务开机启动

chkconfig keepalived on

修改 Keepalived 配置文件

先查询网卡的名称 我的是 ens33

ip addr

192.168.66.67 (主服务器的Keepalived 配置)

rm -rf  /etc/keepalived/keepalived.conf

vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
	router_id jackfang  # 非常重要,标识本机的hostname  随意名称
}

vrrp_script check_nginx {
    script "/etc/keepalived/nginx_check.sh"   #nginx服务检查脚本    
    interval 2    # 检测时间间隔                         
    weight -20   # 如果条件成立则权重减20
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33  #本机网卡 我的是 ens33  使用ip addr 查询
    virtual_router_id 100  所有的Keepalived id必须一样
    mcast_src_ip 192.168.66.67 ## 本机 IP 地址
    priority 100  #主备的优先级priority 
    advert_int 1  #检查时间1秒
    nopreempt  #不争抢vip   
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        check_nginx  # 检查haproxy健康状况的脚本
    }
    virtual_ipaddress {
        192.168.66.70/24  #虚拟 ip,可以定义多个 地址/网段  网段要和实际ip相同 否则外网访问不了  
    }
    
    
}

192.168.66.68 (副服务器的Keepalived 配置)

rm -rf  /etc/keepalived/keepalived.conf

vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
	router_id jackfang  # 非常重要,标识本机的hostname  随意名称
}

vrrp_script check_nginx {
    script "/etc/keepalived/nginx_check.sh"   #nginx服务检查脚本    
    interval 2    # 检测时间间隔                         
    weight -20   # 如果条件成立则权重减20
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33  #本机网卡 我的是 ens33  使用ip addr 查询
    virtual_router_id 100  所有的Keepalived id必须一样
    mcast_src_ip 192.168.66.68 ## 本机 IP 地址
    priority 90  #主备的优先级priority 
    advert_int 1  #检查时间1秒 
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        check_nginx  # 检查haproxy健康状况的脚本
    }
    virtual_ipaddress {
        192.168.66.70/24  #vip地址/网段  网段要和实际ip相同 否则外网访问不了  
    }
    
    
    
}

192.168.66.69 (副服务器的Keepalived 配置)

rm -rf  /etc/keepalived/keepalived.conf

vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
	router_id jackfang  # 非常重要,标识本机的hostname  随意名称
}

vrrp_script check_nginx {
    script "/etc/keepalived/nginx_check.sh"   #nginx服务检查脚本    
    interval 2    # 检测时间间隔                         
    weight -20   # 如果条件成立则权重减20
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33  #本机网卡 我的是 ens33  使用ip addr 查询
    virtual_router_id 100  所有的Keepalived id必须一样
    priority 80  #主备的优先级priority 
    mcast_src_ip 192.168.66.69 8088 ## 本机 IP 地址
    advert_int 1  #检查时间1秒   
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        check_nginx  # 检查haproxy健康状况的脚本
    }
    virtual_ipaddress {
        192.168.66.70/24  #vip地址/网段  网段要和实际ip相同 否则外网访问不了  
    }    
    
}

这些配置文件不同地方就是 priority 的优先级 和 state (MASTER(主)|BACKUP(副)) 以及本机ip设置

创建检测nginx脚本

用于发送心跳的

192.168.66.67 192.168.66.68 192.168.66.69

vi /etc/keepalived/nginx_check.sh
#!/bin/bash
A=`ps -C nginx -no-header |wc -l`
if [ $A -eq 0 ];then
/etc/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
        killall keepalived
fi
fi

添加权限:

chmod +x /etc/keepalived/nginx_check.sh

keepalived命令

service keepalived start  #启动 (1)

查看keepalived运行状态

service keepalived status

启动服务后观察网卡信息

192.168.66.67

ip addr

可以发现 我们现在 是可以 ping 192.168.66.70的

192.168.66.68(服务器) 和 192.168.66.69(服务器) 同上配置 但是配置完ip addr 不会发生变化只有 192.168.66.67 宕机了 那么 192.168.66.70 才会进行地址漂移到192.168.66.68上…

测试地址漂移

当 192.168.66.67 192.168.66.68 192.168.66.69 都配置好了 我们来检测 是否能漂移成功

192.168.66.69 进行 ping 192.168.66.70 不要关
1.
将 192.168.66.67 服务器关闭
1.
查询 192.168.66.68 的 ip addr 看看 192.168.66.70地址漂移过来没

然后我们将192.168.66.67 恢复 看看地址漂移回去了没 可以发现 地址又漂移回去了

这样就能保住 就算 某个服务器宕机了 还能继续工作

什么是裂脑?

由于两台高可用服务器之间在指定的时间内,无法互相检测到对方心跳而各自启动故障转移功能,取得了资源以及服务的所有权,而此时的两台高可用服务器

对都还活着并作正常运行,这样就会导致同一个IP湖综合服务在两端同时启动而发生冲突的严重问题,最严重的就是两台主机同时占用一个VIP的地址,当用户写入数

据的时候可能会分别写入到两端,这样可能会导致服务器两端的数据不一致或造成数据的丢失,这种情况就本成为裂脑,也有的人称之为分区集群或者大脑垂直分隔

在上面我们已经解决了 可能发裂脑 的问题

nopreempt  #不争抢vip

keepalived的日志文件路径:

vi /var/log/messages

还有就是 如果你重启 服务器 那么 keepalived 生效时间很慢的 等个几分钟后在看看 ip addr 有没有 vip

到这里可能你会吧 Keepalived 和 nginx 弄混 我这里在解释一遍

Keepalived 是为了防止服务器宕机 导致 不能正常工作

而 nginx 是将请求进行代理转发给其他的服务器 (负载均衡) 从而减少服务器的压力

测试

http://192.168.66.70/group1/M00/00/00/wKhCQ1_LrZCAD3H6AAQplCTU_z8232.jpg

你把 192.168.66.67服务器宕机 看看还能访问吗

答案是还能的 因为 192.168.66.68 和192.168.66.69 都还没死呢 自动会代替死去的主机

以上我们FastDFS集群 搭建完成

相关文章