• 第4次实践作业


    通过前面几次的实验,大家已经基本熟悉Docker、Dockerfile、Docker Compose的相关操作,从本次实验开始,将结合此前相关课程内容,安排一些相关技术专题实践:

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

    要求:
    1.理解nginx反向代理原理;
    2.nginx代理tomcat集群,代理2个以上tomcat;
    3.了解nginx的负载均衡策略,并至少实现nginx的2种负载均衡策略;
    参考资料:
    Nginx 配置详解
    Nginx服务器之负载均衡策略

    理解nginx反向代理原理

    Nginx在做反向代理时,提供性能稳定,并且能够提供配置灵活的转发功能。Nginx可以根据不同的正则匹配,采取不同的转发策略,比如图片文件结尾的走文件服务器,动态页面走web服务器,只要你正则写的没问题,又有相对应的服务器解决方案,你就可以随心所欲的玩。并且Nginx对返回结果进行错误页跳转,异常判断等。如果被分发的服务器存在异常,他可以将请求重新转发给另外一台服务器,然后自动去除异常服务器。

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

    本次项目的结构

    Tomcat是一个web应用服务器,index.html用于显示登录到服务器上时页面显示的内容,用于区分不同的Tomcat

    docker-compose.yml

    version: "3"
    services:
        nginx:
            image: nginx
            container_name: "nginx-tomcat"
            ports:
                - "80:8085"
            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
    

    nginx配置文件default.conf

    upstream tomcats {
        server tomcat01:8080; # 主机名:端口号
        server tomcat02:8080; # tomcat默认端口号8080
        server tomcat03:8080; # 默认使用轮询策略
    }
    
    server {
        listen 8085;
        server_name localhost;
    
        location / {
            proxy_pass http://tomcats; # 请求转向tomcats
        }
    }
    

    index.html

    运行docker-compose up并登录到localhost查看配置是否正确

    sudo docker-compose up -d
    

    显示的内容为Tomcat1里面index.html的内容,说明配置没有问题,可以开始接下来的测试了。

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

    1.关于Nginx的负载均衡

    在服务器集群中,Nginx起到一个代理服务器的角色(即反向代理),为了避免单独一个服务器压力过大,将来自用户的请求转发给不同的服务器。

    2.Nginx负载均衡策略(轮询)

    最基本的配置方法,每个请求会按时间顺序逐一分配到不同的后端服务器。(ubuntu w3m体验不佳)

    ①方法一:不停的点击浏览器的重新载入当前页面

    ②方法二:

    3.Nginx负载均衡策略(weight)

    权重方式,在轮询策略的基础上指定轮询的几率

    修改defaul.conf文件

    重启nginx

    结果显示,1多余2,2多余3

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

    要求:
    1.分别构建tomcat、数据库等镜像服务;
    2.成功部署Javaweb程序,包含简单的数据库操作;
    3.为上述环境添加nginx反向代理服务,实现负载均衡。
    参考资料:
    使用docker-compose部署Javaweb项目
    tomcat+nginx-mysql

    文件结构

    docker-compose.yml

    version: '2'
    services:
      tomcat01:
        image: tomcat
        hostname: lyhjavaweb
        container_name: tomcat4
        ports:
         - "5050:8080"
        volumes:
         - "$PWD/webapps:/usr/local/tomcat/webapps"
        networks:
          webnet:
            ipv4_address: 15.22.0.15
      tomcat02:
        image: tomcat
        container_name: tomcat5
        ports:
         - "5051:8080"
        volumes:
         - "$PWD/webapps:/usr/local/tomcat/webapps"
        networks:
          webnet:
            ipv4_address: 15.22.0.16
      mymysql:
        build: .
        image: mymysql:test
        container_name: mymysql
        ports:
          - "3306: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
         ports:
             - "8080:8080"
         volumes:
             - ./default.conf:/etc/nginx/conf.d/default.conf # 挂载配置文件
    networks:
     webnet:
       driver: bridge
       ipam:
         config:
           - subnet: 15.22.0.0/24
             gateway: 15.22.0.2
    

    default.conf

    upstream tomcats {
        server tomcat4:8080 weight=1; 
        server tomcat5:8080 weight=2; 
        
    }
    
    server {
        listen 8080;
        server_name localhost;
    
        location / {
            proxy_pass http://tomcats; # 请求转向tomcats
            
        }
    }
    

    修改IP

    打开终端运行

    docker-compose up -d 
    

    在web上查看

    账号:sa
    密码:123

    http://127.0.0.1:5050/ssmgrogshop_war
    

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

    直接用机器搭建Hadoop集群,会因为不同机器配置等的差异,遇到各种各样的问题;也可以尝试用多个虚拟机搭建,但是这样对计算机的性能要求比较高,通常无法负载足够的节点数;使用Docker搭建Hadoop集群,将Hadoop集群运行在Docker容器中,使Hadoop开发者能够快速便捷地在本机搭建多节点的Hadoop集群。
    要求:
    完成hadoop分布式集群环境配置,至少包含三个节点(一个master,两个slave);
    成功运行hadoop 自带的测试实例。
    参考资料:
    Hadoop 参考文档
    使用Docker搭建Hadoop分布式集群

    在Docker安装Ubuntu系统

    从Docker hub上拉取Ubuntu镜像到本地

    docker pull ubuntu
    

    在启动Ubuntu镜像时,需要先在个人文件下创建一个目录,用于向Docker内部的Ubuntu系统传输文件;命令如下:

    cd ~
    mkdir build
    

    然后再在Docker上运行Ubuntu系统;

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

    这里解析下这个命令参数:

    • docker run 表示运行一个镜像;
    • -i表示开启交互式;-t表示分配一个tty,可以理解为一个控制台;因此-it可以理解为在当前终端上与docker内部的ubuntu系统交互;
    • -v 表示docker内部的ubuntu系统/root/build目录与本地/home/hadoop/build共享;这可以很方便将本地文件上传到Docker内部的Ubuntu系统;
    • –name ubuntu 表示Ubuntu镜像启动名称,如果没有指定,那么Docker将会随机分配一个名字;
    • ubuntu 表示docker run启动的镜像文件;

    Ubuntu系统初始化

    刚安装好的Ubuntu系统,是一个很纯净的系统,很多软件是没有安装的,所以我们需要先更新下Ubuntu系统的源以及安装一些必备的软件;

    更新系统软件源

    更新系统源命令如下:

    apt-get update
    

    安装vim

    然后我们安装下经常会使用到的vim软件:

    apt-get install vim
    

    安装sshd

    接着安装sshd,因为在开启分布式Hadoop时,需要用到ssh连接slave:

    apt-get install ssh
    

    然后运行如下脚本即可开启sshd服务器:

    /etc/init.d/ssh start
    

    但是这样的话,就需要每次在开启镜像时,都需要手动开启sshd服务,因此我们把这启动命令写进~/.bashrc文件,这样我们每次登录Ubuntu系统时,都能自动启动sshd服务;

    vim ~/.bashrc
    

    在该文件中最后一行添加如下内容:

    /etc/init.d/ssh start
    

    配置sshd

    安装好sshd之后,我们需要配置ssh无密码连接本地sshd服务,如下命令:

    cd ~/.ssh  
    ssh-keygen -t rsa #一直按回车键即可
    cat id_dsa.pub >> authorized_keys
    

    执行完上述命令之后,即可无密码访问本地sshd服务;

    安装JDK

    因为Hadoop有用到Java,因此还需要安装JDK;直接输入以下命令来安装JDK:

    apt-get install default-jdk
    

    这个命令会安装比较多的库,可能耗时比较长;等这个命令运行结束之后,即安装成功;然后我们需要配置环境变量,打开~/.bashrc文件,在最后输入如下内容;

    vim ~/.bashrc
    

    export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/
    export PATH=$PATH:$JAVA_HOME/bin
    

    注:参考博客里提供的JDK和环境变量不匹配

    接着执行如下命令使~/.bashrc生效即可;

    source ~/.bashrc
    

    保存镜像文件

    #打开一个新的终端
    sudo su
    docker ps
    docker commit 容器id ubuntu/jdk 
    

    以上命令意思如下:

    1. docker ps查看当前运行的容器信息,目前只运行一个ubuntu容器;
    2. docker commit保存fd1fc69d75a3(容器id)容器为一个新的镜像,镜像名称为ubuntu/jdk
    3. docker images查看当前docker所有镜像,可以看到我们新添加的镜像ubuntu/jdk

    安装Hadoop

    安装好JDK之后,接下来,我们来安装Hadoop;我们开启保存的那份镜像ubuntu/jdk:

    sudo docker run -it -v /home/linguoqin/build:/root/build --name ubuntu-jdk ubuntu/jdk
    

    我们可以用如下命令查看开启的容器:

    docker ps
    

    ok,开启系统之后,我们把下载下来的Hadoop安装文件放到共享目录/home/hadoop/build下面,然后在Docker内部Ubuntu系统的/root/build目录即可获取到Hadoop安装文件;在Docker内部的Ubuntu系统安装Hadoop和本地安装一样,

    cd /root/build
    tar -zxvf hadoop-3.1.3.tar.gz -C /usr/local
    

    如果是单机版Hadoop,到这里已经安装完成了,可以运行如下命令测试下:

    cd /usr/local/hadoop
    ./bin/hadoop version
    

    配置Hadoop集群

    接下来,我们来看下如何配置Hadoop集群;对一些文件的设置和之前教程一样,首先打开hadoop_env.sh文件,修改JAVA_HOME

    #假设现在/usr/local/hadoop目录下
    vim etc/hadoop/hadoop-env.sh
    # 将export JAVA_HOME=${JAVA_HOME}替换成
    export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
    

    接着打开core-site.xml,输入一下内容:

    cd etc/hadoop/
    

    vim core-site.xml
    
    <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输入以下内容:

    <configuration>
        <property>
            <name>dfs.namenode.name.dir</name>
            <value>file:/usr/local/hadoop-3.1.3/namenode_dir</value>
        </property>
        <property>
            <name>dfs.datanode.data.dir</name>
            <value>file:/usr/local/hadoop-3.1.3/datanode_dir</value>
        </property>
        <property>
            <name>dfs.replication</name>
            <value>3</value>
        </property>
    </configuration>
    

    接下来修改mapred-site.xml(复制mapred-site.xml.template,再修改文件名),输入以下内容:

    <configuration>
    	<property>
    		<name>mapreduce.framework.name</name>
    		<value>yarn</value>
    	</property>
    	<property>
    		<name>mapreduce.jobhistory.address</name>
    		<value>master:10020</value>
    	</property>
    	<property>
    		<name>mapreduce.jobhistory.webapp.address</name>
    		<value>master:19888</value>
    	</property>
    	<property>
    		<name>mapreduce.application.classpath</name>
    		<value>/usr/local/hadoop-3.1.3/share/hadoop/mapreduce/lib/*,/usr/local/hadoop-3.1.3/share/hadoop/mapreduce/*</value>
    	</property>
    </configuration>
    

    最后修改yarn-site.xml文件,输入以下内容:

    <configuration>
        <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.nodename.vmem-pmem-ratio</name>
            <value>2.7</value>
        </property>
    </configuration>
    

    修改脚本
    进入脚本文件存放目录:

    cd /usr/local/hadoop-3.1.3/sbin
    

    使用vim修改脚本文件
    对于start-dfs.sh和stop-dfs.sh文件,添加下列参数(可以放在function{}之后):

    HDFS_DATANODE_USER=root
    HADOOP_SECURE_DN_USER=hdfs
    HDFS_NAMENODE_USER=root
    HDFS_SECONDARYNAMENODE_USER=root
    

    对于start-yarn.sh和stop-yarn.sh,添加下列参数(可以放在function{}之后):

    YARN_RESOURCEMANAGER_USER=root
    HADOOP_SECURE_DN_USER=yarn
    YARN_NODEMANAGER_USER=root
    

    保存镜像

    #打开一个新的终端
    docker commit 容器id ubuntu/hadoopinstalled
    

    从三个终端分别开启三个容器运行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修改为如下形式

    vim /etc/hosts
    172.17.0.3      master
    172.17.0.4      slave01
    172.17.0.5      slave02
    

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

    ssh slave01
    ssh slave02
    exit #退出
    

    修改master上workers文件;修改localhost

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

    测试Hadoop集群

    #在master上操作
    cd /usr/local/hadoop-3.1.3
    bin/hdfs namenode -format      #首次启动Hadoop需要格式化
    sbin/start-all.sh              #启动所有服务
    jps                            #分别查看三个终端
    

    运行Hadoop实例程序

    /bin/hdfs dfs -mkdir -p /user/hadoop/input
    bin/hdfs dfs -put ./etc/hadoop/*.xml /user/hadoop/input
    bin/hdfs dfs -ls /user/hadoop/input
    

    执行实例并查看结果

    bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar grep /user/hadoop/input output 'dfs[a-z.]+'
    /bin/hdfs dfs -cat output/*
    

    总结

    这次作业从早上开始做,到晚上结束,发现了很多很多的问题,第一个实验除了阿里云有点问题其他都ok,第二个实验样例还行,第三个实验和大数据做的时候有点像,但不知道为什么按照博客做的,jdk版本不一样,还好可以在docker里换版本,其他的在大佬们和大佬们博客的指点下还是能够完成的。

  • 相关阅读:
    Dubbo教程:入门到实战
    阿里面试Java程序员都问些什么?
    Canon MF113W激光打印机双面打印方法
    MacBook Pro App Store无法下载和更新软件解决方案
    收不到Win10正式版预订通知?一个批处理搞定
    创业公司失败的20大原因:没市场需求排第一
    最新版本sublime text3注册码
    Spring MVC 知识点整理
    Nginx子域名配置
    Install Local SQL In Mac OS
  • 原文地址:https://www.cnblogs.com/linguoqin/p/12909037.html
Copyright © 2020-2023  润新知