在学习前必须将docker安装好,可以参考我博客里Docker安装教程,自行查找
最小化部署图
注意:为了做到高可用,一个group建议分为两台以上的机器。
为了简化FastDFS的搭建我们使用dokcer容器来搭建
需要准备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
默认访问端口是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
VM 虚拟机搭建
名称 | IP |
---|---|
服务器系统 | Centos7 |
服务器1 nginx+keepalved | 192.168.66.67 |
服务器2 nginx+keepalved | 192.168.66.68 |
服务器3 nginx+keepalved | 192.168.66.69 |
对外统一IP(vip) keepalved | 192.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漂移的
简单来说就是 你有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集群 搭建完成
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_45203607/article/details/120492700
内容来源于网络,如有侵权,请联系作者删除!