搭建 MySQL 主從服務(wù)

最近生產(chǎn)環(huán)境的 MySQL 主從出現(xiàn)了問(wèn)題,所以需要在測(cè)試環(huán)境下進(jìn)行方案的驗(yàn)證,順便整理下這篇文章,以便后來(lái)人可以少走彎路。此次搭建使用的環(huán)境如下:

  • CentOS Linux release 7.5.1804 (Core)
  • mysql-community-server-5.7.25-1.el7.x86_64.rpm
  • mysql-community-client-5.7.25-1.el7.x86_64.rpm
  • mysql-community-common-5.7.25-1.el7.x86_64.rpm
  • mysql-community-libs-5.7.25-1.el7.x86_64.rpm

安裝 MySQL服務(wù)

  1. 將下載好的 MySQL安裝包上傳到服務(wù)器執(zhí)行目錄下,然后執(zhí)行以下命令進(jìn)行安裝.
bash > rpm -i mysql-community-server-5.7.25-1.el7.x86_64.rpm

安裝過(guò)程中可能會(huì)出現(xiàn) mariadb 已存在的問(wèn)題,需要執(zhí)行以下命令卸載 mariadb 之后執(zhí)行 mysql 的安裝

bash > rpm -e --nodeps mariadb-libs-***
  1. 第一次安裝會(huì)提示缺少依賴,按照提示將依賴安裝完成即可,目前遇到的依賴包括以下幾個(gè):
  • perl
  • net-tools
  1. 安裝完成后服務(wù)默認(rèn)是沒(méi)有啟動(dòng)的,執(zhí)行以下命令啟動(dòng)服務(wù).
bash > systemctl start mysqld
  1. 首次安裝完成后 MySQL 會(huì)為 root 用戶默認(rèn)生成一個(gè)密碼并記錄在 mysqld.log 中,通過(guò)以下方式可以找到并進(jìn)行修改.
# 找到密碼
bash > grep 'temporary password' /var/log/mysqld.log
# 使用密碼進(jìn)行登錄
bash > mysql -uroot -p
# 修改 MySQL 默認(rèn)的密碼規(guī)則,否則要求大小寫(xiě)字母、數(shù)字、特殊字符都要有,長(zhǎng)度大于8位
mysql > set global validate_password_policy = 'LOW';
mysql > set global validate_password_length = 1;
# 修改root默認(rèn)密碼
mysql > set password for 'root'@'localhost' = password('root');
  1. 修改密碼后重新登錄 mysql 即可。
  2. 既然是搭建集群,那至少也要兩臺(tái) mysql 服務(wù)器,將上述步驟在另外一臺(tái)機(jī)器上重新執(zhí)行一遍即可。

配置 MySQL 主庫(kù)

  1. 在 my.cnf (默認(rèn)位于 etc 文件夾下)中添加如下配置后重啟 mysql 服務(wù)
log-bin=mysql-bin
# 默認(rèn)為0,表示拒絕所有同步訪問(wèn)
server-id=1
  1. 登錄 mysql 后創(chuàng)建主從用戶并賦予其對(duì)應(yīng)的權(quán)限。
bash > mysql -uroot -p
mysql > CREATE USER '自定義用戶名'@'備機(jī)IP' IDENTIFIED BY '自定義密碼';
mysql > GRANT REPLICATION SLAVE ON *.* TO '自定義用戶名'@'備機(jī)IP';
  1. 鎖定數(shù)據(jù)庫(kù)表,保證數(shù)據(jù)不再寫(xiě)入。
mysql > FLUSH TABLES WITH READ LOCK;
  1. 查看并記錄日志文件名(File)及同步位置(Position)。
mysql > SHOW MASTER STATUS;
  1. 備份數(shù)據(jù)庫(kù)
# 盡可能使用數(shù)據(jù)庫(kù)名代替 all-databases 屬性
bash > mysqldump --all-databases --master-data > dbdump.db
  1. 解鎖數(shù)據(jù)庫(kù)表
mysql > UNLOCK TABLES;
  1. 開(kāi)發(fā)主庫(kù) 3306 端口
bash > firewall-cmd --zone=public --add-port=3306/tcp --permanent
bash > firewall-cmd --reload

配置 MySQL 從庫(kù)

如果主庫(kù)數(shù)據(jù)不為空可使用mysqldump將之前備份的數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫(kù)中。

bash > mysql -h master < fulldb.dump
  1. 在 my.cnf (默認(rèn)位于 etc 文件夾下)中添加如下配置后重啟 mysql 服務(wù)
# 默認(rèn)為0,表示拒絕所有同步訪問(wèn)
server-id=1
  1. 配置主從同步主庫(kù)信息
# MASTER_HOST: 主庫(kù) IP 地址
# MASTER_USER: 之前在主庫(kù)上創(chuàng)建的用來(lái)同步的用戶及密碼
# MASTER_PASSWORD: 之前在主庫(kù)上創(chuàng)建的用來(lái)同步的用戶及密碼
# MASTER_LOG_FILE: 之前通過(guò) show master status 記錄的主庫(kù)文件名
# MASTER_LOG_POS: 之前通過(guò) show master status 記錄的同步位置
mysql > CHANGE MASTER TO MASTER_HOST='192.168.213.129',MASTER_USER='slave',MASTER_PASSWORD='slave',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=625;
  1. 啟動(dòng)主動(dòng)同步
mysql > start slave status;

4.查看 slave 狀態(tài),如果 Slave_IO_Running 和 Slave_SQL_Running 都顯示為 YES,表示配置成功

mysql > show slave status\G;

測(cè)試同步信息

  1. 在主庫(kù)做部分修改,此處創(chuàng)建了一個(gè)新的數(shù)據(jù)庫(kù)
mysql > create dababase test_slave;

2.在從庫(kù)中查看是否存在之前新增的數(shù)據(jù)庫(kù)

mysql > show databases;

配置雙主架構(gòu)

如果沒(méi)有特殊需要,一般服務(wù)器按照之前的配置方法配置主從即可。

  1. 因此部分可能造成主備機(jī)概念混亂,約定之前操作的主庫(kù)為 server01,從庫(kù)為 server02
  2. 在 server01 和 server02 上添加以下配置
log-bin=mysql-bin
# 當(dāng)一臺(tái)服務(wù)器同時(shí)作為主庫(kù)和從庫(kù)時(shí)需要添加此參數(shù)
log-slave-updates=true
  1. 登錄 server02 的 mysql 后創(chuàng)建主從用戶并賦予其對(duì)應(yīng)的權(quán)限,此處需要填寫(xiě)的IP應(yīng)該為 server01 的IP,因?yàn)榕渲秒p主的過(guò)程中,服務(wù)器的主備關(guān)系顛倒了。
bash > mysql -uroot -p
mysql > CREATE USER '自定義用戶名'@'備機(jī)IP' IDENTIFIED BY '自定義密碼';
mysql > GRANT REPLICATION SLAVE ON *.* TO '自定義用戶名'@'備機(jī)IP';

3.鎖定 server01 和 server02 的數(shù)據(jù)庫(kù)表,保證數(shù)據(jù)不再寫(xiě)入。

mysql > FLUSH TABLES WITH READ LOCK;
  1. 查看 server02 的主機(jī)狀態(tài)并記錄日志文件名(File)及同步位置(Position)。
mysql > SHOW MASTER STATUS;
  1. 在 server01 添加主庫(kù)配置,具體內(nèi)容明細(xì)請(qǐng)參考本文檔之前的說(shuō)明。
CHANGE MASTER TO MASTER_HOST='192.168.213.129',MASTER_USER='slave',MASTER_PASSWORD='slave',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=625;

6.開(kāi)放 server02 上的 3306 端口。

bash > firewall-cmd --zone=public --add-port=3306/tcp --permanent
bash > firewall-cmd --reload

7.啟動(dòng) server01 上的同步服務(wù)。

mysql > start slave;
  1. 解鎖兩臺(tái)數(shù)據(jù)庫(kù)表
mysql > UNLOCK TABLES;
  1. 至此 mysql 的雙主架構(gòu)就配置完成了,可以分別在兩臺(tái)機(jī)器上添加一些數(shù)據(jù)查看其是否可進(jìn)行同步。另外,此教程中的配置文件只添加了主從需要的部分,生產(chǎn)環(huán)境使用時(shí)需要添加其他參數(shù)進(jìn)行處理,例如binlog-ignore-db、binlog-do-db、replicate-do-db、replication-ignore-db、gtid-mode等,具體可參考 mysql 官方文檔 16.1.6 Replication and Binary Logging Options and Variables,根據(jù)環(huán)境選擇具體參數(shù)。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 季節(jié)的變換,像一場(chǎng)上達(dá)天地的流感,讓萬(wàn)事萬(wàn)物有了反應(yīng)。就連一向桀驁的人群,也調(diào)整著情緒,服服帖帖地迎接著大自然的安...
    別山舉水閱讀 1,001評(píng)論 7 49
  • 【1】 宮脇咲良將碟片小心翼翼地碼好放進(jìn)不大的紙箱內(nèi),封上箱子的那一刻突然有些后悔,于是把碟片全都倒出來(lái),抽出最下...
    西南君閱讀 510評(píng)論 0 2
  • 躺在床上,喘著氣,腦袋里迸發(fā)出兩年前的幾個(gè)片段,150到170,兩年的積累,怕是化成了血水,堆積在厚厚的脂肪下。我...
    通信兵不尖刀閱讀 185評(píng)論 0 0
  • 媽媽:**(我的小名)今天有沒(méi)有空?。?我:問(wèn)我有沒(méi)有空,干嘛? 媽媽:制啥,我想你啦。(生病之后特別黏我,聽(tīng)爸爸...
    長(zhǎng)安城的納蘭公子閱讀 122評(píng)論 0 0

友情鏈接更多精彩內(nèi)容