• 2020年系统综合实践 第四次作业


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

    (一)项目结构

    (二)配置文件

    • docker-compose.yml
    version: "3"
    services:
      tomcat1:
        image: tomcat:latest
        volumes:
          - ./tomcat1/:/usr/local/tomcat/webapps/ROOT/
        restart: "always"
        container_name: tomcat1
      tomcat2:
        image: tomcat:latest
        volumes:
          - ./tomcat2/:/usr/local/tomcat/webapps/ROOT/
        container_name: tomcat2
        restart: "always"
      tomcat3:
        image: tomcat:latest
        volumes:    
          - ./tomcat3/:/usr/local/tomcat/webapps/ROOT/
        container_name: tomcat3
        restart: "always"
      nginx:
        image: nginx:latest
        volumes:
          - ./nginx/nginx.conf:/etc/nginx/nginx.conf
        ports:
          - "80:80"
        links:
          - tomcat1:t1
          - tomcat2:t2
          - tomcat3:t3
    
    • nginx.conf
    user  nginx;
    worker_processes  1;
    
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    
    
    events {
        worker_connections  1024;
    }
    
    
    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
    
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  /var/log/nginx/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
    
        keepalive_timeout  65;
    
        #gzip  on;
    
        #include /etc/nginx/conf.d/*.conf;
    
        upstream tomcat_client {
             server tomcat1:8080 weight=1;
             server tomcat2:8080 weight=1;
    	 server tomcat3:8080 weight=1;
        } 
    
        server {
            server_name "";
            listen 80 default_server;
            listen [::]:80 default_server ipv6only=on;
    
            location / {
                proxy_pass http://tomcat_client;
                proxy_redirect default;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
            }
        }
    }
    

    (三)负载均衡测试

    • 轮询策略
      • 修改nginx.conf文件中的upstream
      • 测试结果(依次访问每一个Tomcat服务器)
    • 权重策略
      • 修改nginx.conf文件中的upstream
      • 测试结果(权重大的服务器被访问的次数大于权重小的服务器)

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

    (一)文件结构

    (二)配置文件

    • docker-compose.yml
    version: "3"
    services:
      nginx:
        image: nginx:latest
        container_name: isNginx
        ports:
          - "80:80"
        volumes:
          - ./nginx/nginx.conf:/etc/nginx/nginx.conf # 挂载配置文件
        depends_on:
          - tomcat1
          - tomcat2
          - tomcat3
      tomcat1:
        image: tomcat:latest
        container_name: tomcat1
        depends_on:
          - mysql
        restart: always
        volumes:
          - ./webapp:/usr/local/tomcat/webapps # 挂载web目录
          - ./tomcat1/:/usr/local/tomcat/webapps/ROOT/
      tomcat2:
        image: tomcat:latest
        container_name: tomcat2
        depends_on:
          - mysql
        restart: always
        volumes:
          - ./webapp:/usr/local/tomcat/webapps # 挂载web目录
          - ./tomcat2/:/usr/local/tomcat/webapps/ROOT/
      tomcat3:
        image: tomcat:latest
        container_name: tomcat3
        depends_on:
          - mysql
        restart: always
        volumes:
          - ./webapp:/usr/local/tomcat/webapps # 挂载web目录
          - ./tomcat3/:/usr/local/tomcat/webapps/ROOT/
      mysql:
        build: ./mysql
        container_name: ismysql
        ports:
              - "3306:3306"
        restart: always
    
    • MySQL_Dockerfile
    FROM mysql:latest
    #作者信息
    MAINTAINER ISLAND
    #环境变量配置
    ENV MYSQL_ALLOW_EMPTY_PASSWORD no
    ENV MYSQL_ROOT_PASSWORD 123456
    COPY schema.sql /mysql/schema.sql
    
    • schema.sql
    -- 创建数据库,数据库名为“test"
    create database `school` default character set utf8 collate utf8_general_ci;
    -- 切换到上一步所建的数据库中
    use school;
    -- 如果存在school表,则删除
    DROP TABLE IF EXISTS `student`;
    -- 建表
    CREATE TABLE `student`(
    	`id` varchar(9) NOT NULL,
    	`name` varchar(20) NOT NULL,
    	`age` varchar(20) NOT NULL,
    	PRIMARY KEY (`id`)
    )ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    • nginx.conf
    user  nginx;
    worker_processes  1;
    
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    
    
    events {
        worker_connections  1024;
    }
    
    
    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
    
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  /var/log/nginx/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
    
        keepalive_timeout  65;
    
        #gzip  on;
    
        #include /etc/nginx/conf.d/*.conf;
    
        upstream tomcat_client {
             server tomcat1:8080 weight=1;
             server tomcat2:8080 weight=2;
    	 server tomcat3:8080 weight=3;
        } 
    
        server {
            server_name "";
            listen 80 default_server;
            listen [::]:80 default_server ipv6only=on;
    
            location / {
                proxy_pass http://tomcat_client;
                proxy_redirect default;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
            }
        }
    }
    

    (三)JavaWeb程序

    • JavaWeb项目结构

      使用JSP写了简单的对数据库的增删改查的交互,然后将WAR包放在Tomcat的webapps目录下。
      在实际操作中,需要自己查看mysql容器里的IP地址,并且将IP地址写在JDBC连接语句中。或者自己手动将mysql容器的IP地址改成下列的:172.18.0.2

    (四)对数据库操作测试

    • 运行docker-compose,打开浏览器,输入:localhost:80/myWeb
    • 增加数据

    • 查询数据

    • 修改数据

    • 删除数据

    (四)负载均衡测试(权重策略)

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

    (一)环境准备

    • Hadoop版本:hadoop-3.2.1
    • Ubuntu版本:ubuntu:20.04
    • JDK版本:JDK8

    (二)Ubuntu容器初始化

    • 本次实验使用阿里源
      • Dockerfile
    FROM ubuntu
    COPY sources.list /etc/apt/sources.list
    
    • 创建镜像
      docker build -t ubuntu .
    • 运行容器
      docker run -it -v /home/island/build:/root/build --name ubuntu ubuntu
    • 更新软件源
      apt-get update
    • 安装Vim和ssh
    apt-get install vim
    apt-get install ssh   
    
    • 开启ssh服务
      /etc/init.d/ssh start
    • 将自动开启ssh写入~/.bashrc
    vim ~/.bashrc
    

    末尾添加:/etc/init.d/ssh start

    • 配置免密登入
    ssh-keygen -t rsa
    cd ~/.ssh
    cat id_rsa.pub >> authorized_keys
    
    • 安装JDK
    apt install openjdk-8-jdk
    
    • 配置环境变量
      打开~./bashrc,加入以下两行
    export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
    export PATH=$PATH:$JAVA_HOME/bin
    
    • 保存配置好JDK的镜像
    docker commit 容器ID ubuntu/jdk
    

    (三)安装Hadoop

    • 运行容器
    docker run -it -v /home/island/build:/root/build --name ubuntu-jdkinstalled ubuntu/jdk
    
    • 解压下载好的Hadoop
    cd /root/build
    tar -zxvf hadoop-3.2.1.tar.gz -C /usr/local
    
    • 查看是否安装
    cd /usr/hadoop-3.2.1
    ./bin/hadoop version
    

    (四)配置Hadoop集群

    • 配置adoop_env.sh文件
    #当前目录为/usr/local/hadoop-3.2.1/etc/hadoop
    vim hadoop-env.sh
    export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/ # 在任意位置添加
    
    • 在以下四个文件中增加配置
      • 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
        <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>
    
    • mapred-site.xml
    <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
    <configuration>
        <property>
            <name>yarn.nodemanager.aux-services</name>
            <value>mapreduce_shuffle</value>
        </property>
        <property>
            <name>yarn.resourcemanager.hostname</name>
            <value>master</value>
        </property>
    </configuration>
    
    • 修改启动和结束脚本(如果没修改,启动hadoop时会出现用户错误)
      • 进入目录:/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
    
    • tart-yarn.sh和stop-yarn.sh加入下列内容
    YARN_RESOURCEMANAGER_USER=root
    HADOOP_SECURE_DN_USER=yarn
    YARN_NODEMANAGER_USER=root
    
    • 保存镜像
    docker commit 容器ID ubuntu/hadoopinstalled
    

    (五)启动Hadoop并且测试实例

    • 启动三个节点(一个master节点,两个slave节点)
    # 第一个终端
    docker run -it -h master --name master ubuntu/hadoopinstalled
    # 第二个终端
    docker run -it -h slave01 --name slave01 ubuntu/hadoopinstalled
    # 第三个终端
    docker run -it -h slave02 --name slave02 ubuntu/hadoopinstalled
    
    • 配置master,slave01和slave02的地址信息
    vim /etc/hosts
    

    • 在master节点上配置需要寻找的节点
    vim /usr/local/hadoop-3.2.1/etc/hadoop/workers #将localhost改为 slave01、slave02
    
    • 启动集群,以下操作均在hadoop安装目录下
    cd /usr/local/hadoop
    bin/hdfs namenode -format  #第一次启动需要先格式化
    sbin/start-all.sh
    

    • 在分布式文件系统中建立input文件,并将配置文件上传
    bin/hdfs dfs -mkdir -p /user/root/input
    bin/hdfs dfs -put etc/hadoop/*.xml input # 将xml复制到input下,作为示例程序输入
    
    • 运行实例
    bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar grep input output 'dfs[a-z.]+'
    

    • 查看结果
    bin/hdfs dfs -cat output/*
    

    四、问题&&解决办法&&心得&&时长

    问题&&解决办法

    • 容器中安装软件速度过慢
      换源,不过要找到和你ubuntu版本相对应的源,要不然一直会有依赖不满足。
    • docker-compose启动MySQL,MySQL会一直无法进入容器
      先别把脚本放进去,直接构造一个简单的容器,然后在进入这个容器里去创建数据库等等。

    心得

    这次感觉比前几次实验更加困难了,尤其是在部署JaveWeb,需要更多的时间才能完成。

    时长

    阅读资料:4h
    动手实践:10h
    博客编写:2h
    合计:16h

  • 相关阅读:
    Educational Codeforces Round 13 E. Another Sith Tournament 概率dp+状压
    Codeforces Round #358 (Div. 2) D. Alyona and Strings 字符串dp
    Codeforces Round #359 (Div. 2) D. Kay and Snowflake 树的重心
    Codeforces Round #311 (Div. 2) D. Vitaly and Cycle 奇环
    Codeforces Round #Pi (Div. 2) E. President and Roads 最短路+桥
    Codeforces Gym 100342J Problem J. Triatrip 三元环
    HDU 4587 TWO NODES 割点
    hdu 5615 Jam's math problem(十字相乘判定)
    C++数组作为函数参数的几个问题(转)
    UVA
  • 原文地址:https://www.cnblogs.com/lokk/p/12895843.html
Copyright © 2020-2023  润新知