拆分的目的是什麼?前端
拆庫,仍是拆表?二者結合?redis
拆庫方便進行擴容sql
其規則設計的好,表也能夠移動數據庫
拆成多少合適後端
單實例最多1千張表緩存
單表按1千萬~1億條數據規劃,10G左右安全
對於大字段blob,text字段建議拆分並壓縮,用主鍵關聯(查詢)架構
每一個表必須有主鍵,主鍵採用自增int/bigint併發
單庫200~400張表nosql
Hash拆分
拆分紅10庫10表
dbRule: db + (id/10 % 10)
tbRule: t + (id % 10)
Range拆分
id < 1千萬在DB0
1千萬 <= id <2千萬 DB1
按日期拆分
create_time按月一個表
按業務垂直拆分
用戶基本資料庫
好友關係庫
等等
拆分策略最好一開始就想清楚,不要在實施過程當中多變
優先採用可控性強的策略,也就是更方便後續擴展的策略
不單純追求拆分後的均衡離散性
拆分以後,須要選擇一個合適的proxy方案
不必定非要proxy,單總體改造代價必定不能過高
proxy方案選擇更適合本身場景的
第一級:訂單數據和流水數據,這兩塊數據對實時性和精確性要求很高,因此不添加任何緩存,讀寫操做將直接操做數據庫
第二級:用戶相關數據,這些數據和用戶相關,具備讀多寫少的特徵,因此咱們適用redis進行緩存
第三級:配置信息,這些數據和用戶無關,具備數據量小,頻繁讀,幾乎不修改的特徵,可使用本地內存進行緩存
如何保證多節點的寫入可用性
keepalived+雙主,但只寫一個節點
PXC,多庫多表並行寫入
MHA,一主多從,或者雙主多從
大殺器,MGR
如何提升讀可用性
一主一從,從故障時切換到主
一主多從,多從可作高可用,或者根據狀況切到主
雙主多從,同上
寫壓力分攤
垂直拆分
水平拆分
混合方案
讀壓力分攤
多從
nosql/cache
而且採用多級分層方案
大數據量,而且進行分庫分表後,不建議的SQL
複雜鏈接查詢
跨庫、跨表查詢
分佈式事務
子查詢
涉及到跨庫跨表查詢時,一般須要好的中間層來解決
這個中間層大多靠自主開發,不多有現成的通用方案
跨表JOIN代價較高時,甚至能夠考慮反範式,把多列存放在一個冗餘表中,更方便查詢
快速響應,但延遲服務
前端利用CDN、緩存、靜態內容抗住第一道訪問
前端頁面/APP端/轉發層,增長刷新頻率控制
動態請求須要有流控
業務隔離
區分不一樣業務所在資源池
重點業務,重點保障
彈性資源池(雲)
面臨問題:高併發、超賣
前端提早準備措施:靜態化、擴容、限流、服務降級機制
後端:限制MySQL的併發線程(並啓用thread pool)、訂單提交時再次判斷,是否還有庫存,能夠直接使用AliSQL分支版本(應對秒殺場景特別有效)
提早把商品分攤到多個Redis實例中,根據用戶ID哈希分配到各實例
Redis中保存2個隊列,一個被秒的,一個待秒的
還有個隊列保存已經參加過秒殺的用戶列表
秒殺成功後,被秒隊列+1,待秒隊列-1,加入已秒用戶列表
讀取已秒隊列及已秒用戶列表,更新到MySQL中
重點:入口請求有序排隊避免蜂擁,合併寫請求減少寫壓力
架構案例
不管NOSQL仍是NEWSQL,都不能很好支持事務原子性
NOSQL更多的是cache做用
簡單的KV數據,能夠用innodb memcached plugin解決
複雜的文檔數據,能夠用JSON數據類型解決
NOSQL因爲弱關係約束,後期反倒多是災難
NEWSQL主要解決數據分佈式存儲
真正須要存儲海量數據時,更多的是考慮用大數據解決方案
防止SQL注入
SQLmap
BSQL Hacker
Havij
Safe3 SQL Injector
防止長時間運行的SQL
及時幹掉
啓用timeout