探索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複製操作就結束了!