mysql 5.5半同步复制_(5.5)mysql高可用系列——MySQL半同步复制(实践)
關鍵詞,mysql半同步復制
【0】實驗環境
操作系統:CentOS linux 7.5
數據庫版本:5.7.24
數據庫架構:主從復制,主庫用于生產,從庫用于數據容災和主庫備機,采用默認傳統的異步復制。
主庫IP:192.168.1.201 端口:3306
從庫IP:192.168.1.202 端口:3306
正文:
【1】配置my.cnf
【1.1】通用復制配置
#replication_new
log_bin=/mysql/log/3306/mysql-bin #開啟binlog
log_bin_index=/mysql/log/3306/mysql-bin.index
binlog_format=row
binlog_rows_query_log_events=on
max_binlog_size=2048bind-address=0.0.0.0server_id=2013306expire_logs_days=7#超過7天的binlog清理
innodb_support_xa=1binlog_cache_size=1M
log_bin_trust_function_creators=1#同步存儲過程、函數、觸發器
innodb_flush_log_at_trx_commit=1sync_binlog=1transaction-isolation=read-committed
relay_log=/mysql/log/3306/relaylog/mysql-relay.log
log-slave-updates=1read_only=1slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=4master_info_repository=table #master_info 會記錄到 mysql.slave_master_info
relay_log_info_repository=table #relay_log 會記錄到,mysql.slave_relay_log_info
relay_log_recovery=1slave_skip_errors=ddl_exist_errors
slave_preserve_commit_order=1
【2】半同步復制配置的2種辦法(5.7)
兩種辦法
【2.1】手動安裝半同步復制插件(在mysql環境下,主從都安裝)
【step1】安裝半同步插件install plugin rpl_semi_sync_master soname 'semisync_master.so';install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
show plugins;-- 查看插件安裝情況 or select *from mysql.plugin;
【step2】設置開啟半同步參數
建議都開啟,以免主備切換時需要重新加;如果分開,如下圖;
在主庫上:set global rpl_semi_sync_master_enabled=1;
在從庫上:set global rpl_semi_sync_slave_enabled=1;
如果異步復制正在運行,需要在從庫運行一下命令 才會使用半同步;
stop slave io_thread;start slave io_thread;
【step3】檢查狀態
在主庫查看半同步狀態:show status like'%rpl_semi%';
圈出第1行表示,連接主庫的客戶端個數。
圈出第2行表示,該實例做為半同步的主庫狀態,是on,是開啟的。
最后1行,Rpl_semi_sync_slave_status,表示該實例,作為半同步的從庫狀態,是off,不是從庫。
(但是從庫上進行查看時,圖中的 master_status 與 slave_status 應該正好相反,作為主庫是關閉的,作為從庫是開啟的)
其他重要參數,
Repl_semi_sync_master_yes_tx:表示已經同步的事務數,0表示還沒有任何一個事務以半同步的方式復制到從庫
Repl_semi_sync_master_no_tx:假如為3,表示當前有3事務不是半同步模式下從庫及時響應的(比如可能有網絡延遲,導致半同步超時切換成異步)
【2.2】寫入配置文件(推薦使用,my.cnf)
show variables like'plugin%'; --查看插件路徑
#修改my.cnf 復制代碼
#如果已經有異步復制了,也不需要改其他的,只需要把下面參數加入到my.cnf,重啟mysql服務即可。
#如果業務不允許宕機重啟實例,那么可以參考方法1,并且把該段代碼加上,就可以直接用了。
plugin_dir=/mysql/app/mysql/lib/plugin/plugin_load=rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so
#如果是5.7,參數前面加上loose_,如下列,如果是5.6 則直接使用 rpl_semi_sync_master_enabled=1之類的就好了。
#我這里是5.7就直接做增強半同步了(loseless Semisynchronous )
loose_rpl_semi_sync_master_enabled=1#MySQL開啟主的半同步復制(rpl_semi_sync_master_enabled)
loose_rpl_semi_sync_slave_enabled=1#MySQL5.6開啟從的半同步復制
loose_rpl_semi_sync_master_timeout=5000#超時5秒,切回異步
rpl_semi_sync_master_wait_for_slave_count=1#至少收到1個slave發會的ack
rpl_semi_sync_master_wait_point=AFTER_SYNC #MySQL 5.7的方法,AFTER_SYNC(default,增強半同步) & AFTER_COMMIT(傳統半同步)
【3】進行初始化操作
【3.1】完全同步情況
#【1】在主庫和從庫上 準備復制賬戶
create user 'rpl'@'192.168.1.%' identified by '123456';
grant replication slave on *.* to 'rpl'@'192.168.1.%';
flush privileges;
select user,host from mysql.user;
#【2】在主庫上,設置讀鎖定有效。以便獲取一個一致性的快照
mysql下操作:(鎖表,獲取一致性)
flush tables with read lock;
#【3】在主庫上 show master status;獲取主庫當前的二進制名和偏移量pos位置。
show master status;-- 查看到的日志名記錄下來,比如:mysql-bin.000002 , postion: 881#【4】備份主庫還原到從庫
邏輯方式:mysqldump。然后scp拷貝過去。然后登錄上從庫的mysql,直接把dump的文件加載進去即可。
物理方式:直接拷貝,備份刪除從庫原有data目錄,然后把主庫的data目錄復制過去。
復制到從庫后記得刪除拷貝過來data/下的auto.cnf,否則uuid會一樣,導致無法復制。
不管是物理還是邏輯方式,CP或者mysqldump完后,就都可以解鎖主庫了
在主庫的mysql登錄下,使用命令,unlock tables;
【3.2】如果業務正在跑,利用備份還原恢復同步
#【1】在主庫和從庫上 準備復制賬戶
create user'rpl'@'192.168.1.%' identified by '123456';
grant replication slave on*.* to 'rpl'@'192.168.1.%';
flush privileges;selectuser,host from mysql.user;
#【2】利用備份
#mysqldump,如果備份時加了--master-data=2參數,是有記錄binlog文件和位置的。
#XtraBackup,也會復制Binlog文件和位置信息
#【3】開始還原
利用備份去進行還原,這個時候多半是不一致的,因為業務在跑。
這個時候利用備份中的binlog 來做 change master to
#【4】change master to 示例
change master to
master_host='192.168.1.201',
master_port=3306,
master_user='rep',
master_password='123456',
master_log_file='mysql-bin.000002',
master_log_pos=154;
【4】參數解析
【4.1】show status like '%rpl%'; -- 查看半同步狀態
主庫:
Variable_name
--------------------------------------------
Rpl_semi_sync_master_clients --已連接到本機主庫的客戶端輸了
Rpl_semi_sync_master_net_avg_wait_time ? --平均等待時間
Rpl_semi_sync_master_net_wait_time --總等待時間
Rpl_semi_sync_master_net_waits --等待次數
Rpl_semi_sync_master_no_times --關閉半同步的次數
Rpl_semi_sync_master_no_tx ? --沒有成功同步提交的事務個數
Rpl_semi_sync_master_status --主庫半同步狀態(on為打開半同步,off為異步)
Rpl_semi_sync_master_timefunc_failures --調用函數失敗的次數
Rpl_semi_sync_master_tx_avg_wait_time --事務平均等待時間、平均傳輸時間
Rpl_semi_sync_master_tx_wait_time --事務總等待時間?、總傳輸時間
Rpl_semi_sync_master_tx_waits --事務的總等待次數
Rpl_semi_sync_master_wait_pos_backtraverse -- 后來的事務先來了,先來的事務還沒有到的次數
Rpl_semi_sync_master_wait_sessions -- 當前有多少Session 因為slave 而造成的等待
Rpl_semi_sync_master_yes_tx -- 成功被slave恢復同步的事務個數
Rpl_semi_sync_slave_status -- 表示當前本詞庫是異步還是半同步(主庫應該為off,從庫因為on)
【4.2】show variables like '%rpl%'; -- 查看半同步配置參數
【5】復制的日常管理
#復制的日常管理與維護
(1)show slave status\G :在從庫查看從庫線程狀態
(2)flush tables with read lock;? :主從不一致后鎖表。
然后 show master status\G
然后 show slave status\G 來查看從庫同步狀態 或者重新 change master to....
然后 select master_pos_wait('mysql-bin.00002','389'); (即剛剛show master status找到的文件及位置),如果為1 標識超時退出 ,如果為1 則標識主從同步。
最后再主庫 unlock tables; 解鎖
(3)跳過錯誤
跳過錯誤有兩種方式:
1.跳過指定數量的事務:(建議如果已經出現了錯誤,使用這種辦法)
mysql>slave stop;
mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1 #跳過一個事務
mysql>slave start
2.修改mysql的配置文件,通過slave_skip_errors參數來跳所有錯誤或指定類型的錯誤(建議配置時使用這種辦法)
vi /etc/my.cnf
[mysqld]
#slave-skip-errors=1062,1053,1146 #跳過指定error no類型的錯誤,DDL錯誤類型包含 1007,1008,1050,1051,1054,1060,1061,1068,1091,1146(5.6可以用這個)
#slave-skip-errors=ddl_exist_errors #跳過DDL錯誤,all:跳過所有錯誤(mysql5.7才有ddl_exist_errors)
(4)大對象blog ,text 傳輸
【6】從庫宕機如何重新連入主庫?
1. 此2個參數rpl_semi_sync_master_enabled 和rpl_semi_sync_slave_enabled 不要直接寫入到my.cnf配置文件開啟。
2.在slave庫上先 stop slave io_thread ;set global rpl_semi_sync_slave_enabled=0 關閉此參數。
然后start slave io_thread 或者start slave 開啟異步復制,讓slave庫追趕上master庫。
3.然后在slave庫 set global rpl_semi_sync_slave_enabled=1 ;stop slave io_thread;start slave io_thread;
參考文章:
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的mysql 5.5半同步复制_(5.5)mysql高可用系列——MySQL半同步复制(实践)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bootstrap --- 鼠标停留提
- 下一篇: html5 --- 特性检测