天天看點

MySQL 的主從複制

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&gt; create user [email protected] identified by'password';

mysql&gt; grant replication client,replication slave on *.* to [email protected] identified by 'password';(建立puck使用者,并授權給200.168.10.200(Slave)使用。)

3)、查詢主資料庫狀态,并記下FILE及Position的值,這個在後面配置從伺服器的時候要用到。

mysql&gt; 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&gt; 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&gt; start slave;

5)、檢查主從同步,如果您看到Slave_IO_Running和Slave_SQL_Running均為Yes,則主從複制連接配接正常。

mysql&gt; 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&gt; create database mydatabase;

mysql&gt; use mydatabase;

mysql&gt; create table jin (id int(5),name char(10));

mysql&gt; insert into jin values (2,'puck');

在從資料庫中驗證一下,是否正常複制到資料。

[root@localhost ~]# mysql -uroot –p123456

mysql&gt; show databases;

mysql&gt; select * from mydatabase.jin;

本文轉自 jinlinger 51CTO部落格,原文連結:http://blog.51cto.com/essun/1306466,如需轉載請自行聯系原作者