天天看點

mysql 主從複制簡單部署過程

整體上來說,複制大緻分為3個步驟: 

1. master将資料庫的改變記錄到二進制日志(binary log)中,這些記錄叫做二進制日志事件(binary log  

    events);

2. slave将master的binary log events  dump到它的中繼日志(relay log);

3. slave重做中繼日志中的事件,将改變反映到它自己的資料。

下圖描述了複制的原理:

        該過程的第一部分就是master記錄二進制日志。在每個事務更新資料完成之前,master在二日志記錄這些改變。MySQL将事務串行的寫入二進制日志,即使事務中的語句都是交叉執行的。在事件寫入二進制日志完成後,master通知存儲引擎送出事務。

      接下來就是slave将master的binary log拷貝到它自己的中繼日志。首先,slave開始一個工作線程——I/O線程。I/O線程在master上打開一個普通的連接配接,然後開始binlog dump process。Binlog dump process從master的二進制日志中讀取事件,如果已經跟上master,它會睡眠并等待master産生新的事件。I/O線程将這些事件寫入中繼日志。

       SQL slave thread(SQL從線程)處理該過程的最後一步。SQL線程從中繼日志讀取事件,并重放其中的事件而更新slave的資料,使其與master中的資料一緻。隻要該線程與I/O線程保持一緻,中繼日志通常會位于OS的緩存中,是以中繼日志的開銷很小。

        此外,在master中也有一個工作線程:和其它MySQL的連接配接一樣,slave在master中打開一個連接配接也會使得master開始一個線程。複制過程有一個很重要的限制——複制在slave上是串行化的,也就是說master上的并行更新操作不能在slave上并行操作。

以一個實驗介紹mysql主從複制的部署過程.

場景介紹:

HostName: Mysql_master IP: 192.168.200.20  Mysql複制主伺服器

HostName: Mysql_slave  IP: 192.168.200.21  Mysql複制從伺服器

Mysql版本: 5.6.19

安裝部分:

1. 安裝cmake:從mysql5.5版本開始,開始使用cmake

cmake安裝:

1

2

3

4

5

6

<code>#cmake安裝</code>

<code>[root@Master_mysql src]</code><code># tar zxvf cmake-3.0.0.tar.gz</code>

<code>[root@Master_mysql src]</code><code># cd cmake-3.0.0</code>

<code>[root@Master_mysql cmake-3.0.0]</code><code># ./bootstrap</code>

<code>[root@Master_mysql cmake-3.0.0]</code><code># gmake</code>

<code>[root@Master_mysql cmake-3.0.0]</code><code># make install</code>

2.安裝mysql:

7

8

9

10

11

12

13

14

15

<code>[root@Master_mysql ~]</code><code># groupadd mysql</code>

<code>[root@Master_mysql ~]</code><code># useradd -g mysql mysql</code>

<code>[root@Master_mysql src]</code><code># tar zxvf mysql-5.6.19.tar.gz</code>

<code>[root@Master_mysql src]</code><code># cd mysql-5.6.19</code>

<code>[root@Master_mysql mysql-5.6.19]</code><code># cmake .</code>

<code>[root@Master_mysql mysql-5.6.19]</code><code># make</code>

<code>[root@Master_mysql mysql-5.6.19]</code><code># make install</code>

<code>[root@Master_mysql mysql-5.6.19]</code><code># cd /usr/local/mysql/</code>

<code>[root@Master_mysql mysql]</code><code># chown -R mysql:mysql .</code>

<code>[root@Master_mysql mysql]</code><code># scripts/mysql_install_db --user=mysql &amp;</code>

<code>[root@Master_mysql mysql]</code><code># chown -R root:root  .</code>

<code>[root@Master_mysql mysql]</code><code># chown -R mysql:mysql data</code>

<code>[root@Master_mysql mysql]</code><code># bin/mysqld_safe --user=mysql &amp;</code>

<code>[root@Master_mysql mysql]</code><code># cp support-files/mysql.server /etc/init.d/</code>

在Mysql主從伺服器上分别執行上訴安裝過程.

配置部分:

主資料庫伺服器配置

修改主資料庫伺服器配置檔案my.cnf: 

<code>#增加如下:</code>

<code>[mysqld]</code>

<code>server_id = 1</code>

<code>log_bin = mysql-binlog   </code><code>#二進制日志名稱字首</code>

啟動Mysql服務: 

<code>[root@Master_mysql mysql]</code><code># /etc/init.d/mysql.server start</code>

主伺服器上建立授權賬号并擷取二進制檔案和位置:

16

17

18

19

20

21

<code>#複制權限</code>

<code>mysql&gt; grant replication slave on *.* to </code><code>'replica'</code><code>@</code><code>'192.168.200.21'</code> <code>identified by </code><code>'replicapass'</code><code>;</code>

<code>Query OK, 0 rows affected (0.00 sec)</code>

<code>mysql&gt; flush privileges;</code>

<code>Query OK, 0 rows affected (0.10 sec)</code>

<code>#鎖表</code>

<code>mysql&gt; flush tables with </code><code>read</code> <code>lock;</code>

<code>Query OK, 0 rows affected (0.01 sec)</code>

<code>#</code>

<code>mysql&gt; show master status\G</code>

<code>*************************** 1. row ***************************</code>

<code>             </code><code>File: mysql-binlog.000015</code>

<code>         </code><code>Position: 413</code>

<code>     </code><code>Binlog_Do_DB:</code>

<code> </code><code>Binlog_Ignore_DB:</code>

<code>Executed_Gtid_Set:</code>

<code>1 row </code><code>in</code> <code>set</code> <code>(0.00 sec)</code>

<code>mysql&gt; unlock tables;</code>

<code>Query OK, 0 rows affected (0.04 sec)</code>

此處主要用來擷取File 檔案名稱、Postition 位置,之後從伺服器配置change master to時需要

指定此處擷取的内容.

2. 從資料庫伺服器配置:

修改從資料庫伺服器配置檔案my.cnf: 

<code>server_id = 2</code>

<code>log_bin = mysql-binlog </code>

<code>relay_log = mysql-relaylog   </code><code>#(中繼日志名稱字首)</code>

<code>log_slave_updates = 1        </code><code>#(slave重做中繼日志内容并寫入到log_bin指定的二進制日志檔案)</code>

 普通的從資料庫伺服器是不需要啟用二進制日志的,但在某些特殊情況下,必須啟用二進制日志。比

 如:某個從伺服器同時作為其他資料庫伺服器的主、或者希望日常備份在從庫上執行等。 開啟二進制

 日志後,需要同時開啟log_slave_updates參數,如果不啟用,二進制日志檔案則不會有内容. 

<code>[root@Slave_mysql mysql]</code><code># /etc/init.d/mysql.server start</code>

設定複制并啟動複制:

<code>mysql&gt; change master to  master_host=</code><code>'192.168.200.20'</code><code>,</code>

<code>    </code><code>-&gt; master_user=</code><code>'replica'</code><code>,</code>

<code>    </code><code>-&gt; master_password=</code><code>'replicapass'</code><code>,</code>

<code>    </code><code>-&gt; master_log_file=</code><code>'mysql-binlog.000015'</code><code>,</code>

<code>    </code><code>-&gt; master_log_pos=413,</code>

<code>    </code><code>-&gt; master_connect_retry=10;</code>

<code>Query OK, 0 rows affected, 2 warnings (0.08 sec)</code>

<code>mysql&gt; start slave;</code>

<code>Query OK, 0 rows affected (0.03 sec)</code>

從伺服器上檢視複制狀态:

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

57

58

<code>mysql&gt; show slave status\G</code>

<code>               </code><code>Slave_IO_State: Waiting </code><code>for</code> <code>master to send event</code>

<code>                  </code><code>Master_Host: 192.168.200.20</code>

<code>                  </code><code>Master_User: replica</code>

<code>                  </code><code>Master_Port: 3306</code>

<code>                </code><code>Connect_Retry: 10</code>

<code>              </code><code>Master_Log_File: mysql-binlog.000015</code>

<code>          </code><code>Read_Master_Log_Pos: 413</code>

<code>               </code><code>Relay_Log_File: mysql-relaylog.000002</code>

<code>                </code><code>Relay_Log_Pos: 286</code>

<code>        </code><code>Relay_Master_Log_File: mysql-binlog.000015</code>

<code>             </code><code>Slave_IO_Running: Yes</code>

<code>            </code><code>Slave_SQL_Running: Yes</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: 413</code>

<code>              </code><code>Relay_Log_Space: 458</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: 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: 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: e84592e0-0e5b-11e4-a5d3-000c29e88022</code>

<code>             </code><code>Master_Info_File: </code><code>/usr/local/mysql/data/master</code><code>.info</code>

<code>                    </code><code>SQL_Delay: 0</code>

<code>          </code><code>SQL_Remaining_Delay: NULL</code>

<code>      </code><code>Slave_SQL_Running_State: Slave has </code><code>read</code> <code>all relay log; waiting </code><code>for</code> <code>the slave I</code><code>/O</code> <code>thread to update 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>

可以看到: Slave_IO_Running和Slave_SQL_Running 狀态都是Yes,這說明兩個線程都在正常運作,複制

成功執行.

複制驗證部分:

主伺服器上,登入資料庫進行建庫操作:

本例建立庫temp和表t1

<code>mysql&gt; create database temp;</code>

<code>Query OK, 1 row affected (0.06 sec)</code>

<code>mysql&gt; create table temp.t1(</code>

<code>    </code><code>-&gt; number varchar(10) not null,</code>

<code>    </code><code>-&gt; name varchar(20),</code>

<code>    </code><code>-&gt; birthday </code><code>date</code><code>,</code>

<code>    </code><code>-&gt; primary key (number)</code>

<code>    </code><code>-&gt; );</code>

<code>Query OK, 0 rows affected (0.23 sec)</code>

<code>mysql&gt; insert into temp.t1</code>

<code>    </code><code>-&gt; values(</code><code>'20140805'</code><code>,</code><code>'shizhenning'</code><code>,</code><code>'19860101'</code><code>);</code>

<code>Query OK, 1 row affected (0.07 sec)</code>

<code>mysql&gt; </code><code>select</code> <code>* from temp.t1;</code>

<code>+----------+-------------+------------+</code>

<code>| number   | name        | birthday   |</code>

<code>| 20140805 | shizhenning | 1986-01-01 |</code>

<code>1 row </code><code>in</code> <code>set</code> <code>(0.03 sec)</code>

查詢從庫伺服器複制結果:

<code>mysql&gt; show databases;</code>

<code>+--------------------+</code>

<code>| Database           |</code>

<code>| information_schema |</code>

<code>| mysql              |</code>

<code>| performance_schema |</code>

<code>| temp               |</code>

<code>| </code><code>test</code>               <code>|</code>

<code>5 rows </code><code>in</code> <code>set</code> <code>(0.00 sec)</code>

可以看到,從庫伺服器已經複制完成.

對比兩台伺服器日志:

 主伺服器執行:  mysqlbinlog data/mysql-binlog.000015

從庫伺服器執行: mysqlbinlog data/mysql-binlog.000002 

從庫伺服器的二進制日志已經有了内容,時間戳和主庫二進制保持一緻.

這樣一個基本的主從複制就部署完成了.

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