天天看點

CentOS 6.4系統MySQL主從複制基本配置實踐

對于mysql資料庫一般用途的主從複制,可以實作資料的備份(如果希望在主節點失效後,能夠使從節點自動接管,就需要更加複雜的配置,這裡暫時先不考慮),如果主節點出現硬體故障,資料庫伺服器可以直接手動切換成備份節點(從節點),繼續提供服務。基本的主從複制配置起來非常容易,這裡我們做個簡單的記錄總結。

我們選擇兩台伺服器來進行mysql的主從複制實踐,一台m1作為主節點,另一台nn作為從節點。

兩台機器上都需要安裝mysql資料庫,如果想要卸掉預設安裝的,可以執行如下指令:

<code>1</code>

<code>sudo</code> <code>rpm -e --nodeps mysql</code>

<code>2</code>

<code>yum list |</code><code>grep</code> <code>mysql</code>

現在可以在centos 6.4上直接執行如下指令進行安裝:

<code>sudo</code> <code>yum</code><code>install</code> <code>-y mysql-server mysql mysql-deve</code>

為root使用者設定密碼:

<code>mysqladmin -u root password</code><code>'shiyanjun'</code>

然後可以直接通過mysql用戶端登入:

<code>mysql -u root -p</code>

主節點配置

首先,考慮到資料庫的安全,以及便于管理,我們需要在主節點m1上增加一個專用的複制使用者,使得任意想要從主節點進行複制從節點都必須使用這個賬号:

<code>create</code> <code>user</code> <code>repli_user;</code>

<code>grant</code> <code>replication slave</code><code>on</code> <code>*.*</code><code>to</code> <code>'repli_user'</code><code>@</code><code>'%'</code> <code>identified</code><code>by</code> <code>'shiyanjun'</code><code>;</code>

這裡還進行了操作授權,使用這個換用賬号來執行叢集複制。如果想要限制ip端段,也可以在這裡進行配置授權。

然後,在主節點m1上,修改mysql配置檔案/etc/my.cnf,使其支援master複制功能,修改後的内容如下所示:

<code>01</code>

<code>[mysqld]</code>

<code>02</code>

<code>datadir=/var/lib/mysql</code>

<code>03</code>

<code>socket=/var/lib/mysql/mysql.sock</code>

<code>04</code>

<code>user=mysql</code>

<code>05</code>

<code># disabling symbolic-links is recommended to prevent assorted security risks</code>

<code>06</code>

<code>symbolic-links=0</code>

<code>07</code>

<code>server-id=1</code>

<code>08</code>

<code>log-bin=m-bin</code>

<code>09</code>

<code>log-bin-index=m-bin.index</code>

<code>10</code>

<code>11</code>

<code>[mysqld_safe]</code>

<code>12</code>

<code>log-error=/var/log/mysqld.log</code>

<code>13</code>

<code>pid-file=/var/run/mysqld/mysqld.pid</code>

server-id指明主節點的身份,從節點通過這個server-id來識别該節點是master節點(複制架構中的源資料庫伺服器節點)。

如果mysql目前已經啟動,修改完叢集複制配置後需要重新開機伺服器:

<code>sudo</code> <code>service mysqld restart</code>

從節點配置

接着,類似地進行從節點nn的配置,同樣修改mysql配置檔案/etc/my.cnf,使其支援slave端複制功能,修改後的内容如下所示:

<code>server-id=2</code>

<code>relay-log=slave-relay-bin</code>

<code>relay-log-index=slave-relay-bin.index</code>

同樣,如果mysql目前已經啟動,修改完叢集複制配置後需要重新開機伺服器:

然後,需要使從節點nn指向主節點,并啟動slave複制,執行如下指令:

<code>change master</code><code>to</code> <code>master_host=</code><code>'m1'</code><code>, master_port=3306, master_user=</code><code>'repli_user'</code><code>, master_password=</code><code>'shiyanjun'</code><code>;</code>

<code>start slave;</code>

驗證叢集複制

這時,可以在主節點m1上執行相關操作,驗證從節點nn同步複制了主節點的資料庫中的内容變更。

如果此時,我們已經配置好了主從複制,那麼對于主節點m1上mysql資料庫的任何變更都會複制到從節點nn上,包括建庫建表、插入更新等操作,下面我們從建庫開始:

在主節點m1上建庫建表:

<code>create</code> <code>database</code> <code>workflow;</code>

<code>create</code> <code>table</code> <code>`workflow`.`project` (</code>

<code></code><code>`id`</code><code>int</code><code>(11)</code><code>not</code> <code>null</code> <code>auto_increment,</code>

<code></code><code>`</code><code>name</code><code>`</code><code>varchar</code><code>(100)</code><code>not</code> <code>null</code><code>,</code>

<code></code><code>`type` tinyint(4)</code><code>not</code> <code>null</code> <code>default</code> <code>'0'</code><code>,</code>

<code></code><code>`description`</code><code>varchar</code><code>(500)</code><code>default</code> <code>null</code><code>,</code>

<code></code><code>`create_at`</code><code>date</code> <code>default</code> <code>null</code><code>,</code>

<code></code><code>`update_at`</code><code>timestamp</code> <code>not</code> <code>null</code> <code>default</code> <code>current_timestamp</code> <code>on</code> <code>update</code><code>current_timestamp</code><code>,</code>

<code></code><code>`status` tinyint(4)</code><code>not</code> <code>null</code> <code>default</code> <code>'0'</code><code>,</code>

<code></code><code>primary</code> <code>key</code> <code>(`id`)</code>

<code>) engine=innodb</code><code>default</code> <code>charset=utf8;</code>

在m1上檢視binlog内容,執行指令:

<code>show binlog events\g</code>

binlog内容内容如下所示:

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

<code></code><code>log_name: m-bin.000001</code>

<code></code><code>pos: 4</code>

<code>event_type: format_desc</code>

<code></code><code>server_id: 1</code>

<code>end_log_pos: 106</code>

<code></code><code>info: server ver: 5.1.73-log, binlog ver: 4</code>

<code>*************************** 2. row ***************************</code>

<code></code><code>pos: 106</code>

<code>event_type: query</code>

<code>end_log_pos: 197</code>

<code>14</code>

<code></code><code>info: create database workflow</code>

<code>15</code>

<code>*************************** 3. row ***************************</code>

<code>16</code>

<code>17</code>

<code></code><code>pos: 197</code>

<code>18</code>

<code>19</code>

<code>20</code>

<code>end_log_pos: 671</code>

<code>21</code>

<code></code><code>info: create table `workflow`.`project` (</code>

<code>22</code>

<code></code><code>`id` int(11) not null auto_increment,</code>

<code>23</code>

<code></code><code>`name` varchar(100) not null,</code>

<code>24</code>

<code></code><code>`type` tinyint(4) not null default '0',</code>

<code>25</code>

<code></code><code>`description` varchar(500) default null,</code>

<code>26</code>

<code></code><code>`create_at` date default null,</code>

<code>27</code>

<code></code><code>`update_at` timestamp not null default current_timestamp on update current_timestamp,</code>

<code>28</code>

<code></code><code>`status` tinyint(4) not null default '0',</code>

<code>29</code>

<code></code><code>primary key (`id`)</code>

<code>30</code>

<code>) engine=innodb default charset=utf8</code>

<code>31</code>

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

通過上述binlog内容,我們大概可以看到mysql的binlog都記錄那些資訊,一個事件對應一行記錄。這些記錄資訊的組織結構如下所示:

log_name:日志名稱,指定的記錄操作的binlog日志名稱,這裡是m-bin.000001,與我們前面在/etc/my.cnf中配置的相對應

pos:記錄事件的起始位置

event_type:事件類型

end_log_pos:記錄事件的結束位置

server_id:伺服器辨別

info:事件描述資訊

然後,我們可以檢視在從節點nn上複制的情況。通過如下指令檢視從節點nn上資料庫和表的資訊:

<code>show databases;</code>

<code>use workflow;</code>

<code>3</code>

<code>show tables;</code>

<code>4</code>

<code>desc</code> <code>project;</code>

我們再看一下執行插入語句的情況。在主節點m1上執行如下sql語句:

<code>insert</code> <code>into</code> <code>`workflow`.`project`</code><code>values</code><code>(1,</code><code>'avatar-ii'</code><code>, 1,</code><code>'avatar-ii project'</code><code>,</code><code>'2014-02-16'</code><code>,</code><code>'2014-02-16 11:09:54'</code><code>, 0);</code>

可以在從節點上執行查詢,看到從節點nn上複制了主節點m1上執行的insert語句的記錄:

<code>select</code> <code>*</code><code>from</code> <code>workflow.project;</code>

驗證複制成功。

複制常用指令

下面,我們總結了幾個在mysql主從複制場景中常用到的幾個相關指令:

終止主節點複制

<code>stop master;</code>

清除主節點複制檔案

<code>reset master;</code>

終止從節點複制

<code>stop slave;</code>

清除從節點複制檔案

<code>reset slave;</code>

檢視主節點複制狀态

<code>show master status\g;</code>

結果示例:

<code></code><code>file: m-bin.000001</code>

<code></code><code>position: 956</code>

<code></code><code>binlog_do_db:</code>

<code>5</code>

<code>binlog_ignore_db:</code>

<code>6</code>

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

檢視從節點複制狀态

<code>show slave status\g;</code>

<code></code><code>slave_io_state: waiting for master to send event</code>

<code></code><code>master_host: m1</code>

<code></code><code>master_user: repli_user</code>

<code></code><code>master_port: 3306</code>

<code></code><code>connect_retry: 60</code>

<code></code><code>master_log_file: m-bin.000001</code>

<code></code><code>read_master_log_pos: 956</code>

<code></code><code>relay_log_file: slave-relay-bin.000002</code>

<code></code><code>relay_log_pos: 1097</code>

<code></code><code>relay_master_log_file: m-bin.000001</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: 956</code>

<code></code><code>relay_log_space: 1252</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>32</code>

<code></code><code>master_ssl_cipher:</code>

<code>33</code>

<code></code><code>master_ssl_key:</code>

<code>34</code>

<code></code><code>seconds_behind_master: 0</code>

<code>35</code>

<code>master_ssl_verify_server_cert: no</code>

<code>36</code>

<code></code><code>last_io_errno: 0</code>

<code>37</code>

<code></code><code>last_io_error:</code>

<code>38</code>

<code></code><code>last_sql_errno: 0</code>

<code>39</code>

<code></code><code>last_sql_error:</code>

<code>40</code>

檢視binlog清單

<code>show</code><code>binary</code> <code>logs\g</code>