系统综合实践——第4次实践作业
一、使用Docker-compose实现Tomcat+Nginx负载均衡
(1)理解nginx反向代理原理
反向代理,客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址
(2)文件目录
(3)编写default.conf
upstream tomcats{
server mytomcat1:8080; #容器名(与yml对应):端口号
server mytomcat2:8080; #默认使用的是轮询访问
server mytomcat3:8080;
}
(4)在upstream模块配置完成后,要让指定的访问反向代理到服务器列表
location / {
root /usr/share/nginx/html;
index index.html index.htm;
proxy_pass http://tomcats;#访问nginx之后,会轮询访问代理的tomcat服务器
}
(5)配置docker-compose.yml文件
version: "3"
services:
nginx:
image: nginx
container_name: mynginx
ports:
- 80:1106 #改成自己的端口号
volumes:
- ./default.conf:/etc/nginx/conf.d/default.conf # 挂载配置文件
depends_on:
- tomcat1
- tomcat2
- tomcat3
tomcat1:
image: tomcat
container_name: mytomcat1
volumes:
- ./tomcat1:/usr/local/tomcat/webapps/ROOT
tomcat2:
image: tomcat
container_name: mytomcat2
volumes:
- ./tomcat2:/usr/local/tomcat/webapps/ROOT
tomcat3:
image: tomcat
container_name: mytomcat3
volumes:
- ./tomcat3:/usr/local/tomcat/webapps/ROOT
(6)查看容器
(7)负载均衡策略:轮询策略
编写python代码测试轮询策略
import requests
url='http://localhost'
for i in range(0,10):
response=requests.get(url)
print(response.text)
(8)效果如下
(9)负载均衡策略:权重策略
测试轮询策略
import requests
url='http://localhost'
count={}
for i in range(0,1000):
response=requests.get(url)
if response.text in count:
count[response.text]+=1;
else:
count[response.text]=1
print(count)
tomcat3的权重最大,所以访问次数也就最多
负载均衡策略:依据ip分配方式,在2的配置文件基础上加一句ip_hash;
所有相同客户端请求都发到相同服务器
二、使用Docker-compose部署javaweb运行环境
(1)树状目录
(2)配置default.conf
upstream tomcats { #轮询策略
server mytomcat1:8080;
server mytomcat2:8080;
}
server {
listen 2020; #nginx的监听端口
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
proxy_pass http://tomcats; #访问nginx之后,会轮询访问代理的tomcat服务器
}
(3)配置docker-compose文件(利用nginx代理两个tomcat)
#所有容器都处于同一子网下;静态ip可自由分配
version: "3"
services:
tomcat1:
image: tomcat
container_name: mytomcat1
volumes:
- ./webapps:/usr/local/tomcat/webapps
networks: #网络设置静态IP,保证在同一子网下可随意分配
webnet:
ipv4_address: 15.22.0.15
tomcat2:
image: tomcat
container_name: mytomcat2
volumes:
- ./webapps:/usr/local/tomcat/webapps
networks: #网络设置静态IP,
webnet:
ipv4_address: 15.22.0.16
mysql:
build: .
image: mysql
container_name: mysql
ports:
- "3309:3306"
command: [ #设置编码模式
'--character-set-server=utf8mb4',
'--collation-server=utf8mb4_unicode_ci'
]
environment:
MYSQL_ROOT_PASSWORD: "123456" #root密码
networks:
webnet:
ipv4_address: 15.22.0.6
nginx:
image: nginx
container_name: mynginx
ports:
- 80:1106 #自己的端口号
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 #子网
(4)javaweb
依靠老师的参考项目,用ifconfig查ip之后修改jdbc.properties中的IP地址和映射端口,然后通过浏览器访问localhost/ssmgrogshop_war/,登录后进行数据库操作
三、使用Docker搭建大数据集群环境
(1)pull Ubuntu镜像
docker pull ubuntu
cd ~
mkdir build
sudo docker run -it -v /home/monster/build:/root/build --name ubuntu ubunt
(2)Ubuntu容器的初始化
cat<<EOF>/etc/apt/sources.list #覆盖掉原先内容,注意左边只有一个>,<<EOF>是覆盖;<<EOF>>则变成追加;截图等我下次改
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
EOF
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服务
(3)配置ssh
ssh-keygen -t rsa # 一直按回车即可
cd ~/.ssh
cat id_rsa.pub >> authorized_keys
(4)安装JDK,这里使用JDK8版本(java -version查看)
apt-get install openjdk-8-jdk
vim ~/.bashrc # 在文件末尾添加以下两行,配置Java环境变量:
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
export PATH=$PATH:$JAVA_HOME/bin
source ~/.bashrc # 使.bashrc生效
(5)docker commit从容器去创建一个镜像
#另开一个终端
sudo docker commit 容器id ubuntu:jdk8 #讲其保存说明是jkd8版本的ubuntu
sudo docker run -it -v /home/monster/build:/root/build --name ubuntu-jdk8 ubuntu:jdk8
#开启保存的那份镜像ubuntu:jdk8
(6)安装hadoop(hadoop version看版本号)
cd /root/build
tar -zxvf hadoop-3.1.3.tar.gz -C /usr/local #将hadoop压缩包放入本地build文件夹中,这里使用大数据实验中的3.1.3版本
cd /usr/local/hadoop-3.1.3
./bin/hadoop version # 验证安装
(7)配置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
vim core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop-3.1.3/tmp</value>
<description>A base for other temporary derectories.</description>
</property>
</configuration>
hdfs-site.xml
vim hdfs-site.xml
<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.namenode.data.dir</name>
<value>file:/usr/local/hadoop-3.1.3/tmp/dfs/data</value>
</property>
</configuration>
mapred-site.xml
vim mapred-site.xml
<configuration>
<property>
<!--使用yarn运行MapReduce程序-->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<!--jobhistory地址host:port-->
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<property>
<!--jobhistory的web地址host:port-->
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
<property>
<!--指定MR应用程序的类路径-->
<name>mapreduce.application.classpath</name>
<value>/usr/local/hadoop-3.1.3/share/hadoop/mapreduce/lib/*,/usr/local/hadoop-3.1.3/share/hadoop/mapreduce/*</value>
</property>
</configuration>
yarn-site.xml
vim yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>2.5</value>
</property>
</configuration>
对于start-dfs.sh和stop-dfs.sh文件,添加下列参数
cd /usr/local/hadoop-3.1.3/sbin
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
(9)运行Hadoop集群
保存镜像
sudo 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修改
在master节点上测试ssh,连接到两个slave节点
修改master上workers文件;将localhost修改为如下所示
vim /usr/local/hadoop-3.1.3/etc/hadoop/workers
slave01
slave02
(10)测试Hadoop集群
cd /usr/local/hadoop-3.1.3
bin/hdfs namenode -format #首次启动Hadoop需要格式化
sbin/start-all.sh #启动所有服务
查看jps
建立HDFS文件夹
bin/hdfs dfs -mkdir /user
bin/hdfs dfs -mkdir /user/root #注意input文件夹是在root目录下
bin/hdfs dfs -mkdir input
vim一个样例并上传到input,然后用MapReduce中的wordcount算样例里面的字符串数
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结果
停止服务
问题反馈
最大的问题就是因为hadoop格式化没有成功使得jps的时候namenode显示不出来,原因是因为hdfs-site.xml文件没有配置好就开始运行(文件太多容易漏掉)。
四、实验总结
这次实验耗时巨大,难度超过之前,个人原因做了两天左右,速度较慢,有待加强,但是受益匪浅。