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

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

要求:
理解nginx反向代理原理;
nginx代理tomcat集群,代理2个以上tomcat;
了解nginx的负载均衡策略,并至少实现nginx的2种负载均衡策略;

理解nginx反向代理原理

正向代理:客户端想要访问一个服务器,但是它可能无法直接访问这台服务器,这时候这可找一台可以访问目标服务器的另外一台服务器,而这台服务器就被当做是代理人的角色 ,称之为代理服务器,于是客户端把请求发给代理服务器,由代理服务器获得目标服务器的数据并返回给客户端。客户端是清楚目标服务器的地址的,而目标服务器是不清楚来自客户端,它只知道来自哪个代理服务器,所以正向代理可以屏蔽或隐藏客户端的信息。
反向代理:从上面的正向代理,你会大概知道代理服务器是为客户端作代理人,它是站在客户端这边的。其实反向代理就是代理服务器为服务器作代理人,站在服务器这边,它就是对外屏蔽了服务器的信息,常用的场景就是多台服务器分布式部署,像一些大的网站,由于访问人数很多,就需要多台服务器来解决人数多的问题,这时这些服务器就由一个反向代理服务器来代理,客户端发来请求,先由反向代理服务器,然后按一定的规则分发到明确的服务器,而客户端不知道是哪台服务器。常常用nginx来作反向代理。
Nginx的负载均衡:
负载:就是Nginx接受请求
均衡:Nginx将收到的请求按照一定的规则分发到不同的服务器进行处理

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

创建如下

编写docker-compose.yml

编写nginx的默认配置文件

编写index.html分别为01/02/03

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

这里选择测试默认的轮询算法和指定权重算法
运行yml文件

sudo docker-compose up -d --build


轮询算法
可以通过浏览器访问localhost发现是可以成功访问之前设置的index.html界面,刷新界面会轮询
用以下指令可以可以看出

权重算法
更改default.conf文件

重新执行

sudo docker-compose up -d --build

测试

可以看出2>3>1

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

要求:
分别构建tomcat、数据库等镜像服务;
成功部署Javaweb程序,包含简单的数据库操作;
为上述环境添加nginx反向代理服务,实现负载均衡。

文件配置
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
  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   #子网

default.conf

upstream tomcats {
    server tomcat00:5050; 

}

server {
    listen 8080
    server_name localhost;

    location / {
        proxy_pass http://tomcat123;
        proxy_set_header   Host    $host; 
        proxy_set_header   X-Real-IP   $remote_addr; 
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;

    }
}

docker-entrypoint.sh

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

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
 
# 设置容器启动时执行的命令
#CMD ["sh", "/docker-entrypoint-initdb.d/import.sh"]

通过指令ifconfig -a查询本机IP 修改文件

启动容器

docker-compose up -d --build


访问网页,登陆

http://172.19.0.1:5050/ssmgrogshop_war

可以进行一系列数据库操作

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

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

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

环境搭建
拉取ubantu镜像

docker pull ubantu

创建dockerfile文件

FROM ubuntu
maintainer yuqiancha

进入ubantu容器

docker build -t ubuntu .
docker run -it --name ubuntu ubuntu

更新系统软件源
更新系统源命令如下:

apt-get update

安装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服务,如下命令:

ssh-keygen -t rsa #一直按回车键即可
cat id_rsa.pub >> authorized_keys

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

安装JDK
根据官方文档,最好下载java8

apt install openjdk-8-jdk

安装好后需要配置环境变量

vim ~/.bashrc  #打开配置文件
#在最后添加使~/.bashrc生效
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
export PATH=$PATH:$JAVA_HOME/bin
source ~/.bashrc  

安装Hadoop

tar -zxvf hadoop-3.2.1.tar.gz -C /usr/local
cd /usr/local/hadoop-3.2.1
./bin/hadoop version


配置Hadoop集群
进入配置文件存放目录:

cd /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
添加:

<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
添加

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

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

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

运行Hadoop集群
在三个终端上开启三个容器运行ubuntu/hadoop镜像,分别表示Hadoop集群中的master,slave01和slave02;

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

修改/etc/hosts

vim /etc/hosts

修改为

172.17.0.2      master
172.17.0.3      slave01
172.17.0.4      slave02

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

ssh slave01
ssh slave02
exit #退出


master主机上修改workers

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.2.1.jar grep /user/hadoop/input output 'dfs[a-z.]+'
bin/hdfs dfs -cat output/*

(4)实验总结

实验的工作量还是挺大的,中间也遇见了很多问题。实验还是需要去理解原理,认真细心些还是为好。也真的学到了很多东西,还是很有用的。
记录完成作业所花的时间
第一个实验还是挺轻松的,很快。
第二和第三个实验很麻烦,大概用了一晚上加一下午的时间。

posted @ 2020-05-18 16:19  Yuqiancha  阅读(209)  评论(0编辑  收藏  举报