第4次实践作业

通过前面几次的实验,大家已经基本熟悉Docker、Dockerfile、Docker Compose的相关操作,从本次实验开始,将结合此前相关课程内容,安排一些相关技术专题实践:

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

要求:
1.理解nginx反向代理原理;
2.nginx代理tomcat集群,代理2个以上tomcat;
3.了解nginx的负载均衡策略,并至少实现nginx的2种负载均衡策略;
参考资料:
Nginx 配置详解
Nginx服务器之负载均衡策略

理解nginx反向代理原理

Nginx在做反向代理时,提供性能稳定,并且能够提供配置灵活的转发功能。Nginx可以根据不同的正则匹配,采取不同的转发策略,比如图片文件结尾的走文件服务器,动态页面走web服务器,只要你正则写的没问题,又有相对应的服务器解决方案,你就可以随心所欲的玩。并且Nginx对返回结果进行错误页跳转,异常判断等。如果被分发的服务器存在异常,他可以将请求重新转发给另外一台服务器,然后自动去除异常服务器。

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

本次项目的结构

Tomcat是一个web应用服务器,index.html用于显示登录到服务器上时页面显示的内容,用于区分不同的Tomcat

docker-compose.yml

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

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

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

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

nginx配置文件default.conf

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

server {
    listen 8085;
    server_name localhost;

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

index.html

运行docker-compose up并登录到localhost查看配置是否正确

sudo docker-compose up -d

显示的内容为Tomcat1里面index.html的内容,说明配置没有问题,可以开始接下来的测试了。

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

1.关于Nginx的负载均衡

在服务器集群中,Nginx起到一个代理服务器的角色(即反向代理),为了避免单独一个服务器压力过大,将来自用户的请求转发给不同的服务器。

2.Nginx负载均衡策略(轮询)

最基本的配置方法,每个请求会按时间顺序逐一分配到不同的后端服务器。(ubuntu w3m体验不佳)

①方法一:不停的点击浏览器的重新载入当前页面

②方法二:

3.Nginx负载均衡策略(weight)

权重方式,在轮询策略的基础上指定轮询的几率

修改defaul.conf文件

重启nginx

结果显示,1多余2,2多余3

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

要求:
1.分别构建tomcat、数据库等镜像服务;
2.成功部署Javaweb程序,包含简单的数据库操作;
3.为上述环境添加nginx反向代理服务,实现负载均衡。
参考资料:
使用docker-compose部署Javaweb项目
tomcat+nginx-mysql

文件结构

docker-compose.yml

version: '2'
services:
  tomcat01:
    image: tomcat
    hostname: lyhjavaweb
    container_name: tomcat4
    ports:
     - "5050:8080"
    volumes:
     - "$PWD/webapps:/usr/local/tomcat/webapps"
    networks:
      webnet:
        ipv4_address: 15.22.0.15
  tomcat02:
    image: tomcat
    container_name: tomcat5
    ports:
     - "5051:8080"
    volumes:
     - "$PWD/webapps:/usr/local/tomcat/webapps"
    networks:
      webnet:
        ipv4_address: 15.22.0.16
  mymysql:
    build: .
    image: mymysql:test
    container_name: mymysql
    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
     ports:
         - "8080:8080"
     volumes:
         - ./default.conf:/etc/nginx/conf.d/default.conf # 挂载配置文件
networks:
 webnet:
   driver: bridge
   ipam:
     config:
       - subnet: 15.22.0.0/24
         gateway: 15.22.0.2

default.conf

upstream tomcats {
    server tomcat4:8080 weight=1; 
    server tomcat5:8080 weight=2; 
    
}

server {
    listen 8080;
    server_name localhost;

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

修改IP

打开终端运行

docker-compose up -d 

在web上查看

账号:sa
密码:123

http://127.0.0.1:5050/ssmgrogshop_war

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

直接用机器搭建Hadoop集群,会因为不同机器配置等的差异,遇到各种各样的问题;也可以尝试用多个虚拟机搭建,但是这样对计算机的性能要求比较高,通常无法负载足够的节点数;使用Docker搭建Hadoop集群,将Hadoop集群运行在Docker容器中,使Hadoop开发者能够快速便捷地在本机搭建多节点的Hadoop集群。
要求:
完成hadoop分布式集群环境配置,至少包含三个节点(一个master,两个slave);
成功运行hadoop 自带的测试实例。
参考资料:
Hadoop 参考文档
使用Docker搭建Hadoop分布式集群

在Docker安装Ubuntu系统

从Docker hub上拉取Ubuntu镜像到本地

docker pull ubuntu

在启动Ubuntu镜像时,需要先在个人文件下创建一个目录,用于向Docker内部的Ubuntu系统传输文件;命令如下:

cd ~
mkdir build

然后再在Docker上运行Ubuntu系统;

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

这里解析下这个命令参数:

  • docker run 表示运行一个镜像;
  • -i表示开启交互式;-t表示分配一个tty,可以理解为一个控制台;因此-it可以理解为在当前终端上与docker内部的ubuntu系统交互;
  • -v 表示docker内部的ubuntu系统/root/build目录与本地/home/hadoop/build共享;这可以很方便将本地文件上传到Docker内部的Ubuntu系统;
  • –name ubuntu 表示Ubuntu镜像启动名称,如果没有指定,那么Docker将会随机分配一个名字;
  • ubuntu 表示docker run启动的镜像文件;

Ubuntu系统初始化

刚安装好的Ubuntu系统,是一个很纯净的系统,很多软件是没有安装的,所以我们需要先更新下Ubuntu系统的源以及安装一些必备的软件;

更新系统软件源

更新系统源命令如下:

apt-get update

安装vim

然后我们安装下经常会使用到的vim软件:

apt-get install vim

安装sshd

接着安装sshd,因为在开启分布式Hadoop时,需要用到ssh连接slave:

apt-get install ssh

然后运行如下脚本即可开启sshd服务器:

/etc/init.d/ssh start

但是这样的话,就需要每次在开启镜像时,都需要手动开启sshd服务,因此我们把这启动命令写进~/.bashrc文件,这样我们每次登录Ubuntu系统时,都能自动启动sshd服务;

vim ~/.bashrc

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

/etc/init.d/ssh start

配置sshd

安装好sshd之后,我们需要配置ssh无密码连接本地sshd服务,如下命令:

cd ~/.ssh  
ssh-keygen -t rsa #一直按回车键即可
cat id_dsa.pub >> authorized_keys

执行完上述命令之后,即可无密码访问本地sshd服务;

安装JDK

因为Hadoop有用到Java,因此还需要安装JDK;直接输入以下命令来安装JDK:

apt-get install default-jdk

这个命令会安装比较多的库,可能耗时比较长;等这个命令运行结束之后,即安装成功;然后我们需要配置环境变量,打开~/.bashrc文件,在最后输入如下内容;

vim ~/.bashrc

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

注:参考博客里提供的JDK和环境变量不匹配

接着执行如下命令使~/.bashrc生效即可;

source ~/.bashrc

保存镜像文件

#打开一个新的终端
sudo su
docker ps
docker commit 容器id ubuntu/jdk 

以上命令意思如下:

  1. docker ps查看当前运行的容器信息,目前只运行一个ubuntu容器;
  2. docker commit保存fd1fc69d75a3(容器id)容器为一个新的镜像,镜像名称为ubuntu/jdk
  3. docker images查看当前docker所有镜像,可以看到我们新添加的镜像ubuntu/jdk

安装Hadoop

安装好JDK之后,接下来,我们来安装Hadoop;我们开启保存的那份镜像ubuntu/jdk:

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

我们可以用如下命令查看开启的容器:

docker ps

ok,开启系统之后,我们把下载下来的Hadoop安装文件放到共享目录/home/hadoop/build下面,然后在Docker内部Ubuntu系统的/root/build目录即可获取到Hadoop安装文件;在Docker内部的Ubuntu系统安装Hadoop和本地安装一样,

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

如果是单机版Hadoop,到这里已经安装完成了,可以运行如下命令测试下:

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

配置Hadoop集群

接下来,我们来看下如何配置Hadoop集群;对一些文件的设置和之前教程一样,首先打开hadoop_env.sh文件,修改JAVA_HOME

#假设现在/usr/local/hadoop目录下
vim etc/hadoop/hadoop-env.sh
# 将export JAVA_HOME=${JAVA_HOME}替换成
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/

接着打开core-site.xml,输入一下内容:

cd etc/hadoop/

vim core-site.xml
<configuration>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>file:/usr/local/hadoop-3.1.3/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-3.1.3/namenode_dir</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/usr/local/hadoop-3.1.3/datanode_dir</value>
    </property>
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
</configuration>

接下来修改mapred-site.xml(复制mapred-site.xml.template,再修改文件名),输入以下内容:

<configuration>
	<property>
		<name>mapreduce.framework.name</name>
		<value>yarn</value>
	</property>
	<property>
		<name>mapreduce.jobhistory.address</name>
		<value>master:10020</value>
	</property>
	<property>
		<name>mapreduce.jobhistory.webapp.address</name>
		<value>master:19888</value>
	</property>
	<property>
		<name>mapreduce.application.classpath</name>
		<value>/usr/local/hadoop-3.1.3/share/hadoop/mapreduce/lib/*,/usr/local/hadoop-3.1.3/share/hadoop/mapreduce/*</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>
    <property>
        <name>yarn.nodename.vmem-pmem-ratio</name>
        <value>2.7</value>
    </property>
</configuration>

修改脚本
进入脚本文件存放目录:

cd /usr/local/hadoop-3.1.3/sbin

使用vim修改脚本文件
对于start-dfs.sh和stop-dfs.sh文件,添加下列参数(可以放在function{}之后):

HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root

对于start-yarn.sh和stop-yarn.sh,添加下列参数(可以放在function{}之后):

YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root

保存镜像

#打开一个新的终端
docker commit 容器id ubuntu/hadoopinstalled

从三个终端分别开启三个容器运行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

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

vim /etc/hosts
172.17.0.3      master
172.17.0.4      slave01
172.17.0.5      slave02

在master结点测试ssh;连接到slave结点

ssh slave01
ssh slave02
exit #退出

修改master上workers文件;修改localhost

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

测试Hadoop集群

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

运行Hadoop实例程序

/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/*

总结

这次作业从早上开始做,到晚上结束,发现了很多很多的问题,第一个实验除了阿里云有点问题其他都ok,第二个实验样例还行,第三个实验和大数据做的时候有点像,但不知道为什么按照博客做的,jdk版本不一样,还好可以在docker里换版本,其他的在大佬们和大佬们博客的指点下还是能够完成的。

原文地址:https://www.cnblogs.com/linguoqin/p/12909037.html