MySQL+Heartbeat+DRBD+LVS+keepalived實現數據庫高可用羣集

DRBD  概述

一、DRBD簡介

         DRBD 的全稱爲:Distributed ReplicatedBlock Device(DRBD)分佈式塊設備複製,DRBD

是由內核模塊和相關腳本而組成,用來構建數據的高可用性集羣。其實現方式是通過網絡來鏡像整個磁盤設備(數據)。你可以把它看作是一種基於網絡的 RAID1。它允許用戶在遠程機器上建立一個本地塊設備的實時鏡像。

二、DRBD工作原理

         (DRBD Primary)負責接收數據,把數據寫到本地磁盤併發送給另一臺主機(DRBD

Secondary)。另一個主機再將數據存儲到自己的磁盤中。目前,DRBD每次只允許對一個節

點進行讀寫訪問,但這對於通常的故障切換高可用集羣來說已經足夠用了。有可能以後的版本支持兩個節點進行讀寫存取。

spacer.gif

三、DRBDHA的關係

         一個 DRBD 系統由兩個節點構成,與HA 集羣類似,也有主節點和備用節點之分,在帶有主要設備的節點上,應用程序和操作系統可以運行和訪問 DRBD 設備(/dev/drbd*)。在主節點寫入的數據通過 DRBD 設備存儲到主節點的磁盤設備中,同時,這個數據也會自動發送到備用節點對應的 DRBD 設備,最終寫入備用節點的磁盤設備上,在備用節點上,DRBD 只是將數據從 DRBD 設備寫入到備用節點的磁盤中。現在大部分的高可用性集羣都會使用共享存儲,而 DRBD 也可以作爲一個共享存儲設備,使用 DRBD 不需要太多的硬件的投資。因爲它在TCP/IP 網絡中運行,所以,利用DRBD 作爲共享存儲設備,要節約很多成本,因爲價格要比專用的存儲網絡便宜很多;其性能與穩定性方面也不錯。

四、DRBD複製模式

協議 A

         異步複製協議。一旦本地磁盤寫入已經完成,數據包已在發送隊列中,則寫被認爲是完成的。在一個節點發生故障時,可能發生數據丟失,因爲被寫入到遠程節點上的數據可能仍在發送隊列。儘管,在故障轉移節點上的數據是一致的,但沒有及時更新。這通常是用於地理上分開的節點。

協議 B

         內存同步(半同步)複製協議。一旦本地磁盤寫入已完成且複製數據包達到了遠程節點則認爲寫在主節點上被認爲是完成的。數據丟失可能發生在參加的兩個節點同時故障的情況下,因爲在傳輸中的數據可能不會被提交到磁盤。

協議 C

         同步複製協議。只有在本地和遠程節點的磁盤已經確認了寫操作完成,寫才被認爲完成。沒有任何數據丟失,所以這是一個羣集節點的流行模式,但 I / O 吞吐量依賴於網絡帶寬一般使用協議 C,但選擇 C 協議將影響流量,從而影響網絡時延。爲了數據可靠性,我們在生產環境使用時須慎重選項使用哪一種協議。

Heartbeat

一、heartbeat簡介

         Heartbeat Linux-HA 工程的一個組件,自1999 年開始到現在,發佈了衆多版本,是目前開源Linux-HA項目最成功的一個例子,在行業內得到了廣泛的應用,這裏分析的是2007118日發佈的版本 2.0.8

         隨着 Linux 在關鍵行業應用的逐漸增多,它必將提供一些原來由 IBM SUN 這樣的大型商業公司所提供的服務,這些商業公司所提供的服務都有一個關鍵特性,就是高可用集羣。

二、heartbeat  工作原理

         Heartbeat 最核心的包括兩個部分,心跳監測部分和資源接管部分,心跳監測可以通過

網絡鏈路和串口進行,而且支持冗餘鏈路,它們之間相互發送報文來告訴對方自己當前的狀態,如果在指定的時間內未收到對方發送的報文,那麼就認爲對方失效,這時需啓動資源接管模塊來接管運行在對方主機上的資源或者服務。

三、高可用集羣

         高可用集羣是指一組通過硬件和軟件連接起來的獨立計算機,它們在用戶面前表現爲一個單一系統,在這樣的一組計算機系統內部的一個或者多個節點停止工作,服務會從故障節點切換到正常工作的節點上運行,不會引起服務中斷。從這個定義可以看出,集羣必須檢測節點和服務何時失效,何時恢復爲可用。這個任務通常由一組被稱爲“心跳”的代碼完成。在 Linux-HA 裏這個功能由一個叫做heartbeat 的程序完成。

環境描述:

操作系統

 IP地址

主機名

軟件包列表

CentOS  release 6.5

 192.168.200.101

server1

DRBD heartbeat mysql

CentOS release  6.5

 192.168.200.102

server2

DRBD  heartbeat mysql

CentOS  release 6.5

192.168.200.103

Slave1

Mysql

CentOS release  6.5

192.168.200.104

Slave2

mysql

CentOS  release 6.5

192.168.200.105

Lvs-m

Lvs+keepalived

CentOS release  6.5

192.168.200.106

Lvs-s

Lvs+keepalived

配置過程:

spacer.gif

安裝前準備配置:

所有主機需要添加一塊60GSCSI接口硬盤

配置所有機器:

關閉防火牆和selinux機制

[root@localhost ~]# service iptables stop

[root@localhost ~]# setenforce 0

主從都要配置,分區不需要格式化

[root@localhost ~]# fdisk /dev/sdb

Command (m for help): n

Command action

e extended

p primary partition (1-4)

P

Partition number (1-4): 1

Last cylinder, +cylinders or +size{K,M,G} (1-2610,default 2610): +10G

Command (m for help): w

[root@server1 ~]# partprobe /dev/sdb

從主機改爲 server2

[root@localhost ~]# vim /etc/sysconfig/network

2 HOSTNAME=server1

[root@localhost ~]# hostname server1

[root@localhost ~]# bash

[root@server1 ~]# vim /etc/hosts

3 192.168.200.101 server1

4 192.168.200.102 server2

Heartbeat安裝:

主從都需要安裝

把包上傳到/root下,按照順序安裝。

[root@server1 ~]#rpm -ivhPyXML-0.8.4-19.el6.x86_64.rpm

[root@server1 ~]#rpm -ivhperl-TimeDate-1.16-13.el6.noarch.rpm

[root@server1 ~]#rpm -ivhresource-agents-3.9.5-24.el6_7.1.x86_64.rpm

[root@server1 ~]#rpm -ivh lib64ltdl7-2.2.6-6.1mdv2009.1.x86_64.rpm

[root@server1 ~]#rpm -ivhcluster-glue-libs-1.0.5-6.el6.x86_64.rpm

[root@server1 ~]#rpm -ivhcluster-glue-1.0.5-6.el6.x86_64.rpm

[root@server1 ~]#yum -y install kernel-devel kernel-headers

[root@server1 ~]#rpm -ivh heartbeat-libs-3.0.4-2.el6.x86_64.rpmheartbeat-3.0.4-2.el6.x86_64.rpm

安裝配置 DRBD

主從都需要安裝

[root@server1 ~]# tar xf drbd-8.4.3.tar.gz

[root@server1 ~]# cd drbd-8.4.3

[root@server1 drbd-8.4.3]#./configure--prefix=/usr/local/drbd --with-km --with-heartbeat

[root@server1 drbd-8.4.3]# make KDIR=/usr/src/kernels/2.6.32-504.el6.x86_64/&& make &&

make install

[root@server1 drbd-8.4.3]# mkdir -p/usr/local/drbd/var/run/drbd

[root@server1 drbd-8.4.3]# cp/usr/local/drbd/etc/rc.d/init.d/drbd /etc/init.d/

[root@server1 drbd-8.4.3]# chkconfig --add drbd

[root@server1 drbd-8.4.3]# cd drbd

[root@server1 drbd]# make clean

[root@server1 drbd]# make KDIR=/usr/src/kernels/2.6.32-504.el6.x86_64/

[root@server1 drbd]# cp drbd.ko /lib/modules/2.6.32-504.el6.x86_64/kernel/lib/

[root@server1 drbd]# depmod

[root@server1 drbd]# cp -R/usr/local/drbd/etc/ha.d/resource.d/* /etc/ha.d/resource.d/

[root@server1 drbd]# cd /usr/local/drbd/etc/drbd.d/

[root@server1 drbd]# cat /usr/local/drbd/etc/drbd.conf

# You can find an example in/usr/share/doc/drbd.../drbd.conf.example


 

//此目錄下所有以.res    結尾的都爲資源文件

 

include"drbd.d/global_common.conf";


include "drbd.d/*.res";                                     

配置global_common.conf文件(主從一致)

[root@server1 drbd.d]# pwd

/usr/local/drbd/etc/drbd.d

[root@server1 drbd.d]# cp global_common.conf{,-$(date+%s)}

[root@server1 drbd.d]# vim global_common.conf

global {

usage-count yes;                                                 // 是否對使用信息作統計, 默認爲 yes

}

common {

startup {

wfc-timeout 120;                                                  // 等待連接的超時時間

degr-wfc-timeout 120;

}

disk {

on-io-error detach;                                             //IO出現錯誤時執行的動作

}

net {

protocol C;                                                             // 複製模式爲第 3

}

}

配置資源文件(主從一致)

[root@server1 drbd.d]# vim r0.res

resource r0 {                                                          //r0資源名稱

on server1 {

device /dev/drbd0;                                            // 邏輯設備路徑

disk /dev/sdb1;                                                   // 物理設備

address 192.168.200.101:7788;                      //主節點

meta-disk internal;

}

on server2 {

device /dev/drbd0;

disk /dev/sdb1;

address 192.168.200.102:7788;                       // 備節點

meta-disk internal;

}

}

 

[root@server1 drbd.d]# scp global_common.conf r0.res

192.168.200.102:/usr/local/drbd/etc/drbd.d

創建元數據(兩個節點上操作)

[root@server1 drbd.d]# modprobe drbd

[root@server1 drbd.d]# lsmod | grep drbd

drbd 310268 0

libcrc32c 1246 1 drbd

[root@server1 drbd.d]# dd if=/dev/zero bs=1M count=1of=/dev/sdb1

[root@server1 drbd.d]# drbdadm create-md r0 // 輸出以下信息

The server's response is:

you are the 57184th user to install this version

Writing meta data...

initializing activity log

NOT initializing bitmap

New drbd meta data block successfully created.        //當輸出成功信息後可 Ctrl+C結束

 

注意:

當執行命令”drbdadm create-md r0 ”時,出現以下錯誤信息。

Device sizewould be truncated, which

would corruptdata and result in

'accessbeyond end of device' errors.

You need toeither

* useexternal meta data (recommended)

* shrink thatfilesystem first

* zero outthe device (destroy the filesystem)

Operationrefused.

Command'drbdmeta 0 v08 /dev/xvdb internal create-md' terminated with exit code 40

drbdadmcreate-md r0: exited with code 40

解決辦法:初始化磁盤文件格式, dd if=/dev/zero bs=1M count=1 of=/dev/sdb1; sync

啓動 DRBD(主從節點都要執行)

[root@server1 drbd.d]# /etc/init.d/drbd start

Starting DRBD resources: [

create res: r0

prepare disk: r0

adjust disk: r0

adjust net: r0

]

........

[root@server1 drbd.d]# netstat -anpt | grep 7788

tcp 0 0 192.168.200.101:35654 192.168.200.102:7788

ESTABLISHED -

tcp 0 0 192.168.200.101:7788 192.168.200.102:33034

ESTABLISHED -

[root@server2 drbd.d]# netstat -anpt | grep 7788

tcp 0 0 192.168.200.102:7788 192.168.200.101:48501

ESTABLISHED -

tcp 0 0 192.168.200.102:10354 192.168.200.101:7788

ESTABLISHED -

手動驗證主從切換:

初始化網絡磁盤(主節點上執行)

[root@server1 drbd.d]# drbdadm -- --overwrite-data-of-peerprimary r0

[root@server1 drbd.d]#watch -n 2  cat /proc/drbd                   //動態顯示同步內容

version: 8.4.3 (api:1/proto:86-101)

GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515build by root@bogon, 2016-12-04

13:39:22

0: cs:SyncSource ro:Primary/Secondaryds:UpToDate/Inconsistent C r-----

ns:116024 nr:0 dw:0 dr:123552 al:0 bm:7 lo:0 pe:1 ua:7ap:0 ep:1 wo:f oos:10374340

 [>....................] sync'ed: 1.2%(10128/

 

數據同步測試(主節點上操作前 6 6  步驟,次節點上操作後三步驟)

server1上操作

[root@server1 drbd.d]# mkfs.ext4 /dev/drbd0

[root@server1 drbd.d]# mkdir /mysqldata

[root@server1 drbd.d]# mount /dev/drbd0 /mysqldata

[root@server1 drbd.d]# echo www.crushlinux.com >/mysqldata/file             // 建立測試文件

[root@server1 ~]# umount /dev/drbd0

[root@server1 ~]# drbdadm secondary r0                                     // 主降爲次

server2上操作

[root@server2 drbd.d]# drbdadm primary r0                      // 次升爲主

[root@server2 drbd.d]# mkdir /mysqldata

[root@server2 drbd.d]# mount /dev/drbd0 /mysqldata

[root@server2 drbd.d]# ls /mysqldata                                   // 在備節點上查看數據

file lost+found                                                                                 // 可以看到創建的文件

安裝 MySQL

更改Mysql數據庫的存儲位置爲共享目錄(主從都要執行)

[root@server1 ~]# yum -y install mysql mysql-server

[root@server1 ~]# vim /etc/my.cnf

2datadir=/mysqldata/mysql

[root@server1 ~]# chown -R mysql.mysql /mysqldata

[root@server1 ~]# chkconfig mysqld on

注意:此時我們修改了數據目錄和其屬主和權限,有時會因爲此操作導致數據庫無法啓動,

解決方法:

一,查看你的 selinux 是否處於打開狀態,將其關閉。

二,/etc/apparmor.d/usr.sbin.mysqld文件中,有兩行內容規定了 mysql 使用數據文件的路徑權限,改掉即可,重啓/etc/init.d/apparmor restart

進行數據庫測試

因爲此前的操作,現在把server2 節點降爲次

[root@server2 ~]# umount /dev/drbd0

[root@server2 ~]# drbdadm secondary r0

 

server1 升爲主節點

[root@server1 ~]# drbdadm primary r0

[root@server1 ~]# mount /dev/drbd0 /mysqldata

[root@server1 ~]# /etc/init.d/mysqld start

 

server1上創建一個庫 crushlinux,然後主降爲備,把server2 升爲主查看庫有沒有同步。

[root@server1 ~]# mysql

mysql> create database crushlinux;

Query OK, 1 row affected (0.00 sec)

mysql> exit

Bye

[root@server1 ~]# service mysqld stop                                           //server1的操作

[root@server1 ~]# umount /dev/drbd0                               //server1的操作

[root@server1 ~]# drbdadm secondary r0                                    //server1的操作

server2上操作

[root@server2 drbd.d]# drbdadm primary r0                     //server2的操作

[root@server2 drbd.d]# mount /dev/drbd0 /mysqldata          //server2的操作

[root@server2 drbd.d]# service mysqld start                      //server2的操作

[root@server2 drbd.d]# ls /mysqldata/mysql/                             //server2的操作

crushlinux ibdata1 ib_logfile0 ib_logfile1 mysql test

配置 heartbeat

配置ha.cf文件(主從大體一致)

[root@server1 ~]# cd /usr/share/doc/heartbeat-3.0.4/

[root@server1 heartbeat-3.0.4]# cp ha.cf authkeysharesources /etc/ha.d/

[root@server1 heartbeat-3.0.4]# cd /etc/ha.d/

[root@server1 ha.d]# vim ha.cf

29 logfile /var/log/ha-log

34 logfacility local0

48 keepalive 2                                                                          //多長時間檢測一次

56 deadtime 10                                                                       //連續多長時間聯繫不上後認爲對方掛掉(秒)

61 warntime 5                                                                          //連續多長時間聯繫不上開始警告提示

71 initdead 100                                                                       //主要是給重啓後預留的一段忽略時間

76 udpport 694                                                                       //UDP端口

121 ucast eth0 192.168.200.102                                        //填寫對方 IP (主從的差異點)

157 auto_failback on                                                            //節點修復後是否切換回來

211 node server1                                                                   //節點名稱

212 node server2                                                                   //節點名稱

253 respawn hacluster /usr/lib64/heartbeat/ipfail   //控制 IP切換的程序

配置hasresources件(主從一致)

[root@server1 ha.d]# vim haresources

server1 IPaddr::192.168.200.254/24/eth0:0 drbddisk::r0    

Filesystem::/dev/drbd0::/mysqldata::ext4 mysqld               //注意是一行內容

[root@server1 ha.d]# ln -s /etc/init.d/mysqld /etc/ha.d/resource.d/mysqld

server1IPaddr::192.168.200.254/24/eth0      #主機名,後跟虛擬IP地址、接口

drbddisk::r0                                                                #管理drbd資源

Filesystem::/dev/drbd0::/mysqldata::ext4mysqld   #文件系統,目錄及格式,後跟nfs資源腳本

配置authkeys文件(主從一致)

[root@server1 ha.d]# vim authkeys

23 auth 1

24 1 crc

[root@server1 ha.d]# chmod 600 authkeys

HA驗證:

主從節點啓動heartbeat

[root@server1 ha.d]# service heartbeat start

 

查看主節點VIP  是否存在

[root@server1 ha.d]# ip a  // 需要等待 10 

inet 192.168.200.254/24 brd 192.168.200.255 scopeglobal secondary eth0:0

驗證:先停掉server1上的heartbeat服務,查看 VIP是否能轉移

此時 server2 上的mysql服務是關閉的

server1

[root@server2 ha.d]# mysqladmin -uroot ping                            //備節點操作

mysqladmin: connect to server at 'localhost' failed

error: 'Can't connect to local MySQL server throughsocket '/var/lib/mysql/mysql.sock' (2)'

Check that mysqld is running and that the socket:'/var/lib/mysql/mysql.sock' exists!

server2

[root@server1 ha.d]# service heartbeat stop                      //主節點操作

Stopping High-Availability services: Done.

[root@server2 ha.d]# ip a                                                           //備節點操作

inet 192.168.200.254/24 brd 192.168.0.255 scope globalsecondary eth0:0

[root@server2 ha.d]# mysqladmin -uroot ping                   //備節點操作,發現 mysql隨之啓動

Mysqld is alive

此時還不具備停掉mysqlVIP漂移的功能,需要添加腳本實現,當發現mysql 服務出現掛掉,就停掉heartbeat服務,實現 VIP轉移(雙方都要在後臺執行

[root@server1 ~]# vim chk_mysql.sh

#!/bin/bash

mysql="/etc/init.d/mysqld"

mysqlpid=$(ps-C mysqld --no-header | wc -l)

whiletrue

do

if [$mysqlpid -eq 0 ];then

$mysqlstart

sleep 3

mysqlpid=$(ps-C mysqld --no-header | wc -l)

if [$mysqlpid -eq 0 ];then

/etc/init.d/heartbeatstop

echo"heartbeat stopped,please check your mysql !" | tee -a

/var/log/messages

fi

fi

done

[root@server1 ha.d]# bash chk_mysql.sh &

[root@server1 ha.d]# echo “bash chk_mysql.sh &”>> /etc/rc.local

配置主從複製

保持時間同步(主從都要配)

[root@server1 ~]# crontab –e

*/10 * * * * ntpdate time.nist.gov

 

修改四臺數據庫主機的配置文件(注意server_id不要一樣)開啓binlog日誌

[root@server1~]# vim /etc/my.cnf

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql

# Disabling symbolic-links is recommended to preventassorted security risks

symbolic-links=0

relay-log =relay-log-bin

server_id =1

relay-log-index= slave-relay-bin.index

 

[mysqld_safe]

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid

重啓服務

[root@server1 ~]# /etc/init.d/mysqld restart

停止 mysqld                                              [確定]

正在啓動 mysqld                                          [確定]

serve1上授權,允許從服務器同步,查看主服務器的binlog

[root@server1 ~]# msyql

mysql> grant replication slave on *.* to'user'@'192.168.200.%' identified by '123456';

mysql> flush privileges;

mysql> show master status;

+------------------+----------+--------------+------------------+

| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000002 |      187 |              |                  |

+------------------+----------+--------------+------------------+

1 row in set (0.00 sec)

從服務器同步server1,查看從服務器狀態。

mysql> change master to master_host='192.168.200.254',master_user='user',master_password='123456',master_log_file='mysql-bin.000002', master_log_pos=106;

mysql> flush privileges;

mysql> start slave;

mysql> show slave status \G

在帶有VIP的主數據庫創建庫,驗證從服務器是否同步

server1

mysql> create database abc;

 

slave

mysql> show databases;

+--------------------+

| Database          |

+--------------------+

| information_schema |

| abc                |

| b                 |

| mysql             |

| test              |

+--------------------+

5 rows in set (0.00 sec)

配置LVS+keepalived實現負載

安裝keepalived服務,並配置VIP和節點健康檢查

在主節點上操作

[root@localhost ~]# yum -y install keepalived

[root@localhost ~]# cd /etc/keepalived/

[root@localhost ~]# cp keepalived.confkeepalived.conf.bak

[root@localhost ~]# vim keepalived.conf

! Configuration File for keepalived

 

global_defs {

notification_email {

    [email protected]

    [email protected]

    [email protected]

   }

notification_email_from [email protected]

smtp_server 192.168.200.1

smtp_connect_timeout 30

router_id LVS_DEVEL

}

 

vrrp_instance VI_1 {

stateMASTER

interface eth0

virtual_router_id 51

priority100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

    }

virtual_ipaddress {

       192.168.200.100

    }

}

virtual_server 192.168.200.100 3306 {

delay_loop 6

lb_algo rr

lb_kind DR

nat_mask 255.255.255.0

persistence_timeout 50

protocol TCP

 

real_server 192.168.200.103 3306 {

weight 1

       TCP_CHECK {

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

        }

    }

 

real_server 192.168.200.104 3306 {

weight 1

        TCP_CHECK {

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

        }

}

}

 

備節點與主節點的操作一樣,只有配置文件有一些區別

! Configuration File for keepalived

 

global_defs {

notification_email {

    [email protected]

    [email protected]

    [email protected]

   }

notification_email_from [email protected]

smtp_server 192.168.200.1

smtp_connect_timeout 30

router_id LVS_DEVEL

}

 

vrrp_instance VI_1 {

stateBACKUP

interface eth0

virtual_router_id 51

priority 50

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

    }

virtual_ipaddress {

       192.168.200.100

    }

}

virtual_server 192.168.200.100 3306 {

delay_loop 6

lb_algo rr

lb_kind DR

nat_mask 255.255.255.0

persistence_timeout 50

protocol TCP

 

real_server 192.168.200.103 3306 {

weight 1

       TCP_CHECK {

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

        }

    }

 

real_server 192.168.200.104 3306 {

weight 1

       TCP_CHECK {

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

        }

}

}

編寫腳本,配置從數據庫(主從都要做)

[root@slave1~]# vim /opt/lvs-dr

 

#!/bin/bash

VIP="192.168.200.100"

/sbin/ifconfigeth0 192.168.200.103/24 up

/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask255.255.255.255 up

/sbin/route add -host $VIP dev lo:0

echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore

echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce

echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore

echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

 

[root@slave2~]# vim /opt/lvs-dr

 

#!/bin/bash

VIP="192.168.200.100"

/sbin/ifconfigeth0 192.168.200.104/24 up

/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask255.255.255.255 up

/sbin/route add -host $VIP dev lo:0

echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore

echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce

echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore

echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

 

添加執行權限,執行腳本

chmod +x /opt/lvs-dr

echo "/opt/lvs-dr" >> /etc/rc.local

/opt/lvs-dr

 [root@slave1~]# ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdiscnoqueue state UNKNOWN

   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet127.0.0.1/8 scope host lo

    inet 192.168.200.100/32 brd192.168.200.100 scope global lo:0

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu1500 qdisc pfifo_fast state UP qlen 1000

    link/ether00:0c:29:3f:03:d5 brd ff:ff:ff:ff:ff:ff

    inet192.168.200.103/24 brd 192.168.200.255 scope global eth0

啓動keepalived

[root@localhost keepalived]# /etc/init.d/keepalivedstart

正在啓動 keepalived                                      [確定]

安裝ipvsadm用於查看節點記錄(主從節點都要配置)

[root@localhost ~]# yum -y install ipvsadm

[root@localhost ~]# ipvsadm -Ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  ->RemoteAddress:Port           ForwardWeight ActiveConn InActConn

TCP  192.168.200.100:3306 rr persistent 50

  -> 192.168.200.103:3306         Route  1      0          0

  -> 192.168.200.104:3306         Route  1      0          0

[root@localhost ~]#/etc/init.d/ipvsadm save

[root@localhost ~]#/etc/init.d/ipvsadm restart

驗證

驗證主主切換是否同步從數據庫

server1上關閉heartbeat

[root@server1 ~]# service heartbeat stop

Stopping High-Availability services: Done.

slave上查看同步信息

mysql> show slave status\G

*************************** 1. row***************************

              Slave_IO_State: Waiting for master to send event

                 Master_Host: 192.168.200.253

                 Master_User: myslave

                 Master_Port: 3306

               Connect_Retry: 60

             Master_Log_File: mysql-bin.000008

         Read_Master_Log_Pos: 106

              Relay_Log_File: mysqld-relay-bin.000023

               Relay_Log_Pos: 251

       Relay_Master_Log_File: mysql-bin.000008

            Slave_IO_Running: Yes

           Slave_SQL_Running: Yes

              Replicate_Do_DB:

         Replicate_Ignore_DB:

          Replicate_Do_Table:

      Replicate_Ignore_Table:

     Replicate_Wild_Do_Table:

 Replicate_Wild_Ignore_Table:

                  Last_Errno: 0

                  Last_Error:

                Skip_Counter: 0

         Exec_Master_Log_Pos: 106

             Relay_Log_Space: 552

             Until_Condition: None

              Until_Log_File:

               Until_Log_Pos: 0

          Master_SSL_Allowed: No

          Master_SSL_CA_File:

          Master_SSL_CA_Path:

             Master_SSL_Cert:

           Master_SSL_Cipher:

              Master_SSL_Key:

       Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

               Last_IO_Errno: 0

                Last_IO_Error:

              Last_SQL_Errno: 0

              Last_SQL_Error:

1 row in set (0.00 sec)

如果不同步,停一下同步,再重啓查看。

驗證從數據庫是否輪詢

在主lvs上查看連接信息

 [root@localhost~]# watch ipvsadm -Lnc           //實時查看遠程連接信息

-c (--connection) 顯示LVS目前的連接信息

在其他主機通過VIP進行連接測試

 [root@localhostkeepalived]# mysql -umydb -h192.168.200.100 -p123456 -e 'show databases;'

+--------------------+

| Database          |

+--------------------+

| information_schema |

| mysql             |

| slave1             |

| test              |

+--------------------+

查看主lvs信息,等第一次連接斷開再測試。

[root@localhost keepalived]# mysql -umydb-h192.168.200.100 -p123456 -e 'show databases;'

+--------------------+

| Database          |

+--------------------+

| information_schema |

| mysql             |

| slave2             |

| test              |

+--------------------+

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章