系统综合实践第四次实验

一、使用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也能跑成功了。。。

原文地址:https://www.cnblogs.com/jay-home/p/12908029.html