• 第4次实践作业


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

    1.1 理解nginx反向代理原理

    Http代理,反向代理:作为web服务器最常用的功能之一,尤其是反向代理。

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

     ----------------------------------------------------------------------------------------

    参考自https://www.runoob.com/w3cnote/nginx-setup-intro.html

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

    • 文件树

    •  default.conf内容
    upstream tomcats {
        server tomcat01:8080; #服务器名为docker-compose.yml的各个服务器
        server tomcat02:8080; #端口号随便都可
        server tomcat03:8080; 
    }
    
    server {
        listen 11234;
        server_name localhost;
    
        location / {
            proxy_pass http://tomcats; # 请求转向tomcats
        }
    }
    • docker-compose.yml内容
    version: "3"
    
    services:
    
      nginx:
    
        image: nginx
    
        ports:
    
          - "7890:11234"
    
        volumes:
    
          - ./default.conf:/etc/nginx/conf.d/default.conf 
    
        depends_on:
    
          - tomcat01
    
          - tomcat02
    
          - tomcat03
    
    
    
      tomcat01:
    
        image: tomcat
    
        volumes:
    
          - ./web:/usr/local/tomcat/webapps/ROOT 
    
        
    
      tomcat02:
    
        image: tomcat
    
        volumes:
    
          - ./web:/usr/local/tomcat/webapps/ROOT
    
        
    
      tomcat03:
    
        image: tomcat
    
        volumes:
    
          - ./web:/usr/local/tomcat/webapps/ROOT
    • index.jsp或者index.html都可,内容按自己的喜好

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

    1.3.1轮询

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

    • 将index.jsp的内容修改为下面的内容,来查看使用的是那台服务器
    <%@ page language="java" contentType="text/html; charset=utf-8"  import="java.net.InetAddress"  
    
                pageEncoding="utf-8"%>  
    
            <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
    
            <html>  
    
            <head>  
    
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
    
            <title>Nginx+Tomcat负载均衡</title>  
    
            </head> 
    
            <body>  
    
                 <%  
    
                     InetAddress addr = InetAddress.getLocalHost();  
    
                     out.println("主机地址:"+addr.getHostAddress());  
    
                     out.println("主机名:"+addr.getHostName());   
    
                  %>  
    
            </body>  
    
            </html>
    • 因为默认就是采用轮询策略,所以跟其他的不变
    • 访问localhost:7890 每次刷新都会不一样,说明使用了不同服务器

    1.3.2 weight

      采用不同的权重分配服务器,权重越高被访问的几率越大。适用于设备性能有差异的情况下使用。

    • 修改default.conf

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

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

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

    由于实在懂javaweb的原理但是自己写不知道要写什么而且一大堆api学起来太麻烦就直接用老师给的参考博客内的例子(所以两个一起做了)

    • 打开webapps/ssmgrogshop_war/WEB-INF/classes路径先的jdbc.properties,修改ip地址为linux虚拟机的地址

    •  运行项目
    docker-compose up -d
    • 在浏览器上访问localhost:5050/ssmgrogshop_war。登录名:sa 密码123(这时候可能会出现不能连接数据库的问题解决办法在第4部分)

     

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

    •  创建default.conf
    upstream tomcats {            #轮询策略
        server tomcat1:8080;
        server tomcat2:8080;
    }
    
    server {
        listen       7890;      #nginx的监听端口
        server_name  localhost;
    
        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        proxy_pass http://tomcats;      #访问nginx之后,会轮询访问代理的tomcat服务器
        }
    }
    • 修改docker-compose.yml
    version: '2'
    services:
      tomcat1:          #添加两个服务
        image: tomcat:7
        container_name: tomcat1
        volumes:
         - "$PWD/webapps:/usr/local/tomcat/webapps"
        networks:
          webnet:
            ipv4_address: 15.22.0.15
      tomcat2:              
        image: tomcat:7
        container_name: tomcat2
        volumes:
         - "$PWD/webapps:/usr/local/tomcat/webapps"
        networks:
          webnet:
            ipv4_address: 15.22.0.16      #与第一个作区分
      mymysql:         #这个服务不变
        build: .
        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: mynginx
          ports:
              - 7890:7890
          volumes:
              - ./default.conf:/etc/nginx/conf.d/default.conf     #挂载配置文件
          depends_on:
                - tomcat1
                - tomcat2
          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
             gateway: 15.22.0.2
    • 文件树

    •  访问localhost7890/ssmgrogshop_war验证是否配置成功

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

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

     (备注,做这个实验的时候一定要将虚拟机的内存调大,否则运行实例的时候会卡死)

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

    • dockerfile
    FROM ubuntu:18.04
    ADD ./hadoopneed.zip /usr/local/hadoop/ 
    COPY ./sources.list /etc/apt/sources.list
    MAINTAINER xuhongjian
    • sources.list
    deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
    
    deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
    
    deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
    
    deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
    
    deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
    
    deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
    
    deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
    
    deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
    
    deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
    
    deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
    • 文件树

    docker build -t ubuntucs .
    docker run -it --name ubuntucs ubuntucs
    • 安装所需的程序
    apt-get update
    apt-get install vim
    apt-get install ssh  #登录服务器
    apt-get install zip #解压工具
    • 解压压缩包
    cd /usr/local/hadoop/
    unzip hadoopneed.zip
    • 实现免密登录
    /etc/init.d/ssh start
    vim ~/.bashrc  //并在最后一行添加/etc/init.d/ssh start
    cd ~/.ssh/
    ssh-keygen -t rsa //一直按回车直到结束
    cat id_dsa.pub >> authorized_keys
    • 配置环境变量
    cd /usr/lib/
    mkdir jvm
    cd jvm
    mv /usr/local/hadoop/hadoopneed/jdk1.8.0_162 jdk1.8.0_162
    cd /usr/local
    mv ./hadoop/hadoopneed/hadoop-3.1.3 ./hadoop-3.1.3
    vim ~/.bashrc
    • 在文件头添加下列文字
    export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162
    export JRE_HOME=/JAVA_HOME/jre
    export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
    export HADOOP_HOME=/usr/local/hadoop-3.1.3
    export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$JAVA_HOME/bin
    • 使环境变量生效并检验
    source ~/.bashrc 
    java -version 
    hadoop version  //注意这时候系统可能会提示权限不足,解决办法见问题解决部分

    •  进入hadoop文件,可以看到下面这些文件
    cd /usr/local/hadoop-3.1.3/etc/hadoop
    ls

    •  配置文件修改
    vim hadoop-env.sh  //在末尾添加 export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162/
    • 继续修改其他配置文件

    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>

    hdfs-site.xml

    <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

    <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

    <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>
    • 进入另一个目录继续配置4个文件(在文件头添加下面这些内容)
    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
    • 存档(防止丢失)
    docker commit <容器id> ubuntu/hadoop //在另一个终端输入
    exit
    • 再打开两个终端,分别输入下列命令
    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

    • 打开IP地址文件,根据文件内容添加IP地址,下面是我的文件配置(每一个终端都要输入三个地址)
    vim /etc/hosts

    •  使用master登录其他节点,验证是否可以免密登录(登录完记得退出)
    ssh slave01 //在master操作
    ssh slave02 //......exit退出
    • hadoop运行实例前的最后一步配置(在master节点上配置)
    vim /usr/local/hadoop-3.1.3/etc/hadoop/workers  //在master上做,将localhost修改为两个主机名即slave01 slave02
    cd /usr/local/hadoop-3.1.3
    bin/hdfs namenode -format      //首次启动Hadoop需要格式化
    sbin/start-all.sh //启动所有服务

    •  使用jps命令查看各个节点的进程情况,如下图所示说明配置成功

    3.2 运行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/*       //输出结果

     4.出现的问题及解决方法

    问题一:javaweb项目登录后不能连接数据库

     解决方法:看报错是数据库出了问题,拒绝连接。我们查看一下mysql的运行日志

    docker logs mymysql   #最后一个参数是容器名

     看到日志问题是处在权限不足上,那就修改权限,进到项目文件夹外(不能再文件夹内修改权限),我这边的javaweb项目是在一个叫lzz的文件夹内

    chmod -R 777 lzz

    停止容器

    docker-compose down

    删除mymysql镜像

    docker rmi  <镜像id>

    重新运行

    docker-compose up -d

    问题二:打印java -version的时候提示权限不足

    root@ebca236f904f:/usr/lib/jvm/jdk1.8.0_162/bin# java -version
    bash: /usr/lib/jvm/jdk1.8.0_162/bin/java: Permission denied

    解决方法

    若提示全向不够则输入命令chmod +x /usr/lib/jvm/jdk1.8.0_162/bin/java
    为了避免以后出现更大的麻烦则将文件夹的权限全修改为777
    chmod -R 777 /usr/local/hadoop-3.1.3
    chmod -R 777 /usr/lib/jvm/jdk1.8.0_162/

    5.作业所花的时间

    实验用时:5小时

    纠错用时:6小时

    博客用时:2小时

    总计:13小时

  • 相关阅读:
    8天学通MongoDB——第三天 细说高级操作
    8天学通MongoDB——第二天 细说增删查改
    8天学通MongoDB——第一天 基础入门
    Redis Web界面管理工具
    Redis 起步
    使用 Swagger UI 与 Swashbuckle 创建 RESTful Web API 帮助文件
    面试应该如何面?
    Login oracle for external authenticate
    突然发现我脾气变好了
    一种持续构建构想
  • 原文地址:https://www.cnblogs.com/xhongj/p/12901288.html
Copyright © 2020-2023  润新知