• 系统综合实践第四次实验


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

    Nginx反向代理机制:简而言之就是Nginx服务器与服务商众多个web服务器形成一个整体,用户在向服务器发送请求后,Nginx服务器给web服务器代理这些请求,然后选择某个web服务器交互,然后将应答返回给用户。而这些过程是对用户透明的。

      

    • 项目结构

    • nginx负载均衡配置文件的重点部分

    upstream tomcats {
                 server nt-tomcat1:8080 ;  #tomcat服务器
                 server nt-tomcat2:8080 ;
                 server nt-tomcat3:8080 ;
             ip_hash;
            }
    
    server {
        listen       80;
        server_name  localhost;
    
        #charset koi8-r;
        #access_log  /var/log/nginx/host.access.log  main;
    
        location / {
            root   /usr/nginx-3/html  ;
            index  index.html  index.htm  ;
           proxy_pass http://tomcats  ;  #请求tomcats
        }
    
    • nginx的docker-compose文件


    version: "3" services: nginx: image: nginx container_name: nt-nginx ports: - "80:80" volumes: - ./nginx/default.conf:/etc/nginx/conf.d/default.conf depends_on: - tomcat1 - tomcat2 - tomcat3 tomcat1: image: tomcat container_name: nt-tomcat1 volumes: - ./tomcat1:/usr/local/tomcat/webapps/ROOT tomcat2: image: tomcat container_name: nt-tomcat2 volumes: - ./tomcat2:/usr/local/tomcat/webapps/ROOT tomcat3: image: tomcat container_name: nt-tomcat3 volumes: - ./tomcat3:/usr/local/tomcat/webapps/ROOT
    • docker-compose up -d 搭建nginx+tomcat环境

    •  编写运行python文件来对服务器request,测试负载均衡3种策略

      1、轮询方式(默认):对客户端请求,nginx服务器与每个服务器逐个交互

    upstream tomcats {
                 server tomcat1:8080 ;
                 server tomcat2:8080 ;
                 server tomcat3:8080 ;
            }

      2、给服务器设定权重:多个请求下每个服务器占不同服务次数的比例

    upstream tomcats {
                 server tomcat1:8080 weight=1;
                 server tomcat2:8080 weight=2;
                 server tomcat3:8080 weight=3;
            }

      3、iphash:相同客户端ip只访问一个服务器

    upstream tomcats {
                 server tomcat1:8080 ;
                 server tomcat2:8080 ;
                 server tomcat3:8080 ;
             ip_hash;
            }

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

    • 就尝试跑一下酒馆管理的样例吧

    •  登入

       

    • 基本增删改查

      

    • 给以上javaweb增加nginx反向代理,并实现负载均衡

    #docker-compose.yml
    version: '2' services: tomcat1: image: tomcat:7 container_name: nmt-tomcat1 ports: - "5050:8080" volumes: - "$PWD/webapps:/usr/local/tomcat/webapps" networks: webnet: ipv4_address: 15.22.0.17 tomcat2: image: tomcat:7 container_name: nmt-tomcat2 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: nmt-mysql 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 container_name: nmt-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
    #nginx的配置文件default.conf
    upstream tomcats { server nmt
    -tomcat1:8080 weight=1; server nmt-tomcat2:8080 weight=2; } server { listen 80; server_name localhost; location / { proxy_pass http://tomcats ; }

     以上参考大佬的思路,理解一下就是再创建一个tomcat容器作为web服务器运行webapp,然后nginx容器作为反向代理服务器来代理两个tomcat服务器,策略为权重询问。

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

    • 拉取原生Ubuntu镜像,安装openjdk和hadoop环境

      •     apt-get安装openjdk后需要修改环境变量并生效

      •     把下载好的hadoop的压缩包解压到ubuntu的/usr/local下

      •     这里如果缺少某些功能指令请先app-get相关,如vim,ssh等

    • 设置ssh免登录

      •     进入~/.ssh环境(即含有.ssh隐藏目录)下,ssh-keygen -t rsa 获取密钥

      •     生成密钥后存储在id_rsa文件下,cat id_rsa.pub >> authorized_key 写入密钥

      •     这里需要在环境变量文件bashrc下写入 /etc/init.d/ssh.start指令,即在打开容器时自动执行获取免登入

    • 配置hadoop相关文件

      •     到hadoop安装目录下的etc/hadoop内配置一下文件

      •     到hadoop安装目录下sbin内修改内容start-dfs.sh和stop-dfs.sh  start-yarn.sh和stop-yarn.sh

    #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
    <configuration>
        <property>
            <!--使用yarn运行MapReduce程序-->
            <name>mapreduce.framework.name</name>
            <value>yarn</value>
        </property>
        <property>
            <!--jobhistory地址host:port-->
            <name>mapreduce.jobhistory.address</name>
            <value>master:10020</value>
        </property>
        <property>
            <!--jobhistory的web地址host:port-->
            <name>mapreduce.jobhistory.webapp.address</name>
            <value>master:19888</value>
        </property>
        <property>
            <!--指定MR应用程序的类路径-->
            <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>
    </configuration>
    #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
    • 容器->镜像保存,生成hadoop集群的3个容器(master、slave01、slave02)

      •     docker commit指令将容器配置保存成镜像,因为Ubuntu原生镜像的容器在关闭会所有配置会初始化。

      •     docker run去创建3个含有hadoop+jdk环境的ubuntu镜像容器

      •     修改etc/hosts文件内的主机ip映射,还有hadoop安装目录下的/etc/hadoop/workers增加工作者

    • 格式化并启动hadoop

    cd /usr/local/hadoop-3.1.3
    bin/hdfs namenode -format #格式化
    sbin/start-all.sh    #全部打开
    jps   #查看节点是否全部打开

                                    ——以上过程参考前面大佬标答和docker配置hadoop集群教程 ,由于中途过多bug导致截图省略。。。

    部署完成:

    master节点

     slave02节点

    slave01节点

     

    测试样例:

    现在创建一个工作目录:hdfs dfs -mkdir /user/hadoop/input

    然后将本地usr/etc/下的*.xml文件上传至hadoop的/user/hadoop/input下: hdfs dfs -put ./etc/hadoop/*.xml /user/hadoop/input

    可使用grep功能测试数据:

    bug1:

     

    卡住跑不动,修改过yarn的虚拟物理内存比例的配置了也不行。。。logs下面所有的日志文件看过去看不出明显的bug

     怪自己菜把,可能前面配置时候出了一些bug补完还是遗存错误吧

    重做一遍,bug2:

     

     一开始显示跑一半连接失败connection refuse,然后nadenode也关闭了。

    重启容器(hosts会被格式化,但hadoop的缓存依然还在),重写hosts文件后继续跑样例突然能跑还流畅了。。。但突然疯狂重连然后失败。。。

    重试n次之后:突然成功

    实验总结

      做崩了...

      前两个实验现在看来,虽然刚接触nginx反向代理和tomcat轻量级web服务器,但显然第一个实验对于学习nginx反向代理的大致理念-代理服务器,和负载均衡的简单应用是可以接受的。

      但对于最后一个hadoop集群,一开始以为之前做过大数据hadoop从单机、伪分布、完全式分布的相关再到文件系统的流畅的使用,但显然docker镜像下的hadoop集群架构着实有一些坑点会给人带来困难。

      一开始不知道为何ubuntu镜像不能拉取openjdk8,于是拉去default-jdk(教程上的),突然就下了个openjdk11,想说大不了后面一些环境变量改一改就行,呵呵版本不兼容

      

      然后如果是你,肯定觉得卸载重装一下呗?呵呵,按着网上教程去卸载重装,你会发现删不干净!好吧即使我最后删完已经可以显示java版本1.8,但java list下依然还有jdk11

      然后硬着头皮跑到最后,发现如上bug1:卡住了!群里老师解答:yarn-site.xml下的虚拟内存和物理内存比例配置——哦~我好像忘了写...重新配置,fail again。。。

      最后,干脆重新用原生镜像一步一步仔细地做,做到最后似乎还很顺利,bug2 is coming~slave02主机请求master一直会连接失败,第一次失败后master内的hdfs断连,namenode关闭,重启start-all.sh节点有重新恢复正常,继续跑...失败如是

      然后突然一次死机,重开机后重新配置,感觉似乎好起来了,mapredure开跑了!然后还是会产生断连...数次之后离奇成功。

    总结经验:照着大佬的教程都能失败?菜要承认,挨打站稳

    再附:

    竟然继一次开头彩后,wordcount也能跑成功了。。。

  • 相关阅读:
    基于jquery后台框架设计(自适应高度,iframe简易版)
    发布mvc遇到的HTTP错误 403.14Forbidden解决办法
    编译器错误消息: CS0012: 类型 在未被引用的程序集中定义。必须添加对程序集 的引用
    jquery获取iframe里的js事件
    js获取浏览器相关尺寸
    CSS半透明兼容写法
    sharepoint 添加解决方案 遇到的问题
    WCF开发小结
    TDD(测试驱动开发/TestDriven Development)
    asp.net 2.0 读取 资源文件
  • 原文地址:https://www.cnblogs.com/jay-home/p/12908029.html
Copyright © 2020-2023  润新知