天天看點

MySQL主主互備模式(Keepalived)

                          MySQL雙主-高可用

單台資料庫執行個體安裝

資源規劃

主機名

os 版本

MySQL 版本

主機 IP

MySQL VIP

db01.lyk.com

centos 6.4

mysql-5.6.21-linux-glibc2.5-x86_64 

172.31.30.12

172.31.30.222

db02.lyk.com

mysql-5.6.21-linux-glibc2.5-x86_64

172.31.30.11

  3.修改MySQL配置檔案

修改DB01的配置檔案:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

<code>vi</code> <code>/etc/my</code><code>.cnf</code>

<code>#在[mysqld]添加如下内容#</code>

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

<code>log-bin = </code><code>/usr/local/mysql/data/ttpai-bin</code>

<code>binlog_format = MIXED </code><code>#非必需</code>

<code>relay-log = </code><code>/usr/local/mysql/data/ttpai-relay-bin</code>

<code>binlog-ignore-db = mysql</code>

<code>binlog-ignore-db = </code><code>test</code>

<code>binlog-ignore-db = information_schema</code>

<code>binlog-ignore-db = performance_schema</code>

<code>replicate-wild-ignore-table = mysql.%</code>

<code>replicate-wild-ignore-table = </code><code>test</code><code>.%</code>

<code>replicate-wild-ignore-table = information_schema.%</code>

<code>replicate-wild-ignore-table = performance_schema.%</code>

修改DB02的配置檔案:

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

  4.手動同步資料庫

如果DB01上已經有MySQL資料,那麼執行主主互備之前,需要将DB01和DB02上的兩個MySQL的資料保持同步,首先在DB01上備份MySQL資料,執行如下SQL:

<code>mysql&gt; FLUSH TABLES </code><code>WITH</code> <code>READ</code> <code>LOCK;</code>

在不退出終端的情況下(推出鎖失效),再開啟一個session,直接打包MySQL的資料檔案或者mysqldump工具導出:

<code>cd</code> <code>/usr/local/mysql/</code>

<code>tar</code> <code>zcvf data.</code><code>tar</code><code>.gz data/</code>

将data.tar.gz 傳輸到DB02,依次重新開機DB01和DB02。

其實,可以在不執行READ LOCK語句,直接使用mysqldump語句備份,最起碼個人測試是資料不會丢失或者說出現同步異常。使用如下指令:

<code> </code><code>mysqldump  --default-character-</code><code>set</code><code>=gbk --opt  --triggers -R -E --hex-blob --single-transaction --master-data=2  ttpai &gt; ttpai.sql</code>

其中--master-data=2可以鎖定binlog的檔案名及坐标。

  5.建立授權複制使用者

DB01執行:

<code>mysql&gt; grant REPLICATION SLAVE ON *.* TO lyk@</code><code>'172.31.30.11'</code> <code>IDENTIFIED BY </code><code>'lyk123'</code><code>;</code>

DB02執行:

<code>mysql&gt; grant REPLICATION SLAVE ON *.* TO lyk@</code><code>'172.31.30.12'</code> <code>IDENTIFIED BY </code><code>'lyk123'</code><code>;</code>

其中關于坐标的值,可以執行如下SQL得到:

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

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

<code>| File             | Position  | Binlog_Do_DB | Binlog_Ignore_DB                                 | Executed_Gtid_Set |</code>

<code>| ttpai-bin.000093 | 502389306 |              | mysql,</code><code>test</code><code>,information_schema,performance_schema |                   |</code>

如果使用mysqldump 可以使用如下指令:

<code>head</code> <code>-n50 ttpai.sql</code>

   6.啟動互為主從的模式

在DB02上執行:

<code>mysql&gt;CHANGE MASTER TO </code>

<code>MASTER_LOG_FILE=</code><code>'ttpai-bin.000050'</code><code>,</code>

<code>MASTER_LOG_POS=754861035,</code>

<code>MASTER_HOST=</code><code>'172.31.30.12'</code><code>,</code>

<code>MASTER_USER=</code><code>'lyk'</code><code>,</code>

<code>MASTER_PASSWORD=</code><code>'lyk123'</code><code>;</code>

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

在DB01上執行:

驗證同步結果:

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

自此Mysql互為主從已完畢。

  7.安裝lvs+keepalived

<code> </code><code>yum instal keepalived ipvsadm</code>

  8.編輯keepalived配置檔案

DB01的配置檔案:

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

<code>vi</code> <code>/etc/keepalived/keepalived</code><code>.conf </code>

<code>global_defs {</code>

<code>   </code><code>notification_email {</code>

<code>     </code><code>[email protected]</code>

<code>   </code><code>}</code>

<code>   </code><code>notification_email_from [email protected]</code>

<code>   </code><code>smtp_server 127.0.0.1</code>

<code>   </code><code>smtp_connect_timeout 30</code>

<code>   </code><code>router_id LVS_Mysql</code>

<code>}</code>

<code>vrrp_instance HA_1 {</code>

<code>    </code><code>state BACKUP</code>

<code>    </code><code>interface bond0</code>

<code>    </code><code>virtual_router_id 80</code>

<code>    </code><code>priority 100</code>

<code>    </code><code>advert_int 2</code>

<code>    </code><code>nopreempt</code>

<code>    </code> 

<code>    </code><code>authentication {</code>

<code>        </code><code>auth_type PASS</code>

<code>        </code><code>auth_pass 1111</code>

<code>    </code><code>}</code>

<code>    </code><code>virtual_ipaddress {</code>

<code>      </code><code>172.31.30.222</code>

<code>virtual_server 172.31.30.222 3306 {</code>

<code>    </code><code>delay_loop 2</code>

<code>    </code><code>lb_algo wlc</code>

<code>    </code><code>lb_kind DR</code>

<code>    </code><code>nat_mask 255.255.255.0</code>

<code>    </code><code>protocol TCP</code>

<code>    </code><code>persistence_timeout 60</code>

<code>    </code><code>real_server 172.31.30.12 3306 {</code>

<code>        </code><code>weight 1</code>

<code>        </code><code>notify_down </code><code>/etc/keepalived/mysqlcheck/mysql</code><code>.sh</code>

<code>        </code><code>TCP_CHECK {</code>

<code>            </code><code>connect_port 3306</code>

<code>            </code><code>connect_timeout 3</code>

<code>            </code><code>nb_get_retry 2</code>

<code>            </code><code>delay_before_retry 1</code>

<code>        </code><code>}</code>

其中需要注意的是:

state BACKUP  #DB01和DB02均配置為BACKUP狀态

nopreempt     #為不強占模式,DB02(slave)不用設定

notify_down   #定義監測realserver失敗下一步的動作

priority      #DB02要比DB01低

interface bond0 #沒什麼特别,卻是我的整個搭建最耗時的痛點,稍後解釋

建立notify_down的腳本(DB01和DB02都需建立):

<code>mkdir</code> <code>-p  </code><code>/etc/keepalived/mysqlcheck/</code>

<code>cd</code> <code>/etc/keepalived/mysqlcheck/</code>

<code>vi</code> <code>mysql.sh</code>

<code>#!/bin/sh</code>

<code>pkill keepalived</code>

<code>chmod</code> <code>u+x mysql.sh</code>

其實就是幹掉keepalived程序,釋放VIP。

DB02的配置檔案:

<code>    </code><code>priority 90</code>

<code>    </code><code>real_server 172.31.30.11 3306 {</code>

DB01和DB02的啟動keepalived:

<code>/etc/init</code><code>.d</code><code>/keepalived</code> <code>start</code>

9.測試

測試主從同步,通過VIP連接配接:

<code>mysql -h172.31.30.222 -utest -ptest ttpai</code>

<code>mysql&gt; show vaiables like </code><code>'server_id'</code><code>; </code><code>#可以确認那台為master狀态</code>

<code>mysql&gt; create table ....  </code><code>#到slave狀态的資料庫看都是否正常</code>

<code>.....</code>

測試keepalived實作MySQL故障轉移:

可以在DB01執行

<code>/etc/init</code><code>.d</code><code>/mysqld</code> <code>stop</code>

遠端一直執行

<code>show vaiables like </code><code>'server_id'</code><code>;</code>

發現會卡1~3s,server_id變為110,即master變為DB02。

即使重新開機DB01,VIP也不會轉移,因為采用的是不搶占模式,直到DB02的服務挂,才會轉移VIP。

10:總結

來說下interface bond0的事兒:

一切配置都很順,但是在測試的時候,發現VIP連接配接資料庫,執行SQL時卡時不卡,在windows下ping VIP或者VIP所在的DB的主機IP,丢包;有沒有蛋碎的感覺。開始一頭霧水,後來仔細又看了一邊lvs DR模式的原理,原來都和MAC位址相關聯,而自己的環境網卡做了bond0(mode=0),卻在交換機上沒做端口聚合,可以認為網卡MAC發生紊亂。

解決:

配置交換機(H3C)

<code>#建立端口聚合組(不同型号,指令不同,叫法不一樣)</code>

<code>interface Bridge-Aggregation2</code>

<code>description bonding</code>

<code>port access vlan 30</code>

<code>interface Bridge-Aggregation3</code>

<code>#将做bonding的網卡加入對應的聚合組</code>

<code>interface GigabitEthernet1</code><code>/0/3</code>

<code>port link-aggregation group 3</code>

<code>......</code>

一切恢複正常,發生這個事件,不知是自己太低端,還是大家都沒遇到,搜資料真沒收到,呵呵。

注意:

LVS DR原理

bonding 模式的注意點

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