數據庫基礎:mysql主從集群搭建

文章首發於微信公眾號:java架構師進階之路

前言:

Mysql數據庫沒有增量備份的機制,當數據量太大的時候備份是一個很大的問題。還好mysql數據庫提供了一種主從備份的機制,其實就是把主數據庫的所有的數據同時寫到備份的數據庫中。實現mysql數據庫的熱備份。

要想實現雙機的熱備,首先要了解主從數據庫服務器的版本的需求。要實現熱備mysql的版本都高於3.2。還有一個基本的原則就是作為從數據庫的數據版本可以高於主服務器數據庫的版本,但是不可以低於主服務器的數據庫版本。

mysql 主從備份工作原理

主從簡單的說就是把 一個服務器上執行過的sql語句在別的服務器上也重複執行一遍, 這樣只要兩個數據庫的初態是一樣的,那麼它們就能一直同步。

當然這種複製和重複都是mysql自動實現的,我們只需要配置即可。

我們進一步詳細介紹原理的細節, 這有一張圖:


數據庫基礎:mysql主從集群搭建

上圖中有兩個服務器, 演示了從一個主服務器(master) 把數據同步到從服務器(slave)的過程。

這是一個主-從複製的例子。

對於一個mysql服務器, 一般有兩個線程來負責複製和被複制。當開啟複製之後。

1. 作為主服務器Master, 會把自己的每一次改動都記錄到 二進制日誌 Binarylog 中。(從服務器會負責來讀取這個log, 然後在自己那裡再執行一遍。)

2. 作為從服務器Slave, 會用master上的賬號登陸到 master上, 讀取master的Binarylog, 寫入到自己的中繼日誌 Relaylog, 然後自己的sql線程會負責讀取這個中繼日誌,並執行一遍。 到這裡主服務器上的更改就同步到從服務器上了。

集群搭建

1.集群環境如下:

數據庫基礎:mysql主從集群搭建

2.mysql數據安裝
mysql安裝相對簡單,這裡不做介紹,如果不熟悉的可以查看相關資料。

3.Master(6.84)節點配置

(1)修改my.cnf文件,在[mysqld]加入下面的內容:

# 服務的唯一編號

server-id = 1

# 開啟mysql binlog功能

log-bin = mysql-bin

# binlog記錄內容的方式,記錄被操作的每一行

binlog_format = ROW

# 減少記錄日誌的內容,只記錄受影響的列

binlog_row_image = minimal

# 指定需要複製的數據庫名為test,主庫從庫必須一樣

binlog-do-db = test

(2)修改好配置文件,重啟mysql服務

service mysql restart

(3)創建從庫同步數據的賬號

登錄mysql客戶端:

./mysql -u root –p

數據庫基礎:mysql主從集群搭建

然後添加一個用戶【用於在從庫主機中登錄進行同步】:

create user 'replicate'@'%' identified by 'replicate';

再對該用戶授予複製權限:

grant replication slave on *.* to 'replicate'@'%';

*****【我以為這裡可以更進一步寫成:grant replication slave on test.* to 'replicate'@'%';】

使執行生效:

flush privileges;

數據庫基礎:mysql主從集群搭建

(4)查看一下主庫的狀態

show master status\G;

數據庫基礎:mysql主從集群搭建

需要注意的是:如果沒有上面第3步操作,執行show master status \G;會報錯,如下圖:

數據庫基礎:mysql主從集群搭建

file:表示同步的bin-log信息從哪個文件開始;

position:表示從file的哪個位置開始;

binlog_do_db:表示同步哪一個庫

在後面的slave配置中,這三個結果都需要使用到。

4.Slave(6.85)節點配置

配置從庫

(1)修改my.cnf文件,在[mysqld]加入下面的內容:

# 服務的唯一編號

server-id = 2

# 開啟mysql binlog功能

log-bin = mysql-bin

# binlog記錄內容的方式,記錄被操作的每一行

binlog_format = ROW

# 減少記錄日誌的內容,只記錄受影響的列

binlog_row_image = minimal

# 指定需要複製的數據庫名為test

replicate-do-db = test

(2)修改好配置文件,重啟mysql服務

service mysql restart

(3)執行同步命令

給從設置主服務器ip,同步賬號密碼,同步位置

mysql的終端執行:

change master to master_host='192.168.6.84',master_port=3306,master_user='replicate',master_password='replicate',master_log_file='mysql-bin.000001',master_log_pos=749;

命令需要特別注意:master_log_file 和master_log_pos 2個屬性內容,這2個屬性是剛才主服務器上執行show master status\G;查詢出來的內容。

數據庫基礎:mysql主從集群搭建

(3) 開啟從機角色的

start slave;

數據庫基礎:mysql主從集群搭建

(4)查看從庫的狀態

mysql的終端執行:

show slave status\G;

返回信息為


數據庫基礎:mysql主從集群搭建

當:Slave_IO_Running和Slave_SQL_Running的狀態都為Yes時,說明從庫配置成功。

4.測試驗證

首先在主庫上創建test庫:

create database test character set 'utf8';

數據庫基礎:mysql主從集群搭建

依次執行:

use test;

show tables;

數據庫基礎:mysql主從集群搭建

主庫此時仍然沒有表,查看從庫

依次執行上述3條命令:

show databases;

use test;

show tables;

數據庫基礎:mysql主從集群搭建

查詢可知:slave節點的test庫同樣為空。

此時可以證明,主庫的修改(創建了test)成功同步到從庫中了。

接著在master節點上創建表people。

create table people(id int ,name varchar(20)) character set 'utf8';

數據庫基礎:mysql主從集群搭建

show tables;


數據庫基礎:mysql主從集群搭建

接著在slave上驗證:


數據庫基礎:mysql主從集群搭建

發現數據已經進行了同步。

至此,mysql的主備已經搭建完畢。

6、擴展

問題1:上述介紹的是備份某個庫的操作,如果需要備份多個庫則直接在master的my.cnf中添加新的一行binlog-do-db=test_2等等即可。這行代碼的意思是指:同步該庫(test_2)的bin-log信息。

問題2:這種直接修改master節點的my.cnf文件去同步某個庫,需要重啟master才能讓整個mysql集群工作,有沒有一種方法可以搭建備庫,但是不需要重啟master?

顯然是可以的,不過這次備份的庫是master的全部庫了(因為沒有指定具體庫的bin-log), 所以默認就把全部的bin-log都同步了。可以參考如下的步驟:

step 1:導出Master節點中所有的數據庫

mysqldump -uroot -A --routines --single-transaction --master-data=2 > /data1/mysqldump/alldatabases.sql

參數註釋:

-A:導出所有庫的數據

--routines Dump stored routines (procedures and functions) from dumped databases

--single-transaction Issue a BEGIN SQL statement before dumping data from server

--master-data Write the binary log file name and position to the output

這裡添加option:--master-data之後,就可以不再使用show master status\G;去查看bin-log的file和position了。

step 2:

將上述的sql文件導入到備庫中。

step 3:

其餘步驟同上述內容【在master上創建一個用戶,並授權,然後刷新】;在slave上執行change操作。

以上為全部內容。

歡迎關注微信公眾號:java架構師進階之路


分享到:


相關文章: