摘要:配置主庫和備庫。主庫當(dāng)前的二進(jìn)制日志文件,和獲得數(shù)據(jù)快照時(shí)在該二進(jìn)制日志文件中的偏移量。它能夠在備份時(shí)不阻塞服務(wù)器的操作,因此可以在不影響主庫的情況下設(shè)置備庫。
正所謂理論造航母,現(xiàn)實(shí)小帆船。單有理論,不動(dòng)手實(shí)踐,學(xué)到的知識猶如空中樓閣。接下來,我們一起來看下如何一步步進(jìn)行 MySQL Replication 的配置。
為 MySQL 服務(wù)器配置復(fù)制非常簡單。但由于場景不同,基本的步驟還是有所差異。最基本的場景是新安裝主庫和備庫,總得來說分為以下幾步:
在每臺服務(wù)器上創(chuàng)建復(fù)制賬號。
配置主庫和備庫。
通知備庫連接到主庫并從主庫復(fù)制數(shù)據(jù)。
此外,由于主備部署需要多臺服務(wù)器,但是這種要求對大多數(shù)人來說并不怎么友好,畢竟沒有必要為了學(xué)習(xí)部署主備結(jié)構(gòu),多買個(gè)云服務(wù)器。因此,為了測試方便,我們通過 docker 容器技術(shù)在同臺機(jī)器上部署多個(gè)容器,從而實(shí)現(xiàn)在一臺機(jī)器上部署主備結(jié)構(gòu)。
這里我們先假定大部分配置采用默認(rèn)值,在主庫和備庫都是全新安裝并且擁有同樣的數(shù)據(jù)。接下來,我們將展示如何通過 docker 技術(shù)一步步進(jìn)行復(fù)制配置。
此外,我們將推薦一些“安全配置”,以便在不清楚如何配置時(shí),確保數(shù)據(jù)的安全。
1 部署 docker 環(huán)境1) 部署 docker
什么?docker 還沒部署?趕緊參考這里配一個(gè),docker 都沒玩,怎么和面試官吹水呀!
2) 拉取 MySQL 鏡像
docker pull mysql:5.7
3) 使用 mysql 鏡像啟動(dòng)容器
docker run -p 3339:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 # 啟動(dòng) master 容器 docker run -p 3340:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 # 啟動(dòng) slave 容器
master 對外的端口是 3339,slave 對外的端口是 3340,我們在使用客戶端連接要使用對應(yīng)的端口連接對應(yīng) mysql。
4) 使用命令查看正在運(yùn)行的容器
docker ps
5) 使用客戶端連接工具測試麗連接 mysql
2 配置 Master 和 Slave1) 配置 master
通過以下命令進(jìn)入容器內(nèi)部
docker exec -it mysql-master /bin/bash
a) 更新 apt-get 源
apt-get update
b) 安裝 vim
apt-get install vim
c) 配置 my.cnf
vim /etc/mysql/my.cnf // 在my.cnf 中添加如下配置 [mysqld] server-id=110 # 服務(wù)器 id,同一局域網(wǎng)內(nèi)唯一 log-bin=/var/lib/mysql/mysql-bin # 二進(jìn)制日志路徑
d) 重啟 mysql 服務(wù)使配置生效
service mysql restart
e) 啟動(dòng)容器
重啟 mysql 服務(wù)時(shí)會(huì)使得 docker 容器停止,需要重啟容器。
docker start mysql-master
f) 創(chuàng)建數(shù)據(jù)同步用戶并授權(quán)
CREATE USER "slave"@"%" IDENTIFIED BY "123456"; GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO "slave"@"%";
2) 配置 slave
通過以下命令進(jìn)入容器內(nèi)部
docker exec -it mysql-slave /bin/bash
a) 配置 my.cnf
vim /etc/mysql/my.cnf // 在my.cnf 中添加如下配置 [mysqld] server-id=120 # 服務(wù)器 id,同一局域網(wǎng)內(nèi)唯一 log-bin=/var/lib/mysql/mysql-bin # 二進(jìn)制日志路徑 relay_log=/path/to/logs/relay-bin # 中繼日志路徑
3) 關(guān)聯(lián) master 和 slave
配置完 master 和 slave,接下來就要讓 master 和 slave 相關(guān)聯(lián)。
回到我們的服務(wù)器,先找出 master 和 slave 容器的 IP,執(zhí)行:
docker inspect --format="{{.NetworkSettings.IPAddress}}" mysql-master
因此,我們知道了 mysql-master 容器的 IP 是:172.17.0.3。同樣的方法,mysq-slave 容器的 IP 是:172.17.0.4。記住這兩個(gè)值,后面的配置需要用到。
我們首先配置 master。在 master 容器內(nèi)通過 mysql -u root -p 進(jìn)入 MySQL 命令行,執(zhí)行 show master status;
上圖中,F(xiàn)ile 和 Position 字段對應(yīng)的值要記錄下來,后續(xù)在 slave 配置時(shí)需要用到這兩個(gè)值。要注意的是,記錄完這兩個(gè)值后,就不能在 master 庫上做任何操作,否則會(huì)出現(xiàn)數(shù)據(jù)不同步的情況。
接下來配置 slave,同樣的,在 slave 上進(jìn)入 MySQL 命令行。然后執(zhí)行下面語句:
change master to master_host="172.17.0.3", master_user="slave", master_password="123456", master_port=3306, master_log_file="mysql-bin.000001", master_log_pos=42852, master_connect_retry=30;
change master to 是 slave 配置 master 的命令,相關(guān)參數(shù)含義如下:
master_host:master 的IP,就是我們上面獲取的 IP 地址
master_port:master 的端口號,也就是我們 master mysql 的端口號
master_user:進(jìn)行數(shù)據(jù)同步的用戶
master_password:同步用戶的密碼
master_log_file:指定 slave 從 master 的哪個(gè)日志文件開始復(fù)制數(shù)據(jù),也就是我們上面提到的 File 字段的值
master_log_pos:從 master 日志文件的那個(gè)位置開始讀,上面提到的 Position 字段的值
master_connect_retry:重試時(shí)間間隔。單位是秒,默認(rèn) 60
3 啟動(dòng)復(fù)制配置完 slave 后,可以通過 show slave statusG; 查看 slave 的狀態(tài)。
![slave 狀態(tài)]](/img/bVbqPxZ)
正常情況下,剛配置完 slave 的 Slave_IO_Running 和 Slave_SQL_Runing 都是 NO,因?yàn)槲覀冞€沒開啟主從復(fù)制。使用 start slave 開啟主從復(fù)制,然后再查下 slave 狀態(tài)。
slave 的 Slave_IO_Running 和 Slave_SQL_Runing 都是 YES,說明主從復(fù)制已成功啟動(dòng)。此時(shí),可以通過客戶端能否成功復(fù)制數(shù)據(jù)。
我們在 master 新建 replication 庫,然后觀察 slave 庫是否創(chuàng)建了 replication 庫,如下圖,表示復(fù)制成功。
另外,開啟主從復(fù)制后,如果出現(xiàn)以下情況:
Slave_IO_Running: CONNECTING Slave_SQL_RUNNING: Yes
表示開啟主從復(fù)制后, slave 的 IO 進(jìn)程連接 master 出現(xiàn)問題,一直在重試連接。我們可以根據(jù) Last_IO_Error 的提示進(jìn)行解決:
網(wǎng)絡(luò)不通。檢查 IP、port。
密碼錯(cuò)誤。檢查配置的同步用戶和密碼是否正確。
pos 錯(cuò)誤。檢查 slave 配置的 Position 的值 與 master 是否一致。
4 從另一個(gè)服務(wù)器開始復(fù)制前面的設(shè)置都是假定主備庫均為剛剛安裝好且都是默認(rèn)的數(shù)據(jù),也就是說兩臺服務(wù)器上數(shù)據(jù)相同,并且知道當(dāng)前主庫的二進(jìn)制日志。但在實(shí)際環(huán)境中,大多數(shù)情況下是有一個(gè)一級運(yùn)行了一段時(shí)間的主庫,然后用一臺新安裝的備庫與之同步,此時(shí)這臺備庫還沒有數(shù)據(jù)。
有幾種方法來初始化備庫或者從其他服務(wù)器克隆數(shù)據(jù)到備庫。包括從主庫復(fù)制數(shù)據(jù)、從另外一臺備庫克隆數(shù)據(jù),以及使用最近的一次備份來啟動(dòng)備庫等。而這些方法都需要有三個(gè)條件來讓主庫與備庫保持同步:
在某個(gè)時(shí)間點(diǎn)的主庫的數(shù)據(jù)快照。
主庫當(dāng)前的二進(jìn)制日志文件,和獲得數(shù)據(jù)快照時(shí)在該二進(jìn)制日志文件中的偏移量。我們把這兩個(gè)值稱為日志文件坐標(biāo)(log file coordinates)。通過這兩個(gè)值可以確定二進(jìn)制日志的位置。可以通過 SHOW MASTER STATUS 命令來獲取這些值。
從快照時(shí)間到現(xiàn)在的二進(jìn)制日志。
下面是一些從別的服務(wù)器克隆備庫的方法:
使用冷備份。最基本的方法是關(guān)閉主庫,把數(shù)據(jù)復(fù)制到備庫。重啟主庫后,會(huì)使用一個(gè)新的二進(jìn)制日志文件,我們在備庫通過執(zhí)行 CHANGE MASTER TO 指向這個(gè)文件的起始處。不過這個(gè)方法的缺點(diǎn)很明顯:在復(fù)制數(shù)據(jù)時(shí)需要關(guān)閉主庫。
使用熱備份。如果僅使用了 MyISAM 表,可以在主庫運(yùn)行時(shí)使用 mysqlhotcopy 或 rsync 來復(fù)制數(shù)據(jù)。
使用 mysqldump。如果只包含 InnoDB 表,可以使用以下命令來轉(zhuǎn)儲(chǔ)主庫數(shù)據(jù)并將其加載到備庫,然后設(shè)置相應(yīng)的二進(jìn)制日志坐標(biāo):mysqldump --single-transaction --all-databases --master-data=1 --host=server1 | mysql --host=server2。選項(xiàng) --single-transaction 使得轉(zhuǎn)儲(chǔ)的數(shù)據(jù)為事務(wù)開始前的數(shù)據(jù)。如果使用的是非事務(wù)型表,可以使用 --lock-all-tables 選項(xiàng)來獲得所有表的一致性轉(zhuǎn)儲(chǔ)。
使用快照或備份。只要知道對應(yīng)的二進(jìn)制日志坐標(biāo),就可以使用主庫的快照或者備份來初始化備庫。(如果使用備份,需要確保從備份的時(shí)間點(diǎn)開始的主庫二進(jìn)制日志都要存在)。只需要把備份或快照恢復(fù)到備庫,然后使用 CHANGE MASTER TO 指定二進(jìn)制日志的坐標(biāo)。
使用 Percona Xtrabackup。Percona 的 Xtrabackup 是一款開源的熱備份工具。它能夠在備份時(shí)不阻塞服務(wù)器的操作,因此可以在不影響主庫的情況下設(shè)置備庫。可以通過克隆主庫或另一個(gè)已存在的備庫的方式來建立備庫。
使用另外的備庫。可以使用任何一種克隆或拷貝技術(shù)從任意一臺備庫上將數(shù)據(jù)克隆到另外一臺服務(wù)器。但是如果使用的是 mysqldump,--master-data 選項(xiàng)就會(huì)不起作用。此外,不能使用 SHOW MASTER STATUS 來獲得主庫的二進(jìn)制日志坐標(biāo),而是在獲取快照時(shí)使用 SHOW SLAVE STATUS 來獲取備庫在主庫上的執(zhí)行位置。使用另外的備庫進(jìn)行數(shù)據(jù)克隆最大的缺點(diǎn)是,如果這臺備庫的數(shù)據(jù)已經(jīng)和主庫不同步,克隆得到的就是臟數(shù)據(jù)。
5 推薦的復(fù)制配置我們知道,MySQL 的復(fù)制有許多參數(shù)可以控制,其中一些會(huì)對數(shù)據(jù)安全和性能產(chǎn)生影響。這里,我們介紹一種“安全配置”,可以最小化問題發(fā)生的概率。
在主庫上二進(jìn)制日志最重要的選項(xiàng)是 sync_binlog:
sync_binlog=1
如果開啟該選項(xiàng),MySQL 每次在提交事務(wù)前會(huì)將二進(jìn)制日志同步到磁盤上,保證在服務(wù)器崩潰時(shí)不會(huì)丟失時(shí)間。如果禁止該選項(xiàng),服務(wù)器會(huì)少做一些工作,但二進(jìn)制日志文件可能在服務(wù)器崩潰時(shí)損壞或丟失信息。在一個(gè)不需要作為主庫的備庫上 ,該選項(xiàng)會(huì)帶來不必要的開銷。要注意的是,它只適用于二進(jìn)制日志,而非中繼日志。
如果無法接受服務(wù)器崩潰導(dǎo)致表損壞,推薦使用 InnoDB。MyISAM 表在備庫服務(wù)器崩潰重啟后,可能已經(jīng)處于不一致狀態(tài)。
如果使用 InnoDB,推薦設(shè)置如下選項(xiàng):
innodb_flush_logs_at_trx_commit=1 # 每次事務(wù)提交時(shí),將 log buffer 寫入到日志文件并刷新到磁盤。默認(rèn)值為 1 innodb_safe_binlog
明確指定二進(jìn)制日志文件的名稱。當(dāng)服務(wù)器間轉(zhuǎn)移文件、克隆新的備庫、轉(zhuǎn)儲(chǔ)備份或者其他場景下,如果以服務(wù)器名來命名二進(jìn)制日志可能會(huì)導(dǎo)致很多問題。因此,我們需要給 log_bin 選項(xiàng)指定一個(gè)參數(shù)。
log_bin=/var/lib/mysql/mysql-bin
在備庫上,同樣開啟如下培訓(xùn),為中繼日志指定絕對路徑:
relay_log=/path/to/logs/relay-bin skip_slave_start read_only
通過設(shè)置 relay_log 可以避免中繼日志文件基于機(jī)器名來命名,防止之前提到的可能在主庫上發(fā)生的問題。而 skip_slave_start 選項(xiàng)能夠阻止備庫在崩潰后自動(dòng)啟動(dòng)復(fù)制,以留出時(shí)間修復(fù)可能發(fā)生的問題。read_only 選項(xiàng)可以阻止大部分用戶更改非臨時(shí)表。
6 小結(jié)復(fù)制初始化配置三部曲:創(chuàng)建賬號、配置主備庫、備庫連接到主庫開始復(fù)制;
從已有服務(wù)器復(fù)制時(shí),可用熱備份或 mysqldump 命令進(jìn)行備份;
在不確定相關(guān)配置時(shí),選擇最安全的配置準(zhǔn)沒錯(cuò);
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/31175.html
摘要:配置主庫和備庫。主庫當(dāng)前的二進(jìn)制日志文件,和獲得數(shù)據(jù)快照時(shí)在該二進(jìn)制日志文件中的偏移量。它能夠在備份時(shí)不阻塞服務(wù)器的操作,因此可以在不影響主庫的情況下設(shè)置備庫。 showImg(https://segmentfault.com/img/bVbqOEk?w=720&h=480); 正所謂理論造航母,現(xiàn)實(shí)小帆船。單有理論,不動(dòng)手實(shí)踐,學(xué)到的知識猶如空中樓閣。接下來,我們一起來看下如何一步步...
摘要:也就是說線程能夠獨(dú)立于線程之前工作。復(fù)制使用了三個(gè)線程。的日志線程,將事件寫入,的線程獲取,并將其寫入,線程重放日志。 1. 復(fù)制概述 MySQL 內(nèi)置的復(fù)制功能是構(gòu)建基于 MySQL 的大規(guī)模、高性能應(yīng)用的基礎(chǔ),復(fù)制解決的基本問題是讓一臺服務(wù)器的數(shù)據(jù)與其他服務(wù)器保持同步。接下來,我們將從復(fù)制概述及原理、復(fù)制的配置、常見的問題及解決方法來學(xué)習(xí) MySQL 的復(fù)制功能。 1.1 復(fù)制解決...
摘要:也就是說線程能夠獨(dú)立于線程之前工作。復(fù)制使用了三個(gè)線程。的日志線程,將事件寫入,的線程獲取,并將其寫入,線程重放日志。 1. 復(fù)制概述 MySQL 內(nèi)置的復(fù)制功能是構(gòu)建基于 MySQL 的大規(guī)模、高性能應(yīng)用的基礎(chǔ),復(fù)制解決的基本問題是讓一臺服務(wù)器的數(shù)據(jù)與其他服務(wù)器保持同步。接下來,我們將從復(fù)制概述及原理、復(fù)制的配置、常見的問題及解決方法來學(xué)習(xí) MySQL 的復(fù)制功能。 1.1 復(fù)制解決...
閱讀 1682·2021-11-17 09:33
閱讀 3546·2021-11-16 11:40
閱讀 3065·2019-08-30 11:23
閱讀 1058·2019-08-29 16:36
閱讀 2475·2019-08-29 13:23
閱讀 1750·2019-08-29 12:59
閱讀 1554·2019-08-29 12:42
閱讀 1990·2019-08-28 18:22