探索MySQL高可用架構之MHA(4)

探索MySQL高可用架構之MHA(4)

-----構建mysql高可用系列(共9篇)

    上一篇文章介紹了本次架構中的Mysql源碼安裝。本篇文章主要介紹本次架構中的ABBB複製。

    首先我們先介紹什麼是MySql AB複製????

        AB複製又稱主從複製,實現的是數據同步。如果要做MySQL AB複製,數據庫版本儘量保持一致。如果版本不一致,從服務器版本高於主服務器,但是版本不一致不能做雙向複製。

    MySQL AB複製有什麼好處呢?

        a.解決宕機帶來的數據不一致,因爲MySQL AB複製可以實時備份數據。

        b.減輕數據庫服務器壓力,這點很容易想到,多臺服務器的性能一般比單臺要好。

    AB複製主要通過2個線程實現:

        a.I/O線程:從主庫上把bin-log下載到從庫後,放到從庫的Relay-log中。(從庫中的)

        b.SQL線程:把Relay-log中的動作,在從庫上做一次。(從庫中的)

    AB複製的3個主要步驟

        a.主服務器把數據更改記錄到二進制日誌中,這個操作叫做二進制日誌事件。

        b.從服務器把主服務器的二進制日誌事件拷貝到自己的中繼日誌(relay log)中。

        c.從服務器執行中繼日誌中的事件,把更改應用到自己的數據上。

    修改主庫和從庫的參數文件(/etc/my.cnf)

        主庫:10.142.132.52    #[mysqld]標籤下追加

server_id =1         #表示是本機的序號爲1,一般來講就是master的意思
wait_timeout=360000  #服務器在關閉它之前在一個連接上等待行動的秒數。
log-bin=binlog#開啓Binlog日誌
log-bin-index=binlog.index   #開啓Binlog日誌的索引文件
log_slave_updates=1          #表示slave將複製事件寫進自己的二進制日誌
sync-binlog = 1              #當每進行1次事務提交之後,MySQL將進行一次fsync之類的磁盤同步指令來將binlog_cache中的數據強制寫入磁盤
auto_increment_offset = 2    #表示自增長字段從那個數開始,他的取值範圍是1-65535
auto_increment_increment = 2 #表示自增長字段每次遞增的量,其默認值是1,取值範圍是1-65535

        從庫1:10.142.132.51(備主)    [mysqld]標籤下追加

relay_log_purge=0     #是否自動清空不再需要中繼日誌時,0不啓動
server_id =2
wait_timeout=360000   #服務器在關閉它之前在一個連接上等待行動的秒數。
log-bin=binlog        #開啓Binlog日誌
log-bin-index=binlog.index  #開啓Binlog日誌的索引文件
log_slave_updates=1    #表示slave將複製事件寫進自己的二進制日誌
sync-binlog = 1        #當每進行1次事務提交之後,MySQL將進行一次fsync之類的磁盤同步指令來將binlog_cache中的數據強制寫入磁盤
auto_increment_offset = 1      #表示自增長字段從那個數開始,他的取值範圍是1-65535
auto_increment_increment = 2   #表示自增長字段每次遞增的量,其默認值是1,取值範圍是1-65535

       從庫2:10.142.132.48    #[mysqld]標籤下追加

read_only=1         #只讀操作控制
relay_log_purge=0   #是否自動清空不再需要中繼日誌時,0不啓動
server_id = 3relay_log = /app/mysql/mysql-relay-bin   #定義relay_log的位置和名稱
relay_log_index=/app/mysql/mysql-relay-bin.index      #定義relay_log的索引文件位置和名稱
wait_timeout=360000  #服務器在關閉它之前在一個連接上等待行動的秒數。

        從庫3:10.142.132.47    #[mysqld]標籤下追加

read_only=1         #只讀操作控制
relay_log_purge=0   #是否自動清空不再需要中繼日誌時,0不啓動
server_id = 4
relay_log = /app/mysql/mysql-relay-bin             #定義relay_log的位置和名稱
relay_log_index=/app/mysql/mysql-relay-bin.index   #定義relay_log的索引文件位置和名稱
wait_timeout=360000   #服務器在關閉它之前在一個連接上等待行動的秒數。

        主庫    #創建用AB複製所需的用戶

mysql> GRANT replication slave ON *.* TO 'lipengfei'@'%' identified by 'lipengfei';
mysql> flush privileges;

  所有從庫    #如果從庫以前有數據,要幹掉原有數據,保持從庫是乾淨

service mysql stop  #停止Mysql服務
cd /app/mysql/data  #進入數據目錄
rm -fr 數據庫目錄   #刪除數據庫目錄
service mysql restart  #啓動Mysql服務

主庫    #主庫的數據導出,並導入所有從庫,保持數據一致

mysqldump -u root -pmysql m >/tmp/full.sql  #主庫導出數據
scp /tmp/full.sql root@從庫IP:/tmp/    #主庫導出的數據通過scp傳送到所有從庫

所有從庫    #導入主庫傳過來的數據

mysql -u root -pmysql m < /tmp/full.sql  #導入主庫傳遞過來的數據

    主庫    #爲主庫加上只讀鎖,查看當前Binlog日誌情況

mysql> flush tables with read lock; #給主庫加上讀鎖
mysql> show master status;  #查看Bin-log狀態
+---------------+----------+--------------+------------------+-------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000001 |      402 |              |                  |                   |
+---------------+----------+--------------+------------------+-------------------+
mysql>unlock tables;   #給主庫解鎖

        所有從庫    #向主庫做同步操作,開啓AB複製

mysql> change master to master_host='主庫IP', master_port=主庫端口,
       master_user='同步用戶', master_password='同步用戶的密碼', master_log_file='主庫Binlog',
       master_log_pos=主庫Binlog位置;    #向主庫做同步操作
mysql> start slave;  #啓動AB複製
所有從庫    #查看AB複製的狀態
mysql> show slave status \G
Slave_IO_Running: Yes  #I/O線程狀態OK
Slave_SQL_Running: Yes  #SQL線程狀態OK
Seconds_Behind_Master: 0  #同步效率非常好,沒有延遲
mysql> show databases;  #查看當前有哪些數據庫(主庫新建的slave庫同步過來了)
mysql> use slave;   #選擇數據庫
mysql> select * from a;  #查看a表數據

        所有從庫    #查看數據同步狀態

mysql> show databases;  #查看當前有哪些數據庫(主庫新建的slave庫同步過來了)
mysql> use slave;   #選擇數據庫
mysql> select * from a;  #查看a表數據

    如果從庫的同步進程停止了,主庫的操作還會往從庫中同步嗎?會丟數據嗎?

        所有從庫    #模擬服務出現問題 

myservice sql stop   #停止mysql服務,模擬從庫出現問題

        主庫    #從庫出現問題,此期間主庫正常操作

use slave;    #選擇數據庫
insert into a values(3);    #插入數據
insert into a values(4);    #插入數據

       所有從庫  #問題解決,查看有沒有丟數據

service mysql start   #啓動Mysql服務
mysql >use slave;   #選擇數據庫
mysql >select * from a;  #數據自動同步過來了,主庫的數據沒有丟失

    上面的結果說明了,從庫中肯定保存着主庫相關的配置:

/app/mysql/data/master.info

    只要朋友們仔細點按着我寫的文章一步一步操作,相信你也可以成功搭建AB複製的,加油吧!    到此爲止,咱們的AB複製操作就結束了!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章