|
1、描述Tomcat的架构;
Tomcat组件,分为4类:
- 顶层类组件:包括元素和元素,它们位于整个配置文件的顶层;
- 连接器类组件:为元素,代表介于客户端与服务器端之间的通信接口,负责将客户端的请求发送给服务器端,并将服务器的响应结果返回给客户端;
- 容器类组件:代表处理客户端请求并生成响应结果的组件,共有四类,分别为、、和元素。Engine组件为特定的Service组件处理所有客户端请求,Host组件为特定的虚拟主机处理所有的客户端请求,Context组件为特定的Web应用处理所有的客户端请求。Cluster组件负责为Tomcat集群系统进行会话复制、Context组件的属性的复制,以及集群范围内WAR文件的发布。
- 嵌套类组件:代表可以被嵌入到容器中的组件,如元素和元素等。
Tomcat元素:
- 元素:代表整个Servlet容器组件,是Tomcat的顶级元素。在元素中可包含一个或多个元素;
- 元素:包含一个元素,以及一个或多个元素,这些元素共享同一个元素;
- 元素:代表和客户端实际交互的组件,负责接收客户端请求,以及向客户端返回响应结果;
- 元素:每个元素只能包含一个元素。元素处理在同一个中所有元素接收到的客户端请求;
- 元素:在一个元素中可以包含多个元素。每个元素定义了一个虚拟主机,它可以包含一个或多个Web应用;
- 元素:每个元素代表了运行在虚拟主机上的单个Web应用。在一个元素中可以包含多个元素。
2、详细解释Tomcat的配置文件及配置文件中的参数所代表的含义;
server.xml
web.xml基于Java Servlet规范,可被用于每一个Java servlet容器,通常有两个存放位置,$CATALINA_BASE/conf和每个Web应用程序(通常是WEB-INF/web.xml)。Tomcat在deploy一个应用程序时(包括重启或重新载入),它首先读取conf/web.xml,而后读取WEB-INF/web.xml。
tomcat-user.xml用于实现对Tomcat资源的访问控制,如manager-gui,admin-gui。
3、配置Apache通过mod_proxy模块与Tomcat连接的详细过程;
配置:
apache主机:
hostname: node4.magedu.com
ip:192.168.71.130
tomcat主机:
hostname: node3.magedu.com
ip:192.168.71.133前提:
apache主机:
# httpd -M | grep proxy
proxy_module (shared)
proxy_ajp_module (shared)
proxy_balancer_module (shared)
proxy_http_module (shared)apache与tomcat的http连接器进行整合:
禁用中心主机
vim /etc/httpd/conf/httpd.conf
#DocumentRoot "/var/www/html"//-->注释掉该项创建虚拟主机
vim /etc/httpd/conf.d/proxy_mod.http.conf
ServerName node3.magedu.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
Require all granted
ProxyPass / http://192.168.71.133:8080/
ProxyPa***everse / http://192.168.71.133:8080/
Require all granted
apache与tomcat的ajp连接器进行整合:
vim /etc/httpd/conf.d/proxy_mod.ajp.conf
ServerName node3.magedu.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
Require all granted
ProxyPass / http://192.168.71.133:8009/
ProxyPa***everse / http://192.168.71.133:8009/
Require all granted
相关指令详解:
ProxyPreserveHost {On|Off}:如果启用此功能,代理会将用户请求报文中的Host:行发送给后端的服务器,而不再使用ProxyPass指定的服务器地址。如果想在反向代理中支持虚拟主机,则需要开启此项,否则就无需打开此功能。
ProxyVia {On|Off|Full|Block}:用于控制在http首部是否使用Via:,主要用于在多级代理中控制代理请求的流向。默认为Off,即不启用此功能;On表示每个请求和响应报文均添加Via:;Full表示每个Via:行都会添加当前apache服务器的版本号信息;Block表示每个代理请求报文中的Via:都会被移除。
ProxyRequests {On|Off}:是否开启apache正向代理的功能;启用此项时为了代理http协议必须启用mod_proxy_http模块。同时,如果为apache设置了ProxyPass,则必须将ProxyRequests设置为Off。
ProxyPass [path] !|url [key=value key=value ...]]:将后端服务器某URL与当前服务器的某虚拟路径关联起来作为提供服务的路径,path为当前服务器上的某虚拟路径,url为后端服务器上某URL路径。使用此指令时必须将ProxyRequests的值设置为Off。需要注意的是,如果path以“/”结尾,则对应的url也必须以“/”结尾,反之亦然。
另外,mod_proxy模块在httpd 2.1的版本之后支持与后端服务器的连接池功能,连接在按需创建在可以保存至连接池中以备进一步使用。连接池大小或其它设定可以通过在ProxyPass中使用key=value的方式定义。常用的key如下所示:
◇ min:连接池的最小容量,此值与实际连接个数无关,仅表示连接池最小要初始化的空间大小。
◇ max:连接池的最大容量,每个MPM都有自己独立的容量;都值与MPM本身有关,如Prefork的总是为1,而其它的则取决于ThreadsPerChild指令的值。
◇ loadfactor:用于负载均衡集群配置中,定义对应后端服务器的权重,取值范围为1-100。
◇ retry:当apache将请求发送至后端服务器得到错误响应时等待多长时间以后再重试。单位是秒钟。
4、配置基于mod_jk的负载均衡;
配置
apache主机:
node4.magedu.com 192.168.71.130
TomcatA主机:
node3.magedu.com 192.168.71.133
TomcatB主机:
node5.magedu.com 192.168.71.128前提:编译mod_jk时需用到apxs,所以预先安装httpd-devel,之后编译安装mod_jk。
apache主机:
# yum install -y httpd-devel
# whereis apxs
/usr/bin/apxs
# tar xf tomcat-connectors-1.2.40-src.tar.gz
# cd tomcat-connectors-1.2.40-src/native/
# ./configure --with-apxs=/usr/bin/apxs
# make && make install
TomcatA主机:
# vim server.xml
TomcatB主机:
# vim server.xml
配置基于mod_jk的负载均衡
# vim /etc/httpd/conf.d/http-jk.conf
LoadModule jk_module modules/mod_jk.so
JkWorkersFile /etc/httpd/conf.d/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel debug
JkMount */ lbcluster1
JkMount /status/ stat1
# vim /etc/httpd/conf.d/workers.properties
worker.list=lbcluster1,stat1
worker.TomcatA.type=ajp13
worker.TomcatA.host=192.168.71.133
worker.TomcatA.port=8009
worker.TomcatA.lbfactor=1
worker.TomcatB.type=ajp13
worker.TomcatB.host=192.168.71.128
worker.TomcatB.port=8009
worker.TomcatB.lbfactor=1
worker.lbcluster1.type=lb
worker.lbcluster1.sticky_session=0
worker.lbcluster1.balance_workers=TomcatA,TomcatB
worker.stat1.type=status启动服务,进行测试成功!
5、配置Tomcat集群,能够实现用户的session会话保持。
为node3和node5节点配置使用deltamanager:
将以下内容复制到server.xml中的Host组件中,主要修改的处为Receiver的address,若主机配置有多个ip,在默认auto情况下会报错,最好将其修改为服务监听的ip。
6、请描述本地文件系统和分布式文件系统的特点;
文件系统是一套实现了数据的存储、分级组织、访问和获取等操作的抽象数据类型(Abstract data type)(From Wikipedia)。
现在的文件系统多种多样,不管是接口、架构、部署都有巨大差异,本文试图总结一下本地文件系统和分布式文件系统
以及它们的特点和技术点。
本地文件系统
本地文件系统主要是指Ext2,Ext3,Btrfs,XFS这类(很难概括,只好举例子),它们通常提供以下功能:
扩展性:随着系统容量的增加保持性能,不随容量变化而导致性能震荡。比如一个目录下的海量文件,在EXT2/3中由于目录设计问题会导致较大的性能问题。再比如EXT2/3中的Metadata的占用和inode的划分可能会导致空间的浪费。
数据一致性
Checksum: Checksum与对应的数据块分开放置,避免silent corruption
COW事务: COW事务参考文件系统特性 – COW事务
Log: Log被一些文件系统用作WAL模式来加快写操作,并且保证写操作的原子性
多设备管理:传统上Linux往往使用LVM进行多设备的管理,现代文件系统往往增加对多设备的支持。如ZFS和Btrfs会有存储池模型对应LVM的逻辑卷组,文件系统会对底层的多设备进行并行的访问。
快照和克隆:采用COW事务模型的文件系统通常具有这个特性
软件RAID支持:现代文件系统通过对多设备的管理可以很好的支持软件RAID,如Btrfs对Metadata进行RAID1的默认保护
针对SSD的优化: 除了SSD对于随机读这一特性的优化外,还有对SSD擦除操作的优化。另外,SSD在使用容量接近100%时会导致极差的写入性能,文件系统也可以对SSD的分配策略和重平衡进行一定的优化。
压缩和加密: 现在的IO速度远远跟不上CPU的发展,因此对磁盘文件进行压缩读写是个很好的选择,现代文件系统往往支持多种压缩格式,而且可以支持整个文件系统的加密或者某个文件和目录的加密
去重: 文件系统系统去重是个大话题,主要是计算块的checksum方法或者客户端计算文件的hash来决定是否是一个新文件。具体参考Deduplication。
分布式文件系统
分布式文件系统的架构和实现有非常大的差异,如NFS这种传统的基于存储服务器的网络文件系统,基于SAN的GPFS,然后现在的集群式架构,比如HDFS这种有中心的分布式,如GlusterFS这种无中心分布式,再如Ceph这种部分在内核态部分在用户态等等。
NFS
GPFS
HDFS
GlusterFS
由于架构上的差异和本身文件系统的设计目标,通常分布式文件系统可以根据接口类型分成块存储、对象存储和文件存储。如Ceph具备块存储(Experiment)、文件存储和对象存储的能力,GlusterFS支持对象存储和文件存储的能力。而MogileFS只能作为对象存储并且通过key来访问。
扩展能力: 毫无疑问,扩展能力是一个分布式文件系统最重要的特点。分布式文件系统中元数据管理一般是扩展的重要问题,GFS采用元数据中心化管理,然后通过Client暂存数据分布来减小元数据的访问压力。GlusterFS采用无中心化管理,在客户端采用一定的算法来对数据进行定位和获取。
高可用性: 在分布式文件系统中,高可用性包含两层,一是整个文件系统的可用性,二是数据的完整和一致性。整个文件系统的可用性是分布式系统的设计问题,类似于NOSQL集群的设计,比如有中心分布式系统的Master服务器,网络分区等等。数据完整性则通过文件的镜像和文件自动修复等手段来解决,另外,部分文件系统如GlusterFS可以依赖底层的本地文件系统提供一定支持。
协议和接口: 分布式文件系统提供给应用的接口多种多样,Http RestFul接口、NFS接口、Ftp等等POSIX标准协议,另外通常会有自己的专用接口。
弹性存储: 可以根据业务需要灵活地增加或缩减数据存储以及增删存储池中的资源,而不需要中断系统运行。弹性存储的最大挑战是减小或增加资源时的数据震荡问题。
压缩、加密、去重、缓存和存储配额: 这些功能的提供往往考验一个分布式文件系统是否具有可扩展性,一个分布式文件系统如果能方便的进行功能的添加而不影响总体的性能,那么这个文件系统就是良好的设计。这点GlusterFS就做的非常好,它利用类似GNU/Hurd的堆栈式设计,可以让额外的此类功能模块非常方便的增加
7、总结常用的分布式文件系统的应用场景及常规的维护方式;名称 适用场景
MogileFS 适用于处理海量小文件
Ceph PB级的分布式文件系统
MooseFS 适用于处理海量小文件
Taobao Filesystem 适用于处理海量小文件
GlusterFS 适于用处理单个大文件
Google Filesystem 适用于处理单个大文件
Hadoop Distributed Filesystem 适用于处理单个大文件8、从理论原理到实战案例来阐述MogileFS体系;
Tacker’s Database(数据库)
数据库保存了Mogilefs的所有元数据,你可以单独拿数据库服务器来做,也可以跟其他程序跑在一起,数据库 部分非常重要,类似邮件系统的认证中心那么重要,如果这儿挂了,那么整个Mogilefs将处于不可用状态。因此最好是HA结构。
Storage nodes(存储节点)
mogstored 程序的启动将使本机成为一个存储节点。启动时默认去读/etc/mogilefs/mogstored.conf 。mogstored启动后,便可以通过mogadm增加这台机器到cluster中。一台机器可以只运行一个mogstored作为存储节点即可,也可以同时运行其他程序。
Trackers(跟踪器)
mogilefsd即 trackers程序,类似mogilefs的wiki上介绍的,trackers做了很多工作,Replication ,Deletion,Query,Reaper,Monitor等等。mogadm,mogtool的所有操作都要跟trackers打交 道,Client的一些操作也需要定义好trackers,因此最好同时运行多个trackers来做负载均衡。trackers也可以只运行在一台机器 上,也可以跟其他程序运行在一起,只要你配置好他的配置文件即可,默认在/etc/mogilefs/mogilefsd.conf。
工具
主要就是mogadm,mogtool这两个工具了,用来在命令行下控制整个mogilefs系统以及查看状态等等。
Client
Client实际上是一个Perl的pm,可以写程序调用该pm来使用mogilefs系统,对整个系统进行读写操作。
原理:
每次文件的上传和读取,都经过前端Trackers服务器,trackers服务器收到client端的请求,查询数据库,返回一个上传或者是读取的可用的后端StorageNode的地址,然后由client端直接操作后端StorageNode服务器。upload操作返回就是成功或者失败的结果,read操作就是返回对应的查询数据。
环境:
Tracker + Tracker database:192.168.0.21
Mogstored node1:192.168.0.22
Mogstored node2:192.168.0.23#### 安装包
~]# ls mogilefs
MogileFS-Server-2.46-2.el6.noarch.rpm Perlbal-doc-1.78-1.el6.noarch.rpm
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm perl-MogileFS-Client-1.14-1.el6.noarch.rpm
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm perl-Net-Netmask-1.9015-8.el6.noarch.rpm
MogileFS-Utils-2.19-1.el6.noarch.rpm perl-Perlbal-1.78-1.el6.noarch.rpm
Perlbal-1.78-1.el6.noarch.rpm
### 在tracker和mogstored节点上安装需要的包
~]# cd mogilefs
~]# yum install * -y
### 在tracker节点上安装mysql
~]# yum install mysql-server -y
~]# vim /etc/my.cnf
[mysqld]
...
innodb_file_per_table=ON
sskip_name_resolve
~]# /etc/init.d/mysql start
mysql> CREATE DATABASE mogdb charset utf8;
mysql> grant all on mogdb.* to 'moguser'@'192.168.0.%' identified by 'mogpass';
mysql> flush privileges;
### 初始化mogdb库
~]# mogdbsetup --dbname=mogdb --dbuser=moguser --dbpass=mogpass
This will attempt to setup or upgrade your MogileFS database.
It won't destroy existing data.
Run with --help for more information. Run with --yes to shut up these prompts.
Continue? [N/y]: y
Create/Upgrade database name 'mogdb'? [Y/n]: y
Grant all privileges to user 'moguser', connecting from anywhere, to the mogilefs database 'mogdb'? [Y/n]: y
### 修改配置文件
~]# vim /etc/mogilefs/mogilefsd.conf
db_dsn = DBI:mysql:mogdb:host=192.168.0.61
db_user = moguser
db_pass = mogpass
listen = 0.0.0.0:7001
### 启动tracker###
~]# /etc/init.d/mogilefsd start
### 在mogstored节点1创建数据挂载点
mkdir -p /data/mogstored/DEV{1,2}
chown -R mogilefs.mogilefs /data/mogstored/
### 在mogstored节点2创建数据挂载点
mkdir -p /data/mogstored/DEV{3,4}
chown -R mogilefs.mogilefs /data/mogstored/
### 修改mogstored配置文件
vim /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /data/mogstored #修改数据文件目录为实际路径
### 启动mogstored服务
/etc/init.d/mogstored start
### 在tracker上创建host
~]# mogadm host add 192.168.0.62 --ip=192.168.0.62 --port=7500 --status=alive
~]# mogadm host add 192.168.0.63 --ip=192.168.0.63 --port=7500 --status=alive
### 创建device
~]# mogadm device add 192.168.0.62 1 #最后的数字代表设备号,如:dev1
~]# mogadm device add 192.168.0.62 2
~]# mogadm device add 192.168.0.63 3
~]# mogadm device add 192.168.0.63 4
### 查看device状态
~]# mogadm device list
192.168.0.62 [1]: alive
used(G) free(G) total(G) weight(%)
dev1: alive 1.643 108.021 109.664 100
dev2: alive 1.643 108.021 109.664 100
192.168.0.63 [2]: alive
used(G) free(G) total(G) weight(%)
dev3: alive 1.643 108.021 109.664 100
dev4: alive 1.643 108.021 109.664 100
### 创建一个名为files的域用来存储文件
~]# mogadm domain add files
### 将本地的/etc/fstab文件上传至files域,并命名为fstab.txt
~]# mogupload --trackers=192.168.0.61 --domain=files --key='/fstab.txt' --file='/etc/fstab'
### 查看files域中的文件
~]# moglistkeys --trackers=192.168.0.61 --domain=files
/fstab.txt
### 查看已上传的fstab.txt文件的属性信息
~]# mogfileinfo --trackers=192.168.0.61 --domain=files --key='/fstab.txt'
- file: /fstab.txt
class: default
devcount: 2
domain: files
fid: 3
key: /fstab.txt
length: 805
- http://192.168.0.62:7500/dev1/0/000/000/0000000003.fid
- http://192.168.0.63:7500/dev3/0/000/000/0000000003.fid
### 下载fstab.txt文件到本地,并另存为fstab_dfs.txt
~]# mogfetch --trackers=192.168.0.61 --domain=files --key='/fstab.txt' --file='/tmp/fstab_dfs.txt
|
|
|