配置mysql+lvs+keeplived實現Mysql讀操作的負載均衡
環境:
test1192.168.46.131master
test2192.168.46.130slave備份test庫
test3調度器
1、安裝與配置Keepalived
首先在節點test1、test2上安裝Keepalived軟件,軟件安裝非常簡單。
[root@test1 ]# yum install -y openssl-devel [root@test1 ~]# wget http://www.keepalived.org/software/keepalived-1.2.1.tar.gz [root@test1 ~]# tar zxvf keepalived-1.2.1.tar.gz [root@test1 ~]# cd keepalived-1.2.1 [root@test1 keepalived-1.2.1]# ./configure --prefix=/usr/local/keepalived [root@test1 keepalived-1.2.1]# make && make install [root@test1 ~]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ [root@test1 ~]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ [root@test1 ~]# mkdir /etc/keepalived [root@test1 ~]# cp /usr/local/keepalived/etc/keepalived /keepalived.conf /etc/keepalived/ [root@test1 ~]# ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/ [root@test1 ~]# service keepalived start Starting keepalived: [ OK ]
Keepalived的配置也非常簡單,僅僅需要一個配置文件即可完成HAcluster和lvs服務節點監控功能,在通過Keepalived搭建高可用的LVS集羣實例中,主、備DirectorServer都需要安裝Keepalived軟件,安裝成功後,默認的配置文件路徑爲/etc/Keepalived/Keepalived.conf。
一個完整的keepalived配置文件,有三個部分組成,分別是全局定義部分、vrrp實例定義部分以及虛擬服務器定義部分,配置好的文件內容如下:
! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from root@localhost smtp_server 192.168.46.131 smtp_connect_timeout 30 router_id LVS_MASTER } vrrp_instance VI_1 { state MASTER //備庫爲BACKUP interface eth2 //通過的網卡 virtual_router_id 51 priority 100 //備庫爲99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.46.100 } } virtual_server 192.168.46.100 3306 { delay_loop 30 lb_algo rr lb_kind DR persistence_timeout 50 protocol TCP real_server 192.168.46.131 3306 { weight 1 MISC_CHECK{ misc_path "/etc/keepalived/check_slave.pl 192.168.46.131" misc_dynamic } } real_server 192.168.46.130 3306 { weight 1 MISC_CHECK{ misc_path "/etc/keepalived/check_slave.pl 192.168.46.130" misc_dynamic } } } }
2,check_slave.pl檢測mysql
check_slave.pl是用perl寫的一個檢測腳本,定時在slave機器上執行showslavestatus\G命令,檢查Slave_IO_Running、Slave_SQL_Running、Seconds_Behind_Master三個值。Slave_IO_Running和Slave_SQL_Running有一個值爲No就自動從LVS的realserver列表去掉,不再對外提供服務,如果這兩個值爲Yes,檢查Seconds_Behind_Master大於設定的值也會自動從對外服務機器列表裏面去掉。三個值同時滿足時又會被加入到服務列表,對外提供服務。這個檢測腳本內容如下:
#!/usr/bin/perl -w use DBI; use DBD::mysql; # CONFIG VARIABLES $SBM = 120; $db = "test"; $host = $ARGV[0]; $port = 3306; $user = "root"; $pw = "mysql"; # SQL query $query = "show slave status"; $dbh = DBI->connect("DBI:mysql:$db:$host:$port", $user, $pw, { RaiseError => 0,PrintError => 0 }); if (!defined($dbh)) { exit 1; } $sqlQuery = $dbh->prepare($query); $sqlQuery->execute; $Slave_IO_Running = ""; $Slave_SQL_Running = ""; $Seconds_Behind_Master = ""; while (my $ref = $sqlQuery->fetchrow_hashref()) { $Slave_IO_Running = $ref->{'Slave_IO_Running'}; $Slave_SQL_Running = $ref->{'Slave_SQL_Running'}; $Seconds_Behind_Master = $ref->{'Seconds_Behind_Master'}; } $sqlQuery->finish; $dbh->disconnect(); if ( $Slave_IO_Running eq "No" || $Slave_SQL_Running eq "No" ) { exit 1; } else { if ( $Seconds_Behind_Master > $SBM ) { exit 1; } else { exit 0; } }
3、安裝配置lvs
[root@test1 ~]# yum install -y ipvsadm [root@test1 ~]# lsmod |grep ip_vs [root@test1 ~]# modprobe ip_vs [root@test1 ~]# lsmod |grep ip_vs ip_vs 122241 0 這裏不能靠進程來判斷是不是加載了ip_vs模塊,因爲這裏就是一個命令,沒有產生進程。 vim /etc/init.d/lvsdrrip #!/bin/bash #DR server VIP=192.168.46.100 case "$1" in start) echo "start LVS of DR" /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.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 ;; stop) echo "stop LVS of DR" /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 ;; *) echo "Usage:$0 {start|stop}" esac exit 1
4,test1和test2上安裝mysql服務,test1爲master,test2爲slave
參考http://wolfword.blog.51cto.com/4892126/1290938
5,test3調度器安裝lvsdr
[root@test3 ~]# vim /etc/init.d/lvsdr #!/bin/bash VIP=192.168.46.100 RIP1=192.168.46.131 RIP2=192.168.46.130 case "$1" in start) echo "start LVS of DirectorServer DR" /sbin/iptables -F /sbin/ipvsadm -C /sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.0 up /sbin/ipvsadm -A -t $VIP:3306 -s rr /sbin/ipvsadm -a -t $VIP:3306 -r $RIP1 -g /sbin/ipvsadm -a -t $VIP:3306 -r $RIP2 -g /sbin/ipvsadm ;; stop) echo "stop LVS of DirectorServer DR" echo "0" >/proc/sys/net/ipv4/ip_forward /sbin/ipvsadm -C /sbin/ifconfig eth0:0 down ;; *) [root@test3 ~]#chown +x /etc/init.d/lvsdr