当前位置:首页 » 网站系统架构

java集群优化——Nginx+tomcat集群配置-理论篇

2015-08-03 09:00 本站整理 浏览(143)

我们了解一个道理,就是数据的增长是我们必然面对的问题,因为在技术日益变化的当下,我们收集数据的方式和存储及处理技术不断升级,迫使我们面对这一问题,并且,在数据挖掘日益火热的今天,我们也要对这样的问题加以重视,改变在所难免!

我们曾经想过,在极致优化的情况下,一台普通服务器,是可以挖掘出无穷的潜力的,我的们的确曾做到这一点,用一台2万元的设备,承载了同时1万余人的并发,但是随着技术的衍生,我们需要更灵活地处理应用,我们需要更及时的响应速度,我们需要实时地对数据进行分析和处理!这时,我们必然接触一个词汇,集群,今天,咱们就一起搭建一套简单的tomcat集群,为大家揭开这冰山一角。

作用

其实Nginx的作用非常简单,就是做代理服务器,那什么是代理服务器呢?大家看下图:

大家看,图片中间的黄色的机器就是代理服务器,其实代理服务器就是互联网上的访问公司服务器地址的请求,全通过一台机器进行转发,由这台机器去做负载均衡!这种技术,其实早就有了,我们早期上网使用的代理,就是这样的一种实践,当然,这里的Nginx实现的不仅仅是转发代理,还为提供持久稳定的服务做了很多努力。

原理

多进程模型

在nginx中,这种多进程结构以前只是在理论上听过,现在知道了见到了真实的实现,那么,这和多线程有哪些区别呢,咱们通过网上的一个表格说明:

对比维度多进程多线程总结
数据共享、同步数据共享复杂,需要用IPC;数据是分开的,同步简单因为共享进程数据,数据共享简单,但也是因为这个原因导致同步复杂各有优势
内存、CPU占用内存多,切换复杂,CPU利用率低占用内存少,切换简单,CPU利用率高线程占优
创建销毁、切换创建销毁、切换复杂,速度慢创建销毁、切换简单,速度很快线程占优
编程、调试编程简单,调试简单编程复杂,调试复杂进程占优
可靠性进程间不会互相影响一个线程挂掉将导致整个进程挂掉进程占优
分布式适应于多核、多机分布式;如果一台机器不够,扩展到多台机器比较简单适应于多核分布式进程占优
关于孰优孰劣,这是个问题,但是,这不是困恼我们前进的石头,咱们一般是根据情况进行选择,这里不过多讨论,有时间咱们针对这个方向讨论。而在ngnix中,woker进程主要用来处理网络事件,各个woker进程之间是对等且相互独立的,它们同等竞争来自客户端的请求,一个请求只可能在一个woker进程中处理,woker进程个数一般设置为机器CPU核数。

非阻塞结构

一个生活中的实际例子,帮助大家理解阻塞是怎么回事阻塞

阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行)。函数只有在得到结果之后才会返回。

吃饭的例子:

比如到你某个餐厅点餐,你不知道菜什么时候做好,你又不能干别的事,只能等着。你可以稍事休息(休眠),等待被服务员唤醒(菜已经做好了)。

非阻塞

非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

吃饭的例子:

比如到你某个餐厅点餐,但是你是叫的外卖,你不知道菜什么时候做好,但是你可以干别的事,你可以每隔一段时间看一眼有没有电话,菜好了会叫你来吃(菜已经做好了)

一般阻塞结构,会浪费一部分时间,非阻塞结构会最大效率地完成这部分工作,大家看时间上的进程图:

总结:

Nginx是非常优秀的反向代理实现工具,它非常清亮,大小只又不到2m,却给我们如此简单,实用,高效的提供了优质的服务,这样的设计理念也是我们需要学习的,在以后的产品架构设计中,我们也要秉着这样的一种原则,就是小而美,精且优的原则,将软件打造成艺术品!