2020系统综合实践 第4次实践作业
使用Docker-compose实现Tomcat+Nginx负载均衡
理解Nginx反向代理原理
代理:简单来说就是自己不想直接去做某件事,这时候就找另外一个人帮我们做。
正向代理:正向代理服务器位于客户端和服务器之间,为了向服务器获取数据,客户端要向代理服务器发送一个请求,并指定目标服务器,代理服务器将目标服务器返回的数据转交给客户端。这里客户端是要进行一些正向代理的设置的。
反向代理:反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。
Nginx代理tomcat集群,代理2个以上tomcat
文件结构
docker-compose.yml
version: "3"
services:
nginx:
image: nginx
container_name: zxhngx
ports:
- 80:2525
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf # 挂载配置文件
depends_on:
- tomcat01
- tomcat02
- tomcat03
tomcat01:
image: tomcat
container_name: tc1
volumes:
- ./tomcat1:/usr/local/tomcat/webapps/ROOT # 挂载web目录
tomcat02:
image: tomcat
container_name: tc2
volumes:
- ./tomcat2:/usr/local/tomcat/webapps/ROOT
tomcat03:
image: tomcat
container_name: tc3
volumes:
- ./tomcat3:/usr/local/tomcat/webapps/ROOT
nginx/default.conf
upstream tomcats {
server tc1:8080; # 主机名:端口号
server tc2:8080; # tomcat默认端口号8080
server tc3:8080; # 默认使用轮询策略
}
server {
listen 2525;
server_name localhost;
location / {
proxy_pass http://tomcats; # 请求转向tomcats
}
}
test.py
import requests
import re
url = 'http://localhost'
for i in range(0,20):
response = requests.get(url)
text = response.text
print(text)
验证默认的轮询
验证权重策略
修改default.conf为权重策略(需要重启动容器)
upstream tomcats {
server tc1:8080 weight=3; # 主机名:端口号
server tc2:8080 weight=2; # tomcat默认端口号8080
server tc3:8080 weight=1; # 修改为权重策略
}
server {
listen 2525;
server_name localhost;
location / {
proxy_pass http://tomcats; # 请求转向tomcats
}
}
使用Docker-compose部署javaweb运行环境
主要文件
default.conf
upstream tomcats {
server mytomcat1:8080;
server mytomcat2:8080;
}
server {
listen 2020;
server_name localhost;
location / {
proxy_pass http://tomcats;
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-compose.yml
version: "3"
services:
tomcat1:
image: tomcat
container_name: mytomcat1
volumes:
- ./webapps:/usr/local/tomcat/webapps
ports:
- 5050:8080
networks:
webnet:
ipv4_address: 15.22.0.15
tomcat2:
image: tomcat
container_name: mytomcat2
volumes:
- ./webapps:/usr/local/tomcat/webapps
ports:
- 5051:8080
networks:
webnet:
ipv4_address: 15.22.0.16
mysql:
build: .
image: mysql
container_name: mysql
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
container_name: mynginx
ports:
- 80:2020
volumes:
- ./default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- tomcat1
- tomcat2
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
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"]
使用老师给的教程替换ip
// webapps/ssmgrogshop_war/WEB-INF/classes/jdbc.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://172.18.0.1:3306/grogshop?useUnicode=true&characterEncoding=utf-8
username=root
password=123456
登录酒店管理系统
访问http://localhost/ssmgrogshop_war
通过nginx的反向代理和轮询策略不用直接访问tomcat暴露的端口。
进行删除操作
使用Docker搭建大数据集群环境
拉取 ubuntu 镜像
输入docker pull ubuntu
来拉取ubuntu镜像
运行 ubuntu 容器
执行指令docker run -it -v ~/:/root/build --name ubuntu ubuntu
更新系统软件源
输入apt-get update
,对系统软件源进行更新
安装 vim
vim用以对文本文件进行编辑,输入apt-get install vim
进行安装
安装和配置 sshd
输入apt-get install ssh
进行安装 ssh
并且输入vim ~/.bashrc
对文件进行编辑,在文件最后一行插入以下内容,以便可以自动启动sshd服务:
/etc/init.d/ssh start
输入ssh-keygen -t rsa
获取密钥,运行过程中一直回车即可
接着输入cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
将密钥导入文件,然后就可以无密码访问本地sshd服务了
安装 JDK
把hadoop的安装包放在~/目录下,然后执行以下代码安装hadoop:
安装 hadoop
cd /root/build
tar -zxvf hadoop-3.1.3.tar.gz -C /usr/local
输入vim ~/.bashrc
,把以下内容加到文件末尾,以编辑环境变量:
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生效
在目录/usr/local/hadoop-3.1.3/etc/hadoop
下,更改hadoop-env.sh文件,在其中新增export JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"
检查是否安装成功
java -version
cd /usr/local/hadoop-3.1.3
./bin/hadoop version
配置文件编写
-
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
<configuration> <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> </configuration>
-
mapred-site.xml
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
-
yarn-site.xml
<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> </configuration>
-
保存镜像
-
查看 ip 并复制填写,测试连通
172.17.0.3 master
172.17.0.4 slave01
172.17.0.5 slave02
-
配置workers文件
hadoop集群配置的最后一步,就是在master目录
/usr/local/hadoop-3.1.3/etc/hadoop/
中输入vim workers
编辑workers文件
将其中的localhost替换为slave01 slave02
运行实例grep
-
在 hdfs 上创建一个目录
输入
./bin/hdfs dfs -mkdir -p /user/hadoop/input
-
拷贝文件
dfs -put ./etc/hadoop/*.xml /user/hadoop/input
-
验证结果
dfs -ls /user/hadoop/input
-
执行程序
输入`./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep /user/hadoop/input output 'dfs[a-z.]+'