Mysql分布式解決方案


數據可靠+負載均衡:主從復制 + 分庫分表

 

一、主從復制

原理解析:

  從庫生成兩個線程,一個 I/O 線程,一個 SQL 線程;

   I/O 線程去請求主庫的 binlog,並將得到的 binlog 日志寫到 relay log(中繼日志) 文件中;

   主庫會生成一個 log dump 線程,用來給從庫 I/O 線程傳 binlog;

  SQL 線程會讀取 relay log 文件中的日志,並解析成具體操作,來實現主從的操作一致,而最終數據一致;

 

binlog:

  二進制日志,記錄mysql的數據更新,主要用於主從復制。

 

主從復制的方式(面試題):

    Statement:基於 SQL 語句的復制,statement-based replication, SBR

  優點:日志量小,節約IO,提高性能。 缺點:某些情況下會導致 master-slave中的數據不一致。

 Row:基於行的復制,row-based replication, RBR

  優點:精准 缺點:日志量大

 Mixed:混合模式復制,mixed-based replication, MBR【推薦

  一般的復制使用STATEMENT模式保存binlog 對於STATEMENT模式無法復制的操作使用ROW模式保存binlog MySQL會根據執行的SQL語句選擇日志保存方式。

 

主從復制的類型:

 同步復制: slave同步完成后才提交事務

  異步復制:不關心slave是否同步便提交事務【推薦

     半同步復制:部分slave同步完成后便提交事務

 

redolog與binlog的區別(面試題)

  1.redolog是存儲引擎產生的,binlog是mysql server產生的。

  2.redolog用於宕機后臟頁的恢復,binlog主要用於主從復制。

 

二、讀寫分離

 (面試題:什么是讀寫分離)

   寫操作(delete/update/insert)走主庫,讀操作(select)走從庫。

 

常用的讀寫分離中間件:

  mysql-proxy:mysql官方提供的。

  dbproxy:美團點評公司技術工程部DBA團隊(北京)提供的。【推薦

  mycat:民間社區提供的【不推薦

 

讀寫分離需要高可用,不能單點:

 

 

 

 

 

三、分庫分表  

把一個數據庫切分成多個部分放到不同的數據庫(server)上,從而緩解單一數據庫的瓶頸問題。

 

水平拆分:按照不同的表(或者 Schema)來切分到不同的數據庫中。【很少場景能如此做】

垂直拆分:根據表中的數據的邏輯關系,將同一個表中的數據按照某種條件拆分到多台數據庫上。【基本都需要這么做】

 

拆分帶來的問題?

 拆分原則難以把控

 跨庫查詢

 主鍵唯一性受到挑戰

 跨庫事務帶來的性能損耗

 

分布式主鍵生成方式(面試題):

 

UUID:

  優點:可用性高、性能高

  缺點:無序,不自增

 

 

中間件自增:Redis/ZK

  優點:簡單

  缺點:可用性問題、ID可靠性較差

 

 

雪花算法: Twitter 公布的分布式主鍵生成算法,它能夠保證不同進程主鍵的不重復性,以及相同進程主鍵的有序性。在同一個進程中,它首先是通過時間位保證不重復,如果時間相同則是通過序列位保證。【推薦

  優點:相對有序,性能高

  缺點:需要發現與容忍“時鍾回撥”

 

 

數據庫號段模式:一台數據庫的一張表做為號段存儲,每次要產生ID時,動態去申請一批次在內存中使用【推薦

  優點:自增有序

  缺點:高可用與性能相對差一些

 


免責聲明!

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



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