Mysql/Mariadb主從複製

来源:https://www.cnblogs.com/kuiyajia/archive/2019/11/12/11843722.html
-Advertisement-
Play Games

概念 什麼是·Mysql/Mariadb主從複製? Mysql/Mariadb主從複製:當Master(主)資料庫發生變化的時候,變化實時會同步到slave(從)資料庫中; 類似於:Samba共用文件(C/S)、NFS網路文件共用(C/S),當服務端(Server)發生變化時,客戶端(client) ...


概念

什麼是·Mysql/Mariadb主從複製?    

Mysql/Mariadb主從複製:當Master(主)資料庫發生變化的時候,變化實時會同步到slave(從)資料庫中;
類似於:Samba共用文件(C/S)、NFS網路文件共用(C/S),當服務端(Server)發生變化時,客戶端(client)數據內容會根據服務端進行改變;

好處

  • 水平擴展資料庫的負載能力,後備資料庫,主資料庫伺服器故障後,可切換到從資料庫繼續工作;
  • 容錯、高可用,從資料庫可用來做備份、數據統計等工作,這樣不影響主資料庫的性能;
  • 數據分佈;
  • 數據備份;

實現原理

在master機器上,主從同步事件會被寫到特殊的log文件中(binary-log);

主從同步事件有3種形式:statement、row、mixed。

 statement:會將對資料庫操作的sql語句寫入到binlog中。
 row:會將每一條數據的變化寫入到binlog中。
 mixed:statement與row的混合。Mysql決定什麼時候寫statement格式的,什麼時候寫row格式的binlog。

整體上來說,複製有3個步驟:

  • master將改變記錄到二進位日誌(binary log)中(這些記錄叫做二進位日誌事件,binary log events);
  • slave將master的binary log events拷貝到它的中繼日誌(relay log);
  • slave重做中繼日誌中的事件,將改變反映它自己的數據。

下麵這章圖可以詳細解釋其原理:

主從複製過程

說的簡單一些就是:

當對Master資料庫不管做了增、刪、改還是創建了資料庫、表等操作時,Slave就會快速的接受這些數據以及對象的操作,從而實現主從數據複製,保證數據的一致性。  

實戰

我記得我學PHP開發的時候,教員經常說的一句話就是:學習半小時,實戰一分鐘;
好了,接下來到我們實戰的時刻了,認真聽講喲!!! 

環境介紹

系統環境:系統基本上都差不多,一般多數都是Linux平臺和Windows平臺比較多,不管什麼樣的系統環境對這次實戰的操作都影響不大,我在這裡使用的是Docker虛擬出來的CentOS操作系統,當然您可以選用Ubuntu、RedHat以及Windows系統,這些都不會影響到大的操作;

我這裡使用的系統版本:

[root@master /]# cat /etc/redhat-release
CentOS Linux release 8.0.1905 (Core) 

這裡會用到兩台伺服器:其中一臺MasterIP172.18.0.2,另外一個slaveIP172.18.0.3
資料庫版本:(我這裡使用的Mariadb,你可以使用mysql資料庫)

[root@master /]# mysql --version
mysql  Ver 15.1 Distrib 10.3.11-MariaDB, for Linux (x86_64) using readline 5.1

配置Master資料庫

  1.更改Master配置文件
    找到下麵文件:

mysql資料庫:/etc/mysql/mysql,conf.d/mysqld.cnf
mariadb資料庫:/etc/my.cnf.d/mariadb.cnf

註意:我這裡是使用yum進行安裝的所以預設配置文件是在/etc下麵,建議在修改上面兩個文件時要先將配置文件進行備份 

修改以下配置:  

bind-address=172.18.0.2		\\指定Master地址
server-id = 1					\\指定唯一的serverid		部分版本沒有需手動寫入
log_bin = /var/log/mariadb/mariadb-bin.log				\\開啟binlog			部分版本沒有需手動寫入

註意:log_bin這個欄位需根據實際情況來定,需找到資料庫的日誌文件,預設實在 /var/log

   2.重新啟動資料庫

[root@master my.cnf.d]# systemctl restart mariadb		\\centos7、centos8、ubuntu重新啟動方式
[root@master my.cnf.d]# server  mariadb  restart		\\centos6及以下版本使用這個重新啟動方式

  mysql重新啟動: 

[root@master my.cnf.d]# systemctl restart mysqld		\\centos7、centos8、ubuntu重新啟動方式
[root@master my.cnf.d]# server  mysqld  restart		\\centos6及以下版本使用這個重新啟動方式

  3.初始化資料庫

[root@master my.cnf.d]# mysql_secure_installation 

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): 					//這裡敲回車
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] y						//這裡是設置root密碼,可不進行設置
New password: 					//新密碼
Re-enter new password: 			//舊密碼
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!
[root@master my.cnf.d]# 

  4.創建主從同步的用戶 

 [root@master ~]# mysql -u root -p				\\登陸資料庫
Enter password: 			\\輸入root密碼
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 18
Server version: 10.3.11-MariaDB-log MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> GRANT REPLICATION SLAVE on *.* to 'slave'@'%' IDENTIFIED BY 'redhat';		
\\創建用戶,並設置相應的許可權
	\\此處%表示允許從任何地方(除本地外)使用此賬號進行登陸使用,在正式環境建議具體到某台主機IP
Query OK, 0 rows affected (0.000 sec)			\\表示sql語句執行成功

  5.更新Slave用戶許可權 

 MariaDB [(none)]> flush privileges;		\\每次修改用戶許可權,都要使用這個sql語句進行更新
Query OK, 0 rows affected (0.000 sec)

  6.導出資料庫中所有數據(此步驟取決於slave的許可權)

[root@master ~]# mysqldump -u root -p --all-databases --master-data > mariadb.bat.sql
	--all-databases		\\此參數表示備份所有資料庫
	--master-data		\\此參數表示將二進位的信息寫入到輸出文件中,在這裡是寫入到備份的sql文件中
Enter password:

  7.查看MASTERr REPLICATION LOG位置

 MariaDB [(none)]> show master status;
+--------------------+----------+--------------+------------------+
| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| mariadb-bin.000002 |     1974 |              |                  |
+--------------------+----------+--------------+------------------+
1 row in set (0.000 sec)

配置Slave資料庫

  1.更改Slave配置文件

   文件位置與Master位置一致

mysql資料庫:/etc/mysql/mysql,conf.d/mysqld.cnf
mariadb資料庫:/etc/my.cnf.d/mariadb.cnf

   註意:我這裡是使用yum進行安裝的所以預設配置文件是在/etc下麵,建議在修改上面兩個文件時要先將配置文件進行備份

  修改以下配置:

bind-address=172.18.0.3		\\指定Master地址
server-id = 2					\\指定唯一的serverid		部分版本沒有需手動寫入
log_bin = /var/log/mariadb/mariadb-bin.log				\\開啟binlog			部分版本沒有需手動寫入

  註意:log_bin這個欄位需根據實際情況來定,需找到資料庫的日誌文件,預設實在 /var/log

  2.重新啟動資料庫

[root@master my.cnf.d]# systemctl restart mariadb		\\centos7、centos8、ubuntu重新啟動方式
[root@master my.cnf.d]# server  mariadb  restart		\\centos6及以下版本使用這個重新啟動方式

  mysql重新啟動:

[root@master my.cnf.d]# systemctl restart mysqld		\\centos7、centos8、ubuntu重新啟動方式
[root@master my.cnf.d]# server  mysqld  restart		\\centos6及以下版本使用這個重新啟動方式

  3.初始化資料庫

[root@master my.cnf.d]# mysql_secure_installation 

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): 					//這裡敲回車
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] y						//這裡是設置root密碼,可不進行設置
New password: 					//新密碼
Re-enter new password: 			//舊密碼
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!
[root@master my.cnf.d]# 

  4.從Master將資料庫備份複製到slave伺服器

[root@slave my.cnf.d]# scp [email protected]:/opt/mariadb.bat.sql /opt/
[email protected]'s password: 
mariadb.bat.sql                   

  5.將備份數據恢復到slave資料庫

[root@slave my.cnf.d]# mysql -u root -p < /opt/mariadb.bat.sql 
 Enter password: 

  6.使slave與master建立連接

[root@slave my.cnf.d]# mysql -u root -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
[root@slave my.cnf.d]# mysql -u root -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 22
Server version: 10.3.11-MariaDB-log MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> stop slave;
Query OK, 0 rows affected, 1 warning (0.000 sec)

MariaDB [(none)]> CHANGE MASTER TO
    -> MASTER_HOST = '172.18.0.2',		\\指定Master資料庫地址
    -> MASTER_USER = 'slave',			\\指定主從複製用戶名
    -> MASTER_PASSWORD = 'redhat',			\\指定主從複製用戶密碼
    -> MASTER_LOG_FILE = 'mariadb-bin.000002',		\\指定Master資料庫的binlog文件名
    -> MASTER_LOG_POS=1974;			
Query OK, 0 rows affected (0.290 sec)

MariaDB [(none)]> start slave;			\\開啟複製功能
Query OK, 0 rows affected (0.019 sec)

MariaDB [(none)]>

  註意:lMASTER_LOG_FILE='mariadb-bin.000002與MASTER_LOG_POS=1974的值,是從上面的 SHOW MASTER STATUS 得到的。

  到這裡已經可以做到主從複製了下麵讓我們測試一下吧

驗證資料庫是否同步

測試方法很簡單,只需要在主資料庫上面創建資料庫或者增加一條記錄就可以測試是否主從複製配置成功

MariaDB [(none)]> show  databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.018 sec)

MariaDB [(none)]> create database a;			\\在主資料庫創建a資料庫
Query OK, 1 row affected (0.063 sec)
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| a                  |
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.000 sec)

  下麵我們來看看從資料庫上面有沒有a這個資料庫吧

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| a                  |
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.075 sec)

  我們會發現已經有了a這個資料庫


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ⽹絡時間服務和chrony 實驗練習: 1. 準備實驗環境: 2. 時間同步(centos6) 3. ntp軟體實現時間同步(centos6) centos6上預設安裝了ntp軟體包(包括客戶端和伺服器端),但是ntp同步需要⼀定時間才能完全同步時間的,⽽chrony同步時間⽐ntp快。centos ...
  • 故事背景:我們公司是做新零售的,需要對發佈的每台機器進行文件的同步更新,所以我這裡做了一個小小的調研 技術調研:linux之間同步文件有兩種方式rsync與scp。 sync和scp在文件夾均不存在時,執行時間相差不大,但是文件夾存在的情況下差異很大。原因是scp是複製:若mas2文件不存在則新建, ...
  • 環境:centos7 nginx1.16.1(源碼安裝) 一、下載nginx源碼包 地址:http://nginx.org/en/download.html Mainline version(主線版本)Stable version(穩定版本)Legacy versions(傳統老版本) 下載穩定版: ...
  • xcrun: error 在終端輸入 git clone *****後,提示: xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing*****,解決方法,直接在終端輸入以下 ...
  • 括弧的種類 小括弧,圓括弧 ( ) 中括弧,方括弧 [ ] 大括弧、花括弧 { } 一、單小括弧 () 1.另開命令組——小括弧中的命令將會新開啟一個子shell獨立順序運行,所以括弧中的變數不能夠被腳本餘下的部分使用。括弧中多個命令之間用分號隔開,最後一個命令不需要分號,各命令和括弧之間無空格。 ...
  • chrony軟體使用說明 chrony簡介 chrony是一個開源的自由軟體,它能保持系統時鐘與時間伺服器(ntp)同步,讓時間保持精確。 它由兩個程式組成:chrongd和chronyc。 chronyd是一個後臺運行的守護進程,用於調整內核運行的系統時鐘和時間伺服器同步。 它確定電腦增減時間的 ...
  • Flink-測試用的fake溫度感測器 Flink中,測試時,會用到自定義的source。 下為一例。。 該例使用溫度感測器的格式演示fake日誌數據源。 代碼用Scala寫的。 感測器... 感測器 - 樣例類 SensorReads.scala: ​x 1 package sr 2 ​ 3 /* ...
  • 整理記錄關於使用cmd安裝mysql的過程 1.配置環境變數 1) 電腦->屬性->高級系統設置->環境變數 2)先添加變數 變數名:MYSQL_HOME 變數值:D:\mysql-8.0.13-winx64\bin (mysql存放地址) 3)然後配置Path系統變數 在系統變數里,找到Path ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...