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

时间:2022-10-12 19:14:38

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

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

作用

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




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

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


原理

多进程模型

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

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

        

对比维度

多进程

多线程

总结

数据共享、同步

数据共享复杂,需要用IPC;数据是分开的,同步简单

因为共享进程数据,数据共享简单,但也是因为这个原因导致同步复杂

各有优势

内存、CPU

占用内存多,切换复杂,CPU利用率低

占用内存少,切换简单,CPU利用率高

线程占优

创建销毁、切换

创建销毁、切换复杂,速度慢

创建销毁、切换简单,速度很快

线程占优

编程、调试

编程简单,调试简单

编程复杂,调试复杂

进程占优

可靠性

进程间不会互相影响

一个线程挂掉将导致整个进程挂掉

进程占优

分布式

适应于多核、多机分布式;如果一台机器不够,扩展到多台机器比较简单

适应于多核分布式

进程占优

 关于孰优孰劣,这是个问题,但是,这不是困恼我们前进的石头,咱们一般是根据情况进行选择,这里不过多讨论,有时间咱们针对这个方向讨论。而在ngnix中,woker进程主要用来处理网络事件,各个woker进程之间是对等且相互独立的,它们同等竞争来自客户端的请求,一个请求只可能在一个woker进程中处理,woker进程个数一般设置为机器CPU核数。



非阻塞结构

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

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

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


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

    吃饭的例子:

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

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

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

总结:

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