2020系统综合实践 第4次实践作业

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

理解Nginx反向代理原理

代理:简单来说就是自己不想直接去做某件事,这时候就找另外一个人帮我们做。

正向代理:正向代理服务器位于客户端和服务器之间,为了向服务器获取数据,客户端要向代理服务器发送一个请求,并指定目标服务器,代理服务器将目标服务器返回的数据转交给客户端。这里客户端是要进行一些正向代理的设置的。

反向代理:反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。

Nginx代理tomcat集群,代理2个以上tomcat

文件结构

docker-compose.yml

version: "3"
services:
    nginx:
        image: nginx
        container_name: zxhngx
        ports:
            - 80:2525
        volumes:
            - ./nginx/default.conf:/etc/nginx/conf.d/default.conf # 挂载配置文件
        depends_on:
            - tomcat01
            - tomcat02
            - tomcat03

    tomcat01:
        image: tomcat
        container_name: tc1
        volumes:
            - ./tomcat1:/usr/local/tomcat/webapps/ROOT # 挂载web目录

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

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

nginx/default.conf

upstream tomcats {
    server tc1:8080; # 主机名:端口号
    server tc2:8080; # tomcat默认端口号8080
    server tc3:8080; # 默认使用轮询策略
}

server {
    listen 2525;
    server_name localhost;

    location / {
        proxy_pass http://tomcats; # 请求转向tomcats
    }
}

test.py

import requests
import re

url = 'http://localhost'
for i in range(0,20):
    response = requests.get(url)
    text = response.text
    print(text)

验证默认的轮询

验证权重策略

修改default.conf为权重策略(需要重启动容器)

upstream tomcats {
    server tc1:8080 weight=3; # 主机名:端口号
    server tc2:8080 weight=2; # tomcat默认端口号8080
    server tc3:8080 weight=1; # 修改为权重策略
}

server {
    listen 2525;
    server_name localhost;

    location / {
        proxy_pass http://tomcats; # 请求转向tomcats
    }
}

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

主要文件

default.conf

upstream tomcats {            
    server mytomcat1:8080;
    server mytomcat2:8080;
}

server {
    listen       2020;      
    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:     
  tomcat1:                             
    image: tomcat   
    container_name: mytomcat1
    volumes:  
     - ./webapps:/usr/local/tomcat/webapps
    ports:
     - 5050:8080
    networks:   
      webnet:
        ipv4_address: 15.22.0.15
  tomcat2:
     image: tomcat
     container_name: mytomcat2
     volumes:  
        - ./webapps:/usr/local/tomcat/webapps
     ports:
     - 5051:8080
     networks:   
        webnet:
          ipv4_address: 15.22.0.16
  mysql:  
    build: .   
    image: mysql
    container_name: 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: mynginx
      ports:
          - 80:2020
      volumes:
          - ./default.conf:/etc/nginx/conf.d/default.conf 
      depends_on:
            - tomcat1
            - tomcat2
      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  

docker-entrypoint.sh

#!/bin/bash
mysql -uroot -p123456 << EOF
source /usr/local/grogshop.sql;

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"]

使用老师给的教程替换ip

// webapps/ssmgrogshop_war/WEB-INF/classes/jdbc.properties

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://172.18.0.1:3306/grogshop?useUnicode=true&characterEncoding=utf-8
username=root
password=123456

登录酒店管理系统

访问http://localhost/ssmgrogshop_war通过nginx的反向代理和轮询策略不用直接访问tomcat暴露的端口。

进行删除操作

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

拉取 ubuntu 镜像

输入docker pull ubuntu来拉取ubuntu镜像

运行 ubuntu 容器

执行指令docker run -it -v ~/:/root/build --name ubuntu ubuntu

img

更新系统软件源

输入apt-get update,对系统软件源进行更新

安装 vim

vim用以对文本文件进行编辑,输入apt-get install vim进行安装

安装和配置 sshd

输入apt-get install ssh进行安装 ssh

并且输入vim ~/.bashrc对文件进行编辑,在文件最后一行插入以下内容,以便可以自动启动sshd服务:
/etc/init.d/ssh start

输入ssh-keygen -t rsa获取密钥,运行过程中一直回车即可
接着输入cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys将密钥导入文件,然后就可以无密码访问本地sshd服务了

安装 JDK

把hadoop的安装包放在~/目录下,然后执行以下代码安装hadoop:

安装 hadoop

cd /root/build
tar -zxvf hadoop-3.1.3.tar.gz -C /usr/local

输入vim ~/.bashrc,把以下内容加到文件末尾,以编辑环境变量:

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
export PATH=$PATH:$JAVA_HOME/bin
export HADOOP_HOME=/usr/local/hadoop-3.1.3
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$JAVA_HOME/bin

并输入source ~/.bashrc使~/.bashrc生效

在目录/usr/local/hadoop-3.1.3/etc/hadoop下,更改hadoop-env.sh文件,在其中新增export JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"

检查是否安装成功

java -version

cd /usr/local/hadoop-3.1.3
./bin/hadoop version

配置文件编写

  • core-site.xml

    <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

    <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

    <configuration>
        <property>
            <name>mapreduce.framework.name</name>
            <value>yarn</value>
        </property>
      </configuration>
    
  • yarn-site.xml

    <configuration>
      <!-- Site specific YARN configuration properties -->
          <property>
              <name>yarn.nodemanager.aux-services</name>
              <value>mapreduce_shuffle</value>
          </property>
          <property>
              <name>yarn.resourcemanager.hostname</name>
              <value>master</value>
          </property>
      </configuration>
    
  • 保存镜像

  • 查看 ip 并复制填写,测试连通

    172.17.0.3 master

    172.17.0.4 slave01

    172.17.0.5 slave02

  • 配置workers文件

    hadoop集群配置的最后一步,就是在master目录/usr/local/hadoop-3.1.3/etc/hadoop/中输入vim workers编辑workers文件
    将其中的localhost替换为

    slave01
    slave02
    

运行实例grep

  • 在 hdfs 上创建一个目录

    输入./bin/hdfs dfs -mkdir -p /user/hadoop/input

  • 拷贝文件

    dfs -put ./etc/hadoop/*.xml /user/hadoop/input

  • 验证结果

    dfs -ls /user/hadoop/input

  • 执行程序

    输入`./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep /user/hadoop/input output 'dfs[a-z.]+'

posted @ 2020-05-18 22:08  ddaydream  阅读(130)  评论(0编辑  收藏  举报