1. 程式人生 > >MariaDB數據庫主從復制實現步驟

MariaDB數據庫主從復制實現步驟

format 雙向 binlog日誌 word 授權 自己 導出 宕機 sha2

一.MariaDB簡介

MariaDB數據庫的主從復制方案,是其自帶的功能,並且主從復制並不是復制磁盤上的數據庫文件,而是通過binlog日誌復制到需要同步的從服務器上.
MariaDB數據庫支持單向、雙向、鏈式級聯等不同業務場景的復制.在復制的過程中,一臺服務器充當主服務器(Master),接收來自用戶的內容更新,而一個或多個其他的服務器充當從服務器(slave),接收來自Master上binlog文件的日誌內容,解析出SQL,重新更新到Slave,使得主從服務器數據達到一致.
主從復制的邏輯有以下幾種:
1)一主一從,單向主從同步模式,只能在Master端寫入數據;
技術分享圖片
2)一主多從,
技術分享圖片
3)雙主復制邏輯架構,此架構可以在Master1或Master2進行數據寫入,或者兩端同時寫入(特殊設置);

技術分享圖片
在生產環境中,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)

五.總結

暫時沒啥好總結的,就先按照上面的步驟進行吧!如有問題,後續更正!

MariaDB數據庫主從復制實現步驟