Docker-compose實現Tomcat+Nginx負載均衡和部署javaweb運行環境以及搭建大數據集群環境


使用Docker-compose實現Tomcat+Nginx負載均衡

反向代理原理

  • 反向代理(Reverse Proxy)方式是指以代理服務器來接受Internet上的連接請求,然后將請求轉發給內部網絡上的服務器;並將從服務器上得到的結果返回給Internet上請求連接的客戶端,此時代理服務器對外就表現為一個服務器。

Nginx反向代理優化服務器的性能

  • Nginx可以在request讀取完整請求前,buffer住(緩沖),然后一起發給服務器。因為有時候會出現卡頓現象,會斷斷續續傳遞,比如網慢的時候,request請求就會一點一點發給服務器,Nginx可以發給服務器一個完整的http請求。同樣,Nginx也可以把response先buffer住,也是提升服務器性能。

  • 通常的代理服務器,只用於代理內部網絡對Internet的連接請求,客戶機必須指定代理服務器,並將本來要直接發送到Web服務器上的http請求發送到代理服務器中。當一個代理服務器能夠代理外部網絡上的主機,訪問內部網絡時,這種代理服務的方式稱為反向代理服務

Nginx代理Tomcat集群

Nginx配置文件

upstream tomcats {
    server Tomcat1:8080; 
    server Tomcat2:8080; 
    server Tomcat3:8080; 
}

server {
    listen 2422;
    server_name localhost;

    location / {
        proxy_pass http://tomcats; # 請求轉向tomcats
    }
}

Docker-compose.yml

version: "3.8"
services:
    nginx:
        image: nginx
        container_name: ngix
        ports:
            - 80:2422
        volumes:
            - ./nginx/default.conf:/etc/nginx/conf.d/default.conf # 掛載配置文件
        depends_on:
            - tomcat01
            - tomcat02
            - tomcat03

    tomcat01:
        image: tomcat
        container_name: Tomcat1
        volumes:
            - ./tomcat1:/usr/local/tomcat/webapps/ROOT # 掛載web目錄

    tomcat02:
        image: tomcat
        container_name: Tomcat2
        volumes:
            - ./tomcat2:/usr/local/tomcat/webapps/ROOT

    tomcat03:
        image: tomcat
        container_name: Tomcat3
        volumes:
            - ./tomcat3:/usr/local/tomcat/webapps/ROOT

Tomcat配置文件

<html>
	<h1>This is Tomcat 1/2/3!</h1>
</html>

了解並至少實現Nginx的2種負載均衡策略

  • Nginx的負載均衡策略有如下幾種:
  • 輪詢 默認方式
  • weight 權重方式
  • ip_hash 依據ip分配方式
  • least_conn 最少連接方式
  • fair(第三方) 響應時間方式
  • url_hash(第三方) 依據URL分配方式

輪詢策略

  • 最基本的配置方法,它是upstream模塊默認的負載均衡默認策略。每個請求會按時間順序逐一分配到不同的后端服務器
  • 可以用過采用python文件進行直觀顯示
import requests
url = 'http://localhost'
for i in range(1,10):
    response=requests.get(url)
    print(response.text)

weight權重策略

  • 權重方式,在輪詢策略的基礎上指定輪詢的幾率。
  • weight參數用於指定輪詢幾率,weight的默認值為1,;weight的數值與訪問比率成正比,比如Tomcat1 被訪問的幾率為其他服務器的兩倍。
upstream tomcats {
    server Tomcat1:8080 weight=2; 
    server Tomcat2:8080; 
    server Tomcat3:8080; 
}
  • 通過py文件測試結果如下,Tomcat 1 的訪問次數基本為其他的兩倍即權重為兩倍
import requests
url = 'http://localhost'
count={'Tomcat 1':0,'Tomcat 2':0,'Tomcat 3':0}
for i in range(0,90):
    response=requests.get(url)
    if  'This is Tomcat 1!' in response.text:
        count['Tomcat 1'] += 1
    if  'This is Tomcat 2!' in response.text:
        count['Tomcat 2'] += 1
    if  'This is Tomcat 3!' in response.text:
        count['Tomcat 3'] += 1
print(count)

使用Docker-compose部署javaweb運行環境

分別構建tomcat、數據庫等鏡像服務

Nginx配置文件

upstream tomcats {
    server Tomcat:5050; 

}

server {
    listen 8080;
    server_name localhost;

    location / {
        proxy_pass http://tomcats;
        proxy_set_header   Host    $host; 
        proxy_set_header   X-Real-IP   $remote_addr; 
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;

    }
}

Docker-compose.yml

version: "3"   
services:    
  tomcat:     
    image: tomcat    
    hostname: hostname       
    container_name: Tomcat   
    ports:      
     - "5050:8080"          #后面訪問網頁的時候要選擇對應的端口號5050
    volumes:  #數據卷
     - "./webapps:/usr/local/tomcat/webapps"
     - ./wait-for-it.sh:/wait-for-it.sh
    networks:   #網絡設置靜態IP
      webnet:
        ipv4_address: 15.22.0.15
  mysql:  
    build:
      context: ./mysql   #通過MySQL的Dockerfile文件構建MySQL
    image: mymysql:test
    container_name: Mysql
    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: Nginx
      ports:
          - 8080:8080
      volumes:
          - ./nginx/default.conf:/etc/nginx/conf.d/default.conf # 掛載配置文件
      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   #子網

Mysql配置文件

  • 主要webapps參考老師文件
Dockerfile
#  這個是構建MySQL的dockerfile
 
FROM registry.saas.hand-china.com/tools/mysql:5.7.17
 
# mysql的工作位置
ENV WORK_PATH /usr/local/

# 定義會被容器自動執行的目錄
ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d
 
#復制gropshop.sql到/usr/local 
COPY grogshop.sql  /usr/local/
#把要執行的shell文件放到/docker-entrypoint-initdb.d/目錄下,容器會自動執行這個shell
COPY docker-entrypoint.sh  $AUTO_RUN_DIR/
 
#給執行文件增加可執行權限
RUN chmod a+x $AUTO_RUN_DIR/docker-entrypoint.sh
 
# 設置容器啟動時執行的命令
#CMD ["sh", "/docker-entrypoint-initdb.d/import.sh"]
Docker-entrypoint.sh
!/bin/bash
mysql -uroot -p123456 << EOF
source /usr/local/grogshop.sql;
構建調試
  • 文件配置完后,利用sudo docker-compose up -d build構建所有容器
  • 瀏覽器訪問http://127.0.0.1:5050/ssmgrogshop_war發現登錄頁面正常,但是輸入賬號密碼登錄后出現了崩潰,應該是數據庫登錄時出問題了(血崩!。。。。500

  • 之后再看了一下老師的教程發現,有個修改數據庫ip的步驟忘記做了,補上后重新構建 發現還是同樣的錯誤
  • 查了一下所有容器的日志,發現tomcat里的報錯:2020-05-18 19:13:25 DruidDataSource:1651 ERROR - create connection error com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'grogshop'
  • 然后又看來mysql里,原來根本沒有grogshop這個數據庫。
  • 原來是.sql文件出了問題。估計是在windows下解壓然后復制到虛擬機過程里轉碼出了問題。直接把解壓包復制到虛擬機里再加壓成功排雷

添加Nginx反向代理服務,實現負載均衡

修改Nginx配置文件
upstream tomcats {
    server Tomcat1:8080; 
    server Tomcat2:8080; 
    server Tomcat3:8080; 
}
修改Docker-compose.yml文件
tomcat1:     
    image: tomcat    
    hostname: hostname       
    container_name: tomcat1   
    ports:      
     - "5051:8080"          #后面訪問網頁的時候要選擇對應的端口號5050
    volumes:  #數據卷
     - "./webapps:/usr/local/tomcat/webapps"
     - ./wait-for-it.sh:/wait-for-it.sh
    networks:   #網絡設置靜態IP
      webnet:
        ipv4_address: 15.22.0.16
  tomcat2:     
    image: tomcat    
    hostname: hostname       
    container_name: tomcat2   
    ports:      
     - "5052:8080"          #后面訪問網頁的時候要選擇對應的端口號5050
    volumes:  #數據卷
     - "./webapps:/usr/local/tomcat/webapps"
     - ./wait-for-it.sh:/wait-for-it.sh
    networks:   #網絡設置靜態IP
      webnet:
        ipv4_address: 15.22.0.17
  nginx:
    depends_on:
     - tomcat1
     - tomcat2
     - tomcat3

使用Docker搭建大數據集群環境

運行環境配置

ubuntu容器初始化

FROM ubuntu
LABEL author=ra9zer
更新系統源,安裝vim與ssh
apt-get update
apt-get install vim
apt-get install ssh

#######配置SSH服務器

vim ~/.bashrc 
/etc/init.d/ssh start # 在文件末尾添加上一行的內容,實現ssd開機自啟
ssh-keygen -t rsa # 一直按回車即可
cd ~/.ssh
cat id_rsa.pub >> authorized_keys

#######安裝JDK

apt-get install openjdk-8-jdk
vim ~/.bashrc # 在文件末尾添加以下兩行,配置Java環境變量:
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
export PATH=$PATH:$JAVA_HOME/bin
source ~/.bashrc # 使.bashrc生效


## 另開一個終端存個檔
docker ps 
sudo docker commit 91102204f9f7 ubuntu/jdk8 
sudo docker run -it -v /home/ubuntu/docker-Hadoop/build:/root/build --name ubuntu-jdk8 ubuntu/jdk8
# 掛載是為了讀取Hadoop安裝文件

#######安裝Hadoop

  • 於官網下載Hadoop3.2.1,在拷貝到掛載目錄下
cd /root/build
tar -zxvf hadoop-3.2.1.tar.gz -C /usr/local
cd /usr/local/hadoop-3.2.1
./bin/hadoop version # 驗證安裝

###輸出如下
Hadoop 3.2.1
Source code repository https://gitbox.apache.org/repos/asf/hadoop.git -r b3cbbb467e22ea829b3808f4b7b01d07e0bf3842
Compiled by rohithsharmaks on 2019-09-10T15:56Z
Compiled with protoc 2.5.0
From source with checksum 776eaf9eee9c0ffc370bcbc1888737
This command was run using /usr/local/hadoop-3.2.1/share/hadoop/common/hadoop-common-3.2.1.jar

#######配置Hadoop集群

cd /usr/local/hadoop-3.2.1/etc/hadoop #進入配置文件存放目錄

########hadoop_env.sh

vim hadoop-env.sh
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/ # 在任意位置添加

########core-site.xml

vim core-site.xml

##添加以下內容
<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl" ?>
<configuration>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>file:/usr/local/hadoop/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

vim hdfs-site.xml

##添加以下內容
<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl" ?>
<configuration>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/usr/local/hadoop/namenode_dir</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/usr/local/hadoop/datanode_dir</value>
    </property>
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
</configuration>

########mapred-site.xml

vim mapred-site.xml

##添加以下內容
<?xml version="1.0" ?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl" ?>
<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.2.1</value>
    </property>
    <property>
        <name>mapreduce.map.env</name>
        <value>HADOOP_MAPRED_HOME=/usr/local/hadoop-3.2.1</value>
    </property>
    <property>
        <name>mapreduce.reduce.env</name>
        <value>HADOOP_MAPRED_HOME=/usr/local/hadoop-3.2.1</value>
    </property>
</configuration>

########yarn-site.xml

vim yarn-site.xml

##添加以下內容
<?xml version="1.0" ?>
<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>master</value>
    </property>
</configuration>

#######修改腳本

cd /usr/local/hadoop-3.2.1/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

運行Hadoop集群

運行主機

做完以上步驟之后存檔,然后開啟三個終端,分別運行集群中的主機:

docker commit  ubuntu/hadoop # 存檔
# 第一個終端
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

修改/etc/hosts

vim /etc/hosts # 查看各終端的IP並修改

添加內容重復內容刪去
172.17.0.2      master
172.17.0.3      slave01
172.17.0.4      slave02
##這里注意要看清清楚主機的ip地址 因人而異

測試連通性

  • 檢測下是否master是否可以連上slave01和slave02(exit為退出)

修改wokers

##在mater上修改wokers文件
vim /usr/local/hadoop-3.2.1/etc/hadoop/workers

##將localhost修改為:

slave01
slave02

測試Hadoop集群

##在master上

cd /usr/local/hadoop-3.2.1
bin/hdfs namenode -format # 格式化文件系統
sbin/start-dfs.sh # 開啟NameNode和DataNode服務
bin/hdfs dfs -mkdir /user # 建立HDFS文件夾,也可以放到下面示例程序中進行
bin/hdfs dfs -mkdir /user/root
bin/hdfs dfs -mkdir input
bin/hdfs dfs -put etc/hadoop/*.xml input # 將xml復制到input下,作為示例程序輸入
sbin/start-yarn.sh # 開啟ResourceManager和NodeManager服務
jps # 查看服務狀態

運行Hadoop示例程序

##在master上

bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar grep input output 'dfs[a-z.]+' # 運行示例
bin/hdfs dfs -get output output # 獲取輸出結果
cat output/* # 查看輸出結果
sbin/stop-all.sh # 停止所有服務

實驗心得

  • 這次實驗差不多用時12個小時,主要還是網上一些教程比較多。第一個實驗任務相當與復習一下上次實驗了。第二個實驗確實也是偷懶了點,按照老師給的教程自己做了一遍。第三實驗任務屬於最懵的一個,信息量太大,最后只能‘前人栽樹后人乘涼’了,看了看已經做完的同學的博客。感覺現在實驗作業有點變成純屬按照網上教程操作一遍,動手的部分在於debug過程了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM