Docker集群环境下安装Fastdfs集群+Nginx负载均衡

一、环境配置

现有两台服务器10.168.103.110(旧服务器)和10.168.103.111(新服务器),其中110服务器上有swarm集群,一个tracker和一个storage,现在要做Fastdfs集群,满足110上Fastdfs宕机的情况,111服务器上的Fastdfs能够正常使用。

  1. 首先查看110服务器的网络情况:
docker network ls

网络名称为prod-net
Docker集群环境下安装Fastdfs集群+Nginx负载均衡_第1张图片

docker node ls

在这里插入图片描述

二、搭建docker网络集群(swarm)

这里我们需要在新服务器111上创建swarm的管理节点,将两台服务器的docker节点组织起来,以同一集群的方式进行管理:
参考博客:https://segmentfault.com/a/1190000020378231

  1. 在管理节点前首先要初始化110服务器上的管理节点(这里已经初始化过)
    Docker集群环境下安装Fastdfs集群+Nginx负载均衡_第2张图片
  2. 将111服务器加入到110的管理节点,这里111需要加的是管理节点而不是工作节点(docker swarm的工作节点不能正常使用docker-compose启动)
    在110服务器上输入docker swarm join-token manager,即可获得管理节点的join-token
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网络的问题)

三、搭建Fastdfs集群

因为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

Docker集群环境下安装Fastdfs集群+Nginx负载均衡_第3张图片

# 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集群环境下安装Fastdfs集群+Nginx负载均衡_第4张图片
三个文件都改结束过后,退出容器重新启动。

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都可以访问,此时集群搭建成功。
Docker集群环境下安装Fastdfs集群+Nginx负载均衡_第5张图片
在这里插入图片描述

四、nginx负载均衡(https://www.cnblogs.com/1214804270hacker/p/9325150.html)

我们还需要在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集群环境下安装Fastdfs集群+Nginx负载均衡_第6张图片
修改两个部分,然后启动docker-compose文件,此时完成了nginx的负载均衡,如果110的Fastdfs宕机了,访问的时候会自动寻找111的。适应Nginx访问上面测试文件也是可以的。
Docker集群环境下安装Fastdfs集群+Nginx负载均衡_第7张图片

你可能感兴趣的:(工具,docker,负载均衡,nginx)