搭建 MySQL 主從服務

最近生產環境的 MySQL 主從出現了問題,所以需要在測試環境下進行方案的驗證,順便整理下這篇文章,以便後來人可以少走彎路。此次搭建使用的環境如下:

  • 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服務

  1. 將下載好的 MySQL安裝包上傳到服務器執行目錄下,然後執行以下命令進行安裝.
bash > rpm -i mysql-community-server-5.7.25-1.el7.x86_64.rpm

安裝過程中可能會出現 mariadb 已存在的問題,需要執行以下命令卸載 mariadb 之後執行 mysql 的安裝

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

配置 MySQL 主庫

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

配置 MySQL 從庫

如果主庫數據不爲空可使用mysqldump將之前備份的數據導入到數據庫中。

bash > mysql -h master < fulldb.dump
  1. 在 my.cnf (默認位於 etc 文件夾下)中添加如下配置後重啓 mysql 服務
# 默認爲0,表示拒絕所有同步訪問
server-id=1
  1. 配置主從同步主庫信息
# MASTER_HOST: 主庫 IP 地址
# MASTER_USER: 之前在主庫上創建的用來同步的用戶及密碼
# MASTER_PASSWORD: 之前在主庫上創建的用來同步的用戶及密碼
# MASTER_LOG_FILE: 之前通過 show master status 記錄的主庫文件名
# MASTER_LOG_POS: 之前通過 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. 啓動主動同步
mysql > start slave status;

4.查看 slave 狀態,如果 Slave_IO_Running 和 Slave_SQL_Running 都顯示爲 YES,表示配置成功

mysql > show slave status\G;

測試同步信息

  1. 在主庫做部分修改,此處創建了一個新的數據庫
mysql > create dababase test_slave;

2.在從庫中查看是否存在之前新增的數據庫

mysql > show databases;

配置雙主架構

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

  1. 因此部分可能造成主備機概念混亂,約定之前操作的主庫爲 server01,從庫爲 server02
  2. 在 server01 和 server02 上添加以下配置
log-bin=mysql-bin
# 當一臺服務器同時作爲主庫和從庫時需要添加此參數
log-slave-updates=true
  1. 登錄 server02 的 mysql 後創建主從用戶並賦予其對應的權限,此處需要填寫的IP應該爲 server01 的IP,因爲配置雙主的過程中,服務器的主備關係顛倒了。
bash > mysql -uroot -p
mysql > CREATE USER '自定義用戶名'@'備機IP' IDENTIFIED BY '自定義密碼';
mysql > GRANT REPLICATION SLAVE ON *.* TO '自定義用戶名'@'備機IP';

3.鎖定 server01 和 server02 的數據庫表,保證數據不再寫入。

mysql > FLUSH TABLES WITH READ LOCK;
  1. 查看 server02 的主機狀態並記錄日誌文件名(File)及同步位置(Position)。
mysql > SHOW MASTER STATUS;
  1. 在 server01 添加主庫配置,具體內容明細請參考本文檔之前的說明。
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.開放 server02 上的 3306 端口。

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

7.啓動 server01 上的同步服務。

mysql > start slave;
  1. 解鎖兩臺數據庫表
mysql > UNLOCK TABLES;
  1. 至此 mysql 的雙主架構就配置完成了,可以分別在兩臺機器上添加一些數據查看其是否可進行同步。另外,此教程中的配置文件只添加了主從需要的部分,生產環境使用時需要添加其他參數進行處理,例如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,根據環境選擇具體參數。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章