• 第4次实践作业


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

    (1)理解nginx反向代理原理


    正向代理:客户端不知道具体是哪个服务器为自己提供的服务,每个客户端要做的就是把需求提交给代理服务器
    反向代理:服务器不知道具体请求是哪个客户端发来的,由代理负责服务器资源的分配和任务的安排

    (2)nginx代理tomcat集群,代理2个以上tomcat

    • mkdir lab4-1 //创建一个文件夹

    • 文件夹内容如下:

    ├── default.conf            //nginx的配置文件
    ├── docker-compose.yml      //docker-compose
    ├── tomcat1                 //tomcat的网页文件夹 
    │   ├── index.html          //随便写的html  
    │   └── lzh.html
    ├── tomcat2
    │   └── lzh.html
    └── tomcat3
        └── lzh.html
    
    • default.conf
    • docker-compose.yml
    version: "3"
    services:
        nginx:
            image: nginx
            container_name: nginx1
            ports:
                - 8080:3000
            volumes:
                - ./default.conf:/etc/nginx/conf.d/default.conf
        tomcat01:
            image: tomcat
            container_name: tomcat1
            volumes:
                - ./tomcat1:/usr/local/tomcat/webapps/ROOT 
    
        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
    
    • lzh.html
    tomcat(i):i am tomcat(i)
    
    • 反向代理成功
      (8080/lzh.html是因为tomcat默认显示html是index.html,要查看别的html就需要指明html)

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

    • 默认的轮询策略
    • 添加权重策略和备份

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

    前言

    这次的这一步用的是老师提供的博客里面的数据库,主要是实现了nginx+tomcat+mysql

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

    • mkdir lab4-2//创建文件夹
    • 文件夹内容如下
    ├── default.conf            //nginx的配置文件
    ├── docker-compose.yml      //compose
    ├── docker-entrypoint.sh    //数据库脚本
    ├── Dockerfile              //mysql的dockerfile    
    ├── grogshop.sql            //要放进容器中的数据库
    ├── wait-for-it.sh          //docker提供的用来确保容器正确连接的脚本,中间是想用他来解决问题,但是发现在这个例子里面,不用也可以,所以没什么用  
    └── webapps                 //博客中提供的tomcat相关配置,前端之类的吧 
    
    • docker-compose.yml
    #这个compose就在原作者博客的里面再添加一个tomcat,再复制一份webapp(也可以不),然后加上nginx并且放进同一个子网里面就好了。如果不想放进子网里面的话那我建议全部不要放进子网...
    version: "3"   #版本
    services:     #服务节点
      tomcat01:     #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
      tomcat02:     #tomcat 服务
        image: tomcat    #镜像
        container_name: tomcat0I   #容器名
        ports:      #端口
         - "5051:8080"
        volumes:  #数据卷
         - "./webapps1:/usr/local/tomcat/webapps"
        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
          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 tomcat0I:8080;
    }
    
    server {
        listen 8080;      #这个改成8080的话是因为在调用原作者的数据库前端接口的时候,有一张数据图要向**127.0.0.1:端口**请求,如果内外端口不统一的话就会显示不了数据图.
        server_name localhost;
    
        location / {
            proxy_pass http://tomcat123;
        }
    }
    
    • 其他文件的话就和作者博客中的一模一样,放个链接吧,作者博客
    • 进目录里面改个配置(./webapps/ssmgrogshop_war/WEB-INF/classes/jdbc.properties)

      这个端口的话和同学讨论的时候发现,有的同学用3306好像不行,但是在我这可以,所以为了方便的话还是都用3309吧。
    • 然后一切正确的话,在这一步是访问5050端口下的ssmgrogshop_war页面(nginx在这个时候还没必要,虽然上面的文件已经添加好了,但是javaweb成功的话只需要进5050端口就能验证,这张截图是8080是因为我写博客的时候发现5050的图没截下来,但是能进8080,5050肯定也是可以的),看到如下场景:


      (说实话原作者做的数据库还是很好看的...... 我要是去年有这个做参考,数据库作业也不至于做的那么差)

    (2)成功部署Javaweb程序,包含简单的数据库操作

    • 查询

    • 插入

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

    • 访问8080端口

      就这样吧,我也不知道怎么验证,但是我的配置应该是实现了2个tomcat轮询。

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

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

    • mkdie lab4-3
    • 文件夹内容
    .
    ├── build      
    │   └── hadoop-3.1.3.tar.gz       //来自同学的tar.gz,省掉了不少下载的时间
    ├── docker-compose.yml            //一个docker-compose
    ├── Dockerfile                    //用来创建合适的镜像的dockerfile
    └── sources.list                  //用来加快upgrate的神奇小文件
    
    • docker-compose.yml
    version: "3"   #版本
    services:     #服务节点
      hadoop01:     #tomcat 服务
        image: ubuntu/hadoop    #镜像
        hostname: master
        container_name: master   #容器名
        tty: true
        networks:   
          webnet:
            ipv4_address: 15.22.1.15
        extra_hosts:
         - "slave01:15.22.1.14"
         - "slave02:15.22.1.13"
      hadoop02:     #tomcat 服务
        image: ubuntu/hadoop    #镜像
        hostname: slave01
        container_name: slave01   #容器名
        tty: true
        networks:   
          webnet:
            ipv4_address: 15.22.1.14
        extra_hosts:
         - "master:15.22.1.15"
         - "slave02:15.22.1.13"
      hadoop03:     #tomcat 服务
        image: ubuntu/hadoop    #镜像
        hostname: slave02
        container_name: slave02   #容器名
        tty: true
        networks:   
          webnet:
            ipv4_address: 15.22.1.13 
        extra_hosts:
         - "master:15.22.1.15"
         - "slave01:15.22.1.14"
    networks:   #网络设置
     webnet:
       driver: bridge  #网桥模式
       ipam:
         config:
          - 
           subnet: 15.22.1.0/24   #子网
    
    • Dockerfile
    FROM ubuntu:18.04
    
    MAINTAINER lzh
    
    COPY ./sources.list /etc/apt/sources.list
    COPY ./build/hadoop-3.1.3.tar.gz /root/hadoop-3.1.3.tar.gz 
    
    • source.list
    # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
    # deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
    # deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
    # deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
    # deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
    # 预发布软件源,不建议启用
    # deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
    # deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
    
    • 创建并运行
    docker build -t ubuntu:18.04 .
    docker run -it --name ubuntu ubuntu:18.04
    
    • 把该装的都装好
    apt-get update
    apt-get install vim
    apt-get install ssh 
    /etc/init.d/ssh start
    
    • vim ~/.bashrc
    末尾添加/etc/init.d/ssh start
    
    • 配置ssh
    ssh-keygen -t rsa
    cat id_rsa.pub >> authorized_keys
    cd ~/.ssh
    
    • 安装jdk
    apt-get install openjdk-8-jdk
    
    • 解压一下hadoop-3.1.3.tar.gz
    cd /root
    tar -xvf hadoop-3.1.3.tar.gz -C /usr/local
    
    • vim ~/.bashrc
    #添加以下内容
    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

    • 查看是否安装完成

    • 进目录配!hadoop

    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>
    
    • 进目录配!脚本
    cd /usr/local/hadoop-3.1.3/sbin
    
    • start-dfs.sh和stop-dfs.sh(以下内容建议放在脚本最前面,反正不要放在最后面,一念之差就是生命里的2小时)
    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
    
    • 把容器commit到本地仓库
    docker commit 容器ID ubuntu/hadoop
    
    • 运行compose
     sudo docker sudo docker-compose --d
    

    • 进master瞅瞅
    sudo docker exec -it countainerid /bin/bash
    


    如上图所示就是成功了。

    • 修改workers
    vim /usr/local/hadoop-3.1.3/etc/hadoop/workers
    

    • 开启服务
    start-dfs.sh
    start-yarn.sh
    
    • jsp



      到这里一个hadoop就好了,当然中间如果遇到脚本跑起来有eeror的,多半是让放进脚本里面的几行放的位置不对,随手再往上挪挪就好了(指挪了2小时)

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

    • 在master上格式化
    hdfs namenode -format #这一步会需要关闭掉hdfs,执行stop-all.sh脚本就好了
    
    • 重启hdfs!!!
    start-all.sh #绝对不会只有我一个人不知道这个,很多同学都已经上过大数据课了,不会提到这个
    
    • grep测试
    hdfs dfs -mkdir -p /user/root/input    #新建input文件夹
    hdfs dfs -put /usr/local/hadoop-3.1.3/etc/hadoop/*s-site.xml input  #将部分文件放入input文件夹
    hadoop jar /usr/local/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar grep input output 'dfs[a-z.]+'    #运行示例程序grep
    hdfs dfs -cat output/*   #查看运行结果
    

    • grep测试可能会有的问题
     如果报错是什么端口9000连接不上,那就是服务没开
     如果是input目录下没有东西,那就比较麻烦了
     在master结点中访问 /usr/local/hadoop-3.1.3/tmp/dfs/name/current/VERSION
     记录clusterid
     在slave结点中访问 vim /usr/local/hadoop-3.1.3/tmp/dfs/data/current/VERSION
     把里面的clusterid替换成master节点的就好了,记得两个slave都要。
    

    实验过程的主要问题和解决方法

    除了上面hadoop那一堆问题外,还有一点。
    第一个实验里面不管是容器名字还是upstream什么的,都别用下划线,不然就会有下面这个报错。
    

    时间

    步骤 时间(h)
    nginx+tomcat 1
    nginx+tomcat+mysql 2
    nginx+tomcat+mysql+debug 6
    hadoop+debug 6
    博客 3
    自闭 1
  • 相关阅读:
    20155327 2017-2018-2 《Java程序设计》第9周学习总结
    20155327《Java程序设计》第八周学习总结
    实验二 Java面向对象程序设计
    20155327 李百乾 Exp4 恶意代码分析
    20155327结对编程练习
    20155327第七周学习总结
    2017-2018-1 20155310 20155337 实验五 通讯协议设计
    # 2017-2018-1 20155337《信息安全系统设计基础》第十三周学习总结
    # 20155337 2017-2018 1 课上测试、课下作业、实验
    # 课下测试ch02
  • 原文地址:https://www.cnblogs.com/fzu-lzh/p/12902579.html
Copyright © 2020-2023  润新知