MySQL雙機互備熱備自動切換

2021-01-19 IT168

  【IT168 技術文檔】在實際的應用中,資料庫是非常重要和關鍵的一個環節。在保障資料庫安全的同時,提高應用性和縮短出故障後的恢復時間,也同等重要。特別是在一些持續性和實時性要求高的應用中,故障一小時,可能會讓你損失幾千到幾萬甚至更高。

  本方案致力於資料庫實時備份,並且在故障發生後以最短的時間恢復和修復。

  在mysql資料庫的備份應用中,主從複製結構是應用的比較廣泛,數據同步和實時性都很高,基本上能滿足大部分的需求。

  本方案基於主從複製結構的基礎上,當主庫出現故障時,從庫能自動接管主庫的功能,向外提供服務,且將自身設置為主庫,將這個故障時間和影響縮短至最小,5秒內可切換完成。待原主庫修復後,會自動進入從庫的備份角色,如此循環。

  在本方案的實現中,有兩種方法且均基於mysql的主從結構中:

  1、 高可用(High Availability)HA集群,用heartbeat實現及增加了故障後的恢復功能。

  2 、同樣是高可用,只是是自己編寫腳本程序來監控,切換,恢復。

  在方法1中,使用穩定的heartbeat開源軟體實現,但此方法,需要多一個IP對外訪問,同時在監控上,是監控機器的狀態而不是mysql,有些情況下,機器是好的但mysql服務掛了,這種情況下就不準確了。不過可以修改監控方式或增加對mysql服務的監控。

  方法2中,可以不用增加一個對外IP,同時在監控上,可以直接監控mysql的服務,至於穩定性,有待測試。此方法中還有一個問題,就是提供給客戶端的資料庫連接IP,因為切換後,IP也就變了。如果說更改程序,那不現實。所以,這裡可以用域名,不過仍然需要修改域名的IP指向或是修改客戶機的hosts文件。本文使用的是修改DNS的方法,因為DNS是自己配置的,可以靈活操作。

  本文分兩部分進行說明

  第一部分 用 heartbeat 實現的高可用

  1環境條件

  兩個虛擬機(IP:192.168.1.91/92/93),

  CentOS5.4,mysql-5.1.37,heartbeat-2.1.3-3

  2 安裝前的準備

  Heartbeat 的工作原理:heartbeat最核心的包括兩個部分,心跳監測部分和資源接管部分,心跳監測可以通過網絡鏈路和串口進行,而且支持冗餘鏈路,它們之間相互發送報文來告訴對方自己當前的狀態,如果在指定的時間內未受到對方發送的報文,那麼就認為對方失效,這時需啟動資源接管模塊來接管運行在對方主機上的資源或者服務。更多請看官網 http://linux-ha.org/HomePage。

  基礎系統的安裝,mysql的安裝(略)

  軟體下載

  http://linux-ha.org/DownloadSoftware

  Http://www.packetfactory.net/libnet

  http://dev.mysql.com/downloads/mysql/5.1.html

  3 安裝過程(heartbeat)

  一般的軟體源碼安裝是./configure –prefix=path;make;make install,本文使用yum安裝。

  yum install heartbeat

  yum install heartbeat-ldirectord

  有一點要注意:heartbeat的監測,可以是網絡或串口,本文使用網絡也就是網卡。

  4 配置文檔及腳本

  1) Heartbeat的三個配置文件ha.cf,authkeys,haresources

Cat Ha.cf
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 5
warntime 10
initdead 10
udpport 694
bcast eth0
auto_failback off
node mysqlm
node mysqls
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster

Cat authkeys
auth 1
1 crc

Cat haresources
mysqlm mysql_start1.sh IPaddr::192.168.1.93/32/eth0

  2) mysql_start1.sh腳本  3) 同保證和記錄當主機由slave到master轉變時記錄當前master的文件和位置,需要建一個資料庫和表來記錄

#!/bin/sh
# author:wdlinux
# url:http://www.wdlinux.cn
# description: mysql start
local_ip=192.168.1.91
mip=192.168.1.92
vip=192.168.1.93
mysql_in=/usr/local/mysqlm
mysql_bin=${mysql_in}/bin/mysql
mysql_user=root
mysql_port=3306
mysql_pass=12345
mysqld_start=/etc/rc.d/init.d/mysqldm
. /etc/rc.d/init.d/functions
function slave_to_master() {
        echo "mysql to master from slave..."
        $mysql_bin -u"${mysql_user}" -p"${mysql_pass}" -e "slave stop;"                                                                  
log_file=$(${mysql_bin} -u"${mysql_user}" -p"${mysql_pass}" -P"${mysql_port}" -e"show master status\G" | grep "File:" | a
wk -F ': ' '{printf $2}')                                                                                                                
log_id=$(${mysql_bin} -u"${mysql_user}" -p"${mysql_pass}" -P"${mysql_port}" -e"show master status\G" | grep "Position:" |
awk -F ': ' '{printf $2}')                                                                                                              
$mysql_bin -u"${mysql_user}" -p"${mysql_pass}" -P"${mysql_port}" -e "use ms_state;update ms_log set mlf='${log_file}',mlp
='${log_id}'"
        echo "mysql server is master"
}
function master_to_slave {
        echo "mysql to slave from master..."
        if (${mysql_bin} -h"${vip}" -u"${mysql_user}" -p"${mysql_pass}" -P"${mysql_port}" -e"show slave status" > /dev/null 2>&1)
        then                                                                                                                                    
log_file=$(${mysql_bin} -h"${vip}" -u"${mysql_user}" -p"${mysql_pass}" -P"${mysql_port}" -e"use ms_state;select m
lf from ms_log\G" | grep "mlf:" | awk -F': ' '{printf $2}')                                                                                      
log_id=$(${mysql_bin} -h"${vip}" -u"${mysql_user}" -p"${mysql_pass}" -P"${mysql_port}" -e"use ms_state;select mlp
from ms_log\G" | grep "mlp:" | awk -F': ' '{printf $2}')                                                                                        
$mysql_bin -u"${mysql_user}" -p"${mysql_pass}" -P"${mysql_port}" -e "slave stop;CHANGE MASTER TO MASTER_LOG_FILE
= '${log_file}',MASTER_LOG_POS = ${log_id};slave start";
                echo "mysql server is slave"
        fi
}
case "$1" in
     start)
        slave_to_master
        ;;
     stop)
        master_to_slave
        ;;
     *)
        echo "Usage: mysql_start.sh {start|stop}"
        echo "start is slave to master"
        echo "stop is master to slave"
        exit 1
esac

   3) 同保證和記錄當主機由slave到master轉變時記錄當前master的文件和位置,需要建一個資料庫和表來記錄

create database ms_state;
use ms_state;
create table ms_log(
id tinyint (1) unsigned not null auto_increment,
mlf varchar (20) not null default '',
mlp varchar (20) not null default '',
primary key (id)
);
insert into ms_log values (NULL,"test","123");

  4) mysql的配置

log-bin=mysql-bin
binlog_format=mixed
server-id       = 1
master-host     = 192.168.1.92
master-user     = msdata
master-password = pass
slave-skip-errors=all
replicate-do-db=test
replicate-ignore-db=mysql
replicate-ignore-db=ms_state

  其它配置略

  經測試,91,92重起關機都能自動切換,接管93的IP,且故障機恢復後都能自動進入備份狀態,且數據同步及時和一致。

  第二部分 自己編寫腳本實現的高可用

  一 監控實現原理

  自己編寫腳本,實現的功能和heartbeat差不多,都是監控,切換等。

  對於監控,可以監控系統的狀態如ping,也可以監控mysql服務狀態(本文使用的方法)。

  二 實現腳本

  除了用此腳本替換heartbeat外,其它的實現和配置同上。

  1 監控腳本 mysql_monitor.sh

#!/bin/bash
# author:wdlinux
# url:http://www.wdlinux.cn
# description:monitor shell of mysql
local_ip=192.168.1.92
rip=192.168.1.91
mysql_in=/usr/local/mysqlm
mysql_bin=${mysql_in}/bin/mysql
mysql_user=root
mysql_pass=12345
mysql_port=3306

st=0
while true;do
if (${mysql_bin} -h"${rip}" -u"${mysql_user}" -p"${mysql_pass}" -P"${mysql_port}" -e "show master status" --connect_timeout=1 > /
dev/null 2>&1)
then
if (($st==0));then
/etc/rc.d/init.d/mysql_start1.sh stop
let st=$st+1
fi
else
for ((i=0;i<=3;i++));do
sleep 3
if (${mysql_bin} -h"${rip}" -u"${mysql_user}" -p"${mysql_pass}" -P"${mysql_port}" -e "show master status" --conne
ct_timeout=1 > /dev/null 2>&1)
then
break
else
if (($i==3));then
echo "slave to master"
/etc/rc.d/init.d/mysql_start1.sh start
###modify dns prg
exit
fi
fi
done
fi
sleep 3
done
將local_ip,rip作相應的修改,local_ip代表本機IP,rip為另一臺機的IP

  2 將監控腳本加入自啟動,隨系統啟動,如

Echo 「/etc/rc.d/init.d/mysql_monitor.sh &」 >> /etc/rc.d/rc.local

  此方法也可以增加一個對外服務IP,如ha實現的一樣,這樣就省去了修改域名IP等問題。

  但在腳本裡,需要增加監控,添加,刪除IP的實現和功能。

相關焦點

  • 雙機熱備軟體哪個好?中興新支點NewStartHA等雙機熱備軟體推薦
    伺服器維護和管理是企業健康穩定運營的一項重要工作,而雙機熱備可以提供伺服器的高可用性。但是成熟好用的雙機熱備軟體有哪些呢?下面就給大家推薦幾款。中興新支點NewStart HA中興新支點高可用集群軟體——NewStart HA無需改變任何服務和應用,即可保證系統故障和部件故障時應用不中斷;可以自動監控伺服器、網卡、浮動 IP 、存儲和業務,生產中心失效會自動切換到災備中心;可實現數據實時同步,切換時間為秒級,為系統提供電信級,高達 99.999%
  • 輕鬆搭建MySQL主從複製、讀寫分離(雙機熱備)
    因此,我們利用mysql自帶的REPLICATION來實現mysql多機熱備的功能,mysql版本為5.7進行演示。讀寫分離:就是把對資料庫的讀操作和寫操作分離開,將讀寫壓力分擔到多臺伺服器上,通常用於讀遠大於寫的場景。
  • 資料庫基礎:mysql主從集群搭建
    還好mysql資料庫提供了一種主從備份的機制,其實就是把主資料庫的所有的數據同時寫到備份的資料庫中。實現mysql資料庫的熱備份。 要想實現雙機的熱備,首先要了解主從資料庫伺服器的版本的需求。要實現熱備mysql的版本都高於3.2。還有一個基本的原則就是作為從資料庫的數據版本可以高於主伺服器資料庫的版本,但是不可以低於主伺服器的資料庫版本。
  • 詳解防火雙機熱備+NAT+外網訪問內部伺服器的配置
    防火牆部署雙機熱備,工作方式為主備,正常情況下FW1為主,FW2為備;4. 要求PC1能夠訪問位於外網的PC2,並且訪問時需進行NAT源地址轉換,使用的地址池區間是200.1.1.10至200.1.1.20;PC2能夠以200.1.1.29為目的地址訪問Server的FTP服務。
  • MySQL的主從備份
    進程讀取主庫的binlog內容存儲到relay log日誌中從庫的SQL進程讀取relay log日誌中內容在從庫中重放MySQL主從配置步驟配置主從資料庫伺服器參數主伺服器配置log_bin = /data/mysql
  • MySQL資料庫主從複製搭建
    --datadir=/data/3307/data --basedir=/application/mysql mysqld --initialize-insecure --user=mysql --datadir=/data/3308/data --basedir=/application/mysql mysqld --initialize-insecure
  • 「Mysql」資料庫主從搭建-基於docker
    這裡我們應該儘量使用mysql默認的3306埠,否則可能會出現無法通過ip連接docker容器內mysql的問題。也可以通過容器名docker exec -it mysql-master /bin/bash命令進入。cd /etc/mysql切換到/etc/mysql目錄下,然後vi my.cnf對my.cnf進行編輯。此時會報出bash: vi: command not found,需要我們在docker容器內部自行安裝vim。
  • mysqldump中的幾個坑
    記錄一下在mysqldump使用中遇到的幾個坑。
  • 量子特攻自動射擊怎麼切換連發 手把手教你自動射擊怎麼切換
    量子特攻自動射擊怎麼切換連發 手把手教你自動射擊怎麼切換時間:2019-09-11 17:28   來源:九遊   責任編輯:沫朵 川北在線核心提示:原標題:量子特攻自動射擊怎麼切換連發 手把手教你自動射擊怎麼切換 《量子特攻》遊戲中,玩家開始默認的是自動射擊,不能進行連發操作,很多小夥伴就比較想知道自動射擊怎麼切換連發,我們想要進行連發
  • 寶塔面板mysql表誤刪恢復過程
    寶塔面板的mysql自動開啟了binlog功能~也就是說我們可以直接通過binlog方式恢復寶塔誤刪的數據。首先找到寶塔面板的/www/server/data文件夾,看看裡面有沒有mysql-bin.xxxxx之類的文件,如果有那恭喜你可以進行下一步了~這裡是000005和000006,修改日期一個是去年剛建庫的時候的,一個是今天的。當然我們都要看一遍~怎麼看呢?
  • 今日份知識分享:mysql創建遠程登入用戶
    用root帳戶(或者其他有權限的帳戶)登錄, mysql -u root -p 回車 輸入密碼 回車
  • MySQL高可用主從切換工具replication-manager
    支持的MySQL的版本:MariaDB 10.xMySQL & Percona Server 5.7 GTID功能特性:複製關係監控與拓撲檢測在線切換(switchover)故障切換(failover)多集群管理支持代理( ProxySQL, MaxScale, HAProxy, Spider)大多數場景數據零丟失二、下載及安裝在github
  • MySQL主從複製原理
    .IO_T線程將TCP/IP緩存中數據,寫入到磁碟文件relaylog中10.SQL_T線程讀取relay.info中的信息,獲取上次已經應用過的relaylog的位置信息11.SQL_T會按照上次的位置點回放到最新的relaylog,再次更新relay.info信息12.從庫會自動
  • SpringBoot + MyBatis + MySQL讀寫分離實踐!
    username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver slave1: jdbc-url: jdbc:mysql://192.168.102.56:
  • MySQL - Xtrabackup簡介
    Xtrabackup是由percona開源的免費資料庫熱備份軟體,它能對InnoDB資料庫和XtraDB存儲引擎的資料庫非阻塞地備份(對於MyISAM的備份同樣需要加表鎖);mysqldump備份方式是採用的邏輯備份,其最大的缺陷是備份和恢復速度較慢,如果資料庫大於50G,mysqldump備份就不太適合
  • MySQL 數據校驗工具-愛可生|mysql|perl|伺服器|node01_網易訂閱
    便切換,從庫也創建)  master82 >GRANT REPLICATION SLAVE ON *.* TO repl@'10.186.63.%' IDENTIFIED BY '123';  Query OK, 0 rows affected, 1 warning (0.01 sec)  # 建?
  • 面試不得不知的Mysql殺手鐧
    每開始一個新的事務,系統版本號都會自動遞增。事務開始時刻的系統版本號會作為事務的版本號,用來和查詢到的每行記錄的版本號進行比較。就是樂觀鎖的實現。闡述對數據的理解一切皆數據,無數據不編程。存儲引擎的區別InnoDB mysql默認引擎,支持事務,行鎖、表鎖(沒有索引就會表鎖)、外鍵。
  • MySQL密碼管理
    1.密碼修改set--在當前的用戶登錄後修改set password=password('new_password');mysqladmin-- mysqladmin -uroot -pold_password password new_password[root@jssdb01 ~]# mysqladmin -uroot -prootroot password root123mysqladmin: [Warning] Using a password
  • 技術分享 | MySQL 閃回工具 MyFlash
    /  extracting: MyFlash-master/source/mysqlHelper/mysqlHelper.c  creating: MyFlash-master/source/network/  inflating: MyFlash-master/source/network/network.c  creating: MyFlash-master
  • MySQL如何計算統計redo log大小
    我們通過統計、分析計算重做日誌(redo log)的生成量,從而判斷InnoDB的事務日誌文件大概能支撐多長時間就會切換。有具體數據支撐,你才好分析判斷,否則巧婦也難為無米之炊。*版本用下面腳本DELIMITER &&DROPPROCEDUREIFEXISTS `Record_Innodb_Log_Size`&&CREATEPROCEDURE Record_Innodb_Log_Size()BEGIN INSERT INTO mysql.