『教程』mariadb的主從複製
一.MariaDB簡介
MariaDB資料庫的主從複製方案,是其自帶的功能,並且主從複製並不是複製磁碟上的資料庫檔案,而是通過binlog日誌複製到需要同步的從伺服器上.
MariaDB資料庫支援單向、雙向、鏈式級聯等不同業務場景的複製.在複製的過程中,一臺伺服器充當主伺服器(Master),接收來自使用者的內容更新,而一個或多個其他的伺服器充當從伺服器(slave),接收來自Master上binlog檔案的日誌內容,解析出SQL,重新更新到Slave,使得主從伺服器資料達到一致.
主從複製的邏輯有以下幾種:
1)一主一從,單向主從同步模式,只能在Master端寫入資料;
2)一主多從, ![](https://img2020.cnblogs.com/blog/1979914/202011/1979914-20201112153836779-780295141.png) 3)雙主複製邏輯架構,此架構可以在Master1或Master2進行資料寫入,或者兩端同時寫入(特殊設定); ![](https://img2020.cnblogs.com/blog/1979914/202011/1979914-20201112153844145-1593241785.png) 在生產環境中,MySQL主從複製都是非同步的複製方式,即不是嚴格的實時複製,但是給使用者的體驗都是實時的.MySQL主從複製叢集功能使得MySQL資料庫支援大規模高併發讀寫成為可能,且有效的保護了伺服器宕機的資料備份.
二.應用場景
利用複製功能當Master伺服器出現問題時,我們可以人工的切換到從伺服器繼續提供服務,此時伺服器的資料和宕機時的資料幾乎完全一致.複製功能也可用作資料備份,但是如果人為的執行drop,delete等語句刪除,那麼從庫的備份功能也就失效了.
三.主從機制實現原理
(1)master將改變記錄到二進位制日誌(binary log)中(這些記錄叫做二進位制日誌事件,binary log events);
(2)slave將master的binary log events拷貝到它的中繼日誌(relay log);
(3)slave重做中繼日誌中的事件,將改變反映它自己的資料;
四.主從實驗步驟
主庫配置
1.檢視資料庫狀態
systemctl status mariadb
2.停止mariadb
systemctl stop mariadb
3.修改配置檔案
vi /etc/my.cnf
# 修改內容如下:
# server-id服務的唯一標識(主從之間都必須不同);
# log-bin啟動二進位制日誌名稱為mysql-bin
[mysqld]
server-id=1
log-bin=apollo-mysql-bin
4.重啟mariadb
systemctl start mariadb
5.新建用於主從同步的使用者apollo
[root@localhost etc]# mysql -uroot -p MariaDB [mysql]> create user 'apollo'@'%' identified by 'apollo123'; Query OK, 0 rows affected (0.00 sec)
6.如果提示密碼太簡單不符合策略加在前面加這句,否則可以忽略.
mysql> set global validate_password_policy=0;
7.給從庫賬號授權
MariaDB [mysql]> grant replication slave on *.* to 'apollo'@'%';
Query OK, 0 rows affected (0.00 sec)
8.檢查主庫建立的複製賬號
MariaDB [(none)]> select user,host,password from mysql.user;
+--------+-----------------------+-------------------------------------------+
| user | host | password |
+--------+-----------------------+-------------------------------------------+
| root | localhost | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
| root | localhost.localdomain | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
| root | 127.0.0.1 | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
| root | ::1 | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
| apollo | % | *F4C3606BB4D20E38BDAC60DD383666A1F3D72A67 |
+--------+-----------------------+-------------------------------------------+
6 rows in set (0.00 sec)
9.檢查授權賬號的許可權
MariaDB [(none)]> show grants for apollo@'%';
+-----------------------------------------------------------------------------------------------------------------+
| Grants for apollo@% |
+-----------------------------------------------------------------------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'apollo'@'%' IDENTIFIED BY PASSWORD '*91310B9B3DD9D3B34E510A8C8BEE1096516C0C94' |
+-----------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
10.實現對主資料庫鎖表只讀,防止資料寫入,資料複製失敗.
MariaDB [mysql]> flush table with read lock;
Query OK, 0 rows affected (0.02 sec)
11.檢查主庫的狀態
MariaDB [(none)]> show master status;
+--------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| a-mysql-bin.000001 | 615 | | |
+--------------------+----------+--------------+------------------+
1 row in set (0.01 sec)
# File是二進位制日誌檔名,
# Position是日誌開始的位置,後面從庫會用到.
12.鎖表後,一定要單獨再開啟一個SSH視窗,匯出資料庫的所有資料.
[root@localhost ~]# mysqldump -uroot -p --all-databases > /opt/root.sql
13.確保資料匯出後,沒有資料插入,完畢再檢視主庫狀態.
MariaDB [(none)]> show master status;
+--------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| a-mysql-bin.000001 | 615 | | |
+--------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
14.將備份匯出的資料scp至Slave資料庫
[root@localhost ~]# scp /opt/zdk.sql [email protected]:/opt/
The authenticity of host '192.168.13.183 (192.168.13.183)' can't be established.
ECDSA key fingerprint is SHA256:inppMYl6FXIzV/XOV6TTlSUmP4TY96mz6sujwtTY7nk.
ECDSA key fingerprint is MD5:69:b7:4c:cc:18:86:94:be:d9:63:4d:4c:cb:62:fa:67.
# 輸入yes
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.13.183' (ECDSA) to the list of known hosts.
# 輸入資料庫密碼
[email protected]'s password:
zdk.sql 100% 467KB 5.0MB/s 00:00
從庫設定(192.168.13.183)
1.此時去從庫的mysql上,登入,匯入主庫的資料,保持資料一致性.
mysql -uroot -p
source /opt/root.sql
# 這一步完成後,再登入資料庫,如出現密碼不正確,請輸入主庫資料庫密碼.
2.檢視資料庫狀態
systemctl status mariadb
3.停止mariadb
systemctl stop mariadb
4.從庫的配置,寫入my.cnf,從庫的身份資訊
vi /etc/my.cnf
[mysqld]
server-id=10
5.檢查一下主庫和從庫的引數資訊
主庫:
MariaDB [(none)]> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 1 |
+---------------+-------+
1 row in set (0.00 sec)
MariaDB [(none)]> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set (0.00 sec)
從庫:
MariaDB [(none)]> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 10 |
+---------------+-------+
1 row in set (0.00 sec)
MariaDB [(none)]> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | OFF |
+---------------+-------+
1 row in set (0.01 sec)
6.通過一條命令,開啟主從同步{從庫執行}
# 主庫IP地址:'192.168.13.189'
# 如果以下資訊不知道,可以通過命令show master status;
change master to master_host='192.168.13.189',
master_user='apollo',
master_password='apollo123',
master_log_file='a-mysql-bin.000001',
master_log_pos=615;
MariaDB [(none)]> change master to master_host='192.168.13.189',
-> master_user='apollo',
-> master_password='apollo123',
-> master_log_file='a-mysql-bin.000001',
-> master_log_pos=615;
Query OK, 0 rows affected (0.05 sec)
7.檢視主從同步的狀態
show slave status\G;
8.開啟從庫的slave同步
start slave;
9.再次檢視主從同步的狀態
show slave status\G;
# 檢視兩條引數,確保主從正常
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
10.解鎖主庫,恢復可寫
MariaDB [(none)]> unlock tables;
Query OK, 0 rows affected (0.00 sec)
11.主庫建立一個數據庫db2
# 這個是在主庫裡面執行的哦
MariaDB [(none)]> create database db2;
Query OK, 1 row affected (0.00 sec)
12.去從庫裡面檢視資料庫中是否有db2
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| db1 |
| db2 |
| information_schema |
| mysql |
| performance_schema |
+--------------------+
5 rows in set (0.00 sec)