服務器配置:
集群的環境,每個主機選擇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版本控制。
可以采用樂觀鎖+回滾:
采用悲觀鎖: