Nginx反向代理機制:簡而言之就是Nginx服務器與服務商衆多個web服務器造成一個總體,用戶在向服務器發送請求後,Nginx服務器給web服務器代理這些請求,而後選擇某個web服務器交互,而後將應答返回給用戶。而這些過程是對用戶透明的。
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
}
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
一、輪詢方式(默認):對客戶端請求,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; }
#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
ssh-keygen -t rsa 獲取密鑰
#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
cd /usr/local/hadoop-3.1.3 bin/hdfs namenode -format #格式化 sbin/start-all.sh #所有打開
jps #查看節點是否所有打開
——以上過程參考前面大佬標答和docker配置hadoop集羣教程 ,因爲中途過多bug致使截圖省略。。。mysql
可以使用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也能跑成功了。。。