系统综合实践(四)-综合实践
1.使用Docker-compose实现Tomcat+Nginx负载均衡
-
理解nginx反向代理原理
- 参考资料:nginx反向代理原理和配置讲解
- 原理:以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
-
nginx代理tomcat集群,代理2个以上tomcat;
-
参考资料
- Nginx 配置详解
- linux下Nginx反向代理多个tomcat(单独访问或集群配置)
- Docker-Compose部署nginx代理Tomcat集群 -
项目结构
-
default.conf
upstream tomcats { server cat1:8080; server cat2:8080; server cat3:8080; } server { listen 2020; server_name localhost; location / { proxy_pass http://tomcats; # 请求转向tomcats } }
- docker-compose.yml
version: "3.3" services: nginx: image: nginx container_name: ex4ngx ports: - 80:2420 volumes: - ./nginx/default.conf:/etc/nginx/conf.d/default.conf # 挂载配置文件 depends_on: - cat1 - cat2 - cat3 cat1: hostname: cat1 image: tomcat container_name: cat1 volumes: - ./webapps:/usr/local/tomcat/webapps/ROOT # 挂载web目录 cat2: hostname: cat2 image: tomcat container_name: cat2 volumes: - ./webapps:/usr/local/tomcat/webapps/ROOT # 挂载web目录 cat3: hostname: cat3 image: tomcat container_name: cat3 volumes: - ./webapps:/usr/local/tomcat/webapps/ROOT # 挂载web目录
-
-
了解nginx的负载均衡策略,并至少实现nginx的2种负载均衡策略;
-
编写py:
import requests url="http://localhost" for i in range(10): response = requests.get(url) print(response.text)
-
轮询策略:
默认就是轮询算法
-
权重策略:
修改weight后
-
1.使用Docker-compose实现Tomcat+Nginx负载均衡
-
理解nginx反向代理原理
- 参考资料:nginx反向代理原理和配置讲解
- 原理:以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
-
nginx代理tomcat集群,代理2个以上tomcat;
-
参考资料
- Nginx 配置详解
- linux下Nginx反向代理多个tomcat(单独访问或集群配置)
- Docker-Compose部署nginx代理Tomcat集群 -
项目结构
-
default.conf
upstream tomcats { server cat1:8080; server cat2:8080; server cat3:8080; } server { listen 2020; server_name localhost; location / { proxy_pass http://tomcats; # 请求转向tomcats } }
- docker-compose.yml
version: "3.3" services: nginx: image: nginx container_name: ex4ngx ports: - 80:2420 volumes: - ./nginx/default.conf:/etc/nginx/conf.d/default.conf # 挂载配置文件 depends_on: - cat1 - cat2 - cat3 cat1: hostname: cat1 image: tomcat container_name: cat1 volumes: - ./webapps:/usr/local/tomcat/webapps/ROOT # 挂载web目录 cat2: hostname: cat2 image: tomcat container_name: cat2 volumes: - ./webapps:/usr/local/tomcat/webapps/ROOT # 挂载web目录 cat3: hostname: cat3 image: tomcat container_name: cat3 volumes: - ./webapps:/usr/local/tomcat/webapps/ROOT # 挂载web目录
-
-
了解nginx的负载均衡策略,并至少实现nginx的2种负载均衡策略;
-
编写爬虫:
import requests url="http://localhost" for i in range(10): response = requests.get(url) print(response.text)
-
轮询策略:
默认就是轮询算法 -
权重策略:
修改weight后
-
二、使用Docker-compose部署javaweb运行环境
1.部署项目
这里用了老师推荐的博客里的webapp
├── docker-compose.yml
├── default.conf
├── docker-entrypoint.sh
├── grogshop.sql
├── Dockerfile
└── webapps
├── docs
├── examples
├── host-manager
├── manager
├── ROOT
├── ssmgrogshop_war
└── ssmgrogshop_war.war
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
tomcat01: #tomcat 服务
image: tomcat #镜像
hostname: hostname #容器的主机名
container_name: tomcat01 #容器名
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: mymysql
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
- tomcat01
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
ifconfig查看虚拟机ip,然后修改连接数据库的IP
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
三、使用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:
ssh-keygen -t rsa # 一直按回车即可
cd ~/.ssh
cat id_rsa.pub >> authorized_keys
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集群
hadoop-env.sh
cd /usr/local/hadoop-3.1.3/etc/hadoop #进入配置文件存放目录
vim 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. 运行
从三个终端分别开启三个容器运行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 # 查看服务状态
7.运行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