• 系统综合实践第四次作业


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

    参考资料:
    nginx反向代理原理和配置讲解
    Nginx 配置详解
    Nginx服务器之负载均衡策略

    1. 理解nginx反向代理原理

    反向代理方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
    多个客户端给服务器发送的请求,nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。此时请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,nginx扮演的就是一个反向代理角色。反向代理,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。
    举例示意图:

    2.nginx代理tomcat集群,代理2个以上tomcat

    项目结构:

    default.conf:

    upstream tomcats {
        server tomcat01:8080;
        server tomcat02:8080; 
        server tomcat03:8080; 
    }
    
    server {
        listen 8045;
        server_name localhost;
    
        location / {
            proxy_pass http://tomcats; # 请求转向tomcats
        }
    }
    

    docker-compose.yml:

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

    在index.thml里分别写入:

    this is tomcat1!
    this is tomcat2!
    this is tomcat3!
    


    启动docker-compose:

    查看容器:

    访问localhost:


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

    编写爬虫:

    import requests
    
    url="http://127.0.0.1"
    
    for i in range(0,10):
    reponse=requests.get(url)
    print(reponse.text)
    

    (1)轮询策略

    最基本的配置方法,上面的例子就是轮询的方式,它是upstream模块默认的负载均衡默认策略。每个请求会按时间顺序逐一分配到不同的后端服务器。
    可以看出三个服务器出现的频率一样:

    (2)权重策略

    权重方式,在轮询策略的基础上指定轮询的几率,weight的数值与访问比率成正比。权重越高分配到需要处理的请求越多。此策略可以与least_conn和ip_hash结合使用。此策略比较适合服务器的硬件配置差别比较大的情况。
    修改default.conf:

    upstream tomcats {
        server tomcat01:8080; #默认weight=1
        server tomcat02:8080 weight=2; 
        server tomcat03:8080 weight=3; 
    }
    
    server {
        listen 8085;
        server_name localhost;
    
        location / {
            proxy_pass http://tomcats; # 请求转向tomcats
        }
    }
    

    重启容器。可看出权重越大出现次数越多:

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

    1.部署项目


    docker-compose.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
      tomcat11:     #tomcat 服务
        image: tomcat    #镜像
        hostname: hostname       #容器的主机名
        container_name: tomcat11   #容器名
        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: test4mysql
        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
              - tomcat11
          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 tomcat11:8080;
    }
    
    server {
        listen 8080;
        server_name localhost;
    
        location / {
            proxy_pass http://tomcat123;
        }
    }
    

    docker-entrypoint.sh:

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

    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"]
    

    2.修改连接数据库的IP

    Javaweb太菜了没学会,最后还是用了老师的。
    ifconfig查看虚拟机ip,然后修改连接数据库的IP。
    cd /test4.2/lzz/webapps/ssmgrogshop_war/WEB-INF/classes
    vim jdbc.properties


    3.启动容器

    docker-compose up -d
    

    4.浏览器访问前端页面

    http://127.0.0.1:8080/ssmgrogshop_war或http://主机ip地址:8080/ssmgrogshop_war

    5.nginx代理之后,主机访问localhost/ssmgrogshop_war/

    账户sa 密码123登陆。

    测试两个tomcat服务器负载均衡。
    http://主机ip地址:5050/ssmgrogshop_war
    http://主机ip地址:5055/ssmgrogshop_war

    6.在前端页面进行数据库进行各种操作




    删除102、修改101、增加100后:

    搜索:

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

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

    1.配置

    树形结构
    在个人文件下创建一个目录,用于向Docker内部的Ubuntu系统传输文件。创建并运行容器。
    ├── Dockerfile
    ├── build
    │ └── hadoop-3.1.3.tar.gz
    └── sources.list

    Dockerfile:

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

    source.list:

    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       # 安装vim软件
    apt-get install ssh       # 安装sshd,因为在开启分布式Hadoop时,需要用到ssh连接slave:
    /etc/init.d/ssh start     # 运行脚本即可开启sshd服务器
    vim ~/.bashrc             
    /etc/init.d/ssh start  # 在该文件中最后一行添加如下内容,实现进入Ubuntu系统时,都能自动启动sshd服务
    

    配置ssh:

    cd ~/.ssh #不存在~/.ssh目录可先执行第二步
    ssh-keygen -t rsa # 一直按回车即可
    cat id_rsa.pub >> authorized_keys #这一步要在~/.ssh目录下进行
    

    3. 安装JDK

    因为Hadoop有用到Java,因此还需要安装JDK。
    JDK用了jdk1.8。

    apt-get install openjdk-8-jdk
    

    4. 安装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
    


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

    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
    

    6. 构建镜像

    docker commit 容器ID ubuntu/hadoop 
    

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

    从三个终端分别开启三个容器运行ubuntu/hadoopinstalled镜像,分别表示Hadoop集群中的master,slave01和slave02:

    # 第一个终端
    sudo docker run -it -h master --name master ubuntu/hadoopinstalled
    # 第二个终端
    sudo docker run -it -h slave01 --name slave01 ubuntu/hadoopinstalled
    # 第三个终端
    sudo docker run -it -h slave02 --name slave02 ubuntu/hadoopinstalled
    


    三个终端分别打开/etc/hosts,根据各自ip修改为如下形式:

    172.17.0.4    master
    172.17.0.5    slave01
    172.17.0.6    slave02
    




    在master结点测试ssh;连接到slave结点:

    ssh slave01
    ssh slave02
    exit 退出
    


    master主机上修改workers:

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

    在master上测试hadoop集群:

    cd /usr/local/hadoop-3.1.3
    bin/hdfs namenode -format # 格式化文件系统
    sbin/start-dfs.sh # 开启NameNode和DataNode服务
    sbin/start-yarn.sh # 开启ResourceManager和NodeManager服务
    jps # 查看服务状态
    



    8.运行hadoop示例程序

    在master上建立HDFS文件夹:

    bin/hdfs dfs -mkdir /user 
    bin/hdfs dfs -mkdir /user/root      #注意input文件夹是在root目录下
    bin/hdfs dfs -mkdir input
    

    在master终端上vim一个测试样例,并将其上传到input文件夹;注意test文件的路径:

    bin/hdfs dfs -put ~/test.txt input
    


    bin/hadoop jar /usr/local/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount input output
    


    cat查看output文件夹结果显示:

    ./bin/hdfs dfs -cat output/*
    


    停止所有服务:

    sbin/stop-all.sh
    

    四、问题总结

    1.测试ssh的时候出现链接超时。

    检查后发现是因为IP配置写错了。
    2.配置ssh时提示无法打开ssh。
    执行ssh-keygen -t rsa,再尝试打开就可以了。

    3.格式化时报错。
    原因是core-site.xml格式输入不正确,开头两行打错了。找错找了好久。

    4.测试hadoop集群的时候,jps后只有master启动了节点,slave01和slave02都没有改变。看到百度说可能是多次格式化导致ID不一致,按这个问题方法去改完以后还是不行。尝试在slave上启动看报错发现是配置文件youwent,因为之前配置文件有问题,而在master上有改过slave没有。把配置文件改正以后,删掉tmp,停止运行的节点,重启开启,再次jps看的时候就可以了。

    五、小结

    实验一大概用了四个小时,实验二大概六个小时,实验三大概六个多小时,写博客一个小时。做得最久的一次实验了,大部分时间都花在看资料和查错。按着教程一步步做,没有大的问题,但是小的问题不断,一样的步骤总能做出各种问题,特别是写配置的小错误找起来最为窒息。
    花了很多时间也学了很多东西。本次实验学了反向代理、负载均衡、用Docker-compose部署javaweb运行环境、用Docker搭建大数据集群环境。也有很多收获,比如实验三,对比之前大数据实验搭建hadoop完全分布式配置开了三台虚拟机,我的脆皮笔记本卡到鼠标都不会动,这次用Docker搭建大数据集群环境就只要一台虚拟机并且完全不会卡。对于Javaweb,本来想自己做,但是没有接触过然后时间又比较紧,最后还是屈服了用了老师的,感觉自己还是太菜了。

  • 相关阅读:
    201871010106丁宣元 《面向对象程序设计(java)》第八周学习总结
    201871010106丁宣元 《面向对象程序设计(java)》第十一周学习总结
    201871010106丁宣元 《面向对象程序设计(java)》第十周学习总结
    学习:数据结构树状数组
    学习:数据结构线段树
    学习:数据结构哈希
    学习:数据结构单调栈
    学习:数学欧拉定理与扩展欧拉定理
    CRUD全栈式编程架构之导入导出的设计
    CRUD全栈式编程架构之服务层的设计
  • 原文地址:https://www.cnblogs.com/RAEQI/p/12908643.html
Copyright © 2020-2023  润新知