歡迎您光臨本站 註冊首頁

這樣配置mysql的高可用和負載均衡可以嗎?歡迎大家來指點

下面的配置是參考了論壇里的許多先輩的貼子(不好意思,看過好多貼子一時忘記參考了誰的,等有時間我整理后在具體註明)
本人是新手,剛學做這方面的配置,應該存在不少問題,所以貼出來希望大家能指點指點,謝謝。
因為只有兩台伺服器,所以每台即是banlancer又是real server
用LVS+heartbeat+ldirector+mysql_replication實現高可用和負載均衡。
*****************************************************************************************
一、環境簡介
*****************************************************************************************
        兩台主機分別為MySvrA.com和MySvrB.com,操作系統都為 :CentOS 5
        MySvrA.com:是LoadBlancer(LB)同時也是REAL SERVER,而且, 在mysql方面同時作master和slave
        MySvrB.com:是備用LoadBlancer同時也是REAL SERVER,而且, 在mysql方面同時作master和slave


*****************************************************************************************
二、地址規劃
*****************************************************************************************
VIP:192.168.1.123
MySvrA
                eth0:addr:192.168.1.124  Bcast:192.168.1.127  Mask:255.255.255.248
                eth1:10.0.0.124              //HA心跳使用地址
MySvrB
                eth0:addr:192.168.1.125  Bcast:192.168.1.127  Mask:255.255.255.248
                eth1:10.0.0.125              //HA心跳使用地址

*****************************************************************************************
三、使用heartbeat設置高可用
*****************************************************************************************

1、文件/etc/ha.d/ha.cf在MySvrA.com和MySvrB.com上一樣,如下:

vi /etc/ha.d/ha.cf

debugfile  /var/log/ha_log/ha-debug.log
logfile         /var/log/ha_log/ha-log.log
logfacility     local0
keepalive 2
deadtime 30
warntime 10
initdead 120
udpport 694
bcast eth1
auto_failback on
node    mysvra.com
node    mysvrb.com
ping 192.168.1.121
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster
hopfudge 1

2、文件/etc/hc.d/authkeys在MySvrA.com和MySvrB.com上一樣,如下:
vi /etc/hc.d/authkeys

auth 1
1 crc


3、MySvrA.com的haresources文件如下:

/etc/ha.d/haresources
MySvrA.com IPaddr::192.168.1.123 lvsdr mysqld ldirectord


4、MySvrB.com的haresources文件如下:

/etc/ha.d/haresources
MySvrA.com IPaddr::192.168.1.123 lvsdr ldirectord
MySvrB.com lvsrs mysqld



*****************************************************************************************
四、使用lvsdr,lvsrs,Monitor-eth0和ldirector設置負載均衡
*****************************************************************************************
1、在MySvrA.com上建立lvsdr文件,如下:
# vi /etc/init.d/lvsdr
#!/bin/bash
# Name:lvsdr
VIP=192.168.1.123
RIP1=192.168.1.124
RIP2=192.168.1.125
case "$1" in
start)
# Set the Virtual IP Address
/sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.248 up
/sbin/route add -host $VIP dev eth0:0
echo "1" > /proc/sys/net/ipv4/ip_forward
# Clear IPVS table
/sbin/ipvsadm -C
# Set LVS
/sbin/ipvsadm -A -t $VIP:3306 -s rr
/sbin/ipvsadm -a -t $VIP:3306 -r $RIP1:3306 -g
/sbin/ipvsadm -a -t $VIP:3306 -r $RIP2:3306 -g
# Run LVS
/sbin/ipvsadm
;;
stop)
ifconfig eth0:0 down
ipvsadm -C
;;
restart)
ifconfig eth0:0 down
ipvsadm -C
/sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.248 up
/sbin/route add -host $VIP dev eth0:0
# Set LVS
/sbin/ipvsadm -A -t $VIP:3306 -s rr
/sbin/ipvsadm -a -t $VIP:3306 -r $RIP1:3306 -g
/sbin/ipvsadm -a -t $VIP:3306 -r $RIP2:3306 -g
# Run LVS
/sbin/ipvsadm
;;
status)
ipvsadm
;;
*)
echo "Usage:$0 "
echo
;;
esac



2、在MySvrB.com上建立lvsrs文件,如下:

# cat /etc/init.d/lvsrs
#!/bin/bash
# Name:lvsrs
VIP=192.168.1.123
case "$1" in
start)
# Start LVS-DR real server on this machine.
/sbin/ifconfig lo down
/sbin/ifconfig lo up
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255
/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
sysctl -p
;;
stop)
# Stop LVS-DR real server loopback device(s).
/sbin/ifconfig lo:0 down
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
;;
status)
# Status of LVS-DR real server.
islothere=`/sbin/ifconfig lo:0 | grep $VIP`
isrothere=`netstat -rn | grep "lo:0" | grep $VIP`
if [ ! "$islothere" -o ! "$isrothere" ];then
    # Either the route or the lo:0 device no found.
    echo "LVS-DR real server Stopped."
else
    echo "LVS-DR Running."
fi
;;
*)
# Invalid entry
echo "Usage:$0 "
echo
;;
esac


3、 在MySvrB.com上建立Monitor-eth0文件,如下:
# cat /etc/init.d/Monitor-eth0
#!/bin/sh
i=1
while [ "$i" = "1" ]
do
sleep 10
/sbin/ifconfig | grep eth0:0 > /dev/null
if [ "$?" = "0" ]; then
    /sbin/ifconfig | grep lo:0 > /dev/null
    if [ "$?" = "0" ]; then
         /etc/init.d/lvsrs stop
    fi
else
    /sbin/ifconfig | grep lo:0 > /dev/null
    if [ "$?" != "0" ]; then
        /etc/init.d/lvsrs start
    fi
fi
done

註:Monitor-eth0 文件主要作用是:如果監測到備用LoadBlancer接管了主 LoadBlancer后,將lo:0 down下來,用 eth0:0就行;如果主 LoadBlancer恢復后,再將lo:0 up 起來。

4、 ldirectord.cf在MySvrA.com和MySvrB.com上一樣,如下:

vi /etc/ha.d/conf/ldirectord.cf
checktimeout=10
checkinterval=2
autoreload=no
logfile="/var/log/ldirectord.log"
logfile="local0"
quiescent=yes
virtual=192.168.1.123:3306
        real=192.168.1.124:3306 gate
        real=192.168.1.125:3306 gate
        fallback=127.0.0.1:3306
        service=mysql
        scheduler=rr
        protocol=tcp
        checktype=negotiate
        login="ldirector"
        passwd="ldirectorpassword"
        database="ldirectordb"
        request="SELECT * FROM connectioncheck"



*****************************************************************************************
五、mysql replication 的配置
*****************************************************************************************
1.在MySvrA.com中修改/etc/my.cf文件,在[mysqld]項里增加如下內容

#
## set master
#
server-id=1
log-bin=SvrA-bin
binlog-do-db=backup
log_err=SvrA-err.log
max_binlog_size=104857600

#
## set slave
#
master-host=192.168.1.125
master-user=backup
master-password=123456
replicate-do-db=backup
master-connect-retry=60



2.在MySvrB.com中修改/etc/my.cf文件,在[mysqld]項里增加如下內容
#
## set slave
#
server-id=2
master-host=192.168.1.124
master-user=backup
master-password=123456
master-port=3306
master-connect-retry=60
replicate-do-db=backup
binlog-do-db=backup

#
## set master
#
log-bin=SvrB-bin
log_err=SvrB-err.log
max_binlog_size=104857600

[ 本帖最後由 yingsuifeng 於 2007-9-26 16:49 編輯 ]
《解決方案》

怎麼都沒人指點指點阿
《解決方案》

你用LVS,只解決了做那些網站應用的時候在第三層分擔掉request的問題. 我比較關心當DB自己的負載很重的情況下怎樣解決負載的方案. mysql 的原生cluster就是想要解決這樣的問題,不過看來還需要等一段時間.
《解決方案》

謝謝nntp斑竹, 你說的可是ndbcluster  這個速度好象比replication慢好多,而且,做全量和增量備份好象也不好做
《解決方案》

原帖由 nntp 於 2007-10-7 02:47 發表 http://linux.chinaunix.net/bbs/images/common/back.gif
你用LVS,只解決了做那些網站應用的時候在第三層分擔掉request的問題. 我比較關心當DB自己的負載很重的情況下怎樣解決負載的方案. mysql 的原生cluster就是想要解決這樣的問題,不過看來還需要等一段時間.


現在mysql 還沒有好的方案啊, 實際使用的就是 多master 多slave 方式,並進行讀寫分佈。或者進行應用層的數據散列來分佈到多台資料庫上,進而達到分攤負載。
《解決方案》

樓主,你的方案是否可以行的通。能否正常工作。db的負載平衡是很難確定的。
《解決方案》

既然問設計,,最好畫圖和圖解

配置代碼另外把。。
《解決方案》

mysql 兩台互為主從,這種方式實驗還可以,如果帶業務就不要用了,會有很多問題。
隨便舉例一個:
MYSQL-A  MYSQL-B
比如在一個表裡面都使用自增的id
有人批量插入數據,這時資料庫A收到一個INSERT請求,緊接著B也收到一個INSERT請求,那麼他們都會使用自增id,但這是后通過讀bin-log傳過來的數據就會插入出錯,斷掉。
結果就是你都不知道那個機器里的數據是你想要的。

[火星人 ] 這樣配置mysql的高可用和負載均衡可以嗎?歡迎大家來指點已經有769次圍觀

http://coctec.com/docs/service/show-post-7993.html