通过前面几次的实验,大家已经基本熟悉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
以上命令意思如下:
- docker ps查看当前运行的容器信息,目前只运行一个ubuntu容器;
- docker commit保存fd1fc69d75a3(容器id)容器为一个新的镜像,镜像名称为ubuntu/jdk
- 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
hadoop.tmp.dir
file:/usr/local/hadoop-3.1.3/tmp
Abase for other temporary directories.
fs.defaultFS
hdfs://master:9000
然后再打开hdfs-site.xml输入以下内容:
dfs.namenode.name.dir
file:/usr/local/hadoop-3.1.3/namenode_dir
dfs.datanode.data.dir
file:/usr/local/hadoop-3.1.3/datanode_dir
dfs.replication
3
接下来修改mapred-site.xml(复制mapred-site.xml.template,再修改文件名),输入以下内容:
mapreduce.framework.name
yarn
mapreduce.jobhistory.address
master:10020
mapreduce.jobhistory.webapp.address
master:19888
mapreduce.application.classpath
/usr/local/hadoop-3.1.3/share/hadoop/mapreduce/lib/*,/usr/local/hadoop-3.1.3/share/hadoop/mapreduce/*
最后修改yarn-site.xml文件,输入以下内容:
yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.resourcemanager.hostname
master
yarn.nodename.vmem-pmem-ratio
2.7
修改脚本
进入脚本文件存放目录:
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里换版本,其他的在大佬们和大佬们博客的指点下还是能够完成的。