• 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.]+'

  • 相关阅读:
    MyBatis入门(一)—— 入门案例
    Spring Boot统一异常处理方案示例
    Centos7 安装 ActiveMq
    在 CentOS7 上安装 zookeeper-3.5.2 服务
    使用Homebrew安装Git与Github在idea中的配置
    iReport(模版) 与Jasper(数据填充)生成pdf文档
    SSH下shiro的基本使用
    FastJson的忽略字段和格式日期用法
    Quartz —— 任务调度框架
    POI操作Excel
  • 原文地址:https://www.cnblogs.com/ddaydream/p/12913279.html
Copyright © 2020-2023  润新知