mysql 5.5半同步复制_(5.5)mysql高可用系列——MySQL半同步复制(实践)
關(guān)鍵詞,mysql半同步復(fù)制
【0】實(shí)驗(yàn)環(huán)境
操作系統(tǒng):CentOS linux 7.5
數(shù)據(jù)庫(kù)版本:5.7.24
數(shù)據(jù)庫(kù)架構(gòu):主從復(fù)制,主庫(kù)用于生產(chǎn),從庫(kù)用于數(shù)據(jù)容災(zāi)和主庫(kù)備機(jī),采用默認(rèn)傳統(tǒng)的異步復(fù)制。
主庫(kù)IP:192.168.1.201 端口:3306
從庫(kù)IP:192.168.1.202 端口:3306
正文:
【1】配置my.cnf
【1.1】通用復(fù)制配置
#replication_new
log_bin=/mysql/log/3306/mysql-bin #開(kāi)啟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#超過(guò)7天的binlog清理
innodb_support_xa=1binlog_cache_size=1M
log_bin_trust_function_creators=1#同步存儲(chǔ)過(guò)程、函數(shù)、觸發(fā)器
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 會(huì)記錄到 mysql.slave_master_info
relay_log_info_repository=table #relay_log 會(huì)記錄到,mysql.slave_relay_log_info
relay_log_recovery=1slave_skip_errors=ddl_exist_errors
slave_preserve_commit_order=1
【2】半同步復(fù)制配置的2種辦法(5.7)
兩種辦法
【2.1】手動(dòng)安裝半同步復(fù)制插件(在mysql環(huán)境下,主從都安裝)
【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】設(shè)置開(kāi)啟半同步參數(shù)
建議都開(kāi)啟,以免主備切換時(shí)需要重新加;如果分開(kāi),如下圖;
在主庫(kù)上:set global rpl_semi_sync_master_enabled=1;
在從庫(kù)上:set global rpl_semi_sync_slave_enabled=1;
如果異步復(fù)制正在運(yùn)行,需要在從庫(kù)運(yùn)行一下命令 才會(huì)使用半同步;
stop slave io_thread;start slave io_thread;
【step3】檢查狀態(tài)
在主庫(kù)查看半同步狀態(tài):show status like'%rpl_semi%';
圈出第1行表示,連接主庫(kù)的客戶端個(gè)數(shù)。
圈出第2行表示,該實(shí)例做為半同步的主庫(kù)狀態(tài),是on,是開(kāi)啟的。
最后1行,Rpl_semi_sync_slave_status,表示該實(shí)例,作為半同步的從庫(kù)狀態(tài),是off,不是從庫(kù)。
(但是從庫(kù)上進(jìn)行查看時(shí),圖中的 master_status 與 slave_status 應(yīng)該正好相反,作為主庫(kù)是關(guān)閉的,作為從庫(kù)是開(kāi)啟的)
其他重要參數(shù),
Repl_semi_sync_master_yes_tx:表示已經(jīng)同步的事務(wù)數(shù),0表示還沒(méi)有任何一個(gè)事務(wù)以半同步的方式復(fù)制到從庫(kù)
Repl_semi_sync_master_no_tx:假如為3,表示當(dāng)前有3事務(wù)不是半同步模式下從庫(kù)及時(shí)響應(yīng)的(比如可能有網(wǎng)絡(luò)延遲,導(dǎo)致半同步超時(shí)切換成異步)
【2.2】寫(xiě)入配置文件(推薦使用,my.cnf)
show variables like'plugin%'; --查看插件路徑
#修改my.cnf 復(fù)制代碼
#如果已經(jīng)有異步復(fù)制了,也不需要改其他的,只需要把下面參數(shù)加入到my.cnf,重啟mysql服務(wù)即可。
#如果業(yè)務(wù)不允許宕機(jī)重啟實(shí)例,那么可以參考方法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,參數(shù)前面加上loose_,如下列,如果是5.6 則直接使用 rpl_semi_sync_master_enabled=1之類的就好了。
#我這里是5.7就直接做增強(qiáng)半同步了(loseless Semisynchronous )
loose_rpl_semi_sync_master_enabled=1#MySQL開(kāi)啟主的半同步復(fù)制(rpl_semi_sync_master_enabled)
loose_rpl_semi_sync_slave_enabled=1#MySQL5.6開(kāi)啟從的半同步復(fù)制
loose_rpl_semi_sync_master_timeout=5000#超時(shí)5秒,切回異步
rpl_semi_sync_master_wait_for_slave_count=1#至少收到1個(gè)slave發(fā)會(huì)的ack
rpl_semi_sync_master_wait_point=AFTER_SYNC #MySQL 5.7的方法,AFTER_SYNC(default,增強(qiáng)半同步) & AFTER_COMMIT(傳統(tǒng)半同步)
【3】進(jìn)行初始化操作
【3.1】完全同步情況
#【1】在主庫(kù)和從庫(kù)上 準(zhǔn)備復(fù)制賬戶
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】在主庫(kù)上,設(shè)置讀鎖定有效。以便獲取一個(gè)一致性的快照
mysql下操作:(鎖表,獲取一致性)
flush tables with read lock;
#【3】在主庫(kù)上 show master status;獲取主庫(kù)當(dāng)前的二進(jìn)制名和偏移量pos位置。
show master status;-- 查看到的日志名記錄下來(lái),比如:mysql-bin.000002 , postion: 881#【4】備份主庫(kù)還原到從庫(kù)
邏輯方式:mysqldump。然后scp拷貝過(guò)去。然后登錄上從庫(kù)的mysql,直接把dump的文件加載進(jìn)去即可。
物理方式:直接拷貝,備份刪除從庫(kù)原有data目錄,然后把主庫(kù)的data目錄復(fù)制過(guò)去。
復(fù)制到從庫(kù)后記得刪除拷貝過(guò)來(lái)data/下的auto.cnf,否則uuid會(huì)一樣,導(dǎo)致無(wú)法復(fù)制。
不管是物理還是邏輯方式,CP或者mysqldump完后,就都可以解鎖主庫(kù)了
在主庫(kù)的mysql登錄下,使用命令,unlock tables;
【3.2】如果業(yè)務(wù)正在跑,利用備份還原恢復(fù)同步
#【1】在主庫(kù)和從庫(kù)上 準(zhǔn)備復(fù)制賬戶
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,如果備份時(shí)加了--master-data=2參數(shù),是有記錄binlog文件和位置的。
#XtraBackup,也會(huì)復(fù)制Binlog文件和位置信息
#【3】開(kāi)始還原
利用備份去進(jìn)行還原,這個(gè)時(shí)候多半是不一致的,因?yàn)闃I(yè)務(wù)在跑。
這個(gè)時(shí)候利用備份中的binlog 來(lái)做 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】參數(shù)解析
【4.1】show status like '%rpl%'; -- 查看半同步狀態(tài)
主庫(kù):
Variable_name
--------------------------------------------
Rpl_semi_sync_master_clients --已連接到本機(jī)主庫(kù)的客戶端輸了
Rpl_semi_sync_master_net_avg_wait_time ? --平均等待時(shí)間
Rpl_semi_sync_master_net_wait_time --總等待時(shí)間
Rpl_semi_sync_master_net_waits --等待次數(shù)
Rpl_semi_sync_master_no_times --關(guān)閉半同步的次數(shù)
Rpl_semi_sync_master_no_tx ? --沒(méi)有成功同步提交的事務(wù)個(gè)數(shù)
Rpl_semi_sync_master_status --主庫(kù)半同步狀態(tài)(on為打開(kāi)半同步,off為異步)
Rpl_semi_sync_master_timefunc_failures --調(diào)用函數(shù)失敗的次數(shù)
Rpl_semi_sync_master_tx_avg_wait_time --事務(wù)平均等待時(shí)間、平均傳輸時(shí)間
Rpl_semi_sync_master_tx_wait_time --事務(wù)總等待時(shí)間?、總傳輸時(shí)間
Rpl_semi_sync_master_tx_waits --事務(wù)的總等待次數(shù)
Rpl_semi_sync_master_wait_pos_backtraverse -- 后來(lái)的事務(wù)先來(lái)了,先來(lái)的事務(wù)還沒(méi)有到的次數(shù)
Rpl_semi_sync_master_wait_sessions -- 當(dāng)前有多少Session 因?yàn)閟lave 而造成的等待
Rpl_semi_sync_master_yes_tx -- 成功被slave恢復(fù)同步的事務(wù)個(gè)數(shù)
Rpl_semi_sync_slave_status -- 表示當(dāng)前本詞庫(kù)是異步還是半同步(主庫(kù)應(yīng)該為off,從庫(kù)因?yàn)閛n)
【4.2】show variables like '%rpl%'; -- 查看半同步配置參數(shù)
【5】復(fù)制的日常管理
#復(fù)制的日常管理與維護(hù)
(1)show slave status\G :在從庫(kù)查看從庫(kù)線程狀態(tài)
(2)flush tables with read lock;? :主從不一致后鎖表。
然后 show master status\G
然后 show slave status\G 來(lái)查看從庫(kù)同步狀態(tài) 或者重新 change master to....
然后 select master_pos_wait('mysql-bin.00002','389'); (即剛剛show master status找到的文件及位置),如果為1 標(biāo)識(shí)超時(shí)退出 ,如果為1 則標(biāo)識(shí)主從同步。
最后再主庫(kù) unlock tables; 解鎖
(3)跳過(guò)錯(cuò)誤
跳過(guò)錯(cuò)誤有兩種方式:
1.跳過(guò)指定數(shù)量的事務(wù):(建議如果已經(jīng)出現(xiàn)了錯(cuò)誤,使用這種辦法)
mysql>slave stop;
mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1 #跳過(guò)一個(gè)事務(wù)
mysql>slave start
2.修改mysql的配置文件,通過(guò)slave_skip_errors參數(shù)來(lái)跳所有錯(cuò)誤或指定類型的錯(cuò)誤(建議配置時(shí)使用這種辦法)
vi /etc/my.cnf
[mysqld]
#slave-skip-errors=1062,1053,1146 #跳過(guò)指定error no類型的錯(cuò)誤,DDL錯(cuò)誤類型包含 1007,1008,1050,1051,1054,1060,1061,1068,1091,1146(5.6可以用這個(gè))
#slave-skip-errors=ddl_exist_errors #跳過(guò)DDL錯(cuò)誤,all:跳過(guò)所有錯(cuò)誤(mysql5.7才有ddl_exist_errors)
(4)大對(duì)象blog ,text 傳輸
【6】從庫(kù)宕機(jī)如何重新連入主庫(kù)?
1. 此2個(gè)參數(shù)rpl_semi_sync_master_enabled 和rpl_semi_sync_slave_enabled 不要直接寫(xiě)入到my.cnf配置文件開(kāi)啟。
2.在slave庫(kù)上先 stop slave io_thread ;set global rpl_semi_sync_slave_enabled=0 關(guān)閉此參數(shù)。
然后start slave io_thread 或者start slave 開(kāi)啟異步復(fù)制,讓slave庫(kù)追趕上master庫(kù)。
3.然后在slave庫(kù) set global rpl_semi_sync_slave_enabled=1 ;stop slave io_thread;start slave io_thread;
參考文章:
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的mysql 5.5半同步复制_(5.5)mysql高可用系列——MySQL半同步复制(实践)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: bootstrap --- 鼠标停留提
- 下一篇: mysql编译安装后目录空_MySQL源