一、系統架構圖
數據庫1與數據庫2進行雙機熱備。雙機熱備即將主從備份在兩臺機器上相互配置一遍,達到兩臺機器互爲主機和從機的目的。
二、haproxy
微服務通過haproxy代理訪問數據庫1,在數據庫1異常時訪問數據庫2
配置如下:
global
maxconn 32000
nbproc 3
daemon
defaults
mode tcp
retries 3
option abortonclose
maxconn 32000
timeout connect 10s
timeout client 10m
timeout server 10m
timeout http-keep-alive 10m
log 127.0.0.1 local0 err #syslog日誌
listen win_ss
bind 0.0.0.0:8080
mode tcp
option mysql-check user haproxy#添加mysql無密碼賬號,通過該賬號進行check
#balance source
server s1 127.0.0.1:3306 check rise 1 fall 1#主機,進行check檢查
server s2 127.0.0.1:3306 check rise 1 fall 1 backup#熱備主機(從機),本次沒有使用負載均衡配置,僅配置backup,在主機掛掉後可以自動切換到從機
listen status
bind 0.0.0.0:1188#web監控的地址
mode http
stats enable
stats refresh 30s
stats uri /
stats auth admin:admin #web登錄的賬號密碼
stats hide-version #隱藏版本號
stats admin if TRUE
三、msql
3.1mysql備份原理
Mysql內建的複製功能是構建大型,高性能應用程序的基礎。將Mysql的數據分佈到多個系統上去,這種分佈的機制,是通過將Mysql的某一臺主機的數據複製到其它主機(slaves)上,並重新執行一遍來實現的。複製過程中一個服務器充當主服務器,而一個或多個其它服務器充當從服務器。主服務器將更新寫入二進制日誌文件,並維護文件的一個索引以跟蹤日誌循環。這些日誌可以記錄發送到從服務器的更新。當一個從服務器連接主服務器時,它通知主服務器從服務器在日誌中讀取的最後一次成功更新的位置。從服務器接收從那時起發生的任何更新,然後封鎖並等待主服務器通知新的更新。
3.2mysql支持的複製類型
- 基於語句的複製: 在主服務器上執行的SQL語句,在從服務器上執行同樣的語句。MySQL默認採用基於語句的複製,效率比較高。一旦發現沒法精確複製時,會自動選着基於行的複製。缺點:使用如sysdate、uuid等與本機相關的函數會報警
- 基於行的複製:把改變的內容複製過去,而不是把命令在從服務器上執行一遍。缺點:binlog文件太大,尤其當在一個數據量較大的表中新增字段時,每一行一條的update語句大大增加了binlog文件。所以在在添加字段時,一般需要暫停同步。dba手動添加字段(或則使用別的方式),然後再啓動同步。mysql5.5默認使用該方式。
- 混合類型的複製: 默認採用基於語句的複製,一旦發現基於語句的無法精確的複製時,就會採用基於行的複製。
mysql主從配置詳細內容參考https://www.cnblogs.com/jirglt/p/3549047.html
3.3mysql主從備份日常監控
- 監控備份情況及異常處理命令如下:
stop slave;//停止從庫同步
set global sql_slave_skip_counter=1;//跳過錯誤
start slave;//開啓同步
show slave status;//顯示同步狀態
- 同步狀態重點關注字段:
Slave_io_state//狀態
Relay_master_log_file//當前讀取的備份文件名
Slave_io_running//io運行情況
Slave_sql_running//sql運行情況
Seconds_behind_master//落後於主機的時間
-
數據庫配置
#忽略同步的表
replicate-wild-ignore-table
#跳過指定error no類型的錯誤,不是越多越好
slave-skip-errors=1062,1053,1146,1051
四、windows下的mysql定時備份
在windows上添加任務計劃,明天定時備份。
注意:1、bat文件路徑最好不要添加空格、括號等2、起始於路徑需要配置
bat內容
@echo off
echo ------------------------backup Database-----------------------------
::----------------------------配置部分--------------------------
:: 備份目錄,必須以\結尾
set BACKUP_PATH=F:\1-DB-BACKUP\
:: 要備份的數據庫名稱,支持%通配符,注意:兩個%%表示一個%
set DATABASES=databasename%%
::建議賬戶只分配備份必要的權限,參考語句:GRANT SELECT, RELOAD, LOCK TABLES ON *.* TO 'dump'@'127.0.0.1' IDENTIFIED BY 'mima';
set USERNAME=root
set PASSWORD=mima
set PORT=3306
:: MYSQL目錄,必須以\結尾
set MYSQL=E:\1-DB\mysql-5.5.51-winx64(slave)\bin\
set year=%date:~0,4%
set month=%date:~5,2%
set day=%date:~8,2%
::----------------------------執行部分--------------------------
::必須加延遲開關,否則for循環裏面的set結果不正確,而且for循環內的引用變量要用!
setlocal EnableDelayedExpansion
echo show databases like '%DATABASES%'; > tmp.sql
"%MYSQL%"mysql -u%USERNAME% -p%PASSWORD% -P%PORT% < tmp.sql > out.tmp
echo flush tables; > tmp.sql
echo flush tables with read lock; >> tmp.sql
echo show slave status\G; >> tmp.sql
"%MYSQL%"mysql -u%USERNAME% -p%PASSWORD% -P%PORT% < tmp.sql > %BACKUP_PATH%%year%%month%%day%.slave
echo show master status\G; > tmp.sql
"%MYSQL%"mysql -u%USERNAME% -p%PASSWORD% -P%PORT% < tmp.sql > %BACKUP_PATH%%year%%month%%day%.master
FOR /F "tokens=1* delims=:" %%a IN ('findstr /n .* out.tmp') DO (
if %%a gtr 1 (
echo Dumping database %%b ...
set filename=%BACKUP_PATH%%%b_%year%%month%%day%
"%MYSQL%"mysqldump -u%USERNAME% -p%PASSWORD% -P%PORT% %%b --lock-all-tables=true --skip-lock-tables --default-character-set=utf8 --hex-blob --result-file=!filename!.sql
)
)
echo unlock tables; > tmp.sql
"%MYSQL%"mysql -u%USERNAME% -p%PASSWORD% -P%PORT% < tmp.sql
del out.tmp /q 1>nul 2>nul
del tmp.sql /q 1>nul 2>nul
::刪除歷史文件(30天)
forfiles /p %BACKUP_PATH% /m *.* -d -30 /c "cmd /c del /f @path"
echo ------------------------close backup Database-----------------------------
@echo on
- 遺留問題
- 尚不能實現高可用,單點問題,需要使用集羣及vip的方式解決
- 同步的機制,無法實現雙機的實時性,參考與pxc的對比https://blog.csdn.net/zisefeizhu/article/details/81873466
- 讀寫分離問題,需要mycat等中間件解決
- 分區表的問題,需要跟蹤及測試
- 數據庫宕機報警及相關信息監控,使用如zabbix監控