MySQL複製介紹
MySQL複製就是一臺MySQL服務器(slave)從另一臺MySQL服務器(master)進行日誌的複製然後再解析日誌並應用到自身,類似Oracle中的Data Guard。
MySQL複製有那些好處:
- 第一是解決宕機帶來的數據不一致,因爲MySQL複製可以實時備份數據;
- 第二點是減輕數據庫服務器的壓力,多臺服務器的性能一般比單臺要好。但是MySQL複製不適合大數據量,大數據量推薦使用集羣。
MySQL複製過程分成三步:
- master將改變記錄到二進制日誌(binary log)。這些記錄過程叫做二進制日誌事件,binary log events;
- slave將master的binary log events拷貝到它的中繼日誌(relay log);
- slave重做中繼日誌中的事件,將改變應用到自己的數據庫中。 MySQL複製是異步的且串行化的
MySQL複製搭建
環境準備
master 192.168.1.5
slave 192.168.1.6
OS:Oracle Linux 6.1
MySQL:5.5.37
Master配置
1)分配複製權限
主庫和從庫均需要執行
1 2 | mysql> grant replication client,replication slave on *.* to root@'192.168.1.%' identified by 'root'; Query OK, 0 rows affected (0.00 sec) |
2)清空日誌文件
主從庫都是默認開啓二進制日誌文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
mysql>
show
binary logs;
+------------------+-----------+
|
Log_name
|
File_size
|
+------------------+-----------+
|
mysql-bin.000001
|
26636
|
|
mysql-bin.000002
|
1069399
|
|
mysql-bin.000003
|
26636
|
|
mysql-bin.000004
|
1069399
|
|
mysql-bin.000005
|
536
|
+------------------+-----------+
5
rows
in
set
(0.00
sec)
mysql>
reset master;
Query
OK,
0
rows
affected
(0.01
sec)
mysql>
show
binary logs;
+------------------+-----------+
|
Log_name
|
File_size
|
+------------------+-----------+
|
mysql-bin.000001
|
107
|
+------------------+-----------+
1
row
in
set
(0.00
sec)
|
需要注意的是,如果不想清空日誌文件的話,需要記錄當前master的log_file和log_pos,並在下面啓用複製操作時指定這兩個參數或者在slave的配置文件指定。
Slave設置
1) 修改從服務器server-id
1 2 | # vim /etc/my.cnf server-id = 2 |
修改完以後需要重啓數據庫
2)清空日誌文件,同Master
3)啓用複製
讓slave連接master並開始重做master二進制日誌中的事件
1
2
|
mysql>
change
master
to
master_host='192.168.1.5',master_user='root',master_password='root',master_port=3306,master_log_file='mysql-bin.000001',master_log_pos=0;
|
master_log_pos的值爲0,因爲它是日誌的開始位置;master_log_file是初始日誌文件。如果master日誌沒有被清空,這裏就是當前master的日誌信息
需要注意的是,默認情況下,會同步該用戶下所有的DB,如果想限定哪些DB,有3種思路
- 在master上的/etc/my.inf中通過參數binlog-do-db、binlog-ignore-db設置需要同步的數據庫。
- 在執行grant分配權限操作的時候,限定數據庫
- 在slave上限定數據庫使用replicate-do-db=dbname
4)開啓slave
1 2 | mysql> start slave; Query OK, 0 rows affected (0.00 sec) |
5)確認Slave是否和Mater成功通信。如果 Slave_IO_Running和Slave_SQL_Running都是yes,則證明配置成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
mysql>
show
slave
statusG;
***************************
1.
row ***************************
Slave_IO_State:
Waiting
for
master
to
send
event
Master_Host:
192.168.1.5
Master_User:
root
Master_Port:
3306
Connect_Retry:
60
Master_Log_File:
mysql-bin.000001
Read_Master_Log_Pos:
107
Relay_Log_File:
rac-node2-relay-bin.000002
Relay_Log_Pos:
253
Relay_Master_Log_File:
mysql-bin.000001
**Slave_IO_Running:
Yes**
**Slave_SQL_Running:
Yes**
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno:
0
Last_Error:
Skip_Counter:
0
Exec_Master_Log_Pos:
107
Relay_Log_Space:
413
Until_Condition:
None
Until_Log_File:
Until_Log_Pos:
0
Master_SSL_Allowed:
No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master:
0
Master_SSL_Verify_Server_Cert:
No
Last_IO_Errno:
0
Last_IO_Error:
Last_SQL_Errno:
0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id:
1
1
row
in
set
(0.00
sec)
|
測試
Master創建數據庫
1 2 3 4 5 6 7 8 9 10 11 | mysql> create database d; mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | d | | mysql | | performance_schema | | test | +--------------------+ |
Slave查看數據庫已同步
1
2
3
4
5
6
7
8
9
10
|
mysql>
show
databases;
+--------------------+
|
Database
|
+--------------------+
|
information_schema
|
|
d |
|
mysql |
|
performance_schema
|
|
test
|
+--------------------+
|
Master創建表插入數據
1 2 3 4 | mysql> use d mysql> create table t(id int); mysql> insert into t values(1); mysql> commit; |
Slave查看
1
2
3
4
5
6
7
8
|
mysql>
use
d;
mysql>
show
tables;
mysql>
select *
from
t;
+------+
|
id
|
+------+
| 1
|
+------+
|
通過以上驗證,可以看到主服務器上的修改能夠正常同步到從服務器。
補充說明
1)做了MySQL主從複製以後,使用mysqldump對數據備份時,一定要注意按照如下方式:
mysqldump –master-data –single-transaction –user=username –password=password dbname> dumpfilename
這樣就可以保留file和position的信息,在新搭建一個slave的時候,還原完數據庫,file和position的信息也隨之更新,接着再start slave 就可以很迅速的完成增量同步。
其他複製方式
主主複製
master-slave只能進行單向操作,像網絡中的半雙工。master-master可以實現服務器之間互相同步,且主主複製可以避免出現單點故障後整個系統宕機。主主複製最大的問題就是數據插入或更新衝突。配置方法同主從複製,反過來讓slave同步master。注意master_log_file和master_log_pos參數要與master上對應。具體可以參考這裏
單一master和多slave
由一個master和多個slave組成的複製系統比較簡單。slave之間並不互相通信,只能與master通信。如果寫操作較少,讀操作很多,可以採用。可以將讀操作分佈到其他slave,從而減輕master的壓力。但slave增加到一定數量時,slave對master的負載以及網絡帶寬都會成爲問題。
主從多級複製
讀操作很多可以採用單一maste和多slave,但增大到一定slave後連到master的slaveIO線程太多會造成master壓力增大,從而造成數據複製延時。多級複製就是爲了解決這個問題。如果想實現主-從(主)-從多級複製,需要設置log-slave-updates參數。同時二進制日誌也必須啓用。
當然,增加複製的級聯層次,同一個變更傳到最底層的Slave所需要經過的MySQL也會更多,同樣可能造成延時較長的風險。如果條件允許,傾向於通過拆分成多個Replication集羣來解決。