系統綜合實踐第四次實驗

1、使用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種策略

  一、輪詢方式(默認):對客戶端請求,nginx服務器與每一個服務器逐個交互html

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

 

 

  二、給服務器設定權重:多個請求下每一個服務器佔不一樣服務次數的比例java

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

 

 

 

 

  三、iphash:相同客戶端ip只訪問一個服務器node

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服務器,策略爲權重詢問。python

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、slave0一、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致使截圖省略。。。mysql

部署完成:

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功能測試數據:nginx

bug1:web

 

卡住跑不動,修改過yarn的虛擬物理內存比例的配置了也不行。。。logs下面全部的日誌文件看過去看不出明顯的bugsql

 怪本身菜把,可能前面配置時候出了一些bug補完仍是遺存錯誤吧docker

 

重作一遍,bug2:ubuntu

 

 一開始顯示跑一半鏈接失敗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也能跑成功了。。。

相關文章
相關標籤/搜索