第4次实践作业

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

a.理解nginx反向代理原理;

反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。当一个代理服务器能够代理外部网络上的主机,访问内部网络时,这种代理服务的方式称为反向代理服务。反向代理,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息!nginx扮演了反向代理服务器的角色.

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


编写配置文件 default.conf:

upstream Tomcatweb{
   server ruinTom1:8080  max_fails=3 fail_timeout=60s;  #允许失败三次,失败60s后再来
       server ruinTom2:8080  max_fails=3 fail_timeout=60s;
       server ruinTom3:8080  max_fails=3 fail_timeout=60s;
}
   

server {
   listen       2506;
   server_name  localhost;
   location / {
     # root   /usr/share/nginx/html;
     # index  index.html index.htm;
      	proxy_pass http://Tomcatweb;  #访问nginx,实在访问代理服务器,
   }

   error_page   500 502 503 504  /50x.html;
   location = /50x.html {
       root   /usr/share/nginx/html;
   }
}

docker-compose.yml:


`version: "3.1"`

`services:`

 `nginx:`

​    `image: nginx`

​    `container_name: ng1`

​    `ports:`

​      `\- 80:2508`

​    `volumes:`

​      `\- ./nginx/default.conf:/etc/nginx/conf.d/default.conf # 挂载配置文件`

​    `depends_on:`

​      `\- tomcat01`

​      `\- tomcat02`

​      `\- tomcat03`



 `tomcat01:`

​    `image: tomcat`

​    `container_name: tt1`

​    `volumes:`

​      `\- ./tomcat/tomcat1:/usr/local/tomcat/webapps/ROOT # 挂载web目录`



 `tomcat02:`

​    `image: tomcat`

​    `container_name: tt2`

​    `volumes:`

​      `\- ./tomcat/tomcat2:/usr/local/tomcat/webapps/ROOT`



 `tomcat03:`

​    `image: tomcat`

​    `container_name: tt3`

​    `volumes:`

​      `\- ./tomcat/tomcat3:/usr/local/tomcat/webapps/ROOT`

运行docker-compose

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

  • 轮询策略
    Nginx配置文件dafault.conf:

  • 权重方式
    Nginx配置文件dafault.conf:


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

要求:

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

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

  • 编写配置文件:
  • default.conf
        server ruintomcat:8080;
}
server {
        listen 8080;
        server_name localhost;

        location / {
                proxy_pass http://tomweb;
        }
}
  • docker-compose.yml
services:
  tomcat:
    image: tomcat
    hostname: hostname
    container_name: ruintomcat
    ports:
     - "5050:8080"
    volumes:
     - "$PWD/webapps:/usr/local/tomcat/webapps"
    networks:
      webnet:
        ipv4_address: 15.22.0.15
  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
networks:
 webnet:
   driver: bridge
   ipam:
     config:
       - subnet: 15.22.0.0/24
         gateway: 15.22.0.2
  • docker-entrypoint.sh
mysql -uroot -p123456 << EOF
source /usr/local/grogshop.sql;
  • 更改数据库ip

  • 在 /webapps/ssmgrogshop_war/WEB-INF/classes/jdbc.properties 修改ip和端口,并且用指令docker-compose up启动容器。

  • 浏览器打开项目

  • 登录以后可进行数据库的基本操作

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

  • 修改nginx配置文件
upstream tomcats {
    server tomcat00:5050; 
    server tomcat00:5051; 
    server tomcat00:5052; 
     
}
  • 修改yml文件
tomcat01:     
    image: tomcat    
    hostname: hostname       
    container_name: tomcat01   
    ports:      
     - "5051:8080"          #后面访问网页的时候要选择对应的端口号5050
    volumes:  #数据卷
     - "./webapps:/usr/local/tomcat/webapps"
     - ./wait-for-it.sh:/wait-for-it.sh
    networks:   #网络设置静态IP
      webnet:
        ipv4_address: 15.22.0.16
  tomcat02:     
    image: tomcat    
    hostname: hostname       
    container_name: tomcat02   
    ports:      
     - "5052:8080"          #后面访问网页的时候要选择对应的端口号5050
    volumes:  #数据卷
     - "./webapps:/usr/local/tomcat/webapps"
     - ./wait-for-it.sh:/wait-for-it.sh
    networks:   #网络设置静态IP
      webnet:
        ipv4_address: 15.22.0.17
  nginx:
    depends_on:
     - tomcat00
     - tomcat01
     - tomcat02   

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

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

要求:

a.完成hadoop分布式集群环境配置,至少包含三个节点(一个master,两个slave);

b.成功运行hadoop 自带的测试实例。

  • 1.拉取ubuntu镜像
    创建目录,用于向Docker内部的Ubuntu系统传输文件

docker pull ubuntu
cd ~
mkdir build
sudo docker run -it -v /home/ubuntu/build:/root/build --name ubuntu ubuntu

	
创建并运行容器 
 - 2.更新软件源以及安装vim 和安装sshd
 ```cpp
apt-get update
apt-get install vim
apt-get install ssh 
 /etc/init.d/ssh start
 vim ~/.bashrc
添加 /etc/init.d/ssh start

添加vim后,换源

Dockerfile

FROM ubuntu
COPY ./sources.list /etc/apt/sources.list

sources.list

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
  • 3.配置sshd
cd ~/.ssh
ssh-keygen -t rsa #一直按回车
cat id_rsa.pub >> authorized_keys

安装JDK

cd ~/.ssh
cat id_rsa.pub >> authorized_keys 
ssh localhost #测试免密登录


vim ~/.bashrc       
#在文件末尾添加以下两行,配置Java环境变量:
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
export PATH=$PATH:$JAVA_HOME/bin

source ~/.bashrc #使.bashrc生效
java -version #验证java
  • 4.保存镜像文件
docker ps
docker commit 容器id hadoop_ubuntu:jdk8
  • 5.安装Hadoop

  • 6.配置Hadoop集群

cd /usr/local/hadoop-3.1.3/etc/hadoop
vim hadoop-env.sh #把下面一行代码加入文件
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/

修改/usr/local/hadoop/etc/hadoop下的文件
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-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

<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl" ?>
<configuration>
        <property>
                <name>dfs.replication</name>
                <value>1</value>
        </property>
        <property>
                <name>dfs.namenode.name.dir</name>
  	        <value>file:/usr/local/hadoop-3.1.3/tmp/dfs/name</value>
  </property>
  <property>
                <name>dfs.datanode.data.dir</name>
                <value>file:/usr/local/hadoop-3.1.3/tmp/dfs/data</value>
  </property>
  <property>
                <name>dfs.permissions.enabled</name>
                <value>false</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.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>

yarn-site.xml:

<?xml version="1.0" ?>
<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>
        <!--虚拟内存和物理内存比,不加这个模块程序可能跑不起来-->
        <property>
               <name>yarn.nodemanager.vmem-pmem-ratio</name>
               <value>2.5</value>
        </property>
</configuration>

映射得到镜像

sudo docker commit 容器id ubuntu/hadoop

修改文件:
进入脚本文件存放目录:cd /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
  • 5.运行Hadoop集群
    保存镜像
sudo docker commit 850572f6a724 ubuntu/hadoopinstal

从三个终端分别开启三个容器运行ubuntu/hadoop镜像

# 第一个终端
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

三个终端分别打开/etc/hosts,根据各自ip修改

172.17.0.5	master
172.17.0.6      slave01
172.17.0.7      slave02

在master节点测试ssh

ssh slave01
ssh slave02
exit 退出
	


master上的worker文件内容修改为

slave01
slave02
  • 6.测试Hadoop集群
cd /usr/local/hadoop-3.1.3
bin/hdfs namenode -format # 格式化文件系统
sbin/start-dfs.sh # 开启NameNode和DataNode服务
sbin/start-yarn.sh # 开启ResourceManager和NodeManager服务
jps # 查看服务状态

执行实例程序


4)总结

救命,终于要和这次实验说再见了,每一次这门课的实验做得都呕心沥血,心力交瘁,几乎每三步出一次错,总是在崩溃边缘疯狂试探。
在拿到实验的刚开始很迷茫,后来看了同学的博客,了解了大致思路,然后按着思路,学习实验要用到的理论知识,,,通过做实验学习到了很多新知识,了解到反向代理原理、javaweb的简单部署、hadoop等。
学习知识花了2小时左右,做实验花了10小时左右吧,博客2小时。

posted @ 2020-05-17 21:43  小同学-  阅读(144)  评论(0编辑  收藏  举报