傳統複製和GTIDs切換的缺點 python
當replication故障出現以後,最頭疼是replication架構的調整 mysql
一旦master down了,就須要配置某一臺slave做爲master sql
slave上開啓二進制日誌文件,寫操做配置成新的slave。 數據庫
若是架構是MSS,新的relay提高爲master,後面的slave都須要change master to host,binlog-file,postion。還得保證數據的一致性,因此所要花費的時間很長 緩存
GTIDs只須要change master to new_host,可是在每臺機器都要執行 服務器
因此咱們使用mysql自帶的fail-over,而且提供它提供python API。後期能夠整合到自動運維平臺中去 架構
MySQL Utilities https://dev.mysql.com/downloads/utilities/ 運維
##maintaining and administering MySQL servers ide
Connector/Python https://dev.mysql.com/downloads/connector/python/ post
## a standardized database driver for Python platforms and development
yum install mysql-connector-python-2.1.3-1.el6.x86_64.rpm mysql-utilities-1.5.6-1.el6.noarch.rpm -y
環境準備
monitor server1 192.168.88.121 ##監控最好有獨立的服務器
master server2 192.168.88.122
slave server3 192.168.88.123
slave server4 192.168.88.124
監控機須要鏈接到MS上,獲取運行狀態
受權: 基本的:super, replication,slave,reload,
有些時候,當多個程序運行mysql failover,##監控避免單點
create,insert,drop,select (--force不然failed,一旦出錯就會中止複製)
grant create,insert,drop,select,super,replication slave,reload on *.* to repm@192.168.88.121 identified by '123' with grant option;
檢測受權是否成功
show grants for 'repm'@'192.168.88.121'
在monitor測試mysql -urepmon -predhat -h 192.168.88.122
配置文件
##刪除skip-slave-start
+++增長配置
#add fail-over
report-host=本身IP ##向監控端報告本身的IP
master-info-repository=table ##將主機信息保存在表中
relay-log-info-repository=table ##將中繼信息保存在表中
+++
將相應的replication配置的緩存文件保存到數據表中,通常的狀況下,slave它的master的相關信息以及複製當前的信息保存在master.info和relay-log.info,用處:在從新啓動mysqld,mysql將自動啓動slave,而主機的信息和複製的信息就經過這兩個文件中的信息來獲取
若是想自動化監控複製和切換,故障出現,就得從新指定master和binlog,position,若是保存在文件中的話,可能監控端須要相關的權限操做文件,因此能夠在mysql的表中,這樣修改的,也能夠實時生效
注意:若是把master和relay-info保存在mysql的表,mysql鎖建立的表是Myisam表,可是官方建議使用Innodb存儲引擎,5.6以後呢默認時innodb,避免Myisam的自動修復功能
修改完成重啓mysqld。
注意下mysql數據庫中slave_master_info slave_relay_log_info兩張表
mysqlfailover --master=repmon:redhat@192.168.88.122 --discover-slaves-login=repmon:redhat
--master指定M,後接"用戶名:密碼@host"
--discover-slaves-login自動發現slave。後接鏈接slave的用戶名和密碼
--log=file.log ##指定日誌
--failover-mode ##auto(default,沒有slave可選就退出),elect(在制定的slave選取),fail(用於監控,沒有failover)
#####
GTID Executed Set
c09756b8-a7e7-11e5-9468-000c29df5442:1-24
WARNING: Errant transaction(s) found on slave(s).
Replication Health Status
+-----------------+-------+---------+--------+------------+---------+
| host | port | role | state | gtid_mode | health |
+-----------------+-------+---------+--------+------------+---------+
| 192.168.88.122 | 3306 | MASTER | UP | ON | OK |
| 192.168.88.123 | 3306 | SLAVE | UP | ON | OK |
| 192.168.88.124 | 3306 | SLAVE | UP | ON | OK |
+-----------------+-------+---------+--------+------------+---------+
#####
如今測試功能
停掉master,看slave是否接管master,並調整架構
/etc/init.d/mysqld stop
下面是monitor上的調整信息
Failed to reconnect to the master after 3 attemps.
Failover starting in 'auto' mode...
# Candidate slave 192.168.88.123:3306 will become the new master.
# Checking slaves status (before failover).
# Preparing candidate for failover.
# Creating replication user if it does not exist.
# ERROR: ERROR: Cannot grant replication slave to replication user.
# Stopping slaves.
# Performing STOP on all slaves.
# Switching slaves to new master.
# Disconnecting new master as slave.
# Starting slaves.
# Performing START on all slaves.
# Checking slaves for errors.
# Failover complete.
# Discovering slaves for master at 192.168.88.123:3306
######新的架構
b89f9be8-a8af-11e5-9980-000c29ccacd8:1-2 [...]
Transactions executed on the servers:
+-----------------+-------+---------+--------+------------+---------+
| host | port | role | state | gtid_mode | health |
+-----------------+-------+---------+--------+------------+---------+
| 192.168.88.123 | 3306 | MASTER | UP | ON | OK |
| 192.168.88.124 | 3306 | SLAVE | UP | ON | OK |
+-----------------+-------+---------+--------+------------+---------+
####
在新的master(server3)上測試插入以後數據時候同步
可是當原來的master(server2) 恢復會正常的時候,mysql failover是不可以自動發現,並調整爲原來的架構的。
因此要把master添加到集羣,只能手動的調整
> change master to
> master_host='192.168.88.123',
> master_user='rep',
> master_password='redhat',
> master_auto_position=1;
此時監控端又能夠檢測到server2了