高并发处理系统的理解---数据一致性

Posted 醉人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高并发处理系统的理解---数据一致性相关的知识,希望对你有一定的参考价值。

服务器配置:

         集群的环境,每个主机选择apahe 还是nginx,nignx的并发性好。nginx和apche区别 以及服务器的配置,例如缓存大小等

        根据实际情况,可能对于图像比较多的情况,单独配置nginx服务器,作为图像服务器。在实习中使用的是七牛家的云存储单独作为图片存储,将有关车辆的上传图片全部放在上面。

 

数据库设计以及优化

       (1)表的设计:

           存储引擎:innodb还是 myisam? innodb支持事务外键,可以在崩溃时恢复(事务中redo日志实现),myisam不支持;存放数据的方式不同:myisam将表的结构frm 数据myd索引myi存在数据库目标中;innodb只在数据库目标文件中存在表的结构;索引采用B+树,myisam索引叶结点保存的是指针,指向数据,innodb存的就是数据;myisam占用空间小,在读的业务比较多的情况下采用myisam比较好。

         字段的设置: 尽量使用短的字段,提高效率,建立索引也能减少资源浪费; 整型类型,比字符类型比较快;varchar 和 char不定长(节约空间)和定长(查询快)选用;索引字段:该字段进行不同的比较多,字段值不易过长。

         合理选择数据的冗余:可以根据实际情况,不满足三范式:设置冗余字段,可以减少客户的处理,满足三范式,表之间的关系比较清晰,但是因为有外键什么的,多表关联可能性能降低,加大了用户的编程难度。

        索引优化

      (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版本控制

     可以采用乐观锁+回滚:

       技术分享

    采用悲观锁:

    技术分享

以上是关于高并发处理系统的理解---数据一致性的主要内容,如果未能解决你的问题,请参考以下文章

华为技术架构师分享:高并发场景下缓存处理的一些思路

java多线程高并发的学习

java多线程高并发知识总结

Mysql与redis缓存一致性

手写实现一致性Hash算法

怎么理解分布式高并发多线程?