一、使用Docker-compose实现Tomcat+Nginx负载均衡
参考资料:
nginx反向代理原理和配置讲解
Nginx 配置详解
Nginx服务器之负载均衡策略
1. 理解nginx反向代理原理
反向代理方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
多个客户端给服务器发送的请求,nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。此时请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,nginx扮演的就是一个反向代理角色。反向代理,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。
举例示意图:
2.nginx代理tomcat集群,代理2个以上tomcat
项目结构:
default.conf:
upstream tomcats {
server tomcat01:8080;
server tomcat02:8080;
server tomcat03:8080;
}
server {
listen 8045;
server_name localhost;
location / {
proxy_pass http://tomcats; # 请求转向tomcats
}
}
docker-compose.yml:
version: "3"
services:
nginx:
image: nginx
container_name: wrqnginx
ports:
- 80:8045
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
在index.thml里分别写入:
this is tomcat1!
this is tomcat2!
this is tomcat3!
启动docker-compose:
查看容器:
访问localhost:
3.了解nginx的负载均衡策略,并至少实现nginx的2种负载均衡策略
编写爬虫:
import requests
url="http://127.0.0.1"
for i in range(0,10):
reponse=requests.get(url)
print(reponse.text)
(1)轮询策略
最基本的配置方法,上面的例子就是轮询的方式,它是upstream模块默认的负载均衡默认策略。每个请求会按时间顺序逐一分配到不同的后端服务器。
可以看出三个服务器出现的频率一样:
(2)权重策略
权重方式,在轮询策略的基础上指定轮询的几率,weight的数值与访问比率成正比。权重越高分配到需要处理的请求越多。此策略可以与least_conn和ip_hash结合使用。此策略比较适合服务器的硬件配置差别比较大的情况。
修改default.conf:
upstream tomcats {
server tomcat01:8080; #默认weight=1
server tomcat02:8080 weight=2;
server tomcat03:8080 weight=3;
}
server {
listen 8085;
server_name localhost;
location / {
proxy_pass http://tomcats; # 请求转向tomcats
}
}
重启容器。可看出权重越大出现次数越多:
二、使用Docker-compose部署javaweb运行环境
1.部署项目
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
tomcat11: #tomcat 服务
image: tomcat #镜像
hostname: hostname #容器的主机名
container_name: tomcat11 #容器名
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: mymysql:test
container_name: test4mysql
ports:
- "3309: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: "nginx-tomcat"
ports:
- 8080:8080
volumes:
- ./default.conf:/etc/nginx/conf.d/default.conf # 挂载配置文件
tty: true
stdin_open: true
depends_on:
- tomcat00
- tomcat11
networks:
webnet:
ipv4_address: 15.22.0.7
networks: #网络设置
webnet:
driver: bridge #网桥模式
ipam:
config:
-
subnet: 15.22.0.0/24 #子网
default.conf:
upstream tomcat123 {
server tomcat00:8080;
server tomcat11:8080;
}
server {
listen 8080;
server_name localhost;
location / {
proxy_pass http://tomcat123;
}
}
docker-entrypoint.sh:
#!/bin/bash
mysql -uroot -p123456 << EOF # << 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"]
2.修改连接数据库的IP
Javaweb太菜了没学会,最后还是用了老师的。
ifconfig查看虚拟机ip,然后修改连接数据库的IP。
cd /test4.2/lzz/webapps/ssmgrogshop_war/WEB-INF/classes
vim jdbc.properties
3.启动容器
docker-compose up -d
4.浏览器访问前端页面
http://127.0.0.1:8080/ssmgrogshop_war或http://主机ip地址:8080/ssmgrogshop_war
5.nginx代理之后,主机访问localhost/ssmgrogshop_war/
账户sa 密码123登陆。
测试两个tomcat服务器负载均衡。
http://主机ip地址:5050/ssmgrogshop_war
http://主机ip地址:5055/ssmgrogshop_war
6.在前端页面进行数据库进行各种操作
删除102、修改101、增加100后:
搜索:
三、使用Docker搭建大数据集群环境
参考材料:
Hadoop 参考文档
使用Docker搭建Hadoop分布式集群
1.配置
树形结构
在个人文件下创建一个目录,用于向Docker内部的Ubuntu系统传输文件。创建并运行容器。
├── Dockerfile
├── build
│ └── hadoop-3.1.3.tar.gz
└── sources.list
Dockerfile:
#Base images 基础镜像
FROM ubuntu:18.04
#MAINTAINER 维护者信息
MAINTAINER wrq
COPY ./sources.list /etc/apt/sources.list
source.list:
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# 预发布软件源,不建议启用
# deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
创建并运行容器:
docker build -t ubuntu:18.04 .
docker run -it --name ubuntu ubuntu:18.04
2. 容器初始化
安装必要工具:
apt-get update
apt-get install vim # 安装vim软件
apt-get install ssh # 安装sshd,因为在开启分布式Hadoop时,需要用到ssh连接slave:
/etc/init.d/ssh start # 运行脚本即可开启sshd服务器
vim ~/.bashrc
/etc/init.d/ssh start # 在该文件中最后一行添加如下内容,实现进入Ubuntu系统时,都能自动启动sshd服务
配置ssh:
cd ~/.ssh #不存在~/.ssh目录可先执行第二步
ssh-keygen -t rsa # 一直按回车即可
cat id_rsa.pub >> authorized_keys #这一步要在~/.ssh目录下进行
3. 安装JDK
因为Hadoop有用到Java,因此还需要安装JDK。
JDK用了jdk1.8。
apt-get install openjdk-8-jdk
4. 安装hadoop
把下载好的hadoop-3.1.3.tar.gz放在挂载的目录下并安装。
docker cp ./build/hadoop-3.1.3.tar.gz 容器ID:/root/hadoop-3.1.3.tar.gz
cd /root
tar -zxvf hadoop-3.1.3.tar.gz -C /usr/local
配置环境:
vim ~/.bashrc # 在文件末尾添加以下五行,配置Java、hadoop环境变量:
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
export PATH=$PATH:$JAVA_HOME/bin
export HADOOP_HOME=/usr/local/hadoop-3.1.3
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$JAVA_HOME/bin
使配置环境生效:
source ~/.bashrc # 使.bashrc生效
验证是否安装完成:
java -version
hadoop version
5. 置Hadoop集群
cd /usr/local/hadoop-3.1.3/etc/hadoop
hadoop-env.sh:
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/ # 在任意位置添加
core-site.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl" ?>
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop-3.1.3/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:
<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl" ?>
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop-3.1.3/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop-3.1.3/tmp/dfs/data</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
</configuration>
mapred-site.xml:
<?xml version="1.0" ?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl" ?>
<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>
yarn-site.xml:
<?xml version="1.0" ?>
<configuration>
<!-- Site specific YARN configuration properties -->
<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>
进入脚本目录。
cd /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
6. 构建镜像
docker commit 容器ID ubuntu/hadoop
7. 利用构建好的镜像运行主机
从三个终端分别开启三个容器运行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修改为如下形式:
172.17.0.4 master
172.17.0.5 slave01
172.17.0.6 slave02
在master结点测试ssh;连接到slave结点:
ssh slave01
ssh slave02
exit 退出
master主机上修改workers:
vim /usr/local/hadoop-3.1.3/etc/hadoop/workers
slave01
slave02
在master上测试hadoop集群:
cd /usr/local/hadoop-3.1.3
bin/hdfs namenode -format # 格式化文件系统
sbin/start-dfs.sh # 开启NameNode和DataNode服务
sbin/start-yarn.sh # 开启ResourceManager和NodeManager服务
jps # 查看服务状态
8.运行hadoop示例程序
在master上建立HDFS文件夹:
bin/hdfs dfs -mkdir /user
bin/hdfs dfs -mkdir /user/root #注意input文件夹是在root目录下
bin/hdfs dfs -mkdir input
在master终端上vim一个测试样例,并将其上传到input文件夹;注意test文件的路径:
bin/hdfs dfs -put ~/test.txt input
bin/hadoop jar /usr/local/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount input output
cat查看output文件夹结果显示:
./bin/hdfs dfs -cat output/*
停止所有服务:
sbin/stop-all.sh
四、问题总结
1.测试ssh的时候出现链接超时。
检查后发现是因为IP配置写错了。
2.配置ssh时提示无法打开ssh。
执行ssh-keygen -t rsa,再尝试打开就可以了。
3.格式化时报错。
原因是core-site.xml格式输入不正确,开头两行打错了。找错找了好久。
4.测试hadoop集群的时候,jps后只有master启动了节点,slave01和slave02都没有改变。看到百度说可能是多次格式化导致ID不一致,按这个问题方法去改完以后还是不行。尝试在slave上启动看报错发现是配置文件youwent,因为之前配置文件有问题,而在master上有改过slave没有。把配置文件改正以后,删掉tmp,停止运行的节点,重启开启,再次jps看的时候就可以了。
五、小结
实验一大概用了四个小时,实验二大概六个小时,实验三大概六个多小时,写博客一个小时。做得最久的一次实验了,大部分时间都花在看资料和查错。按着教程一步步做,没有大的问题,但是小的问题不断,一样的步骤总能做出各种问题,特别是写配置的小错误找起来最为窒息。
花了很多时间也学了很多东西。本次实验学了反向代理、负载均衡、用Docker-compose部署javaweb运行环境、用Docker搭建大数据集群环境。也有很多收获,比如实验三,对比之前大数据实验搭建hadoop完全分布式配置开了三台虚拟机,我的脆皮笔记本卡到鼠标都不会动,这次用Docker搭建大数据集群环境就只要一台虚拟机并且完全不会卡。对于Javaweb,本来想自己做,但是没有接触过然后时间又比较紧,最后还是屈服了用了老师的,感觉自己还是太菜了。