java高并发的解决方案
javajava 高并发的解决方案高并发的解决方案 对于我们开发的网站,如果网站的访问量非常大的话, 那么我们就需要考虑相关的并发访问问题了。而并发问题是 绝大部分的程序员头疼的问题 下面是小编分享的,欢迎大 家阅读 【java 高并发的解决方案】一般来说 MySQL 是最常 用的,可能最初是一个 mysql 主机,当数据增加到 100 万以 上, 那么, MySQL 的效能急剧下降。 常用的优化措施是 M-S主 -从方式进行同步复制,将查询和操作和分别在不同的服务 器上进行操作。 我推荐的是 M-M-Slaves 方式, 2 个主 Mysql, 多个 Slaves,需要注意的是,虽然有 2 个 Master,但是同 时只有 1 个是 Active,我们可以在一定时候切换。之所以用 2 个 M,是保证 M 不会又成为系统的 SPOF。 Slaves 可以进一步负载均衡,可以结合LVS,从而将 select 操作适当的平衡到不同的 slaves 上。 以上架构可以抗衡到一定量的负载,但是随着用户进一 步增加, 你的用户表数据超过 1千万, 这时那个 M变成了SPOF。 你不能任意扩充 Slaves,否则复制同步的开销将直线上升, 怎么办我的方法是表分区,从业务层面上进行分区。最简 单的,以用户数据为例。根据一定的切分方式,比如id,切 分到不同的数据库集群去。 全局数据库用于 meta 数据的查询。缺点是每次查询, 会增加一次, 比如你要查一个用户 nightsailer,你首先要到 全局数据库群找到 nightsailer 对应的 cluster id,然后再 到指定的 cluster 找到 nightsailer 的实际数据。每个 cluster 可以用 m-m 方式,或者 m-m-slaves 方式。这是一个 可以扩展的结构,随着负载的增加,你可以简单的增加新的 mysql cluster 进去。 网站 HTML 静态化解决方案 当一个 Servlet 资源请求到达 WEB 服务器之后我们会填 充指定的 JSP 页面来响应请求 HTTP 请求---Web 服务器---Servlet--业务逻辑处理-- 访问数据--填充 JSP--响应请求 HTML 静态化之后 HTTP 请求---Web 服务器---Servlet--HTML--响应请求 缓存、负载均衡、存储、队列 1.缓存是另一个大问题,我一般用 memcached 来做缓存 集群,一般来说部署 10 台左右就差不多10g 内存池。需要 注意一点,千万不能用使用 swap,最好关闭 linux 的 swap。 2.负载均衡/加速。可能上面说缓存的时候,有人第一 想的是页面静态化,所谓的静态html,我认为这是常识,不 属于要点了。页面的静态化随之带来的是静态服务的负载均 衡和加速。我认为 LighttpedSquid 是最好的方式了。 LVS lighttpedsquids lighttpd 上面是我经常用的。注意,我没有用apache,除非特定 的需求,否则我不部署 apache,因为我一般用 php-fastcgi 配合 lighttpd,性能比 apachemod_php 要强很多。 squid 的使用可以解决文件的同步等等问题,但是需要 注意,你要很好的监控缓存的命中率,尽可能的提高的 90 以上。 squid 和 lighttped 也有很多的话题要讨论,这里不赘 述。 3.存储。也是一个大问题,一种是小文件的存储,比如 图片这类。另一种是大文件的存储,比如搜索引擎的索引, 一般单文件都超过 2g 以上。 小文件的存储最简单的方法是结合 lighttpd 来进行分 布。或者干脆使用Redhat 的 GFS,优点是应用透明,缺点是 费用较高。我是指 你购买盘阵的问题。我的项目中,存储量是2-10Tb,我 采用了分布式存储。这里要解决文件的复制和冗余。 这样每个文件有不同的冗余,这方面可以参考google 的 gfs 的论文。 大文件的存储,可以参考 nutch 的方案,现在已经独立 为 hadoop 子项目。你可以 google it 4.队列。将并发线程转换为单线程,如果用java 的 concurrentCollection 类去做,原理就是启动一个线程,跑 一个 Queue,并发的时候,任务压入 Queue,线程轮训读取 这个 Queue,然后一个个顺序执行。 一旦并发转成单线程,那么其中一个线程一旦出现性能 问题,必然整个处理都会放慢。所以在单线程中的任何操作 绝对不能涉及到 IO 处理。那数据库操作怎么办 增加缓存。这个思路很简单,直接从内存读取,必然会 快。至于写、更新操作,采用类似的思路,把操作提交给一 个 Queue,然后单独跑一个 Thread 去一个个获取插库。这样 保证了“大循环”中不涉及到 IO 操作。 大家知道,对于 Web 服务器来说,不管是 Apache、IIS 还是其他容器,图片是最消耗资源的,于是我们有必要将图 片与页面进行分离,这是基本上大型网站都会采用的策略, 他 们都有独立的图片服务器,甚至很多台图片服务器。这 样的架构可以降低提供页面访问请求的服务器系统压力,并 且可以保证系统不会因为图片问题而崩溃,在应用服务器 和图片服务器上,可以进行不同的配置优化,比如apache 在配置 ContentType 的时候可以尽量少支持,尽可能少的 LoadModule, 保证更高的系统消耗和执行效率。 数据库集群及库表散列 在数据库集群方面,很多数据库都有自己的解决方案, Oracle、Sybase 等都有很好的方案,常用的 MySQL 提供的 Master/Slave 也是类似的方案,您使用了什么样的 DB,就 参考相应的解决方案来实施即可。 上面提到的数据库集群由于在架构、成本、扩张性方面 都会受到所采用 DB 类型的限制,于是我们需要从应用程序 的角度来考虑改善系统架构,库表散列是常用并且最有效 的解决方案。我们在应用程序中安装业务和应用或者功能模 块将数据库进行分离,不同的模块对应不同的数据库或者表, 再按照一定的策略对某个页面或者功能进行更小的数据库 散列,比如用户表,按照用户 ID 进行表散列,这样就能够 低成本的提升系统的性能并且有很好的扩展性。 sohu 的论坛 就是采用了这样的 架构,将论坛的用户、设置、帖子等信 息进行数据库分离,然后对帖子、用户按照板块和 ID 进行 散列数据库和表,最终可以在配置文件中进行简单的配置便 能让系 统随时增加一台低成本的数据库进来补充系统性能。 集群软件的分类 一般来讲,集群软件根据侧重的方向和试图解决的问题, 分为三大类 高性能集群High perance cluster, HPC、 负载均衡集群Load balance cluster, LBC,高可用性集 群High availability cluster,HAC。 高性能集群High perance cluster,HPC,它是 利用一个集群中的多台机器共同完成同一件任务,使得完成 任务的速度和可靠