现有两台服务器10.168.103.110(旧服务器)和10.168.103.111(新服务器),其中110服务器上有swarm集群,一个tracker和一个storage,现在要做Fastdfs集群,满足110上Fastdfs宕机的情况,111服务器上的Fastdfs能够正常使用。
docker network ls
docker node ls
这里我们需要在新服务器111上创建swarm的管理节点,将两台服务器的docker节点组织起来,以同一集群的方式进行管理:
参考博客:https://segmentfault.com/a/1190000020378231
docker swarm join-token manager
然后在111服务器上执行前面取得的管理节点join token:
docker swarm join --token SWMTKN-1-36skn1672aqlxnx7bsqh5hhudvbdjxak48c1qsy3loy9ny7hh0-8zpzistuo0ycolr50ihlhodbd 10.168.103.110:2377
This node joined a swarm as a manager.
在111服务器上输入docker node ls 可以查看到和110服务器上一样的新加入的节点
到这里就完成了两个Docker节点组织起来了,用户就能以集群的方式进行管理。在docker-compose启动服务的时候就可以使用同一个网络了。(之前搭建Fastdfs一直没有成功,就是因为docker网络的问题)
因为110上已经有了Fastdfs了,所以直接在111上搭建,拿到110上的Fastdfs镜像编写docker-compose文件(这里我指定了容器的ip为10.0.1.59,因为每次起容器的时候ip都会改变,所以这里固定下,后面会用到),看到网络和110上的都是prod-net,要统一。
因为是后续搭建的集群,所以我们要先同步110上的历史数据,这里的同步也非常简单,刚开始编写docker-compose文件的时候,FASTDFS_IPADDR指定用旧服务器的ip,或者旧服务器Fastdfs的容器名称,当我把111上Fastdfs启动的时候他就会自动去同步(Binlong同步)110服务器的数据。
version: "3"
services:
fdfs-service:
image: fastdfs:v2
container_name: fdfs-prod
restart: always
ports:
- 8888:8888
- 22122:22122
- 23000:23000
- 8011:80
volumes:
- /home/xbb/fdfs/storage:/home/dfs
environment:
- FASTDFS_IPADDR=10.168.103.110
networks:
prod-net:
ipv4_address: 10.0.1.59
networks:
prod-net:
external: true
切换到docker-compose文件目录下执行启动容器(这里是tracker和storage都启动):
docker-compose -f docker-compose.yml up -d
我这里映射到宿主机的目录是/home/xbb/fdfs/storage,启动后在它下面会生成data目录和logs文件夹,这里就不多说Fastdfs的介绍,请参考:https://blog.csdn.net/zrs19800702/article/details/53911526
进入到容器内部查看同步状态:
docker exec -it fdfs-prod bash
查看状态:
fdfs_monitor /etc/fdfs/client.conf
# FDFS_STORAGE_STATUS:INIT :初始化,尚未得到同步已有数据的源服务器
# FDFS_STORAGE_STATUS:WAIT_SYNC :等待同步,已得到同步已有数据的源服务器
# FDFS_STORAGE_STATUS:SYNCING :同步中
# FDFS_STORAGE_STATUS:DELETED :已删除,该服务器从本组中摘除
# FDFS_STORAGE_STATUS:OFFLINE :离线
# FDFS_STORAGE_STATUS:ONLINE :在线,尚不能提供服务
# FDFS_STORAGE_STATUS:ACTIVE :在线,可以提供服务
这里表示我们的数据已经同步好并可以提供服务,这个时候去访问图片发现两个服务器都是可以访问的。
现在把历史数据同步完成了,接下来需要去完成增量同步:
上面说到我们把ip固定了,这里我们也需要去把旧服务器110上的容器ip给固定,这里我们把110 的修改为10.0.1.56
version: "3"
services:
fdfs-service:
image: fastdfs:v2
container_name: fdfs-test
restart: always
ports:
- 8888:8888
- 22122:22122
- 23000:23000
- 8011:80
volumes:
- /home/xbb/fastdfs/storage:/home/dfs
environment:
- FASTDFS_IPADDR=10.168.103.110
networks:
prod-net:
ipv4_address: 10.0.1.56
networks:
prod-net:
external: true
因为是用docker 部署的Fastdfs,所以他的ip也是容器的ip,tracker和storage的配置里面不能用宿主机的ip,否则会找不到对应ip而报错。改完固定ip后再把旧服务器的容器down调重新用docker-compose启动,之后在启动ip就会一直是固定的。
两个都启动过后开始修改容器内tracker和storage的配置,需要修改的就三个文件:
vi /etc/fdfs/client.conf
vi /etc/fdfs/storage.conf
vi /etc/fdfs/mod_fastdfs.conf
将两个容器内的这三个配置文件的tracker_server都改成:容器名称:22122
tracker_server=10.0.1.59:22122
tracker_server=10.0.1.56:22122
docker stop fdfs-prod
docker start fdfs-prod
重启之后集群搭建成功。
测试:
在旧服务器上(110)上传一个文件看新服务器(111)上是否同步成功:
docker exec -it fdfs-test bash
cd /var
echo qawsedrftg > a.txt
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf a.txt
执行后会返回一个路径,去浏览器访问,110和111都可以访问,此时集群搭建成功。
我们还需要在110服务器上搭建一个nginx,让它去轮询访问2个Fastdfs。
下载一个nginx镜像。
编写docker-compose文件,nginx.conf文件映射到容器内部 还有日志文件,注意网段要使用同一网段。
version: '3'
services:
nginx:
image: nginx:1.20.1
container_name: nginx-test
restart: always
networks:
- prod-net
ports:
- 81:80
volumes:
- /home/xbb/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- /home/xbb/nginx/log:/var/log/nginx
networks:
prod-net:
external:
name: prod-net
在宿主机/home/xbb/nginx/conf目录下创建nginx.conf文件:
worker_processes auto;
#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;
upstream fdfsServer{
server 10.168.103.111:8888;
server 10.168.103.110:8888;
}
client_max_body_size 20m;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location ~/group([0-9])/M[0-9] {
proxy_pass http://fdfsServer;
}
#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;
# }
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
修改两个部分,然后启动docker-compose文件,此时完成了nginx的负载均衡,如果110的Fastdfs宕机了,访问的时候会自动寻找111的。适应Nginx访问上面测试文件也是可以的。