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

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

  • 理解nginx反向代理原理

参考资料

反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

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

项目结构:

default.conf:

upstream tomcats {
    server tomcat01:8080;
    server tomcat02:8080; 
    server tomcat03:8080; 
}

server {
    listen 8079;
    server_name localhost;

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

docker-compose.yml:

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

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

    tomcat02:
        image: tomcat
        container_name: "tomcat02"
        volumes:
            - ./tomcat-2:/usr/local/tomcat/webapps/ROOT

    tomcat03:
        image: tomcat
        container_name: "tomcat03"
        volumes:
            - ./tomcat-3:/usr/local/tomcat/webapps/ROOT

三个html:

配置完毕后执行sudo docker-compose up -d:

查看容器sudo docker ps -a:

用firebox访问:

  • tomcat01:

  • tomcat02:

  • tomcat03:

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

  • 轮询策略

创建文件webtest.py,编写爬虫程序:

import requests

url="http://127.0.0.1"
count={}
for i in range(0,2000):
	response=requests.get(url)
	if response.text in count:
	        count[response.text]+=1;
	else:
	        count[response.text]=1
for a in count:
	print(a, count[a])

运行爬虫程序:

python3 webtest.py

  • 权重策略

修改default.conf:

upstream tomcats {
    server tomcat01:8080 weight=1;
    server tomcat02:8080 weight=2;
    server tomcat03:8080 weight=3;
}

server {
    listen 8079;
    server_name localhost;

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

重启容器:

sudo docker restart nginx-tomcat

再次运行爬虫程序:

python3 webtest.py

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

这里的webapps用老师给的例子

  • 分别构建tomcat、数据库等镜像服务;

文件结构:

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

docker-entrypoint.sh:

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

docker-compose.yml:

version: "3"   #版本
services:     #服务节点
  tomcat00:     #tomcat 服务
    image: tomcat    #镜像
    hostname: hostname       #容器的主机名
    container_name: tomcat00   #容器名
    ports:      #端口
     - "5050:8080"
    volumes:  #数据卷
     - "./webapps:/usr/local/tomcat/webapps"
     - ./wait-for-it.sh:/wait-for-it.sh
    networks:   #网络设置静态IP
      webnet:
        ipv4_address: 15.22.0.15
  tomcat04:     #tomcat 服务
    image: tomcat    #镜像
    hostname: hostname       #容器的主机名
    container_name: tomcat04   #容器名
    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: lzsmysql
    container_name: lzs_mysql
    ports:
      - "3307:3306" 
#红色的外部访问端口不修改的情况下,要把Linux的MySQL服务停掉
#service mysql stop
#反之,将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: lzs_nginx-tomcat
      ports:
          - 8080:8080
      volumes:
          - ./default.conf:/etc/nginx/conf.d/default.conf # 挂载配置文件
      tty: true
      stdin_open: true
      depends_on:
          - tomcat00
          - tomcat04
      networks:
       webnet:
        ipv4_address: 15.22.0.7
networks:   #网络设置
 webnet:
   driver: bridge  #网桥模式
   ipam:
     config:
      - 
       subnet: 15.22.0.0/24   #子网

default.conf:

upstream tomcat {
    server tomcat00:8080;
    server tomcat04:8080;
}

server {
    listen 8080;
    server_name localhost;

    location / {
        proxy_pass http://tomcat;
    }
}

修改连接数据库的IP地址:

构建镜像查看容器:

sudo docker-compose up -d
sudo docker ps -a

访问前端页面:
http://127.0.0.1:8080/ssmgrogshop_warhttp://主机ip地址:8080/ssmgrogshop_war

  • 成功部署Javaweb程序,包含简单的数据库操作;

  • 查询:

  • 插入:

  • 修改:

  • 删除:

  • 为上述环境添加nginx反向代理服务,实现负载均衡。

测试代理服务:

  • 从5050端口访问:

  • 从5055端口访问:

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

直接用机器搭建Hadoop集群,会因为不同机器配置等的差异,遇到各种各样的问题;也可以尝试用多个虚拟机搭建,但是这样对计算机的性能要求比较高,通常无法负载足够的节点数;使用Docker搭建Hadoop集群,将Hadoop集群运行在Docker容器中,使Hadoop开发者能够快速便捷地在本机搭建多节点的Hadoop集群。
要求:

  • 完成hadoop分布式集群环境配置,至少包含三个节点(一个master,两个slave);
  • 成功运行hadoop 自带的测试实例。

一、搭建hadoop环境

1.拉取ubuntu镜像:

2.在启动Ubuntu镜像前,需要先在个人文件下创建一个目录,用于向Docker内部的Ubuntu系统传输文件

3.然后运行ubuntu

sudo docker run -it -v /home/lzs_hadoop/build:/root/build --name ubuntu ubuntu

4.安装必要工具:

apt-get update
apt-get install vim # 用于修改配置文件
apt-get install ssh # 分布式hadoop通过ssh连接

5.把启动sshd服务命令写进~/.bashrc文件:

vim ~/.bashrc

在该文件中最后一行添加如下内容:

/etc/init.d/ssh start

6.启动sshd服务:

7.配置ssh无密码连接本地sshd服务:

ssh-keygen -t rsa
cat id_dsa.pub >> authorized_keys

8.安装JDK:

apt-get install default-jdk

打开~/.bashrc文件,写入以下内容:

export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/
export PATH=$PATH:$JAVA_HOME/bin

然后输入以下指令使之生效

source ~/.bashrc

检验安装:

java -version

9.登录dockerhub账号,然后保存当前镜像为ubuntu/jdkinstalled,表示jdk安装成功的ubuntu版本,命令如下:

docker commit 容器ID ubuntu/jdkinstalled

10.安装hadoop:
运行新的镜像

sudo docker run -it -v /home/lzs_hadoop/build:/root/build --name ubuntu-jdkinstalled ubuntu/jdkinstalled

把下载到共享文件夹的hadoop-3.1.3.tar.gz移动到到个人创建的build目录下:

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

检验安装:

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

二、配置hadoop集群

1.进入配置目录修改相应文件

vim hadoop-env.sh
vim core-site.xml
vim hdfs-site.xml
vim mapred-site.xml
vim yarn-site.xml

  • 1.hadoop-env.sh:

在任意位置添加

export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/
  • 2.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>
  • 3.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>
  • 4.mapred-site.xml(复制mapred-site.xml.template,再修改文件名):
<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.1.3</value>
    </property>
    <property>
        <name>mapreduce.map.env</name>
        <value>HADOOP_MAPRED_HOME=/usr/local/hadoop-3.1.3</value>
    </property>
    <property>
        <name>mapreduce.reduce.env</name>
        <value>HADOOP_MAPRED_HOME=/usr/local/hadoop-3.1.3</value>
    </property>
</configuration>
  • 5.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>
        <!--虚拟内存和物理内存比,不加这个模块程序可能跑不起来-->
        <property>
               <name>yarn.nodemanager.vmem-pmem-ratio</name>
               <value>2.5</value>
        </property>
</configuration>

2.添加参数
进入目录/usr/local/hadoop-3.1.3/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

3.构建镜像

sudo docker commit 容器ID ubuntu/hadoopinstalled

4.利用构建好的镜像运行主机
开启三个终端运行ubuntu/hadoopinstalled镜像,分别表示Hadoop集群中的master,slave01和slave02;

# 第一个终端
sudo docker run -it -h master --name master ubuntu/hadoopinstalled
# 第二个终端
sudo docker run -it -h slave01 --name slave01 ubuntu/hadoopinstalled
# 第三个终端
sudo docker run -it -h slave02 --name slave02 ubuntu/hadoopinstalled

5.分别查看三个主机的/etc/hosts

得到IP地址如下:

172.17.0.2    master
172.17.0.3    slave01
172.17.0.4    slave02

6.三个终端分别vim /etc/hosts打开/etc/hosts,根据各自ip修改为如下形式

172.17.0.2      master
172.17.0.3      slave01
172.17.0.4      slave02

用如下命令来检测下是否master是否可以连上slave01和slave02

ssh slave01
ssh slave02
exit

7.修改master上workers文件

vim /usr/local/hadoop-3.1.3/etc/hadoop/workers

将localhost替换成两个slave的主机名

slave01
slave02

三、测试Hadoop集群

1.jps查看服务是否开启成功

#在master上操作
cd /usr/local/hadoop-3.1.3
bin/hdfs namenode -format      #首次启动Hadoop需要格式化
sbin/start-all.sh              #启动所有服务
jps                            #分别查看三个终端

四、运行自带的测试实例

准备测试样例的输入文件

bin/hdfs dfs -mkdir -p /user/hadoop/input
bin/hdfs dfs -put ./etc/hadoop/*.xml /user/hadoop/input
bin/hdfs dfs -ls /user/hadoop/input

测试样例并输出结果

bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar grep /user/hadoop/input output 'dfs[a-z.]+'    
bin/hdfs dfs -cat output/*       

(4)实验报告

记录实验过程的主要问题和解决方法,分享经验和感想;

1.web服务配置好后访问网页失败
注意端口号和工作目录是否正确,然后重启容器
2.实验三无法做出正确结果
注意所有操作都是在容器中进行,以此来构建镜像

记录完成作业所花的时间

1、使用Docker-compose实现Tomcat+Nginx负载均衡:大约3.5h
2、使用Docker-compose部署javaweb运行环境:大约2h
3、使用Docker搭建大数据集群环境:大约6.5h
总计约12h

感想

这次作业量极大,但也让我学到不少新东西

原文地址:https://www.cnblogs.com/tinygod/p/12910270.html