Mycat分庫分表


                                分庫分表

分庫分表解決問題

超大容量,性能問題

 

如何做

垂直拆分,水平拆分

垂直分庫:解決表過多的問題

垂直分表:解決單表列過多的問題

 

水平拆分:大數據表拆成小表,單表1000

 

常見拆分策略

垂直拆分(er分片,避免跨庫)

 

水平拆分:

一致性hash,根據訂單號,hash取模

 

范圍切分  id  0-100000010000001-20000000

 

日期拆分

 

 

拆分帶來的問題:

 

1跨庫jion問題   (盡量避免)

 1如果存在,可以通過代碼單獨查詢服務A,一個查詢結果作為條件傳給服務B,關聯建是主鍵

不能做

For(list){

  Rpc調用服務B

}

 

要一次性返回去處理

 

 

2 全局表(數據變更少,基於全局應用的)

 

 

  1. 做字段有效冗余(空間換時間)

   訂單表,商家表,商家名稱,兩表jion,訂單表增加商家名稱字段

   商家名稱變更通知訂單表,定時任務

 

 

 

 

跨分片數據表分頁問題

 

應用層實現,每個表進行查詢,然后應用進行排序

 

  

唯一主鍵問題

 

自增id做主鍵,只針對單表

解決方案:

Uuid,字段長,索引大,影響性能

算法做主鍵,snowflake

 

Mongodbobjectid

Zookeeper

Redis incr

 

數據庫表做遞增

 

分布式事務問題

 

多個數據庫表之間保證原子性,2pc3pc,導致問題:影響性能

 

如何權衡公司的存儲需要優化

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  slavesql/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 1000uuidnow 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的庫,插入delupdate是操作128,然后128同步到129

 

 

這種雙主配置

數據庫雙主架構圖

 

 

跨庫分表能夠讀寫分離嗎?  

跨庫分片規則,shading分片

 

 

 

 

 

實現自己的分片規則

 

 

全局主鍵,mycat自帶的,zookeeperredis  incr

 

 

通過mycat連接,代碼中事務不能用了嗎

 

 

分庫分表如果條件有分片建還有其他的,那么會查所有庫嗎

通過mycat連接,代碼中事務不能用了嗎?  自己查資料

 

 

Mycat集群

 

 

 

 

 

 

 

高可用配置  ha  keepalive進行

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM