高並發處理系統的理解---數據一致性


服務器配置:

         集群的環境,每個主機選擇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版本控制

     可以采用樂觀鎖+回滾:

       

    采用悲觀鎖:

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM