回覆列表
  • 1 # 此生唯一

    之前做過一個每天訪問量達到800w的系統,簡單說下自己的見解!

    從整個應用系統來看,想要支援超高併發量,負載均衡,快取,訊息中介軟體,資料庫讀寫分離,分庫分表等必不可少,既然文章只問了資料庫系統,那就只談資料庫!

    資料庫層面,一般無外乎是主從複製,讀寫分離,分庫分表這些東西!

    1,從單臺數據庫效能來看,單個mysql例項最大連線數為16384,就是說在同一時間最多能容納那麼多的訪問量,同時受伺服器CPU,記憶體,硬碟等的影響,但是在實際應用中能達到2000就不錯了!

    需要使用druid等資料庫監控中介軟體,實時的監控資料庫連線,sql效率等各種指標,在達到瓶頸之前找到辦法,show status;這個指令也可以方便的檢視資料庫例項的各項指標

    單臺數據庫例項配置最最佳化是保證整個資料庫叢集最最佳化的基本保證!

    2,資料庫叢集:以分庫分表為例,分庫分表的方式有很多,比如mycat,Sharding-jdbc等。

    分庫分表的思想很簡單,比如單表1億的資料量,查詢效率很低,如果使用8庫1024表拆分,每張表中的資料不會超過10萬,對資料庫來說不存在任何瓶頸,就算總資料量達到100億,單表的查詢也不會慢!

    拆分的策略通常以某個全域性唯一的業務主鍵使用某種方式(比如hash取模,按月份等等)進行分庫分表的計算!

    那麼問題來了,全域性唯一的欄位怎麼獲取?普通的資料庫主鍵自增,uuid等不再合適,可以使用redis,zookeeper等獲取全域性唯一的id,具體可參見之前的其他回答!

    問題:分庫分表之後存在跨庫join的問題,通常的解決方式為1,儘量使用分庫分表主鍵能保證在同一庫,同一型別的表中進行連線查詢,2,增加專門的查詢庫:將常用的資料欄位冗餘到查詢庫中,方便連線查詢和常用欄位的快速查詢;

    4,sql最佳化:最基本的條件查詢,count,分組等使用索引欄位等避免全域性查詢,避免null值判斷,避免使用not in,避免無效的like語句,避免查詢的時候使用函式操作等等!

    5,像秒殺系統等這種瞬時高併發,最好藉助快取系統來完成!

    總而言之,資料庫是整個應用系統當中最核心,也是最容易出問題的地方,做好監控,提前預防才能保證系統訪問量的增長!

  • 中秋節和大豐收的關聯?
  • 蛇是靠什麼追蹤獵物的?