从大往小说:
服务器结构层面
1、首先是应用服务器和数据服务器分离
2、应用服务器可以作为集群由一台或多台nginx服务器使用负载均衡共同管理,这其中涉及到应用服务器集群共享session等同步问题。多台nginx也可以由其他安装了负载均衡软件的机器管理。也就是三层结构:安装了负载均衡软件的机器(主要有两种常用的软件,lvs和keepalived)——多台nginx——应用服务器集群。这里说的都是软件实现的负载均衡,现在硬件
的负载匀衡效果是最好的但是太贵了,可以百度一下负载均衡的硬件最少10w+(最便宜的能用吗?)。
3、数据库服务器组成集群进行读写分离,主从同步。对mysql来说,可以让多个master分别作为对方的slave,避免单台master出现问题整个集群都坏了。master使用
innodb引擎进行事务和除查询之外的操作(由innodb的特性决定),slave使用myisam引擎进行查询操作。整个mysql集群同样可以被负载均衡(lvs加keepalived)。
nginx+tomcat+mysql挺好的,适合自己拿来玩。Apache(阻塞)可以取代nginx(异步非阻塞),但是并发数3w后效果比nginx差很多,其实lamp(linux+apache+mysql+php)这种主流结构的思路也是免费+并发+灵活。
应用中的细节方面:
数据库配置和sql语句优化
1、对于innodb引擎来说,每次alter操作都相当于整表重建,把引起结构变更的sql语句调整为一句话,能够减少数据库的执行时间。
2、order by的处理,delete insert的合并
3、注意数据库的缓存,减少io。配置mysql的一些参数起到优化作用
3、使用preparedstatement对象,可以预编译sql语句节省时间,还可以避免sql注入
4、经常使用的一组命令设置为存储过程,省去了每条sql语句的编译过程
5、如果数据是通过多表关联获取,那么使用join,为了提高join性能,最好在join列创建索引,并且join条件的这些列最好使用相同的
数据类型和定义
6、评估数据的读写行为是否适用新的压缩特性,如果可以建议执行create table时指定row_format=compressed选项提高读写性能。
7、myisam引擎可以把表设为静态格式表,空间换时间,使用dynamic格式保存大数据类型(blob、text)更有效率
8、对数据库的操作会在mysql库(库名叫mysql)中的各个priv表中查找权限,顺序是user、db、table、column。因此权限粒度越大反而会起到优化作用。
程序优化
1、使用线程池和数据库连接池,使用缓存
2、同步代码为了线程吞吐量可以使用stampedlock(jdk8新出的lock实现类),jdk6及以后的synchronized关键字和reentrantlock类的效率已经差不多了,jdk5还是使用reentrantlock性能更好
3、对于同步的数据可以使用分段加锁,concurrenthashmap就是这么干的
4、避免在循环中加锁(阻塞和唤醒很费时间),不如直接把整个循环加锁(如果不影响多线程间的逻辑关系)
5、减少锁持有的时间,多个线程尽量以相同的顺序去获取资源
6、同步集合类尽量使用jdk自带的concurrent包下的同步集合类,性能比普通的线程安全集合类好很多
7、使用nio,避免阻塞(如果应用需要使用大量io操作)
PS:只写出了宏观上的做法,每一点应该怎么做、为什么这么做都有很多内容,太多就不细说了。。。
阅读(6216) | 评论(0) | 转发(4) |