• 2020系统综合实践 第4次实践作业


    2020系统综合实践 第4次实践作业

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

    要求:

    理解nginx反向代理原理;
    nginx代理tomcat集群,代理2个以上tomcat;
    了解nginx的负载均衡策略,并至少实现nginx的2种负载均衡策略;
    

    参考资料:

    Nginx 配置详解
    Nginx服务器之负载均衡策略
    

    nginx方向代理原理

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

    nginx代理tomcat集群

    sudo docker pull tomcat && docker pull nginx
    

    查看文件树形结构图

    docker-compose.yml

    version: "3"
    services:
        nginx:
            image: nginx
            container_name: c_ngx
            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: c_tc1
            volumes:
                - ./webapps:/usr/local/tomcat/webapps/ROOT # 挂载web目录
    
    
        tomcat02:
            hostname: tomcat02
            image: tomcat
            container_name: c_tc2
            volumes:
                - ./webapps:/usr/local/tomcat/webapps/ROOT # 挂载web目录
    
    
        tomcat03:
            hostname: tomcat03
            image: tomcat
            container_name: c_tc3
            volumes:
                - ./webapps:/usr/local/tomcat/webapps/ROOT # 挂载web目录
    

    default.conf

    upstream tomcats {
            server c_tc1:8080 ;
            server c_tc2:8080 ;
            server c_tc3:8080 ;
    }
    
    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;
            }
    }
    
    sudo docker-compose up -d --build
    

    刷新访问主页,进入不同的页面中

    通过程序代码访问网页

    import requests
    url = 'http://localhost'
    for i in range(0,10):
    	response=requests.get(url)
    	print(response.text)
    

    通过程序来测试负载均衡

    import requests
    url = 'http://localhost'
    count={'yzl: this is the 01_tomcat':0,'yzl: this is the 02_tomcat':0,'yzl: this is the 03_tomcat':0}
    for i in range(0,90):
        response=requests.get(url)
        if  'yzl: this is the 01_tomcat' in response.text:
            count['yzl: this is the 01_tomcat'] += 1
        if  'yzl: this is the 02_tomcat' in response.text:
            count['yzl: this is the 02_tomcat'] += 1
        if  'yzl: this is the 03_tomcat' in response.text:
            count['yzl: this is the 03_tomcat'] += 1
        print(response.text)
    print(count['yzl: this is the 01_tomcat'])
    print(count['yzl: this is the 02_tomcat'])
    print(count['yzl: this is the 03_tomcat'])
    

    修改权重再次访问

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

    要求:

    分别构建tomcat、数据库等镜像服务;
    成功部署Javaweb程序,包含简单的数据库操作;
    为上述环境添加nginx反向代理服务,实现负载均衡。
    

    参考资料:

    使用docker-compose部署Javaweb项目
    tomcat+nginx-mysql
    

    文件结构

    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-compose.yml

    version: "3"   
    services:    
      tomcat00:     
        image: tomcat    
        hostname: hostname       
        container_name: tomcat00   
        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
      mymysql:  #mymysql服务
        build: .   #通过MySQL的Dockerfile文件构建MySQL
        image: mymysql:test
        container_name: mymysql
        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:
              - ./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 tomcat00:5050; 
    
    }
    
    server {
        listen 8080
        server_name localhost;
    
        location / {
            proxy_pass http://tomcat123;
            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-entrypoint.sh

    #!/bin/bash
    mysql -uroot -p123456 << EOF
    source /usr/local/grogshop.sql;
    

    jdbc.properties

    driverClassName=com.mysql.jdbc.Driver
    
    url=jdbc:mysql://172.22.0.1:3309/grogshop?useUnicode=true&characterEncoding=utf-8
    
    username=root
    
    password=123456
    

    执行命令,生成容器

    docker-compose up -d --build
    

    访问网页http://127.0.0.1:5050/ssmgrogshop_war

    使用nginx反向代理

    default.conf

    upstream tomcats{
            server tt1:8080 ;
            server tt2:8080 ;
            server tt3:8080 ;
    
    }
    server {
        listen 2508;
        server_name localhost;
    
    location / {
    root   /usr/share/nginx/html;
        index  index.html index.htm;
    proxy_pass http://tomcats;
    }
    
    }
    

    修改docker-compose.yml

    version: "3"
    services:
        nginx:
            image: nginx
            container_name: ng1
            ports:
    
       - 80:2508
    
            - ./nginx/default.conf:/etc/nginx/conf.d/default.conf # 挂载配置文件
              on:
                 - tomcat01
                   02
                      - tomcat03
    
    tomcat01:
        image: tomcat
        container_name: tt1
        volumes:
    
       - ./tomcat/tomcat1:/usr/local/tomcat/webapps/ROOT # 挂载web目录
    
    tomcat02:
        image: tomcat
        container_name: tt2
        volumes:
    
       - ./tomcat/tomcat2:/usr/local/tomcat/webapps/ROOT
    
    tomcat03:
        image: tomcat
        container_name: tt3
        volumes:
    
       - ./tomcat/tomcat3:/usr/local/tomcat/webapps/ROOT
    

    重新构造

    sudo docker-compose up -d
    

    再次访问(分别从5050 5051 5052三个端口访问)

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

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

    要求:

    完成hadoop分布式集群环境配置,至少包含三个节点(一个master,两个slave);
    成功运行hadoop 自带的测试实例。
    

    参考资料:

    Hadoop 参考文档
    使用Docker搭建Hadoop分布式集群
    

    1.搭建hadoop环境

    实验环境

    ubuntu 18.04 LST
    openjdk 1.8
    hadoop 3.1.3
    

    文件树形结构图

    Dockerfile

    #Base images 基础镜像
    FROM ubuntu:18.04
    
    #MAINTAINER 维护者信息
    MAINTAINER y00
    
    COPY ./sources.list /etc/apt/sources.list
    

    sources.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
    

    2.容器初始化

    安装必要工具

    apt-get update
    apt-get install vim # 用于修改配置文件
    apt-get install ssh # 分布式hadoop通过ssh连接
    /etc/init.d/ssh start # 开启sshd服务器
    vim ~/.bashrc # 在文件末尾添加/etc/init.d/ssh start,实现ssd开机自启
    

    实现ssh无密码登陆

    cd ~/.ssh        #某位热心大佬说这句可以去掉
    ssh-keygen -t rsa # 一直按回车即可
    cat id_rsa.pub >> authorized_keys #这一步要在~/.ssh目录下进行
    

    安装jdk

    apt-get install openjdk-8-jdk
    

    安装hadoop
    把下载好的hadoop-3.1.3.tar.gz放在挂载的目录下并安装

    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生效
    

    证是否安装完成

    java -version
    hadoop version
    

    3.配置hadoop集群

    进入配置目录

    cd /usr/local/hadoop-3.1.3/etc/hadoop
    

    img

    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文件,添加下列参数

    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 
    

    5.利用构建好的镜像运行主机

    开启三个终端分别运行

    # 第一个终端
    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

    根据自己容器的ip地址修改

    172.17.0.2      master
    172.17.0.3      slave01
    172.17.0.4      slave02
    

    测试ssh

    aster主机上修改workers

    vim /usr/local/hadoop-3.1.3/etc/hadoop/workers
    slave01
    slave02
    

    开启服务
    master上运行:

    start-dfs.sh
    start-yarn.sh
    

    jps查看服务是否开启成功
    img

    6.运行hadoop示例程序

    第一次使用先格式化文件系统

    hdfs namenode -format # 格式化文件系统
    

    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/*   #查看运行结果
    

    img

    wordcount测试

    hdfs dfs -rm root     #删除上一次运行的输入和输出
    hdfs dfs -mkdir -p /user/root/input    #新建input文件夹
    vim txt1.txt   #在当前目录下新建txt1.txt
    vim txt2.txt   #在当前目录下新建txt2.txt
    hdfs dfs -put ./*.txt input  #将新建的文本文件放入input文件夹
    hadoop jar /usr/local/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount input output   #运行示例程序wordcount
    hdfs dfs -cat output/*   #查看运行结果
    

    img

    (4)实验报告

    发表一篇博客,记录主要的过程,无需每个步骤一一截图;
    提交可以运行的相关配置文件以及测试程序包;
    记录实验过程的主要问题和解决方法,分享经验和感想;
    记录完成作业所花的时间。
    

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

    因为nginx和tomcat之前有了解过,所以自己做出来的时候比较顺畅。
    

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

    因为Javaweb项目(自己现学的话,感觉来不及做了),所以用了老师给的样例。但是直接放进虚拟机的,调试的话,比较困难
    

    img

    解决:修改连接数据库的IP时没有修改相应端口,修改之后可以成功连接

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

    之前大数据前沿的课程有学,所以对hadoop的概念以及指令也比较熟悉。主要是花时间在容器上搭建hadoop环境。
    
    项目 时间
    Tomcat+Nginx负载均衡 3h
    部署javaweb运行环境 9h
    用Docker搭建大数据集群环境 6h
    博客 1.5h
  • 相关阅读:
    PreferenceScreen 偏好显示类 的使用
    Android实战技巧:如何在ScrollView中嵌套ListView
    android onActivityResult不执行问题
    java zip解压中文乱码问题
    RandomAccessFile读取大文件时效率很低,现进行改进---BufferedRandomAccessFile
    HTTP RANGE(多线程下载相关)
    Android实现ListView异步加载图片
    自己调用webservice方法总结(带请求头SoapHeader)
    Android将程序崩溃信息保存本地文件
    Android的intent之间复杂参数的传递
  • 原文地址:https://www.cnblogs.com/cc1219032777/p/12907789.html
Copyright © 2020-2023  润新知