第4次实践作业

第4次实践作业

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

  • nginx反向代理原理

    反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。

    正向代理代理客户端(VPN),反向代理代理服务器

    参考地址

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

    • 拉取tomcat和nginx镜像

      docker pull nginx && docker pull tomcat

    • 创建项目结构如下

    • 编辑各文件

      • docker-compose.yml

        version: "3.8"
        services:
            nginx:
                image: nginx
                container_name: tm_niginx
                ports:
                    - 8080:8081
                volumes:
                    - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
            tomcatA:
                hostname: tomcatA
                image: tomcat
                container_name: tomcatA
                volumes:
                    - ./tomcatA:/usr/local/tomcat/webapps/ROOT
            tomcatB:
                hostname: tomcatB
                image: tomcat
                container_name: tomcatB
                volumes:
                    - ./tomcatB:/usr/local/tomcat/webapps/ROOT
            tomcatC:
                hostname: tomcatC
                image: tomcat
                container_name: tomcatC
                volumes:
                    - ./tomcatC:/usr/local/tomcat/webapps/ROOT
        
      • default.conf

        upstream tomcats {
                server tomcatA:8080 max_fails=3 fail_timeout=30s;
                server tomcatB:8080 max_fails=3 fail_timeout=30s;
                server tomcatC:8080 max_fails=3 fail_timeout=30s;
        }
        server {
                listen 8081;
                server_name localhost;
                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;
                }
        }
        
      • tomcat.html

        <title>   Tomcat(X)   </title><h1>This is Tomcat(X)</h1>
        
      • test.sh

        #!/bin/bash  
        for((i=1;i<=20;i++));  
        do
        curl http://127.0.0.1:8080/tomcat.html
        done 
        
    • 执行并验证

      • 执行

        docker-compose up -d

      • 浏览器验证

        127.0.0.1:8080/tomcat.html

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

    测试指令:

    bash test.sh

    • 默认方式----轮询

    • 权重方式

      • 修改default.conf中的upstream:

        upstream tomcats {
                server tomcatA:8080 weight=1 max_fails=3 fail_timeout=30s;
                server tomcatB:8080 weight=3 max_fails=3 fail_timeout=30s;
                server tomcatC:8080 weight=2 max_fails=3 fail_timeout=30s;
        }
        
      • 重新构建后再次执行指令

        可见访问概率:tomcatB>tomcatC>tomcatA

      • 其他方法点这里

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

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

    • 创建如下目录结构:

    • 编辑主要文件:

      • docker-compose.yml:

        version: "3.8"
        services:
            tomcat01:
                image: tomcat
                hostname: tomcat01
                container_name: tomcat01
                ports:
                    - "5050:8080"
                volumes:    #挂载卷
                    - "./webapps:/usr/local/tomcat/webapps"
                    - ./wait-for-it.sh:/wait-for-it.sh
                networks:
                    webnet:
                        ipv4_address: 15.22.0.15
            tomcat02:
                image: tomcat
                container_name: tomcat02
                ports:
                    - "5051:8080"
                volumes:    #挂载卷
                    - "./webapps1:/usr/local/tomcat/webapps"
                networks:   #网络设置静态IP
                    webnet:
                        ipv4_address: 15.22.0.16
            my_mysql:
                build: ./mysql
                image: my_mysql:test
                container_name: my_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-tomcat
                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    #子网
                
        
      • default.conf:

        upstream tomcats{
            server tomcat01:8080 max_fails=3 fail_timeout=30s;
            server tomcat02:8080 max_fails=3 fail_timeout=30s;
        }
        
        server {
            listen 8080;
            server_name localhost;
            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;
            }
        }
        
      • 其他文件与作者的差不多,作者博客,只需要根据作者博客的要求改一下配置如下:

        • 进入目录:./webapps/ssmgrogshop_war/WEB-INF/classes,修改其中jdbc.properties,如下

  • 成功部署Javaweb程序,包含简单的数据库操作;

    • 执行 docker-compose up -d

    • 浏览器进入http://192.168.0.111:5050/ssmgrogshop_war/Login/tologin.do

    • 输入 用户名:sa,密码:123

      • 简单是数据操作

        • 查询:

        • 删除:

        • 增加:

    • 成功

  • 为上述环境添加nginx反向代理服务,实现负载均衡。

    • 修改nginx的配置文件default.conf,将其中的upstream修改为:

      upstream tomcats{
          server tomcat01:8080 weight=3 max_fails=3 fail_timeout=30s;
          server tomcat02:8080 weight=1 max_fails=3 fail_timeout=30s;
      }
      

      该方法为权值方式.

    • 重构,执行即可

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

  • 带JDK8的Ubuntu

    • 拉取ubuntu镜像

      docker pull ubuntu

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

      cd /home/admin/

      mkdir build

      docker run -it -v /home/admin/build:/root/build --name ubuntu ubuntu

    • 在ubuntu容器内,安装所需要的软件

      apt-get update && apt-get install vim && apt-get install ssh

    • 设置ssh自启动

      vim ~/.bashrc

      在末尾添加/etc/init.d/ssh start

    • 配置sshd

      ssh-keygen -t rsa && cat id_rsa.pub >> authorized_keys

      使用ssh localhost测试:

    • 安装JDK8

      apt-get install openjdk-8-jdk

      测试java -version

    • 配置环境变量

      vim ~/.bashrc在末尾输入如下内容:

      export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
      export PATH=$PATH:$JAVA_HOME/bin
      
    • 保存镜像

      docker commit 0c8 ubuntu/openjdk

  • 带Hadoop的Ubuntu

    • 下载Hadoop-3.1.3.tar.gz至宿主主机的/home/admin/build

    • 进入容器执行

      cd /root/build/

      tar -zxvf hadoop-3.1.3.tar.gz -C /usr/local

      cd /usr/local/

      mv hadoop-3.1.3 hadoop

      vim ~/.bashrc

      • 在末尾加入:
      export HADOOP_HOME=/usr/local/hadoop
      export PATH=$PATH:$HADOOP_HOME/bin 
      export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
      
      • 验证Hadoop指令./bin/hadoop version

      • 修改hadoop-env.sh

        vim /usr/local/hadoop/etc/hadoop/hadoop-env.sh

        加入export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/

      • 修改core-site.xml

        vim /usr/local/hadoop/etc/hadoop/core-site.xml

        <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 /usr/local/hadoop/etc/hadoop/hdfs-site.xml

        <configuration>
            <property>
                <name>dfs.replication</name>
                <value>3</value>
            </property>
            <property>
                <name>dfs.name.dir</name>
                <value>/usr/local/hadoop/hdfs/name</value>
            </property>
            <property>
                <name>dfs.data.dir</name>
                <value>/usr/local/hadoop/hdfs/data</value>
            </property>
        </configuration>
        
      • 修改mapred-site.xml

        vim /usr/local/hadoop/etc/hadoop/mapred-site.xml

        <configuration>
          <property>
              <name>mapreduce.framework.name</name>
              <value>yarn</value>
          </property>
          <property>
            <name>mapreduce.application.classpath</name>
            <value>$HADOOP_HOME/share/hadoop/mapreduce/*:$HADOOP_HOME/share/hadoop/mapreduce/lib/*</value>
          </property>
        </configuration>
        
      • 修改yarn-site.xml

        vim /usr/local/hadoop/etc/hadoop/yarn-site.xml

        <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.env-whitelist</name>
                <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_HOME</value>
            </property>
        </configuration>
        
    • 保存镜像

      docker commit 0c8 ubuntu/hadoop_installed

  • 完成hadoop分布式集群环境配置,至少包含三个节点(一个master,两个slave)

    • 开启三个容器运行ubuntu/hadoop_installed镜像

      # 第一个终端
      docker run -it -h master --name master ubuntu/hadoop_installed bash
      # 第二个终端
      docker run -it -h slave01 --name slave01 ubuntu/hadoop_installed bash
      # 第三个终端
      docker run -it -h slave02 --name slave02 ubuntu/hadoop_installed bash
      
    • 通过cat /etc/hosts分别获取三个容器的IP地址如下:

      172.17.0.2 master

      172.17.0.3 slave01

      172.17.0.4 slave02

      将地址映射分别写到三个容器各自的/etc/hosts中

      在master中使用ssh slave01ssh slave 02进行验证

  • 成功运行hadoop 自带的测试实例。

    • 添加slaves机器

      vim /usr/local/hadoop/etc/hadoop/workers

    • 一些小修改

      vim /usr/local/hadoop/etc/hadoop hadoop-env.sh

      export HDFS_NAMENODE_USER=root
      export HDFS_DATANODE_USER=root
      export HDFS_SECONDARYNAMENODE_USER=root
      export YARN_RESOURCEMANAGER_USER=root
      export YARN_NODEMANAGER_USER=root
      
    • 在master终端上,进入/usr/local/hadoop并执行如下命令:

      bin/hdfs namenode -format

      sbin/start-all.sh

    • 运行Hadoop实例程序

      • 防止输入文件

        ./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.1.3.jar grep input output 'dfs[a-z.]+'

(4)实验总结

  • 相关配置文件以及测试程序包在博客中已经体现
  • 主要问题,解决方法:
    • tomcat默认web端口是8080,开始没注意,后面走了弯路
    • 在hosts添加地址时,映射搞错了,导致后面测试一直不成功,后面参考一个帖子去检查才发现错误
    • ssh测试时还出了一些问题,Google解决了
    • Hadoop的教程比较老,很多配置不适合最新版本,在摸索中不断成长
  • 记录完成作业所花的时间。
    • 实验(1)大概花了5个小时
    • 实验(2),有实验(1)的基础,而且使用的是所给的示例的javaweb,完成得比较快,大概花了1.5个小时
    • 实验(3),步骤比较繁琐,而且问题比较多,总计应该花了9个小时
    • 合计:15.5小时
原文地址:https://www.cnblogs.com/SilentSamsara/p/12913664.html