分庫分表
分庫分表解決問題
超大容量,性能問題
如何做
垂直拆分,水平拆分
垂直分庫:解決表過多的問題
垂直分表:解決單表列過多的問題
水平拆分:大數據表拆成小表,單表1000萬
常見拆分策略
垂直拆分(er分片,避免跨庫)
水平拆分:
一致性hash,根據訂單號,hash取模
范圍切分 id 0-1000000,10000001-20000000
日期拆分
拆分帶來的問題:
1跨庫jion問題 (盡量避免)
1如果存在,可以通過代碼單獨查詢服務A,一個查詢結果作為條件傳給服務B,關聯建是主鍵
不能做
For(list){
Rpc調用服務B
}
要一次性返回去處理
2 全局表(數據變更少,基於全局應用的)
- 做字段有效冗余(空間換時間)
訂單表,商家表,商家名稱,兩表jion,訂單表增加商家名稱字段
商家名稱變更通知訂單表,定時任務
跨分片數據表分頁問題
應用層實現,每個表進行查詢,然后應用進行排序
唯一主鍵問題
自增id做主鍵,只針對單表
解決方案:
Uuid,字段長,索引大,影響性能
算法做主鍵,snowflake
Mongodb的objectid
Zookeeper的
Redis incr
數據庫表做遞增
分布式事務問題
多個數據庫表之間保證原子性,2pc,3pc,導致問題:影響性能
如何權衡公司的存儲需要優化
1 提前規划(主鍵問題,jion問題提前考慮)
2 當前單表數據超過1000萬,每天增長量持續上升---需要優化
Mysql主從
寫少讀多的,讀寫分離,讀庫到寫庫同步數據,分多個讀卡對數據庫進行壓力釋放,
讀卡實現負載均衡 HAProxy 進行分流,增加集群的性能
單主多從
安裝數據庫
啟動數據庫
systemctl start mysqld
Mysql
數據文件和二進制文件 var/lib/mysql
配置文件 /etc/my.cnf
日志文件 /var/log/mysql.log
修改配置文件:
開啟二進制文件開啟
設置id
創建一個用戶
create user repl identified by 'repl’ ;
賦允許拷貝的權限
grant replication slave on *.* to 'repl'@'%' identified by 'repl';
修改配置文件:my.cnf
增加
log-bin=mysql-bin
server-id=128
從數據庫
中記日志
server-id=129
relay-log=slave-relay-bin
relay-log-index=slave-relay-bin.index
Read_only=1
在從數據庫執行
change master to master_host='192.168.72.128',master_port=3306,master_user='repl',master_password='repl',master_log_file='mysql-bin.000002',master_log_pos=154;
start slave;
show slave status\G;
主從同步完成
原理
Master數據庫數據發生變化會記錄bin-log
Slave 通過io./thread讀取bin-log內容 然后寫到 relay-log ,slave的sql/thread read relay-log 然后同步數據
Bin-log,用來記錄數據庫更新或者潛在更新,文件存儲在/var/lib/mysql
查看bin-log內容:
mysqlbinlog --base64-output=decode-rows -v mysql-bin.000001
Binlog格式
Statement 基於sql語句模式 update effect 1000;uuid, now other function
Row 基於行模式 存在1000條數據變更,記錄修改以后每一條變化的值
Mixed 混合模式 由mysql自動判斷處理
查看模式
Show variables like ‘%log%’;
修改模式
set global binlog_format=’row/mixed/statement’;
雙主配置通過keepalive保持會話,只開啟一台
主從延時問題
Binlogcache
Sync binlog來設置刷新機制
Sync binlog = 0 文件系統調度吧binlogcache刷新到磁盤
Sync binlog = n n個事務 文件系統調度吧binlogcache刷新到磁盤
延時監控
網絡監控
心跳監控:主從庫都建一個表,然后插入時間當前,比較主從庫時間差,如果差距大就說明延遲
應用解決,通過redis,每次插入之后同時插入redis里,然后取數據先從redis取,緩解下數據庫延時時間
Mycat
核心數據庫
邏輯數據庫
核心配置文件
???
實在演示
Explain sql
根據分片建做路由
分片鍵和非分片鍵作為查詢條件一起查詢呢 根據分片建去查詢
不是分片建做條件,都去查一遍,是不是影響性能了呢 影響性能,有緩存機制
???
能不能先分表,再去查詢??? 用分片建就會查單表
跨庫分表
支持oracle嗎
我們分庫分表路由是自己代碼寫的連接不同的數據庫可以用mycat嗎
讀寫分離
兩種配置的差異
Writehost readhost
雙主策略,不需要haproxy做路由
測試下一台掛了的情況
此配置數據庫掛了,還可以繼續操作數據庫,但是會造成數據差異的風險
這種配置數據庫掛了就不能操作數據庫,可以避免造成數據差異的風險但是引起不能高可用
這種讀寫分離配置,查詢都是查詢129的庫,插入del,update是操作128,然后128同步到129
這種雙主配置
數據庫雙主架構圖
跨庫分表能夠讀寫分離嗎?
跨庫分片規則,shading分片
實現自己的分片規則
全局主鍵,mycat自帶的,zookeeper,redis incr
通過mycat連接,代碼中事務不能用了嗎
分庫分表如果條件有分片建還有其他的,那么會查所有庫嗎 ?
通過mycat連接,代碼中事務不能用了嗎? 自己查資料
Mycat集群
高可用配置 ha keepalive進行