2020年系统综合实践 第四次作业
一、使用Docker-compose实现Tomcat+Nginx负载均衡
(一)项目结构
(二)配置文件
- docker-compose.yml
version: "3"
services:
tomcat1:
image: tomcat:latest
volumes:
- ./tomcat1/:/usr/local/tomcat/webapps/ROOT/
restart: "always"
container_name: tomcat1
tomcat2:
image: tomcat:latest
volumes:
- ./tomcat2/:/usr/local/tomcat/webapps/ROOT/
container_name: tomcat2
restart: "always"
tomcat3:
image: tomcat:latest
volumes:
- ./tomcat3/:/usr/local/tomcat/webapps/ROOT/
container_name: tomcat3
restart: "always"
nginx:
image: nginx:latest
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
ports:
- "80:80"
links:
- tomcat1:t1
- tomcat2:t2
- tomcat3:t3
- nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
#include /etc/nginx/conf.d/*.conf;
upstream tomcat_client {
server tomcat1:8080 weight=1;
server tomcat2:8080 weight=1;
server tomcat3:8080 weight=1;
}
server {
server_name "";
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
location / {
proxy_pass http://tomcat_client;
proxy_redirect default;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
(三)负载均衡测试
- 轮询策略
- 修改nginx.conf文件中的upstream
- 测试结果(依次访问每一个Tomcat服务器)
- 修改nginx.conf文件中的upstream
- 权重策略
- 修改nginx.conf文件中的upstream
- 测试结果(权重大的服务器被访问的次数大于权重小的服务器)
- 修改nginx.conf文件中的upstream
二、使用Docker-compose部署javaweb运行环境
(一)文件结构
(二)配置文件
- docker-compose.yml
version: "3"
services:
nginx:
image: nginx:latest
container_name: isNginx
ports:
- "80:80"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf # 挂载配置文件
depends_on:
- tomcat1
- tomcat2
- tomcat3
tomcat1:
image: tomcat:latest
container_name: tomcat1
depends_on:
- mysql
restart: always
volumes:
- ./webapp:/usr/local/tomcat/webapps # 挂载web目录
- ./tomcat1/:/usr/local/tomcat/webapps/ROOT/
tomcat2:
image: tomcat:latest
container_name: tomcat2
depends_on:
- mysql
restart: always
volumes:
- ./webapp:/usr/local/tomcat/webapps # 挂载web目录
- ./tomcat2/:/usr/local/tomcat/webapps/ROOT/
tomcat3:
image: tomcat:latest
container_name: tomcat3
depends_on:
- mysql
restart: always
volumes:
- ./webapp:/usr/local/tomcat/webapps # 挂载web目录
- ./tomcat3/:/usr/local/tomcat/webapps/ROOT/
mysql:
build: ./mysql
container_name: ismysql
ports:
- "3306:3306"
restart: always
- MySQL_Dockerfile
FROM mysql:latest
#作者信息
MAINTAINER ISLAND
#环境变量配置
ENV MYSQL_ALLOW_EMPTY_PASSWORD no
ENV MYSQL_ROOT_PASSWORD 123456
COPY schema.sql /mysql/schema.sql
- schema.sql
-- 创建数据库,数据库名为“test"
create database `school` default character set utf8 collate utf8_general_ci;
-- 切换到上一步所建的数据库中
use school;
-- 如果存在school表,则删除
DROP TABLE IF EXISTS `student`;
-- 建表
CREATE TABLE `student`(
`id` varchar(9) NOT NULL,
`name` varchar(20) NOT NULL,
`age` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
- nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
#include /etc/nginx/conf.d/*.conf;
upstream tomcat_client {
server tomcat1:8080 weight=1;
server tomcat2:8080 weight=2;
server tomcat3:8080 weight=3;
}
server {
server_name "";
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
location / {
proxy_pass http://tomcat_client;
proxy_redirect default;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
(三)JavaWeb程序
- JavaWeb项目结构
使用JSP写了简单的对数据库的增删改查的交互,然后将WAR包放在Tomcat的webapps目录下。
在实际操作中,需要自己查看mysql容器里的IP地址,并且将IP地址写在JDBC连接语句中。或者自己手动将mysql容器的IP地址改成下列的:172.18.0.2
(四)对数据库操作测试
- 运行docker-compose,打开浏览器,输入:localhost:80/myWeb
- 增加数据
- 查询数据
- 修改数据
- 删除数据
(四)负载均衡测试(权重策略)
三、使用Docker搭建大数据集群环境
(一)环境准备
- Hadoop版本:hadoop-3.2.1
- Ubuntu版本:ubuntu:20.04
- JDK版本:JDK8
(二)Ubuntu容器初始化
- 本次实验使用阿里源
- Dockerfile
FROM ubuntu
COPY sources.list /etc/apt/sources.list
- 创建镜像
docker build -t ubuntu .
- 运行容器
docker run -it -v /home/island/build:/root/build --name ubuntu ubuntu
- 更新软件源
apt-get update
- 安装Vim和ssh
apt-get install vim
apt-get install ssh
- 开启ssh服务
/etc/init.d/ssh start
- 将自动开启ssh写入~/.bashrc
vim ~/.bashrc
末尾添加:/etc/init.d/ssh start
- 配置免密登入
ssh-keygen -t rsa
cd ~/.ssh
cat id_rsa.pub >> authorized_keys
- 安装JDK
apt install openjdk-8-jdk
- 配置环境变量
打开~./bashrc,加入以下两行
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
export PATH=$PATH:$JAVA_HOME/bin
- 保存配置好JDK的镜像
docker commit 容器ID ubuntu/jdk
(三)安装Hadoop
- 运行容器
docker run -it -v /home/island/build:/root/build --name ubuntu-jdkinstalled ubuntu/jdk
- 解压下载好的Hadoop
cd /root/build
tar -zxvf hadoop-3.2.1.tar.gz -C /usr/local
- 查看是否安装
cd /usr/hadoop-3.2.1
./bin/hadoop version
(四)配置Hadoop集群
- 配置adoop_env.sh文件
#当前目录为/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
<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>
- 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>
- 修改启动和结束脚本(如果没修改,启动hadoop时会出现用户错误)
- 进入目录:/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
- tart-yarn.sh和stop-yarn.sh加入下列内容
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
- 保存镜像
docker commit 容器ID ubuntu/hadoopinstalled
(五)启动Hadoop并且测试实例
- 启动三个节点(一个master节点,两个slave节点)
# 第一个终端
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
- 配置master,slave01和slave02的地址信息
vim /etc/hosts
- 在master节点上配置需要寻找的节点
vim /usr/local/hadoop-3.2.1/etc/hadoop/workers #将localhost改为 slave01、slave02
- 启动集群,以下操作均在hadoop安装目录下
cd /usr/local/hadoop
bin/hdfs namenode -format #第一次启动需要先格式化
sbin/start-all.sh
- 在分布式文件系统中建立input文件,并将配置文件上传
bin/hdfs dfs -mkdir -p /user/root/input
bin/hdfs dfs -put etc/hadoop/*.xml input # 将xml复制到input下,作为示例程序输入
- 运行实例
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar grep input output 'dfs[a-z.]+'
- 查看结果
bin/hdfs dfs -cat output/*
四、问题&&解决办法&&心得&&时长
问题&&解决办法
- 容器中安装软件速度过慢
换源,不过要找到和你ubuntu版本相对应的源,要不然一直会有依赖不满足。 - docker-compose启动MySQL,MySQL会一直无法进入容器
先别把脚本放进去,直接构造一个简单的容器,然后在进入这个容器里去创建数据库等等。
心得
这次感觉比前几次实验更加困难了,尤其是在部署JaveWeb,需要更多的时间才能完成。
时长
阅读资料:4h
动手实践:10h
博客编写:2h
合计:16h