一、主從介紹
主從複製:主服務器可以讀寫,從服務器可以讀,主服務器寫的時候,從服務器也同步
雙主複製:兩個服務器都是主服務器,都可以讀寫,互相同步,只要有一個寫,另一個就會同步,但必須指定相同主鍵,初始狀態需要相同。
組複製:多個sever(半)同步複製
GTID:不再依賴binlog文件名和文件中的位置,前幾種都需要依賴,且極容易出錯,需要flush logs,但需要5.7之後的版本才支持。
二、GTID
GTID的限制
- 不支持非事務引擎
- 不支持create table ... select 語句複製(主庫直接報錯)
原理:( 會生成兩個sql,一個是DDL創建表SQL,一個是insert into 插入數據的sql。由於DDL會導致自動提交,所以這個sql至少需要兩個GTID,但是GTID模式下,只能給這個sql生成一個GTID ) - 不允許一個SQL同時更新一個事務引擎表和非事務引擎表
- 在一個複製組中,必須要求統一開啓GTID或者是關閉GTID
- 開啓GTID需要重啓(5.7除外)
- 開啓GTID後,就不再使用原來的傳統複製方式
- 對於create temporary table 和 drop temporary table語句不支持
- 不支持sql_slave_skip_counter
- 從傳統複製模式轉爲GTID模式比較麻煩(不建議轉換,如需轉換,建議重新搭建)
三、配置流程
以(1.1.1.1的train這個數據庫)和(1.1.1.2的test這個數據庫)爲例。希望train和test這兩個庫配爲雙主模式,即一個更新,另一個會同步更新。
1、初始狀態需要保持兩個庫一致
這裏1爲空庫,2爲有數據的庫,需要先將2備份,並在1上restore。
鎖住數據庫,備份數據庫
2上:mysqldump -h 1.1.1.1 -u user -ppassward test> ./test.sql
mysqldump -h 1.1.1.1 -u user -ppassward train> ./train.sql
1上:mysql -u user -ppassward test<./test.sql
mysql -u user -ppassward train<./train.sql
2、設置bin_log保存的數據庫
bin_log是用戶記錄用戶對於數據庫的修改操作的日誌,在進行雙主同步的時候,也是依據log進行同步。設置完成之後需要重啓mysql的服務。
在兩臺服務器中分別修改:
在mysqlld.cnf(/etc/mysql/mysql.conf.d)中修改binlog_do_db=databse(需要同步的數據庫)
重啓mysql: sudo service mysql restart
3、配置自增長量、server_id等
需要注意每個server的server_id需要不一樣
自增長的變量需要設置爲2(auto_increment_increment)
自動起始id需要不一樣(auto_increment_offset)
master1設置:
SET GLOBAL auto_increment_offset=1;
SET GLOBAL auto_increment_increment=2;
SET GLOBAL server_id=1;
配置完成後使用show global variables like 'server%';show global variables like 'aut%';查看配置情況
master2設置:
SET GLOBAL auto_increment_offset=2;
SET GLOBAL auto_increment_increment=2;
SET GLOBAL server_id=2;
配置完成後使用show global variables like 'server%';show global variables like 'aut%';查看配置情況
4、新建同步用戶
在mater1和master2上分別新建同一個用戶,並授權同步
grant all privileges on *.* to 'user'@'%' identified by 'password';
flush privileges
5、配置GTID
1)檢查value是否爲0 >> SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT';
用於確認在各個實例節點上執行如下命令檢查匿名事務是否消耗完畢
2)檢查是否開啓gitd >> show variables like '%gt%'; gtid模式一定要開啓gtid_mode、enforce_gtid_consistency
set global ENFORCE_GTID_CONSISTENCY = ON;
set global GTID_MODE =OFF_PERMISSIVE;
set global GTID_MODE =ON_PERMISSIVE;
set global GTID_MODE =ON;
3)重複檢查value
SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT';
4)如果從庫之前有過當主從的情況,或者不是新搭建環境的情況,那麼還需要執行reset master語句來重置一下master,否則出錯
reset master; reset之後需要exit,重新登錄mysql
5)配置master host等,指定數據庫
在master1上:
change master to master_host='1.1.1.2', master_user='user', master_password='password', master_port=3306, master_auto_position=1;
CHANGE REPLICATION FILTER Replicate_Wild_Do_Table=('train.%','test.%');
在master2上:
change master to master_host='1.1.1.1', master_user='user', master_password='password', master_port=3306, master_auto_position=1;
CHANGE REPLICATION FILTER Replicate_Wild_Do_Table=('train.%','test.%');
6)開啓服務
start slave;
7)驗證
show slave status\G
都爲yes的時候,即成功
四、keepalived
心跳檢測,適用於一主一從的場景,或者雙主但是一個master有寫權限的場景,當master出現故障的時候,可以實時監控到,並將從服務器設置爲master,實現自動故障切換。
五、zabbix實時監控mysql狀態
開啓服務
sudo systemctl start zabbix-agent
sudo systemctl restart zabbix-agent.service
sudo systemctl restart zabbix-server
sudo systemctl restart apache2
在/etc/zabbix/zabbix_agentd.conf 中配置監控語句:
UserParameter=mysql_repl_check,mysql -uroot -ppassward -e "show slave status\G" 2>/dev/null | grep -E 'Slave_IO_Running: Yes|Slave_SQL_Running: Yes' | grep -c Yes
當值爲2是爲同步正常,<2失敗