性能優化之數據庫篇4-高可用


從單機到集群

隨着數據量增加,讀寫並發的增加,系統可用性要求的提升,單機MySQL存在着一些問題:

  • 容量有限,難以擴容
  • 讀寫壓力、QPS過大,特別是分析類需求會影響到業務事務
  • 可用性不足,單點故障

1 主從復制

核心流程是:

  1. 主庫寫binlog
  2. 從庫拉取binlog寫入relay log

binlog格式

  • Row

這個模式存的是哪條記錄被修改,修改成什么樣.缺點是日志內容大。

  • Statement

存的是sql語句,日志量少。缺點是一些函數、觸發器同步可能有障礙。

  • Mixed

兩種模式的結合,根據執行的sql語句來區分對待記錄的日志形式。

查看binlog命令,進入mysql的bin目錄下執行。

mysqlbinlog --no-defaults ../data/binlog.000116

修改binlog模式

  1. 先查看binlog格式

SHOW VARIABLES LIKE "%binlog_format%";

  1. 在線修改

set global binlog_format='MIXED';

  1. 使用配置修改

配置文件my.ini中加入

binlog_format="MIXED" #開啟MIXED模式

修改后重啟mysql服務

主從復制方案

  1. 異步復制

傳統的主從復制,網絡或機器故障,會導致數據不一致

  1. 半同步復制

保證Source和Replica最終一致性

  1. 組復制 (Mysql Group Replication)

簡稱MGR,基於分布式協議Paxos實現,保證數據一致性

主從復制實戰

異步復制

  1. 准備兩個mysql實例
  2. 修改master的那個mysql實例的my.cnf配置文件,增加如下內容,並重啟mysql
server-id=1
log-bin=mysql-bin
  1. 登入master的mysql,創建一個同步數據的用戶
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
  1. 修改slave的那個mysql實例的my.cnf配置文件,增加如下內容,並重啟mysql
server-id=2
log-bin=mysql-bin
  1. 登入master的mysql,執行
show master status;

記錄下File和Position

  1. 登入slave的mysql,配置從庫
change master to master_host='192.168.161.21', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 837, master_connect_retry=30;

master_log_file和master_log_pos就是上面記錄下的File和Position。

執行完后繼續執行下面的命令,開啟主從復制

start slave
  1. 查看主從復制是否生效
show slave status \G;

兩個都是YES,說明成功

  1. 測試,在主庫上新建數據庫,新建表,插入數據,然后查看從庫的數據情況即可。

主從復制的局限性

  1. 主從延遲問題
  2. 應用端需要配合讀寫分離框架
  3. 不解決高可用的問題

2 讀寫分離

方案1:

基於Spring提供的路由數據源AbstractRoutingDataSource以及AOP

缺點:

  • 代碼侵入性強
  • 同一個service中有“寫完讀”數據不一致問題

具體實現:https://www.cnblogs.com/cjsblog/p/9712457.html

方案2:

ShardingSphere-jdbc 的 Master-Slave 功能

缺點:

  • 對業務系統還是有侵入
  • 對已存在的舊系統改造不友好

具體操作:https://www.cnblogs.com/javammc/p/12470838.html

方案3:

使用MyCat/ShardingSphere-Proxy的Master-Slave功能

部署中間件,規則配置在中間件中,業務系統無侵入。

3 MySQL高可用

什么是高可用?

高可用代表着更少的不可服務的時間。一般互聯網公司要求達到4個9,即一年不能服務的時間不超過52.6分鍾

99.9 = 8760 * 0.1% = 8760 * 0.001 = 8.76小時

99.99 = 8760 * 0.0001 = 0.876小時 = 0.876 * 60 = 52.6分鍾

數據庫要實現高可用,需要做到

  1. 讀寫分離,提高讀的處理能力
  2. 故障轉移,災難恢復

常見的一些策略有:

  • 多個實例不在一個主機上
  • 跨機房部署
  • 兩地三中心容災高可用方案

3.1 MySQL高可用方案

方案1:主從手動切換

如果主節點掛掉了,將某個從改為主。然后配置其他從節點。應用側需要修改數據源配置。

缺點:

  1. 可能數據不一致
  2. 需要人工操作
  3. 代碼和配置的侵入性

方案2:主從手動切換2

用LVS+Keepalived實現多個節點的探活+請求路由
,配置VIP或DNS實現應用側配置不變更

缺點:

  • 也需要手工操作
  • 大量的配置和腳本定義

方案3:MHA

MHA(Master High Availability)目前在 MySQL 高可用方面是一個相對成熟的解決方案,它由日本 DeNA 公司的 youshimaton(現就職於 Facebook 公司)開發,是一套優秀的作為 MySQL 高可用性環境下故障切換和主從提升的高可用軟件。

基於Perl語言開發,一般能在30S內實現主從切換。切換時通過SSh復制主節點的日志。

缺點:

  • 需要配置SSH信息
  • 至少3台機器

方案4:MGR

Mysql Group Replication(MGR)

MGR的特點:

  1. 高一致性:基於分布式協議Paxos實現組復制,保證數據一致性
  2. 高容錯性:自動檢測機制,只要不是大多數節點宕機都可以繼續工作
  3. 高擴展性:節點的的增加與移除會自動更新組成員信息。新節點加入后,自動從其他節點通過增量數據,直到與其他節點數據一致
  4. 高靈活性:提高單主模式和多主模式,單主模式在主庫宕機后自動選主,多主模式支持多節點寫入。
    如果主節點掛掉,將自動選擇某個從改為主。無需人工干預,基於組復制,保證數據一致性。

缺點:

  • 外部獲得狀態變更需要讀取數據庫
  • 外部需要使用LVS/VIP配置

方案5:Mysql Cluster

MySQL InnoDB Cluster是一個高可用的框架,它由下面這幾個組件構成:

  1. MySQL Group Replication :提供DB的擴展、自動故障轉移
  2. MySQL Router:輕量級中間件,提供應用程序負載均衡和應用連接的故障轉移
  3. MySQL Shell:新的MySQL客戶端,多種接口模式

方案6:orchestrator

一款MySQL高可用和復制拓撲管理工具,支持自動故障轉移和手動主從切換等。通過Web界面操作可以更改Mysql實例的復制關系和部分配置信息,同時提供命令行和API接口,方便運維管理。


免責聲明!

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



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