(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_war
或 http://主机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
感想
这次作业量极大,但也让我学到不少新东西