(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界面,刷新界面会轮询
用以下指令可以可以看出
sudo docker-compose up -d --build
(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
安装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
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
添加:
hadoop.tmp.dir
file:/usr/local/hadoop/tmp
Abase for other temporary directories.
fs.defaultFS
hdfs://master:9000
修改hdfs-site.xml
添加:
dfs.namenode.name.dir
file:/usr/local/hadoop/namenode_dir
dfs.datanode.data.dir
file:/usr/local/hadoop/datanode_dir
dfs.replication
3
修改mapred-site.xml
添加
mapreduce.framework.name
yarn
yarn.app.mapreduce.am.env
HADOOP_MAPRED_HOME=/usr/local/hadoop-3.2.1
mapreduce.map.env
HADOOP_MAPRED_HOME=/usr/local/hadoop-3.2.1
mapreduce.reduce.env
HADOOP_MAPRED_HOME=/usr/local/hadoop-3.2.1
修改yarn-site.xml
添加
yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.resourcemanager.hostname
master
修改脚本
进入脚本文件存放目录:
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)实验总结
实验的工作量还是挺大的,中间也遇见了很多问题。实验还是需要去理解原理,认真细心些还是为好。也真的学到了很多东西,还是很有用的。
记录完成作业所花的时间
第一个实验还是挺轻松的,很快。
第二和第三个实验很麻烦,大概用了一晚上加一下午的时间。