天天看點

MySQL高可用性之Keepalived+Mysql(雙主熱備) mysql5.6.37 http://blog.51cto.com/sf1314/2058754 

環境描述:

OS:CentOS6.5_X64

MySQL-VIP:192.168.1.200    

MySQL-master1:192.168.1.201    

MySQL-master2:192.168.1.202   

1、配置兩台Mysql主主同步

<code></code>

1

2

3

4

5

6

7

8

9

10

11

12

<code>[root@master ~]</code><code># yum install mysql-server mysql -y</code>

<code>[root@master ~]</code><code># service mysqld start</code>

<code>[root@master ~]</code><code># mysqladmin -u root password 123.com</code>

<code>[root@master ~]</code><code># vi /etc/my.cnf                   #開啟二進制日志,設定id</code>

<code>[mysqld]</code>

<code>server-</code><code>id</code> <code>= 1                    </code><code>#backup這台設定2</code>

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

<code>binlog-ignore-db = mysql,information_schema     </code><code>#忽略寫入binlog日志的庫</code>

<code>auto-increment-increment = 2             </code><code>#字段變化增量值</code>

<code>auto-increment-offset = 1               </code><code>#初始字段ID為1</code>

<code>slave-skip-errors = all                </code><code>#忽略所有複制産生的錯誤     </code>

<code>[root@master ~]</code><code># service mysqld restart</code>

安裝mysql,參考文章:

# mysql -uroot -p'密碼'

先檢視下log bin日志和pos值位置

master配置如下:

<code>[root@ master ~]</code><code># mysql -u root -p123.com</code>

<code>mysql&gt; GRANT  REPLICATION SLAVE ON *.* TO </code><code>'replication'</code><code>@</code><code>'192.168.0.%'</code> <code>IDENTIFIED  BY </code><code>'replication'</code><code>;</code>

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

<code>mysql&gt; change  master to</code>

<code>    </code><code>-&gt;  master_host=</code><code>'192.168.0.203'</code><code>,</code>

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

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

<code>    </code><code>-&gt;  master_log_file=</code><code>'mysql-bin.000002'</code><code>,</code>

<code>    </code><code>-&gt;  master_log_pos=106;  </code><code>#對端狀态顯示的值</code>

<code>mysql&gt; start  slave;         </code><code>#啟動同步</code>

backup配置如下:

<code>[root@backup ~]</code><code>#  mysql -u root -p123.com</code>

<code>    </code><code>-&gt;  master_host=</code><code>'192.168.0.202'</code><code>,</code>

<code>    </code><code>-&gt;  master_log_pos=106;</code>

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

#主主同步配置完畢,檢視同步狀态Slave_IO和Slave_SQL是YES說明主主同步成功。

在master插入資料測試下:

在backup檢視是否同步成功:

可以看到已經成功同步過去,同樣在backup插入到user表資料,一樣同步過去,雙主就做成功了。

2、配置keepalived實作熱備

[root@backup ~]# yum install -y pcre-devel openssl-devel popt-devel #安裝依賴包

<code>[root@master ~]</code><code># wget http://www.keepalived.org/software/keepalived-1.2.7.tar.gz </code>

<code>[root@master ~]</code><code># tar -xf keepalived-1.2.7.tar.gz -C /usr/local/src/</code>

<code>[root@master ~]</code><code># cd /usr/local/</code>

<code>[root@master ~]</code><code># ln -sv /usr/local/src/keepalived-1.2.7/ keepalived  #根據實際情況修改 </code>

<code>[root@master ~]</code><code># cd keepalived</code>

<code>[root@master ~]</code><code>#./configure --prefix=/usr/local/keepalived</code>

<code>make</code> <code>&amp;&amp; </code><code>make</code> <code>install</code>

#将keepalived配置成系統服務

<code>[root@master ~]</code><code># cp /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/</code>

<code>chmod</code> <code>+x </code><code>/etc/init</code><code>.d</code><code>/keepalived</code>  

<code>[root@master ~]</code><code># cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/</code>

<code>[root@master  ~]</code><code>#  chkconfig --add keepalived  </code>

<code>[root@master  ~]</code><code>#  chkconfig keepalived on  </code>

<code>[root@master ~]</code><code># mkdir /etc/keepalived</code>

<code>[root@master ~]</code><code># cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/</code>

<code>[root@master ~]</code><code># cp /usr/local/sbin/keepalived /usr/sbin/      #或者ln -s /usr/local/sbin/keepalived /usr/sbin/</code>

配置keepalived

我們自己在建立一個配置檔案,預設情況下keepalived啟動時會去/etc/keepalived目錄下找配置檔案

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

<code>[root@master ~]</code><code># vi /etc/keepalived/keepalived.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 MYSQL_HA      </code><code>#辨別,雙主相同 </code>

<code>}    </code>

<code>   </code> 

<code>vrrp_instance VI_1 {    </code>

<code>     </code><code>state BACKUP   </code><code>#兩台配置此處均是BACKUP    </code>

<code>     </code><code>interface eth0    </code>

<code>     </code><code>virtual_router_id 51    </code><code>#主備相同</code>

<code>     </code><code>priority 100             </code><code>#優先級,另一台backup改為90    </code>

<code>     </code><code>advert_int 1    </code>

<code>     </code><code>nopreempt                  </code><code>#不搶占,隻在優先級高master的機器上設定即可,優先級低backup的機器不設定    </code>

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

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

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

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

<code>         </code><code>192.168.1.200    </code>

<code>virtual_server 192.168.1.200 3306 {    </code>

<code>     </code><code>delay_loop 2    </code><code>#每個2秒檢查一次real_server狀态    </code>

<code>     </code><code>#lb_algo wrr    #LVS算法,用不到,我們就關閉了    </code>

<code>     </code><code>#lb_kind DR    #LVS模式,如果不關閉,備用伺服器不能通過VIP連接配接主MySQL   </code>

<code>     </code><code>persistence_timeout 60   </code><code>#會話保持時間,同一IP的連接配接60秒内被配置設定到同一台真實伺服器   </code>

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

<code>     </code><code>real_server 192.168.1.201 3306 {   </code><code>#檢測本地mysql,backup也要寫檢測本地mysql </code>

<code>         </code><code>weight 3    </code>

<code>         </code><code>notify_down </code><code>/usr/local/keepalived/mysql</code><code>.sh   </code><code>#當mysq服down時,執行此腳本,殺死keepalived實作切換    </code>

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

<code>             </code><code>connect_timeout 10    </code><code>#連接配接逾時時間    </code>

<code>             </code><code>nb_get_retry 3      </code><code>#重連次數    </code>

<code>             </code><code>delay_before_retry 3   </code><code>#重連間隔時間    </code>

<code>             </code><code>connect_port 3306      </code><code>#健康檢查端口</code>

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

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

<code>}</code>

<code>編寫檢測服務down後所要執行的腳本</code>

<code>[root@master ~]</code><code># vi /usr/local/keepalived/mysql.sh</code>

<code>#!/bin/bash</code>

<code>pkill keepalived</code>

<code>[root@master ~]</code><code># chmod +x /usr/local/keepalived/mysql.sh</code>

<code>[root@master ~]</code><code># /etc/init.d/keepalived start</code>

注:此腳本是上面配置檔案notify_down選項所用到的,keepalived使用notify_down選項來檢查real_server 的服務狀态,當發現real_server服務故障時,便觸發此腳本;我們可以看到,腳本就一個指令,通過pkill keepalived強制殺死keepalived程序,進而實作了MySQL故障自動轉移。另外,我們不用擔心兩個MySQL會同時提供資料更新操作, 因為每台MySQL上的keepalived的配置裡面隻有本機MySQL的IP+VIP,而不是兩台MySQL的IP+VIP

啟動keepalived

<code>[root@master ~]</code><code># /usr/local/keepalived/sbin/keepalived –D     或者/etc/init.d/keepalived start</code>

<code>[root@master ~]</code><code># ps -aux | grep keepalived</code>

測試

找一台區域網路PC,然後去ping  MySQL的VIP,這時候MySQL的VIP是可以ping的通的

停止MySQL服務,看keepalived健康檢查程式是否會觸發我們編寫的腳本

#backup伺服器隻修改priority為90、nopreempt不設定、real_server設定本地IP。

#授權兩台Mysql伺服器允許root遠端登入,用于在其他伺服器登陸測試!

mysql&gt; grant all on *.* to'root'@'192.168.0.%' identified by '123.com';

mysql&gt; flush privileges;

3、測試高可用性

1、通過Mysql用戶端通過VIP連接配接,看是否連接配接成功。

2、停止master這台mysql服務,是否能正常切換過去,可通過ip addr指令來檢視VIP在哪台伺服器上。

3、可通過檢視/var/log/messges日志,看出主備切換過程

4、master伺服器故障恢複後,是否主動搶占資源,成為活動伺服器。

本文轉自 Mr_sheng 51CTO部落格,原文連結:http://blog.51cto.com/sf1314/2073383

繼續閱讀