2023-01-12
主從 主庫 架構 mysql
MySQL集群架構的介紹
我們在使用到MySQL數據庫的時候,只是一個單機的數據庫服務。在實際的生產環境中,數據量可能會非常龐大,這樣單機服務的MySQL在使用的時候,性能會受到影響影響。并且單機服務的MySQL的數據安全性也會受到影響。因此在生產環境中,我們通常搭建MySQL的集群架構,來提高龐大數據量的基礎上的高性能讀寫的需求。
在常見的集群架構中,最常見的就是主從架構(Master-Slaves)
主從架構介紹
MySQL的主從架構,又有一些其他的名稱:主從模式、主從復制等。所謂的主從架構指的是建立多個完全一樣的數據庫,其中一個數據庫作為主庫(主要是用的數據庫),其他的作為從庫(次要的數據庫)。主從架構分為很多種:一主一從、雙主架構、一主多從、多主多從等模式。通常主庫可讀可寫,從庫只讀。
MySQL最常見也是最簡單的主從架構的實現就是主從復制(MySQL Replication)模式,這也是MySQL自帶的功能,無需借助第三方的工具,就可以實現一個主從架構的集群模式。
主從架構相比較于單機服務的MySQL來說,優勢有很多,最常見的優勢就是:寫操作連接主庫,讀操作連接從庫,實現讀寫分離。
主從復制的原理
主從復制是通過重演binlog來實現主庫數據的異步復制。即在主庫上打開binlog記錄每一次的數據庫操作,然后從庫會有一個IO線程,負責跟主庫建立TCP連接,請求主庫將binlog傳輸到從庫。此時主庫上會有一個Log Dump線程,負責通過這個TCP連接吧binlog日志傳輸給從庫的IO線程。接著從庫的IO線程會把讀取到的binlog日志數據寫入自己的中繼日志文件(Relay)中。然后從庫上另外一個SQL線程會讀取中繼日志文件中的操作,進行操作重演,達到還原數據的目的。
1主庫的數據發生了變更,將日志寫入到主庫的binlog中。
2主庫的LogDump線程,將binlog文件傳輸到從庫的IO線程。
3從庫的IO線程將接收到的binlog寫入到relay log中。
4從庫的SQL線程讀取relay log中的日志,并操作重演,將結果同步到從庫中。
MySQL主從復制的實現
環境說明
要實現MySQL的主從架構的搭建,需要滿足以下條件:
●所有節點的MySQL版本必須一致。
●所有節點的時間必須同步。
●所有節點需要啟動binlog服務。
主庫配置
我們需要編輯MySQL配置文件,這個配置文件在不同的操作系統中的位置和名字都不同,需要根據自己的操作系統來查找這個文件:
●Windows: C:\ProgramData\MySQL\MySQL Server 8.0\my.ini
●Linux: /etc/my.cnf
macOS:
dmg安裝: /etc/my.cnf
homebrew安裝:
Intel CPU: /usr/local/homebrew/etc/my.cnf
AppleSilicon CPU: /opt/homebrew/etc/my.cnf
# 在[mysqld]的下方添加或修改如下屬性:
# 服務節點的唯一標識,需要給集群中的每個服務分配一個單獨的ID
server-id=101
# 打開binlog日志,并指定文件名
log_bin=master-bin
# binlog日志文件
log_bin-index=master-bin.index
修改完成之后,需要重啟MySQL服務。
為root用戶分配replication slave的權限:
# 登錄到主庫
mysql -uroot -p
# 為root用戶分配權限
# MySQL8中,需要先添加 'root'@'%' 這個用戶
# create user 'root'@'%' identified by '123456'
mysql> grant replication slave on *.* to 'root'@'%';
mysql> flush privileges;
# 查看主節點同步狀態
mysql> show master status;
# +-------------------+----------+--------------+------------------+-------------------+
# | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
# +-------------------+----------+--------------+------------------+-------------------+
# | master-bin.000001 | 543 | | | |
# +-------------------+----------+--------------+------------------+-------------------+
# 1 row in set (0.00 sec)
在上述輸出結果中:
File: 當前日志文件
Position: 日志文件中的索引
Binlog_Do_DB: 需要記錄binlog日志的庫,不設置表示全部的庫
Binlog_Ignore_DB: 不需要記錄binlog日志的庫
從庫配置
我們需要編輯MySQL配置文件,這個配置文件在不同的操作系統中的位置和名字都不同,需要根據自己的操作系統來查找這個文件:
Windows: C:\ProgramData\MySQL\MySQL Server 8.0\my.ini
Linux: /etc/my.cnf
macOS:
dmg安裝: /etc/my.cnf
homebrew安裝:
Intel CPU: /usr/local/homebrew/etc/my.cnf
AppleSilicon CPU: /opt/homebrew/etc/my.cnf
# 在[mysqld]的下方添加或修改如下屬性:
# 服務節點的唯一標識,需要給集群中的每個服務分配一個單獨的ID
# 一定要注意,不能和其他節點重復
server-id=102
# 打開binlog日志,并指定文件名
log_bin=slave-bin
# 打開relaylog日志
relay_log=slave-relay-bin
relay_log-index=slave-relay-bin.index
skip-slave-start
修改完成之后,需要重啟MySQL服務。
然后登錄到其他從庫,設置從主庫同步狀態:
# 登錄從庫
mysql -uroot -p
# 設置同步主節點
change master to
master_host='192.168.10.101', # 設置主庫的地址
master_port=3306, # 設置主庫使用的端口號
master_user='root', # 設置主庫的用戶名
master_password='123456', # 設置主庫的密碼
master_log_file='master-bin.000001', # 設置主庫正在使用的binlog文件,可以在主庫使用 show master status 查詢
master_log_pos=543; # 設置從什么位置同步
# 開啟slave
start slave;
# 查看主從同步狀態
show slave status;
# 也可以使用 show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: 192.168.10.101
Master_User: root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000001
Read_Master_Log_Pos: 916
Relay_Log_File: slave-relay-bin.000002
Relay_Log_Pos: 1133
Relay_Master_Log_File: master-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
正常的結果是如上所示的結果,但是總有意外的時候:
有些同學可能會出現 Slave_IO_Running: Connecting 的狀態,甚至是NO的狀態,說明從庫的IO線程啟動失敗。原因如下:
可能是主庫設置錯誤,檢查 master_host 和 master_port 的設置是否正確
可能是主庫的用戶名和密碼錯誤,檢查 master_user 和 master_password 是否正確
可能是主庫防火墻未關閉,檢查防火墻
可能是主庫不能遠程登錄,檢查主庫用戶的遠程登錄權限
可能是 master_log_file 文件設置出問題
可能是虛擬機克隆,導致的兩個節點的uuid相同檢查 /var/lib/mysql/auto.cnf 中記錄的uuid,如果相同的話,隨便修改一個,重啟服務即可
上述幾種錯誤情況在修改之后,都是需要重新啟動slave服務的。先使用 stop slave 停止服務;再使用 start slave 開啟
有些同學可能會出現 Slave_SQL_Running: No 的狀態,說明從庫的SQL線程啟動失敗,一般是因為執行主庫同步過來的數據的時候失敗了,例如需要創建的數據庫、表已經存在導致。
解決方案:
刪除從庫中同名的庫、表,從主庫的日志中恢復數據。
如果想要保留從庫中的庫、表,先停止slave服務,設置 set global sql_slave_skip_counter = 1; 來設置需要跳過的錯誤的個數。1是可以修改的,想要跳過幾個錯誤,就設置為多少。然后啟動slave服務即可。
主從復制測試
我們在主庫中創建數據庫、創建表,可以在從庫中看到有數據同步過來了。而且在從庫中使用 show slave status \G 來查看從庫的狀態的時候,會發現記錄的Pos位置已經更新。
開班時間:2021-04-12(深圳)
開班盛況開班時間:2021-05-17(北京)
開班盛況開班時間:2021-03-22(杭州)
開班盛況開班時間:2021-04-26(北京)
開班盛況開班時間:2021-05-10(北京)
開班盛況開班時間:2021-02-22(北京)
開班盛況開班時間:2021-07-12(北京)
預約報名開班時間:2020-09-21(上海)
開班盛況開班時間:2021-07-12(北京)
預約報名開班時間:2019-07-22(北京)
開班盛況Copyright 2011-2023 北京千鋒互聯科技有限公司 .All Right 京ICP備12003911號-5 京公網安備 11010802035720號