一次LVS+MySQL的主主負載均衡實戰


這是去年做的一個項目的記錄,如果大家有更好的解決方案,歡迎指出。

先說說項目需求,用戶需要在兩個地市部署兩套應用系統和兩套數據庫,在一個地市主用,在另一個熱備;數據要互備;而且如果主用地市流量很大,可以分流到備用地市。

再說說用戶環境,用戶所有地市之間的通信使用MPLS VPN,兩個地市之間使用不同的網段(甲方的內網)。

應用系統的主備和負載均衡下次再說,這兒先主要講講數據庫內容。

1.選擇數據庫

  現在有很多數據庫可以滿足主備和負載均衡的需求,有關系型數據庫,也有NoSQL數據庫。

  我們選擇了MySQL,做項目嘛,首先考慮的是項目成本,在關系型數據庫中,能滿足需求而且成本低的也就是MySQL了。對NoSQL數據庫,我們考慮過mongodb和Hadoop,而且對這兩個數據庫都做了前期的研究評估,但因為我們的應用系統改造的成本太大,就放棄了。

  采用了MySQL,那么就看使用它的什么技術了,我們需要兩個地市的數據庫都能訪問,那么主備技術不能采用;兩個地市的數據獨立完整,而且在大多數情況下使用主用地市系統,備用地市只做數據同步,不參與應用計算,不消耗網絡流量,MySQL Cluster也排除了。

  最終采用了MySQL的主主備份技術,來達到數據的備份和兩個數據庫系統都可以訪問的目的。

2.選擇負載均衡技術

  對MySQL的負載均衡技術,主要有HAPROXY和LVS等,由於我們的數據庫要部署在兩個不同地市的不同網段上,只有LVS的隧道模式能滿足我們的需求。

3.架構圖

4.安裝LVS

  1).安裝必須文件

    

yum install -y gcc gcc-c++ makepcre pcre-devel kernel-devel openssl-devel libnl-devel popt-devel

 

  2).建立內核軟連接

    

ln -s /usr/src/kernels/2.6.18-164.el5-x86_64/ /usr/src/linux

 

  3).安裝lvs程序

    

    modprobe -l|grep ipvs

    tar xvf  ipvsadm-1.24.tar.gz

       cd ipvsadm-1.24

    make

       make install

       /etc/init.d/ipvsadm save

       /etc/init.d/ipvsadm restart

 

    

  在真實機器上的配置腳本:

  

#!/bin/bash
# description: Config realserver lo and apply noarp
 
SNS_VIP=192.168.1.1
 
/etc/rc.d/init.d/functions
 
case "$1" in
start)
       ifconfig tunl0 $SNS_VIP netmask 255.255.255.255 broadcast 192.168.2.255
       /sbin/route add -host $SNS_VIP dev tunl0
       echo "1" >/proc/sys/net/ipv4/conf/tunl0/arp_ignore      #主要是實現禁止響應對VIP的ARP請求
       echo "2" >/proc/sys/net/ipv4/conf/tunl0/arp_announce
       echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
       echo 0 > /proc/sys/net/ipv4/conf/tunl0/rp_filter
       echo 1 > /proc/sys/net/ipv4/conf/tunl0/forwarding
       echo 1 > /proc/sys/net/ipv4/ip_forwarding
       sysctl -p >/dev/null 2>&1
       echo "RealServer Start OK"
 
       ;;
stop)
       ifconfig tunl0 down
       route del $SNS_VIP >/dev/null 2>&1
       echo "0" >/proc/sys/net/ipv4/conf/tunl0/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/tunl0/arp_announce
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
       echo "RealServer Stoped"
       ;;
*)
       echo "Usage: $0 {start|stop}"
       exit 1
esac
exit 0

 

5.安裝Keepalived

  

  tar xvf keepalived-1.1.19.tar.gz

  cd keepalived-1.1.19

  ./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/2.6.18-164.el5-x86_64 --enable-lvs

  make

  make install

  cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/

  cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

  mkdir -p /etc/keepalived

  /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived

  /usr/local/keepalived/sbin/keepalived /usr/sbin/

   chkconfig keepalived on

 

 

    keepalived.conf文件內容

    

! Configuration File for keepalived

global_defs {
   notification_email {
      **********
   }
   notification_email_from *****
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_MASTER
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.2.1         
    }
}

virtual_server 192.168.2.1 3306 {
    delay_loop 6
    lb_algo wrr
    lb_kind TUN
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP
 real_server 192.168.1.1 3306 {
         weight 10               
 TCP_CHECK {
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
        connect_port 3306
}

     }


 real_server 192.168.3.1 3306 {
         weight 1              
      TCP_CHECK {
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
        connect_port 3306
}
}
}

6.安裝MySQL

  MySQL數據庫的安裝我就不記錄了,主要記錄一下主主備份的配置。

  1).在兩台數據庫上創建同步賬戶

    

grant replication slave on *.* to mysqldb1@'192.168.3.1' identified by '*****';

 

  2).修改數據庫配置文件

    

[client]
default-character-set=utf8
[mysqld]
character-set-server=utf8
server-id=1         #mysql5.5默認有
log-bin=mysql-bin   #mysql5.5默認有
binlog-ignore-db=mysql #mysql庫將不同步
auto_increment_offset=1 #是基數,兩邊不同server1設置1,server2設置2
auto_increment_increment=2 #大於等於復制集群中服務器的數量

 

 

[client]
default-character-set= utf8
[mysqld]
character-set-server= utf8
server-id=2   #將默認的1改為2,該值為兩邊不相同的任意數字
log-bin=mysql-bin  #mysql5.5默認有
binlog-ignore-db=mysql #mysql庫將不同步
auto_increment_offset=2  #是基數,兩邊不同server1設置1,server2設置2
auto_increment_increment=2 #大於等於復制集群中服務器的數量

 

 

  3).執行數據同步

  

  
 show master status\G

   結果:  
      File: binlog.000007
      Position: 107
      Binlog_Do_DB: test
      Binlog_Ignore_DB: mysql
      1 row in set (0.00 sec)
   依據結果,執行下面的語句
  
change master to master_host='192.168.1.2', master_user='xxx', master_password='*******', master_log_file='binlog.000007', master_log_pos=107;

7.注意事項

  1).數據庫鏈接數要依據項目調整

  2).數據庫鏈接的生命周期和LVS會話管理周期的調整    ipvsadm --set 120 20 100,如果時間過短,每次外部請求都會是一個新的鏈接,超過數據庫最大鏈接數

  3).在真實機器上要配置隧道接口,並且要關閉VIP的ARP請求

  4).在lvs虛擬機上不手動配置隧道接口,用keepalived去自動管理,但在真實機上要手動創建(可以寫開機腳本)

  5).在項目中lvs所在區域如果斷網,則負載均衡也失效了,只能手動切換至備用系統

  搭建lvs,是個要十分細心的工作,很多細節要注意,就不一一說了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM