1、複制概述
1.1、複制解決的問題
資料複制技術有以下一些特點:
(1) 資料分布
(2) 負載平衡(load balancing)
(3) 備份
(4) 高可用性(high availability)和容錯
1.2、複制如何工作
從sql layer中邏輯子產品上來看
複制子產品分為master子產品和slave子產品兩部分,master子產品主要負責在replication環境中讀取master端的binary日志,以及與slave端的I/O thread互動等工作。slave子產品比master子產品所要做的事情稍多一些,在系統中主要展現在兩個線程上面。一個是負責從master請求和接受binary日志,并寫入本地relay_log的I/O thread。另外一個是負責從relay_log中讀取相關的日志事件的SQLthread,然後解析成可以在slave端正确執行并得到和master端完全相同的結果的指令并再交給slave執行的過程。
過程如下:
<a href="http://blog.51cto.com/attachment/201310/194612896.jpg" target="_blank"></a>
注:上圖中同一種顔色的箭頭表示一步,自左向右。
1.3實驗環境
系統:centos6.4 x86_64
資料庫:mysql 5.6.13(源碼安裝)
Master端
IP:200.168.10.209
在Master上操作:
1)、確定/etc/my.cnf中有如下參數,沒有的話需手工添加,并重新開機mysql服務。
[root@localhost ~]# vim/etc/my.cnf
[mysqld]
log-bin=mysql-bin 啟動二進制檔案
server-id=1 伺服器ID
2)、登入mysql,在mysql中添加一個puck的賬号,并授權給從伺服器。 [root@localhost ~]# mysql -uroot -p
mysql> create user [email protected] identified by'password';
mysql> grant replication client,replication slave on *.* to [email protected] identified by 'password';(建立puck使用者,并授權給200.168.10.200(Slave)使用。)
3)、查詢主資料庫狀态,并記下FILE及Position的值,這個在後面配置從伺服器的時候要用到。
mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin.000005
Position: 120
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
Slave端
IP:200.168.10.200
在Slave上操作:
1)、確定/etc/my.cnf中有log-bin=mysql-bin和server-id=1參數,并把server-id=1修改為server-id=10。修改之後如下所示:
server-id=10 伺服器ID
2)、重新開機mysql服務。
[root@localhost ~]#/etc/init.d/mysql restart
3)、登入mysql,執行如下語句
[root@localhost ~]# mysql –u root –p
mysql> change master to master_host='200.168.10.209',master_user='puck',master_password='password',master_log_file='mysql-bin.000005',master_log_pos=120;
4)、啟動slave同步。
mysql> start slave;
5)、檢查主從同步,如果您看到Slave_IO_Running和Slave_SQL_Running均為Yes,則主從複制連接配接正常。
mysql> show slave status\G
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
44
45
46
47
48
49
50
51
52
53
54
55
56
<code>*************************** 1. row ***************************</code>
<code> </code><code>Slave_IO_State: Waiting </code><code>for</code> <code>master </code><code>to</code> <code>send event</code>
<code> </code><code>Master_Host: 200.168.10.209 #主伺服器的位址</code>
<code> </code><code>Master_User: puck #主伺服器允許複制的使用者</code>
<code> </code><code>Master_Port: 3306 #通信端口</code>
<code> </code><code>Connect_Retry: 60 #重新連接配接的時間</code>
<code> </code><code>Master_Log_File: mysql-bin.000005#目前主伺服器的日志檔案</code>
<code> </code><code>Read_Master_Log_Pos: 120 #binary_log日志起始點</code>
<code> </code><code>Relay_Log_File: slave-relay-bin.000005#Slave端目前日志檔案</code>
<code> </code><code>Relay_Log_Pos: 283 #Relay_log日志起始點</code>
<code> </code><code>Relay_Master_Log_File: mysql-bin.000005</code>
<code> </code><code>Slave_IO_Running: Yes #I/Othread 用于複制master的</code><code>Binary</code> <code>log到Relay_log中,目前狀态運作中</code>
<code> </code><code>Slave_SQL_Running: Yes #将Relay_log中語句解析并應用于Slave端資料庫中</code>
<code> </code><code>Replicate_Do_DB:</code>
<code> </code><code>Replicate_Ignore_DB:</code>
<code> </code><code>Replicate_Do_Table:</code>
<code> </code><code>Replicate_Ignore_Table:</code>
<code> </code><code>Replicate_Wild_Do_Table:</code>
<code> </code><code>Replicate_Wild_Ignore_Table:</code>
<code> </code><code>Last_Errno: 0</code>
<code> </code><code>Last_Error:</code>
<code> </code><code>Skip_Counter: 0</code>
<code> </code><code>Exec_Master_Log_Pos: 120</code>
<code> </code><code>Relay_Log_Space: 619</code>
<code> </code><code>Until_Condition: None</code>
<code> </code><code>Until_Log_File:</code>
<code> </code><code>Until_Log_Pos: 0</code>
<code> </code><code>Master_SSL_Allowed: </code><code>No</code>
<code> </code><code>Master_SSL_CA_File:</code>
<code> </code><code>Master_SSL_CA_Path:</code>
<code> </code><code>Master_SSL_Cert:</code>
<code> </code><code>Master_SSL_Cipher:</code>
<code> </code><code>Master_SSL_Key:</code>
<code> </code><code>Seconds_Behind_Master: 0</code>
<code>Master_SSL_Verify_Server_Cert: </code><code>No</code>
<code> </code><code>Last_IO_Errno: 0</code>
<code> </code><code>Last_IO_Error:</code>
<code> </code><code>Last_SQL_Errno: 0</code>
<code> </code><code>Last_SQL_Error:</code>
<code> </code><code>Replicate_Ignore_Server_Ids:</code>
<code> </code><code>Master_Server_Id: 1</code>
<code> </code><code>Master_UUID: f9ba5511-0fbe-11e3-a989-000c29f64ea5</code>
<code> </code><code>Master_Info_File: /data/mysql/master.info</code>
<code> </code><code>SQL_Delay: 0</code>
<code> </code><code>SQL_Remaining_Delay: </code><code>NULL</code>
<code> </code><code>Slave_SQL_Running_State: Slave has </code><code>read</code> <code>all</code> <code>relay log; waiting </code><code>for</code> <code>the slave I/O thread </code><code>to</code> <code>update</code> <code>it</code>
<code> </code><code>Master_Retry_Count: 86400</code>
<code> </code><code>Master_Bind:</code>
<code> </code><code>Last_IO_Error_Timestamp:</code>
<code> </code><code>Last_SQL_Error_Timestamp:</code>
<code> </code><code>Master_SSL_Crl:</code>
<code> </code><code>Master_SSL_Crlpath:</code>
<code> </code><code>Retrieved_Gtid_Set:</code>
<code> </code><code>Executed_Gtid_Set:</code>
<code> </code><code>Auto_Position: 0</code>
<code>1 row </code><code>in</code> <code>set</code> <code>(0.00 sec)</code>
驗證配置是否正常,mysql主從能否正常複制。
1.4、測試主從複制
在主資料庫上建立一個庫,并且在庫中寫一個表和一些資料。
mysql> create database mydatabase;
mysql> use mydatabase;
mysql> create table jin (id int(5),name char(10));
mysql> insert into jin values (2,'puck');
在從資料庫中驗證一下,是否正常複制到資料。
[root@localhost ~]# mysql -uroot –p123456
mysql> show databases;
mysql> select * from mydatabase.jin;
本文轉自 jinlinger 51CTO部落格,原文連結:http://blog.51cto.com/essun/1306466,如需轉載請自行聯系原作者