好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

一次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,是个要十分细心的工作,很多细节要注意,就不一一说了。

查看更多关于一次LVS+MySQL的主主负载均衡实战的详细内容...

  阅读:44次