?
需求場(chǎng)景:因機(jī)器原因Mysql服務(wù)需要遷移到其他機(jī)器夷陋,這個(gè)Mysql服務(wù)所在機(jī)器為A; 此Mysql 版本5.1.73 ;?多個(gè)業(yè)務(wù)在使用這個(gè)Mysql 服務(wù),要求遷移的時(shí)候盡可能不影響服務(wù)骗绕。目前這個(gè)Mysql是一個(gè)單點(diǎn)服務(wù),并無從庫撤缴。
解決方案:mysql router + xtrabackup
基本思想:如下圖所示
使用xtrabackup 軟件對(duì)Mysql A 進(jìn)行一次全量備份刹枉,然后在機(jī)器B上進(jìn)行恢復(fù)并設(shè)置成Mysql A? 的從庫,同時(shí)配置Mysql?C屈呕、Mysql D?為?Mysql?B 的從庫;
使用?Mysql?Router?的 Read-Writer 模式?微宝,將MySQL A 服務(wù)配置在 Mysql B 服務(wù)的前面, 修改Mysql Client 使其從MySQL?Router?服務(wù)讀寫Mysql?
關(guān)閉Mysql A服務(wù)凉袱,讓Mysql B 提供服務(wù)芥吟。
下面介紹具體的操作步驟,此文的Mysql 服務(wù)都部署在 Centos 6.3(x64)?系統(tǒng)上专甩,Mysql A 版本為:5.1.73 ?钟鸵,Mysql B、C涤躲、D 版本為 5.6.X
操作步驟:
1.對(duì)Mysql A進(jìn)行全量備份并恢復(fù)到Mysql B:
安裝xtrabackup(機(jī)器A棺耍、B上)? ?
wget http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpmyum install -y? percona-release-0.1-3.noarch.rpm#percona 的官方源很慢种樱,很大概率會(huì)出現(xiàn)下載失敗,多試幾次就好,下載是自動(dòng)支持?jǐn)帱c(diǎn)重試的yum install -y percona-xtrabackup-20.x86_64
設(shè)置?的mysql 賬號(hào)replication(機(jī)器A),之所以在備份前設(shè)置是因?yàn)镸ysql版本5.1 和5.6?的版本在同步?user不兼容(如果你不需要對(duì)mysql 的系統(tǒng)庫進(jìn)行同步,此步可以在后面進(jìn)行)
#使用有權(quán)限的mysql賬號(hào)(如?root)創(chuàng)建replication 賬號(hào)grant replication slave on *.* to slave@'%'? identified by "123";
全量備份(機(jī)器A)
innobackupex /home/mysql/backups/ --user=root --password=123
恢復(fù)備份(機(jī)器A)
innobackupex --apply-log --use-memory=40G /home/mysql/backups/2019-11-15_20-04-14/
拷貝文件(機(jī)器B)
#使用rsync?從機(jī)器B將通過xtrabackup恢復(fù)好的備份文件同步到機(jī)器B上#rsync?相關(guān)使用方法可以自己baidu或者google,注意這里兩個(gè)目錄的?“/”#這里的hostA為機(jī)器A的hostname或者iprsync?-avz?--progress?hostA:/home/mysql/backups/2019-11-15_20-04-14?~mysqld/backup/#根據(jù)你自己的mysql?配置文件路徑進(jìn)行調(diào)整innobackupex --defaults-file=/etc/mysql/my.cnf --copy-back ~mysqld/backup/2019-11-15_20-04-14/
改變文件屬主(機(jī)器B)
#根據(jù)自己的mysql data 的配置進(jìn)行調(diào)整chown -R mysqld:mysqld ~mysqld/var/lib/mysql
mysql 關(guān)鍵配置項(xiàng)(機(jī)器B)
#server-id?要比機(jī)器A的小纪吮,比機(jī)器C、D上大server-id = 10#開啟二進(jìn)制日志嚼沿,目錄根據(jù)自己的機(jī)器進(jìn)行調(diào)整log-bin=/home/disk2/mysqld_bin_log/mysql-bin#開啟通過replication也產(chǎn)生二進(jìn)制日志的選項(xiàng)攀细,以便機(jī)器C锦担、D上的Mysql可以從機(jī)器B上同步數(shù)據(jù)log_slave_updates=1
啟動(dòng)Mysql服務(wù)(機(jī)器B)
#你的mysql要是通過yum 安裝的可以通過service 方式其他磁椒,否則直使用命令行的方式啟動(dòng)service mysqld start
查看master 相關(guān)信息(機(jī)器B),在后面設(shè)置Mysql B 的從庫需要用到,這個(gè)時(shí)候不要有任何對(duì) Mysql B的寫操作
#登錄mysql 后執(zhí)行show master status ;
#?輸出如下示例,需要記下對(duì)應(yīng)的?log?file?和log?pos?缔恳,開啟replication后會(huì)變化#?mysql-bin.000001??120
查看機(jī)器A上Mysql bin?日志位置
#在備份目錄的xtrabackup_binlog_info?文件中,
cat? ~/mysqld/backup/2019-11-15_20-04-14/xtrabackup_binlog_info
#下面是我這邊的輸出示例腰素,需要根據(jù)自己的文件輸出進(jìn)行配置下面的步驟
# mysql-bin.001150??611640010?
設(shè)置mysql?replication (機(jī)器B)
#登錄mysql?后執(zhí)行洋访,需要有對(duì)應(yīng)權(quán)限扶歪,這個(gè)時(shí)候機(jī)器B上的mysql?用戶和機(jī)器Amysql用戶一致#相關(guān)參數(shù)需要根據(jù)自己的配置進(jìn)行調(diào)整,這里僅僅是示例change?master?to?master_host="hostA",?master_port=3306,?master_user='replication',?master_password='123',?master_log_file='mysql-bin.001150',?master_log_pos=611640010;#啟動(dòng)?replicationstart slave ;#查看replication 的狀態(tài)show?slave?status?\G
若slave status 輸出下面兩個(gè)字段都Yes,說明已經(jīng)開始進(jìn)行Mysql的內(nèi)容同步了桥状,若是有錯(cuò)誤需要根據(jù)錯(cuò)誤提示進(jìn)行排查士飒。
Slave_IO_Running: YesSlave_SQL_Running:?Yes
2. 在機(jī)器C缓苛、D上配置Mysql?B 的從庫:
將之前機(jī)器A的備份文件分別拷貝到機(jī)器C、D徘熔,并分別啟動(dòng)mysql 服務(wù)??(不再命令酷师,參看上面)
設(shè)置replication(機(jī)器C山孔、D), 這里的master_log_file 和 master_log_pos 是從Mysql B 啟動(dòng)的時(shí)候通過 show master?status \G 命令獲取的
#登錄mysql?后執(zhí)行串前,需要有對(duì)應(yīng)權(quán)限坛吁,這個(gè)時(shí)候機(jī)器B上的mysql?用戶和機(jī)器Amysql用戶一致#相關(guān)參數(shù)需要根據(jù)自己的配置進(jìn)行調(diào)整,這里僅僅是示例changemastertomaster_host="hostB",?master_port=3306,?master_user='replication',?master_password='123',?master_log_file='mysql-bin.000001',?master_log_pos=120;#啟動(dòng)?replicationstartslave;#查看replication 的狀態(tài)showslavestatus\G
部署 mysql router:
從mysql 官網(wǎng)(https://dev.mysql.com/downloads/router/)下載 mysql?router?
下面給出mysql router 關(guān)鍵配置項(xiàng)桨武,并啟動(dòng)mysql router
[routing:unit1]bind_address? ? ? ? ? ? ? ? ? ? =0.0.0.0:8563connect_timeout? ? ? ? ? ? ? ? =2#?一定是這個(gè)模式mode????????????????????????????=read-writemax_connections? ? ? ? ? ? ? ? =2000max_connect_errors? ? ? ? ? ? ? =10000client_connect_timeout? ? ? ? ? =2#?需要根據(jù)自己的配置進(jìn)行調(diào)整destinations????????????????????=hostA:portA,hostB:portB
修改所有業(yè)務(wù)訪問mysql A 入口 到 mysql router 入口锈津,并驗(yàn)證可用性
切換Mysql A 到 Mysql B上
確認(rèn)MySQL B?和 Mysql A?同步無延遲
msyql>show slave status \G#查看?Seconds_Behind_Master?字段呀酸,值為0表示同步無延遲
直接關(guān)閉Mysql A服務(wù)
?service?mysqld?stop
關(guān)閉Mysql B 上的replication
msyql>stop slave ;