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

服務器配置: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版本控制

     能夠採用樂觀鎖+回滾:

       

    採用悲觀鎖:

    

相關文章
相關標籤/搜索