服务器配置:html
集群的环境,每一个主机选择apahe 仍是nginx,nignx的并发性好。nginx和apche区别 以及服务器的配置,例如缓存大小等mysql
根据实际状况,可能对于图像比较多的状况,单独配置nginx服务器,做为图像服务器。在实习中使用的是七牛家的云存储单独做为图片存储,将有关车辆的上传图片所有放在上面。nginx
数据库设计以及优化git
(1)表的设计:web
存储引擎:innodb仍是 myisam? innodb支持事务外键,能够在崩溃时恢复(事务中redo日志实现),myisam不支持;存放数据的方式不一样:myisam将表的结构frm 数据myd索引myi存在数据库目标中;innodb只在数据库目标文件中存在表的结构;索引采用B+树,myisam索引叶结点保存的是指针,指向数据,innodb存的就是数据;myisam占用空间小,在读的业务比较多的状况下采用myisam比较好。redis
字段的设置: 尽可能使用短的字段,提升效率,创建索引也能减小资源浪费; 整型类型,比字符类型比较快;varchar 和 char不定长(节约空间)和定长(查询快)选用;索引字段:该字段进行不一样的比较多,字段值不易过长。sql
合理选择数据的冗余:能够根据实际状况,不知足三范式:设置冗余字段,能够减小客户的处理,知足三范式,表之间的关系比较清晰,可是由于有外键什么的,多表关联可能性能下降,加大了用户的编程难度。数据库
索引优化apache
(2)分库分表编程
针对大表,能够根据实际状况垂直分表或者水平分表。
垂直分表:对于大表中的某些字段常常使用,能够分表;
水平分表:例如月份,将不一样的月份的数据存在不一样的表中。
(3)MySQL集群的环境
读写分离:主要针对读操做比较多的状况下。
目的:给大型网站缓解查询压力
原理:服务器运行amobe服务,能够判断sql是写仍是读操做。收到sql语句是写,服务器将写送到master mysql处理,利用mysql proxy机制而后同步到slave mysql;
当服务器是select时,服务器会根据负载均衡挑选出一个slave mysql,将select语句送到并处理。
缓存:
能够将一些不动的页面:页面静态化/部分页面静态化;
或者将一些数据存在memcache或者Redis中,不用去查表
数据一致性处理
当多个进程同时操做同一个数据,会产生资源争抢,数据一致性的问题。
高并发状况下,涉及到写操做时,不可能直接操做数据库,大并发的链接会致使mysql请求会阻塞,好比大量的insert update 请求到,会直接致使无数的行锁和表锁,甚至最后堆积不少,历来触发too many connections 错误。
web服务器 nginx和apache链接的进程有限,cpu上下文进程切换也会增长额外的开销,因此响应必定快。
这时能够采用
高并发下的数据安全,防超发,以抢票系统为例:
(1)消息队列:
将票数资源存在redis中,将请求存入消息队列(redis下的list阻塞的,能够实现消息队列,还能够实现优先消息队列点击打开连接)中,依次处理。缺点 :这样会处理比较慢,等待时间比较长。
:对于读操做是否也进入队列,这个问题根据具体的场景,像12306应该是不在队列中或者是优先排在最前面的,由于只是读,要求块。
(2)加锁
常见的锁: 排它锁;乐观锁;悲观锁;
排他锁:在进行写时,禁止一切的读和写;
乐观锁:认为在写的时候,别人不在写,维护一个version号,等处理后对照version好,一致则对,不然回滚,操做不成功,
悲观锁:认为在写的时候,别人也在写。采用数据库提供的锁机制:在写操做的时(insert updata 等)myisam默认是锁表,innodb根据是不是主键,主键则行锁,不然表锁。读操做,innodb采用mvcc版本控制。
能够采用乐观锁+回滚:
采用悲观锁: