• 第四次实践作业


    第四次实践作业

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

    要求:

    • 理解nginx反向代理原理;

      反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器(原始服务器对于客户端是透明的)。而正向代理(Forward Proxy),客户端请求时要指定原始服务器,代理再向原始服务器转交请求并将获得的内容返回给客户端。

    • nginx代理tomcat集群,代理2个以上tomcat;

      • 在文件夹中创建如下结构:

      • 编辑文件

        default.conf

        upstream tomcats {
                server tomcat1:8080 max_fails=3 fail_timeout=30s;
                server tomcat2:8080 max_fails=3 fail_timeout=30s;
                server tomcat3:8080 max_fails=3 fail_timeout=30s;
        }
        
        server {
                listen 80;
                server_name localhost server;
        
                location / {
                        proxy_set_header  X-Real-IP $remote_addr;
                        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
                        proxy_set_header  Host $http_host;
                        proxy_pass http://tomcats;
                        proxy_redirect off;
                }
        }
        

        docker-compose.yml

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

        index.jsp

        <%@ page language="java" contentType="text/html; charset=utf-8"  import="java.net.InetAddress"
            pageEncoding="utf-8"%>
        <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
        <html>
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>Nginx+Tomcat负载均衡</title>
        </head>
        <body>
             <%
                 InetAddress addr = InetAddress.getLocalHost();
                 out.println("主机名:"+addr.getHostName());
              %>
        </body>
        </html>
        

        browse.sh

        for((i=1;i<=15;i++));
        do
        content=$(curl -s localhost:8080);
        echo ${content#*<body>};
        done
        
      • 运行docker-compose构建容器

    • 了解nginx的负载均衡策略,并至少实现nginx的2种负载均衡策略;

      • 运行 sh browse.sh ,默认方式是轮询访问

      • 将default.conf文件修改upstream为

         upstream tomcats { 
                  server tomcat1:8080 weight=1 max_fails=3 fail_timeout=30s;
                  server tomcat2:8080 weight=2 max_fails=3 fail_timeout=30s;
                  server tomcat3:8080 weight=3 max_fails=3 fail_timeout=30s;
          }
        
      • 再次运行sh browse.sh,此时使用权重策略,因此访问概率从大到小为tomcat3,tomcat2,tomcat1

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

    参考连接(老师推荐)

    • 修改文件docker-compose.yml
    version: "3"   #版本
    services:     #服务节点
      tomcat:     #tomcat 服务
        image: tomcat    #镜像
        hostname: hostname       #容器的主机名
        container_name: tomcat00   #容器名
        ports:      #端口
         - "5050:8080"
        volumes:  #数据卷
         - "./webapps:/usr/local/tomcat/webapps"
         - ./wait-for-it.sh:/wait-for-it.sh
        networks:   #网络设置静态IP
          webnet:
            ipv4_address: 15.22.0.15
      mymysql:  #mymysql服务
        build: .   #通过MySQL的Dockerfile文件构建MySQL
        image: mymysql:test
        container_name: mymysql
        ports:
          - "3309:3306" 
    #红色的外部访问端口不修改的情况下,要把Linux的MySQL服务停掉
    #service mysql stop
    #反之,将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-tomcat"
          ports:
              - 8080:8080
          volumes:
              - ./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   #子网
    
    • 新建default.conf
    upstream tomcat123 {
        server tomcat00:8080;
    }
    
    server {
        listen 8080;
        server_name localhost;
    
        location / {
            proxy_pass http://tomcat123;
        }
    }
    
    • ifconfig命令查询本机ip地址

    • 在 /webapps/ssmgrogshop_war/WEB-INF/classes/jdbc.properties中修改ip为和端口号

    • docker-compose up -d

    • 打开下面任一网址,可以看到登陆界面

      http://127.0.0.1:8080/ssmgrogshop_war
      http://本机ip/ssmgrogshop_war
      

    • 进入后可以进行数据库操作
    upstream tomcat123 {
        server tomcat00:5050;
        server tomcat01:5051;
    }
    
    server {
        listen 8080;
        server_name localhost;
    
        location / {
            proxy_pass http://tomcat123;
        }
    }
    
    • 修改nginx配置文件default.conf,反向代理tomcat
    upstream tomcats {
        server tomcat00:5050; 
        server tomcat01:5051; 
    }
    
    • 修改yml文件

      version: "3"   #版本
      services:     #服务节点
        tomcat00:     #tomcat 服务
          image: tomcat    #镜像
          hostname: hostname       #容器的主机名
          container_name: tomcat00   #容器名
          ports:      #端口
           - "5050:8080"
          volumes:  #数据卷
           - "./webapps:/usr/local/tomcat/webapps"
           - ./wait-for-it.sh:/wait-for-it.sh
          networks:   #网络设置静态IP
            webnet:
              ipv4_address: 15.22.0.15
        tomcat01:     #tomcat 服务
          image: tomcat    #镜像
          hostname: hostname       #容器的主机名
          container_name: tomcat01   #容器名
          ports:      #端口
           - "5055:8080"
          volumes:  #数据卷
           - "./webapps:/usr/local/tomcat/webapps"
           - ./wait-for-it.sh:/wait-for-it.sh
          networks:   #网络设置静态IP
            webnet:
              ipv4_address: 15.22.0.16
        mymysql:  #mymysql服务
          build: .   #通过MySQL的Dockerfile文件构建MySQL
          image: mymysql:test
          container_name: mymysql
          ports:
            - "3309:3306" 
      #红色的外部访问端口不修改的情况下,要把Linux的MySQL服务停掉
      #service mysql stop
      #反之,将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-tomcat"
            ports:
                - 8080:8080
            volumes:
                - ./default.conf:/etc/nginx/conf.d/default.conf # 挂载配置文件
            tty: true
            stdin_open: true
            depends_on:
                - tomcat00
                - tomcat01
            networks:
             webnet:
              ipv4_address: 15.22.0.7
      networks:   #网络设置
       webnet:
         driver: bridge  #网桥模式
         ipam:
           config:
            - 
             subnet: 15.22.0.0/24   #子网
      
    • 随后可以分别通过5050和5051端口访问,达到负载均衡

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

    1.要求

    直接用机器搭建Hadoop集群,会因为不同机器配置等的差异,遇到各种各样的问题;也可以尝试用多个虚拟机搭建,但是这样对计算机的性能要求比较高,通常无法负载足够的节点数;使用Docker搭建Hadoop集群,将Hadoop集群运行在Docker容器中,使Hadoop开发者能够快速便捷地在本机搭建多节点的Hadoop集群。

    2.相关环境配置

    • 拉取ubuntu镜像 docker pull ubuntu

    • 运行镜像并与本地/home/xiaoc/build文件夹共享

    • ubuntu系统初始化并安装升级必要软件 apt-get update && apt-get install vim && apt-get install ssh

    • 设置ssd开机启动,vim ~/.bashrc 在文末添加 /etc/init.d/ssh start

    • 设置ssh免密码登陆

      cd ~/.ssh    
      ssh-keygen -t rsa 
      cat id_rsa.pub >> authorized_keys 
      
    • 测试ssh

    • 安装JDK1.8

      apt-get install openjdk-8-jdk
      
    • 安装hadoop

      docker cp ./build/hadoop-3.1.3.tar.gz 容器ID:/root/hadoop-3.1.3.tar.gz
      cd /root
      tar -zxvf hadoop-3.1.3.tar.gz -C /usr/local
      
    • vim ~/.bashrc,在文末加入以下,配置java和hadoop环境

      export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
      export PATH=$PATH:$JAVA_HOME/bin
      export HADOOP_HOME=/usr/local/hadoop-3.1.3
      export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
      export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$JAVA_HOME/bin
      

      source ~/.bashrc # 使.bashrc生效

    • 验证是否安装成功

    3.配置hadoop集群

    (1)cd /usr/local/hadoop-3.1.3/etc/hadoop 进入配置目录,修改以下文件

    • hadoop-env.sh
    export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/ # 在任意位置添加
    
    • 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-3.1.3/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
    <?xml version="1.0" encoding="UTF-8" ?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl" ?>
    <configuration>
            <property>
                    <name>dfs.replication</name>
                    <value>1</value>
            </property>
            <property>
                    <name>dfs.namenode.name.dir</name>
    		        <value>file:/usr/local/hadoop-3.1.3/tmp/dfs/name</value>
    	</property>
    	<property>
                    <name>dfs.datanode.data.dir</name>
                    <value>file:/usr/local/hadoop-3.1.3/tmp/dfs/data</value>
    	</property>
    	<property>
                    <name>dfs.permissions.enabled</name>
                    <value>false</value>
            </property>
    </configuration>
    
    • 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.1.3</value>
        </property>
        <property>
            <name>mapreduce.map.env</name>
            <value>HADOOP_MAPRED_HOME=/usr/local/hadoop-3.1.3</value>
        </property>
        <property>
            <name>mapreduce.reduce.env</name>
            <value>HADOOP_MAPRED_HOME=/usr/local/hadoop-3.1.3</value>
        </property>
    </configuration>
    
    • yarn-site.xml
    <?xml version="1.0" ?>
    <configuration>
    <!-- Site specific YARN configuration properties -->
            <property>
                   <name>yarn.nodemanager.aux-services</name>
                   <value>mapreduce_shuffle</value>
            </property>
            <property>
                   <name>yarn.resourcemanager.hostname</name>
                   <value>Master</value>
            </property>
            <!--虚拟内存和物理内存比,不加这个模块程序可能跑不起来-->
            <property>
                   <name>yarn.nodemanager.vmem-pmem-ratio</name>
                   <value>2.5</value>
            </property>
    </configuration>
    
    (2)cd /usr/local/hadoop-3.1.3/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
    

    4.构建镜像并运行主机,开启三个中断分别运行

    docker commit 容器ID ubuntu/hadoop 
    # 第一个终端
    docker run -it -h master --name master ubuntu/hadoop
    # 第二个终端
    docker run -it -h slave1 --name slave01 ubuntu/hadoop
    # 第三个终端
    docker run -it -h slave2 --name slave02 ubuntu/hadoop
    
    • 根据各个容器的ip分别修改/etc/hosts

    • 测试ssh

    • vim /usr/local/hadoop-3.1.3/etc/hadoop/workers 在master的workers中加入

      slave1
      slave2
      
    • master上开启服务,运行

      start-dfs.sh
      start-yarn.sh
      

    5.运行示例程序

    • 放置输入文件

       ./bin/hdfs dfs -mkdir -p /user/root/input &&
      ./bin/hdfs dfs -put ./etc/hadoop/*.xml input &&
      ./bin/hdfs dfs -ls /user/root/input
      
    • 执行实例程序

      ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar grep input output 'dfs[a-z.]+'
      

    • 获取输出内容

      hdfs dfs -cat output/*
      

    四、总结及踩过的坑

    ​ 1.总计时间:2天

    ​ 2.踩过的坑:运行sh脚本的时候显示Syntax error: Bad for loop variable,思考了很久也找不到语法错误。查询后发现,ubuntu使用的是dash shell,所以解决方法是将默认的shell更改为bash。

    sudo dpkg-reconfigure dash
    
  • 相关阅读:
    Anaconda环境下安装库
    数据库定义、性质、演变
    web测试与app测试区别
    黑盒测试用例设计方法
    软件测试黑盒、灰盒、白盒测试的区别
    web端指什么?
    apache、tomcat和svn有什么作用,区别是什么
    H5如何测试?
    软件测试工具
    web与app测试重点
  • 原文地址:https://www.cnblogs.com/replusone/p/12912919.html
Copyright © 2020-2023  润新知