溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MySQL數(shù)據(jù)庫(kù)?可?HA怎么實(shí)現(xiàn)

發(fā)布時(shí)間:2022-01-24 09:36:02 來(lái)源:億速云 閱讀:154 作者:小新 欄目:開(kāi)發(fā)技術(shù)

小編給大家分享一下MySQL數(shù)據(jù)庫(kù)?可?HA怎么實(shí)現(xiàn),相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

    MySQL數(shù)據(jù)庫(kù)?可?HA實(shí)現(xiàn)

    1、 數(shù)據(jù)庫(kù)?可?分析

    ?可?的衡量標(biāo)準(zhǔn)
    數(shù)據(jù)庫(kù)實(shí)現(xiàn)?可?的?種?式
    MySQL數(shù)據(jù)庫(kù)實(shí)現(xiàn)?可?

    2、MySQL主從復(fù)制的容災(zāi)處理

    MySQL?持的復(fù)制?式分析
    主從場(chǎng)景切換?式
    主從結(jié)構(gòu)如何實(shí)現(xiàn)容災(zāi)

    1. 什么是數(shù)據(jù)庫(kù)?可?

    1.1. 什么是?可?集群

    N+1:N就是集群,1就是?可?,?可?的核?就是冗余,集群是保證服務(wù)最低使?標(biāo)準(zhǔn)的

    1.2. ?可?集群的衡量標(biāo)準(zhǔn)

    ?般是通過(guò)系統(tǒng)的可靠性和可維護(hù)性來(lái)衡量的
    MTTF:平均?故障時(shí)間,這是衡量可靠性的
    MTTR:衡量系統(tǒng)的可維護(hù)性的
    HA=MTTF/(MTTF+MTTR)*100%
    SLA:99.999%:表示?年故障時(shí)間/宕機(jī)時(shí)間不超過(guò)6分鐘

    1.3. 實(shí)現(xiàn)?可?的三種?式

    主從?式(?對(duì)稱)
        這種?式的組織形式通常都是通過(guò)兩個(gè)節(jié)點(diǎn)和?個(gè)或多個(gè)服務(wù)器,其中?臺(tái)作為主節(jié)點(diǎn)
    (active),另?臺(tái)作為備份節(jié)點(diǎn)(standy),備份節(jié)點(diǎn)應(yīng)該隨時(shí)都在檢測(cè)主節(jié)點(diǎn)的健康狀況,當(dāng)
        主節(jié)點(diǎn)發(fā)?故障,服務(wù)會(huì)?動(dòng)切換到備份節(jié)點(diǎn)保障服務(wù)正常運(yùn)?
    對(duì)稱?式
        兩個(gè)節(jié)點(diǎn),都運(yùn)?著不同的服務(wù)且相互備份,相互檢測(cè)對(duì)?的健康,當(dāng)任意?個(gè)節(jié)點(diǎn)發(fā)?故障,這
        個(gè)節(jié)點(diǎn)上的服務(wù)就會(huì)?動(dòng)切換到另?節(jié)點(diǎn)
    多機(jī)?式
        包含多個(gè)節(jié)點(diǎn)多個(gè)服務(wù),每個(gè)節(jié)點(diǎn)都要備份運(yùn)?不同的服務(wù),出現(xiàn)問(wèn)題?動(dòng)遷移

    1.4. MySQL數(shù)據(jù)的?可?實(shí)現(xiàn)

    1.4.1. 主從?式(?對(duì)稱)

    資源:兩臺(tái)同版本的MySQL數(shù)據(jù)庫(kù)
    主從實(shí)現(xiàn)的內(nèi)部運(yùn)?原理和機(jī)制
        First Step:主數(shù)據(jù)庫(kù)服務(wù)器會(huì)把數(shù)據(jù)的修改記錄記錄進(jìn)binlog?志,binlog?定要打開(kāi)
        Second Step:從庫(kù)的I/O進(jìn)?讀取主庫(kù)的binlog內(nèi)容后存???的Relay Log中繼?志中,這
        個(gè)I/O線程會(huì)和主庫(kù)建??個(gè)普通的客戶端連接,然后主庫(kù)啟動(dòng)?個(gè)?進(jìn)制轉(zhuǎn)儲(chǔ)線程,I/O線
        程通過(guò)轉(zhuǎn)儲(chǔ)線程讀取binlog更新事件,同步完畢后I/O進(jìn)?sleep,有新的更新會(huì)再喚醒
                Relay Log和Binlog的格式是?樣的,可以?mysqlbinlog讀取,也可show
                mysql> show relaylog events in 'relay-log.000001';
                ?前數(shù)據(jù)庫(kù)有兩種復(fù)制?式
                        binlog?志點(diǎn)position
                        GTID?式也要依賴binlog
        第三步:從服務(wù)器的SQL進(jìn)程會(huì)從Relay Log中讀取事件并在從庫(kù)中重放
                從服務(wù)器執(zhí)?重放操作時(shí)是可以在配置?聲明是否寫(xiě)?服務(wù)器的binlog?志中

    MySQL數(shù)據(jù)庫(kù)?可?HA怎么實(shí)現(xiàn)

    1.4.2. 配置主從服務(wù)步驟
    1.4.2.1. Binlog的?志點(diǎn)?式配置主從同步

    配置主從服務(wù)器參數(shù)
    在Master服務(wù)器上創(chuàng)建?于復(fù)制并授權(quán)的數(shù)據(jù)庫(kù)賬號(hào)
    備份Master數(shù)據(jù)庫(kù)并初始化Slave服務(wù)器數(shù)據(jù)
    啟動(dòng)復(fù)制鏈路

    Master服務(wù)器配置

    chown -R mysql:mysql /usr/local/binlog/
    #配置?件
    server_id=163
    log_bin=/usr/local/binlog/mysql-bin
    12345

    Slave服務(wù)器配置

    server_id=196
    log_bin=/usr/local/binlog/mysql-bin
    relay_log=/usr/local/relaylog/relay-bin
    #當(dāng)slave宕機(jī)后,如果relay log損壞了,導(dǎo)致?部分中繼?志沒(méi)有處理,則放棄所有未完成的,
    重新獲取執(zhí)?,保證完整性
    relay_log_recovery=1 #讓從庫(kù)數(shù)據(jù)只讀,super?戶,super_read_only=on
    read_only=on
    #從庫(kù)的復(fù)制鏈路服務(wù)不會(huì)隨數(shù)據(jù)庫(kù)重啟?重啟,需要?動(dòng)啟動(dòng)
    skip_slave_start=on
    #確保數(shù)據(jù)?致性,通過(guò)innoDB的崩潰恢復(fù)機(jī)制來(lái)保護(hù)哦
    master_info_repository=TABLE
    relay_log_info_repository=TABLE
    #select * from mysql.slave_master_info;
    #select * from mysql.slave_relay_log_info;

    主庫(kù)授權(quán)

    mysql> use msyql;
    mysql> grant replication slave on *.* to 'syncuser'@'192.168.0.103'
    identified by '123456';
    mysql> flush privileges;
    set global validate_password_policy=LOW;
    set global validate_password_length=6;

    初始化數(shù)據(jù)

    mysqldump -uroot -p123456 --master-data=2 --single-transaction --routines -
    -triggers --events --databases mydb > mydb.sql

    創(chuàng)建復(fù)制鏈路

    mysql>
    CHANGE MASTER TO
    MASTER_HOST='192.168.0.102',
    MASTER_PORT=3306,
    MASTER_USER='syncuser',
    MASTER_PASSWORD='123456',
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=8122;
    mysql> start slave;
    mysql> show slave status \G;

    從庫(kù)的binlog是否寫(xiě)??

    默認(rèn)情況下是不寫(xiě)?的:因?yàn)閷?xiě)?binlog會(huì)消耗I/O,所以性能會(huì)下降,如果需要在從庫(kù)上恢復(fù)數(shù)
    據(jù)就到Relay Log?進(jìn)?導(dǎo)出處理
    直接在從庫(kù)上操作更?語(yǔ)句則會(huì)寫(xiě)?binlog
    如果就是需要寫(xiě)??在從庫(kù)的my.cnf : log_slave_updates=on #開(kāi)啟同步并寫(xiě)?binlog
    開(kāi)啟同步并寫(xiě)?binlog應(yīng)?于從到從的情況

    問(wèn)題:只同步其中三個(gè)表

    #Master配置?件
    #不同步哪些數(shù)據(jù)庫(kù)
    binlog-ignore-db=mysql
    binlog-ignore-db=test
    binlog-ignore-db=information_schema
    #同步哪些庫(kù)
    binlog-do-db=game
    binlog-do-db=mydb
    
    #Slave配置?件
    #復(fù)制哪些數(shù)據(jù)庫(kù)
    replicate-do-db=mydb
    replicate-do-db=game
    #不復(fù)制哪些數(shù)據(jù)庫(kù)
    replicate-ignore-db=mysql
    replicate-ignore-db=test
    
    --replicate-wild-ignore-table=foo%.bar% 不復(fù)制使?表名稱以開(kāi)頭foo且表名稱以開(kāi)頭
    的表的更新bar

    1.4.2.1. GTID的?式來(lái)進(jìn)?主從復(fù)制

    不同點(diǎn)
    	主從服務(wù)器的參數(shù)有不同的地?
    
    #在上?的基礎(chǔ)上,需要給主從服務(wù)器都加上
    gtid_mode=on
    enforce_gtid_consistency=on #開(kāi)啟強(qiáng)制GTID的?致性確保事務(wù)		
    
    GTID下復(fù)制鏈路的啟動(dòng)
    mysql>
    CHANGE MASTER TO
    MASTER_HOST='192.168.0.102',
    MASTER_PORT=3306,
    MASTER_USER='syncuser',
    MASTER_PASSWORD='123456',
    MASTER_AUTO_POSITION=1;
    
    啟動(dòng)GTID后以下數(shù)據(jù)庫(kù)操作不可?
    	create table tableName.... select
    	在?個(gè)事務(wù)中創(chuàng)建臨時(shí)表
    	在?個(gè)transaction中更新innoDB表和myisam表

    2. 數(shù)據(jù)主從復(fù)制?式的容災(zāi)處理

    2.1. MySQL?持的復(fù)制格式

    2.1.1. 基于語(yǔ)句的復(fù)制(statement)

    優(yōu)點(diǎn):記錄少,只記錄執(zhí)?語(yǔ)句,易懂
        缺點(diǎn):insert into table1(create_time) values(now()),這個(gè)now就不是當(dāng)時(shí)的時(shí)間了

    2.1.2. 基于?復(fù)制(row)

    優(yōu)點(diǎn):?乎沒(méi)有基于?復(fù)制?法處理的場(chǎng)景
        缺點(diǎn):數(shù)據(jù)量太?了

    2.1.3. 混合類型的復(fù)制(MIXED)

    mixed格式默認(rèn)采?statement,?如?到UUID(),ROW_COUNT()

    2.1. MySQL主從復(fù)制模式

    異步復(fù)制:MySQL默認(rèn)就是異步復(fù)制,性能最好,但主從復(fù)制的數(shù)據(jù)不?致性概率最?
    同步復(fù)制:當(dāng)客戶端發(fā)過(guò)來(lái)?個(gè)請(qǐng)求后,只有當(dāng)所有的從庫(kù)都寫(xiě)到Relay Log中,才回復(fù)給前端事
    務(wù)完成,性能最差,但?致性很強(qiáng)
    半同步復(fù)制:?少?個(gè)從庫(kù)完成Relay Log寫(xiě)?后就返回事務(wù)完成給前端
    
    主從上都要安裝
    mysql> install plugin rpl_semi_sync_master soname='semisync_master.so'
    rpl_semi_sync_master_enabled
    rpl_semi_sync_master_timeout #單位是毫秒,如果主庫(kù)等待從庫(kù)回復(fù)超過(guò)這個(gè)時(shí)間就?動(dòng)切換
    為異步

    以上是“MySQL數(shù)據(jù)庫(kù)?可?HA怎么實(shí)現(xiàn)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI