• Docker-compose实现Tomcat+Nginx负载均衡和部署javaweb运行环境以及搭建大数据集群环境


    使用Docker-compose实现Tomcat+Nginx负载均衡

    反向代理原理

    • 反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

    Nginx反向代理优化服务器的性能

    • Nginx可以在request读取完整请求前,buffer住(缓冲),然后一起发给服务器。因为有时候会出现卡顿现象,会断断续续传递,比如网慢的时候,request请求就会一点一点发给服务器,Nginx可以发给服务器一个完整的http请求。同样,Nginx也可以把response先buffer住,也是提升服务器性能。

    • 通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。当一个代理服务器能够代理外部网络上的主机,访问内部网络时,这种代理服务的方式称为反向代理服务

    Nginx代理Tomcat集群

    Nginx配置文件

    upstream tomcats {
        server Tomcat1:8080; 
        server Tomcat2:8080; 
        server Tomcat3:8080; 
    }
    
    server {
        listen 2422;
        server_name localhost;
    
        location / {
            proxy_pass http://tomcats; # 请求转向tomcats
        }
    }
    

    Docker-compose.yml

    version: "3.8"
    services:
        nginx:
            image: nginx
            container_name: ngix
            ports:
                - 80:2422
            volumes:
                - ./nginx/default.conf:/etc/nginx/conf.d/default.conf # 挂载配置文件
            depends_on:
                - tomcat01
                - tomcat02
                - tomcat03
    
        tomcat01:
            image: tomcat
            container_name: Tomcat1
            volumes:
                - ./tomcat1:/usr/local/tomcat/webapps/ROOT # 挂载web目录
    
        tomcat02:
            image: tomcat
            container_name: Tomcat2
            volumes:
                - ./tomcat2:/usr/local/tomcat/webapps/ROOT
    
        tomcat03:
            image: tomcat
            container_name: Tomcat3
            volumes:
                - ./tomcat3:/usr/local/tomcat/webapps/ROOT
    

    Tomcat配置文件

    <html>
    	<h1>This is Tomcat 1/2/3!</h1>
    </html>
    

    了解并至少实现Nginx的2种负载均衡策略

    • Nginx的负载均衡策略有如下几种:
    • 轮询 默认方式
    • weight 权重方式
    • ip_hash 依据ip分配方式
    • least_conn 最少连接方式
    • fair(第三方) 响应时间方式
    • url_hash(第三方) 依据URL分配方式

    轮询策略

    • 最基本的配置方法,它是upstream模块默认的负载均衡默认策略。每个请求会按时间顺序逐一分配到不同的后端服务器
    • 可以用过采用python文件进行直观显示
    import requests
    url = 'http://localhost'
    for i in range(1,10):
        response=requests.get(url)
        print(response.text)
    

    weight权重策略

    • 权重方式,在轮询策略的基础上指定轮询的几率。
    • weight参数用于指定轮询几率,weight的默认值为1,;weight的数值与访问比率成正比,比如Tomcat1 被访问的几率为其他服务器的两倍。
    upstream tomcats {
        server Tomcat1:8080 weight=2; 
        server Tomcat2:8080; 
        server Tomcat3:8080; 
    }
    
    • 通过py文件测试结果如下,Tomcat 1 的访问次数基本为其他的两倍即权重为两倍
    import requests
    url = 'http://localhost'
    count={'Tomcat 1':0,'Tomcat 2':0,'Tomcat 3':0}
    for i in range(0,90):
        response=requests.get(url)
        if  'This is Tomcat 1!' in response.text:
            count['Tomcat 1'] += 1
        if  'This is Tomcat 2!' in response.text:
            count['Tomcat 2'] += 1
        if  'This is Tomcat 3!' in response.text:
            count['Tomcat 3'] += 1
    print(count)
    

    使用Docker-compose部署javaweb运行环境

    分别构建tomcat、数据库等镜像服务

    Nginx配置文件

    upstream tomcats {
        server Tomcat:5050; 
    
    }
    
    server {
        listen 8080;
        server_name localhost;
    
        location / {
            proxy_pass http://tomcats;
            proxy_set_header   Host    $host; 
            proxy_set_header   X-Real-IP   $remote_addr; 
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    
        }
    }
    
    

    Docker-compose.yml

    version: "3"   
    services:    
      tomcat:     
        image: tomcat    
        hostname: hostname       
        container_name: Tomcat   
        ports:      
         - "5050:8080"          #后面访问网页的时候要选择对应的端口号5050
        volumes:  #数据卷
         - "./webapps:/usr/local/tomcat/webapps"
         - ./wait-for-it.sh:/wait-for-it.sh
        networks:   #网络设置静态IP
          webnet:
            ipv4_address: 15.22.0.15
      mysql:  
        build:
          context: ./mysql   #通过MySQL的Dockerfile文件构建MySQL
        image: mymysql:test
        container_name: Mysql
        ports:
          - "3309:3306" 
    
        command: [
                '--character-set-server=utf8mb4',
                '--collation-server=utf8mb4_unicode_ci'
        ]
        environment:
          MYSQL_ROOT_PASSWORD: "123456"
        networks:
          webnet:
            ipv4_address: 15.22.0.6
      nginx:
          image: nginx
          container_name: Nginx
          ports:
              - 8080:8080
          volumes:
              - ./nginx/default.conf:/etc/nginx/conf.d/default.conf # 挂载配置文件
          tty: true
          stdin_open: true
          networks:
           webnet:
            ipv4_address: 15.22.0.7
    networks:   #网络设置
     webnet:
       driver: bridge  #网桥模式
       ipam:
         config:
          - 
           subnet: 15.22.0.0/24   #子网
    

    Mysql配置文件

    • 主要webapps参考老师文件
    Dockerfile
    #  这个是构建MySQL的dockerfile
     
    FROM registry.saas.hand-china.com/tools/mysql:5.7.17
     
    # mysql的工作位置
    ENV WORK_PATH /usr/local/
    
    # 定义会被容器自动执行的目录
    ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d
     
    #复制gropshop.sql到/usr/local 
    COPY grogshop.sql  /usr/local/
    #把要执行的shell文件放到/docker-entrypoint-initdb.d/目录下,容器会自动执行这个shell
    COPY docker-entrypoint.sh  $AUTO_RUN_DIR/
     
    #给执行文件增加可执行权限
    RUN chmod a+x $AUTO_RUN_DIR/docker-entrypoint.sh
     
    # 设置容器启动时执行的命令
    #CMD ["sh", "/docker-entrypoint-initdb.d/import.sh"]
    
    Docker-entrypoint.sh
    !/bin/bash
    mysql -uroot -p123456 << EOF
    source /usr/local/grogshop.sql;
    
    构建调试
    • 文件配置完后,利用sudo docker-compose up -d build构建所有容器
    • 浏览器访问http://127.0.0.1:5050/ssmgrogshop_war发现登录页面正常,但是输入账号密码登录后出现了崩溃,应该是数据库登录时出问题了(血崩!。。。。500

    • 之后再看了一下老师的教程发现,有个修改数据库ip的步骤忘记做了,补上后重新构建 发现还是同样的错误
    • 查了一下所有容器的日志,发现tomcat里的报错:2020-05-18 19:13:25 DruidDataSource:1651 ERROR - create connection error com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'grogshop'
    • 然后又看来mysql里,原来根本没有grogshop这个数据库。
    • 原来是.sql文件出了问题。估计是在windows下解压然后复制到虚拟机过程里转码出了问题。直接把解压包复制到虚拟机里再加压成功排雷

    添加Nginx反向代理服务,实现负载均衡

    修改Nginx配置文件
    upstream tomcats {
        server Tomcat1:8080; 
        server Tomcat2:8080; 
        server Tomcat3:8080; 
    }
    
    修改Docker-compose.yml文件
    tomcat1:     
        image: tomcat    
        hostname: hostname       
        container_name: tomcat1   
        ports:      
         - "5051:8080"          #后面访问网页的时候要选择对应的端口号5050
        volumes:  #数据卷
         - "./webapps:/usr/local/tomcat/webapps"
         - ./wait-for-it.sh:/wait-for-it.sh
        networks:   #网络设置静态IP
          webnet:
            ipv4_address: 15.22.0.16
      tomcat2:     
        image: tomcat    
        hostname: hostname       
        container_name: tomcat2   
        ports:      
         - "5052:8080"          #后面访问网页的时候要选择对应的端口号5050
        volumes:  #数据卷
         - "./webapps:/usr/local/tomcat/webapps"
         - ./wait-for-it.sh:/wait-for-it.sh
        networks:   #网络设置静态IP
          webnet:
            ipv4_address: 15.22.0.17
      nginx:
        depends_on:
         - tomcat1
         - tomcat2
         - tomcat3
    

    使用Docker搭建大数据集群环境

    运行环境配置

    ubuntu容器初始化

    FROM ubuntu
    LABEL author=ra9zer
    
    更新系统源,安装vim与ssh
    apt-get update
    apt-get install vim
    apt-get install ssh
    

    #######配置SSH服务器

    vim ~/.bashrc 
    /etc/init.d/ssh start # 在文件末尾添加上一行的内容,实现ssd开机自启
    ssh-keygen -t rsa # 一直按回车即可
    cd ~/.ssh
    cat id_rsa.pub >> authorized_keys
    

    #######安装JDK

    apt-get install openjdk-8-jdk
    vim ~/.bashrc # 在文件末尾添加以下两行,配置Java环境变量:
    export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
    export PATH=$PATH:$JAVA_HOME/bin
    source ~/.bashrc # 使.bashrc生效
    
    
    ## 另开一个终端存个档
    docker ps 
    sudo docker commit 91102204f9f7 ubuntu/jdk8 
    sudo docker run -it -v /home/ubuntu/docker-Hadoop/build:/root/build --name ubuntu-jdk8 ubuntu/jdk8
    # 挂载是为了读取Hadoop安装文件
    

    #######安装Hadoop

    • 于官网下载Hadoop3.2.1,在拷贝到挂载目录下
    cd /root/build
    tar -zxvf hadoop-3.2.1.tar.gz -C /usr/local
    cd /usr/local/hadoop-3.2.1
    ./bin/hadoop version # 验证安装
    
    ###输出如下
    Hadoop 3.2.1
    Source code repository https://gitbox.apache.org/repos/asf/hadoop.git -r b3cbbb467e22ea829b3808f4b7b01d07e0bf3842
    Compiled by rohithsharmaks on 2019-09-10T15:56Z
    Compiled with protoc 2.5.0
    From source with checksum 776eaf9eee9c0ffc370bcbc1888737
    This command was run using /usr/local/hadoop-3.2.1/share/hadoop/common/hadoop-common-3.2.1.jar
    

    #######配置Hadoop集群

    cd /usr/local/hadoop-3.2.1/etc/hadoop #进入配置文件存放目录
    
    

    ########hadoop_env.sh

    vim hadoop-env.sh
    export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/ # 在任意位置添加
    

    ########core-site.xml

    vim core-site.xml
    
    ##添加以下内容
    <?xml version="1.0" encoding="UTF-8" ?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl" ?>
    <configuration>
      <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/usr/local/hadoop/tmp</value>
        <description>Abase for other temporary directories.</description>
      </property>
      <property>
        <name>fs.defaultFS</name>
        <value>hdfs://master:9000</value>
      </property>
    </configuration>
    

    ########hdfs-site.xml

    vim hdfs-site.xml
    
    ##添加以下内容
    <?xml version="1.0" encoding="UTF-8" ?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl" ?>
    <configuration>
        <property>
            <name>dfs.namenode.name.dir</name>
            <value>file:/usr/local/hadoop/namenode_dir</value>
        </property>
        <property>
            <name>dfs.datanode.data.dir</name>
            <value>file:/usr/local/hadoop/datanode_dir</value>
        </property>
        <property>
            <name>dfs.replication</name>
            <value>3</value>
        </property>
    </configuration>
    

    ########mapred-site.xml

    vim mapred-site.xml
    
    ##添加以下内容
    <?xml version="1.0" ?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl" ?>
    <configuration>
        <property>
            <name>mapreduce.framework.name</name>
            <value>yarn</value>
        </property>
        <property>
            <name>yarn.app.mapreduce.am.env</name>
            <value>HADOOP_MAPRED_HOME=/usr/local/hadoop-3.2.1</value>
        </property>
        <property>
            <name>mapreduce.map.env</name>
            <value>HADOOP_MAPRED_HOME=/usr/local/hadoop-3.2.1</value>
        </property>
        <property>
            <name>mapreduce.reduce.env</name>
            <value>HADOOP_MAPRED_HOME=/usr/local/hadoop-3.2.1</value>
        </property>
    </configuration>
    

    ########yarn-site.xml

    vim yarn-site.xml
    
    ##添加以下内容
    <?xml version="1.0" ?>
    <configuration>
        <property>
            <name>yarn.nodemanager.aux-services</name>
            <value>mapreduce_shuffle</value>
        </property>
        <property>
            <name>yarn.resourcemanager.hostname</name>
            <value>master</value>
        </property>
    </configuration>
    

    #######修改脚本

    cd /usr/local/hadoop-3.2.1/sbin
    
    ##对于start-dfs.sh和stop-dfs.sh文件,添加下列参数:
    HDFS_DATANODE_USER=root
    HADOOP_SECURE_DN_USER=hdfs
    HDFS_NAMENODE_USER=root
    HDFS_SECONDARYNAMENODE_USER=root
    
    ##对于start-yarn.sh和stop-yarn.sh,添加下列参数:
    YARN_RESOURCEMANAGER_USER=root
    HADOOP_SECURE_DN_USER=yarn
    YARN_NODEMANAGER_USER=root
    

    运行Hadoop集群

    运行主机

    做完以上步骤之后存档,然后开启三个终端,分别运行集群中的主机:
    
    docker commit  ubuntu/hadoop # 存档
    # 第一个终端
    docker run -it -h master --name master ubuntu/hadoop
    # 第二个终端
    docker run -it -h slave01 --name slave01 ubuntu/hadoop
    # 第三个终端
    docker run -it -h slave02 --name slave02 ubuntu/hadoop
    

    修改/etc/hosts

    vim /etc/hosts # 查看各终端的IP并修改
    
    添加内容重复内容删去
    172.17.0.2      master
    172.17.0.3      slave01
    172.17.0.4      slave02
    ##这里注意要看清清楚主机的ip地址 因人而异
    

    测试连通性

    • 检测下是否master是否可以连上slave01和slave02(exit为退出)

    修改wokers

    ##在mater上修改wokers文件
    vim /usr/local/hadoop-3.2.1/etc/hadoop/workers
    
    ##将localhost修改为:
    
    slave01
    slave02
    

    测试Hadoop集群

    ##在master上
    
    cd /usr/local/hadoop-3.2.1
    bin/hdfs namenode -format # 格式化文件系统
    sbin/start-dfs.sh # 开启NameNode和DataNode服务
    bin/hdfs dfs -mkdir /user # 建立HDFS文件夹,也可以放到下面示例程序中进行
    bin/hdfs dfs -mkdir /user/root
    bin/hdfs dfs -mkdir input
    bin/hdfs dfs -put etc/hadoop/*.xml input # 将xml复制到input下,作为示例程序输入
    sbin/start-yarn.sh # 开启ResourceManager和NodeManager服务
    jps # 查看服务状态
    

    运行Hadoop示例程序

    ##在master上
    
    bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar grep input output 'dfs[a-z.]+' # 运行示例
    bin/hdfs dfs -get output output # 获取输出结果
    cat output/* # 查看输出结果
    sbin/stop-all.sh # 停止所有服务
    

    实验心得

    • 这次实验差不多用时12个小时,主要还是网上一些教程比较多。第一个实验任务相当与复习一下上次实验了。第二个实验确实也是偷懒了点,按照老师给的教程自己做了一遍。第三实验任务属于最懵的一个,信息量太大,最后只能‘前人栽树后人乘凉’了,看了看已经做完的同学的博客。感觉现在实验作业有点变成纯属按照网上教程操作一遍,动手的部分在于debug过程了。
  • 相关阅读:
    sniffer嗅探
    记一次IE代理异常故障
    B860A机顶盒加强
    适合Lakka的安卓盒子配置
    MVG2000 破解
    网络图标显示地球的解决办法
    数码视讯Q7 TTL破解安装APP
    kbmmw 发布免费社区版
    一步一步实现kbmmw的httpsys使用https功能
    PostgreSQL 基本数据类型及常用SQL 函数操作
  • 原文地址:https://www.cnblogs.com/fzu-Z9h/p/12911682.html
Copyright © 2020-2023  润新知