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


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

    理解nginx反向代理原理

    反向代理,"它代理的是服务端",主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息

    • 示意图:

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

    • 文件结构:

    • default.conf

    upstream tomcats {
        server tomcat1:8080; # 主机名:端口号
        server tomcat2:8080; # tomcat默认端口号8080
        server tomcat3:8080; # 默认使用轮询策略
    }
    
    server {
        listen 80;
        server_name localhost;
    
        location / {
            proxy_pass http://tomcats; # 请求转向tomcats
        }
    }
    
    • index.html
    hello tomcat1
    hello tomcat2 
    hello tomcat3 
    
    • docker-compose.yml
    version: "3"
    services:
        nginx:
            image: nginx
            container_name: nginx
            ports:
                - "80:80"
            volumes:
                - ./nginx/default.conf:/etc/nginx/conf.d/default.conf # 将主机上的tomcat_nginx/nginx/default.conf目录挂在到容器的/etc/nginx/conf.d/default.conf目录
            depends_on:
                - tomcat1
                - tomcat2
                - tomcat3
    
        tomcat1:
            image: tomcat
            container_name: tomcat1
            volumes:
                - ./tomcat1:/usr/local/tomcat/webapps/ROOT # 挂载web目录
    
        tomcat2:
            image: tomcat
            container_name: tomcat2
            volumes:
                - ./tomcat2:/usr/local/tomcat/webapps/ROOT
    
        tomcat3:
            image: tomcat
            container_name: tomcat3
            volumes:
                - ./tomcat3:/usr/local/tomcat/webapps/ROOT
    
    • 运行sudo docker-compose up -d

    了解nginx的负载均衡策略,并至少实现nginx的2种负载均衡策略

    • pa.py代替手动访问网页
    import requests
    url="http://127.0.0.1"
    for i in range(0,10):
    	reponse=requests.get(url)
    	print(reponse.text)
    
    • 轮询策略

    • 权重策略

      • 重写default.conf
    upstream tomcats {
        server tomcat1:8080 weight=2; # 主机名:端口号
        server tomcat2:8080 weight=3; # tomcat默认端口号8080
        server tomcat3:8080 weight=5; # 使用权重策略
    }
    
    server {
        listen 80;
        server_name localhost;
    
        location / {
            proxy_pass http://tomcats; # 请求转向tomcats
        }
    }
    
    • 运行py文件

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

    • 文件结构

    • docker-compose.yml

    version: "3"   
    services:    
      tomcat00:     
        image: tomcat    
        hostname: hostname       
        container_name: tomcat00   
        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
      tomcat01:     
        image: tomcat    
        hostname: hostname       
        container_name: tomcat01   
        ports:      
         - "5055:8080"
        volumes:  
         - "./webapps:/usr/local/tomcat/webapps"
         - ./wait-for-it.sh:/wait-for-it.sh
        networks:   #网络设置静态IP
          webnet:
            ipv4_address: 15.22.0.16
      mymysql:  #mymysql服务
        build: .   #通过MySQL的Dockerfile文件构建MySQL
        image: mymysql:test
        container_name: mymysql
        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-tomcat"
          ports:
              - 8080:8080
          volumes:
              - ./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   #子网
    
    • 修改连接数据库的IP
      cd /home/lzz/webapps/ssmgrogshop_war/WEB-INF/classes进入对应的目录
      vim jdbc.properties将IP改为自己的IP

    • 回到lzz目录
      cd /home/lzz

    • 启动容器
      sudo docker-compose up -d

    • 访问酒店


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

    • 拉取ubuntu镜像

    • 运行容器
      sudo docker run -it -v /home/hadoop/build:/root/build --name ubuntu ubuntu

    • 安装必要的工具

    apt-get update
    apt-get install vim 
    apt-get install ssh 
    
    • 开启ssh服务,并让他自启
    /etc/init.d/ssh start 	//此为开启
    vim ~/.bashrc //打开这个文件,添加上面语句即可自动启动
    
    • 配置ssh
    cd ~/.ssh	//如果没有这个文件夹,执行一下ssh localhost,再执行这个
    ssh-keygen -t rsa 	//一直按回车即可
    cat id_rsa.pub >> authorized_keys
    
    • 安装jdk并查看版本
    apt install openjdk-8-jdk
    vim ~/.bashrc       //在文件末尾添加以下两行,配置Java环境变量:
    export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
    export PATH=$PATH:$JAVA_HOME/bin
    

    • 保存配置好的容器映射镜像
    //可以打开一个新的终端
    sudo docker ps //查看容器id
    sudo docker commit [容器id] 镜像名字
    
    • 运行镜像并把下载好的包挂载到目录中
      docker run -it -v /cathy/build:/root/build --name ubuntu-jdk ubuntu/jdk
    • 解压hadoop并查看版本
    cd /root/build
    tar -zxvf hadoop-3.2.1.tar.gz -C /usr/local
    cd /usr/local/hadoop-3.2.1
    ./bin/hadoop version
    

    • 配置集群
    cd /usr/local/hadoop-3.2.1/etc/hadoop
    vim hadoop-env.sh #把下面一行代码加入文件
    export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
    
    • 用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>
    
    • 用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文件内容
    <?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文件内容
    <?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>
    
    • 修改脚本,因为 使用root配置时会出现报错
      • 进入脚本文件存放目录: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
    
    • 从三个终端分别为ubuntu/hadoop镜像构建容器
    # 第一个终端
    sudo docker run -it -h master --name master ubuntu/hadoop
    # 第二个终端
    sudo docker run -it -h slave01 --name slave01 ubuntu/hadoop
    # 第三个终端
    sudo docker run -it -h slave02 --name slave02 ubuntu/hadoop
    
    • 在三个终端里分别对host修改ip
    vim /etc/hosts	# 根据具体内容修改
    172.17.0.4      master
    172.17.0.5      slave01
    172.17.0.6      slave02
    

    • 在master节点测试ssh
      ssh slave01

      第二个图重复就不截了
    • 修改master上的worker文件内容
    vim /usr/local/hadoop-3.2.1/etc/hadoop/workers
    slave01
    slave02
    
    • 测试hadoop集群
    #在master上操作
    cd /usr/local/hadoop-3.2.1
    bin/hdfs namenode -format      #首次启动Hadoop需要格式化
    sbin/start-all.sh              #启动所有服务
    jps                            #分别查看三个终端
    

    • 将hadoop内的一些文件放入hdfs上的input文件夹
    ./bin/hdfs dfs -mkdir -p /user/root/input
    ./bin/hdfs dfs -put ./etc/hadoop/*.xml /user/root/input
    ./bin/hdfs dfs -ls /user/root/input
    

    • 执行指定的应用程序,查看文件内符合正则表达式的字符串
    ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar grep input output 'dfs[a-z.]+'
    

    • 输出结果

    四,记录实验过程的主要问题和解决方法,分享经验和感想和所花的时间。

    • 问题一,之前的容器占用了窗口,解决:删除之前的容器。

    • 问题二,将共享文件挂载到镜像的时候如果选择Home文件夹下会无效。解决方法:以管理员身份在主文件夹下创建一个文件夹并将hadoop安装包copy进去。把该文件夹当共享文件夹。

    • 问题三,启动hadoop时提示权限不够。解决方法:恢复快照重做一遍,之前有个文件忘记修改了。

    • 花费的时间
      实验:6小时,博客:1.5小时。共7.5小时。

  • 相关阅读:
    二维hash(Uva 12886)
    C#中的线程(一)入门
    全国各地所有高校名单数据库 全国所有高校排名
    协议与代理
    表的约束条件
    na 斐波那契数列f(f(n))
    gcd题目
    Neighbor 隔壁
    hadoop
    Mybatis中实现mysql分页写法!!注意
  • 原文地址:https://www.cnblogs.com/qingke1314/p/12912880.html
Copyright © 2020-2023  润新知