设为首页 收藏本站
查看: 1010|回复: 0

[经验分享] lvs+keepalived对MySQL Slave 做读负载均衡完整文档20150523

[复制链接]

尚未签到

发表于 2015-9-4 09:25:50 | 显示全部楼层 |阅读模式
  前言:

电商大促 后端API对MySQL读写要求在毫秒级别,因为瞬时流量和用户数突增,导致数据库挂掉了将近3分钟左右,520大促期间 Haproxy 在MySQL端口转发效率上,
稍稍的让我们逊色了一下,于是决定尝试下lvs 实现对MySQL Slave 的负载均衡,折腾过程中,多多少少踩过不少坑,网络上的多数文档残缺不全或者错误百出,
很大程度上误导了大家,一下是完整文档实战过程,写出来分享给大家。

提纲:
1:系统约定
2:部署前注意事项
3:部署realserver 以及注意事项
4:部署lvs双M 提升服务器有效利用率
5:lvs monitor部署


一:系统约定
group_db_01
old_db_slave_01  192.168.1.121
old_db_slave_02  192.168.1.123
old_db_slave_03  192.168.1.217

group_db_02
mall_db_slave_01 192.168.1.122
mall_db_slave_02 192.168.1.68
mall_db_slave_03 192.168.1.218

group_lvs:
lvs-01:192.168.1.235
lvs-02:192.168.1.236

vip-01:192.168.1.237
vip-02:192.168.1.238

系统版本:
CentOS64_x64

二:部署前注意事项
1:关闭iptable(后期需要再开启调试)

2:关闭selinux 方法如下:
sed -i 's/\=enforcing/\=disabled/' /etc/sysconfig/selinux

3:内核优化 主要是开启内核转发 这里贴出完整的内核配置

group_lvs操作
vi /etc/sysctl.conf
#----------------------------------------------------------------------------------------------------------------------------------
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
net.core.somaxconn = 32768
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 20
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.core.netdev_max_backlog = 32768
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_retries2 = 5
net.ipv4.tcp_mem = 41943040 73400320 94371840
net.ipv4.tcp_max_orphans = 3276800
fs.file-max = 1300000
#LVS虚拟服务器(VIP)忽略ARP广播包
net.ipv4.ip_forward= 1
net.ipv4.conf.lo.arp_ignore= 1
net.ipv4.conf.lo.arp_announce= 2
net.ipv4.conf.all.arp_ignore= 1
net.ipv4.conf.all.arp_announce= 2
#----------------------------------------------------------------------------------------------------------------------------------

三:部署realserver 所有操作相同

vi script/ipvs_v1.1.sh
#----------------------------------------------------------------------------------------------------------------------------------
#!/bin/bash
#created by zhangluya
#date:2015-05-21
#info:ipvsadm
VIP=(
    192.168.1.237
    192.168.1.238
)
. /etc/rc.d/init.d/functions
case "$1" in
start)
    echo "start realserver......"
      for ((i=0; i<`echo ${#VIP
  • }`; i++));do
                  interface="lo:`echo ${VIP[$i]}|awk -F . '{print $4}'`"
                  /sbin/ifconfig $interface ${VIP[$i]} broadcast ${VIP[$i]} netmask 255.255.255.255 up
                  /sbin/route add -host ${VIP[$i]} dev ${interface}
          done
        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 /dev/null 2>&1
        ;;
    stop)
        /sbin/ifconfig lo:237 down
        /sbin/ifconfig lo:238 down
        /sbin/route del 192.168.1.237 > /dev/null 2>&1
        /sbin/route del 192.168.1.238 > /dev/null 2>&1
        echo "close lvs directorserver"
        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
        sysctl -p /dev/null 2>&1
        ;;
    *)
        echo "Usage: $0 {start|stop}"
        exit 1
    esac
    #----------------------------------------------------------------------------------------------------------------------------------

    chmod a+x /opt/sbin/lvs_script/ipvs_v1.1.sh
    echo '/opt/sbin/lvs_script/ipvs_v1.1.sh start' >> /etc/rc.local

    四:部署lvs双M 提升服务器有效利用率
    yum install -y ipvsadm kernel-devel perl  perl-DBI  perl-DBD-MySQL  make gcc openssl-devel libnl*
    wget http://www.keepalived.org/software/keepalived-1.2.16.tar.gz
    tar zvfx keepalived-1.2.16.tar.gz
    cd keepalived-1.2.16
    ./configure
    make
    make install
    /bin/cp /usr/local/etc/sysconfig/keepalived  /etc/sysconfig/
    mkdir -p /etc/keepalived
    /bin/cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
    /bin/cp /usr/local/sbin/keepalived /usr/sbin/
    /bin/cp /usr/local/etc/rc.d/init.d/keepalived  /etc/rc.d/init.d/
    chmod +x /etc/rc.d/init.d/keepalived
    cd ..
    echo "/etc/rc.d/init.d/keepalived" >> /etc/rc.local

    lvs-01 配置:
    #----------------------------------------------------------------------------------------------------------------------------------
    ! Configuration File for keepalived
    global_defs {
       notification_email {
         zhangluya@hichao.com
         64125568@qq.com
       }
       notification_email_from Alexandre.Cassen@firewall.loc
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id LVS_DEVEL_237
       }
    vrrp_instance VI_1 {
        state MASTER
        interface em1
        virtual_router_id 235
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.1.237/24
        }
        }
    virtual_server 192.168.1.237 3306 {
        delay_loop 6
        lb_algo wrr
        lb_kind DR
        nat_mask 255.255.255.0
        persistence_timeout 50
        protocol TCP
        real_server 192.168.1.121 3306 {
            weight 1
            MISC_CHECK {
            misc_path "/etc/keepalived/check_slave.pl 192.168.1.121"
            misc_dynamic
            }
        }
      
      
        real_server 192.168.1.123 3306 {
            weight 1
            MISC_CHECK {
            misc_path "/etc/keepalived/check_slave.pl 192.168.1.123"
            misc_dynamic
            }
        }
       
        real_server 192.168.1.217 3306 {
            weight 1
            MISC_CHECK {
            misc_path "/etc/keepalived/check_slave.pl 192.168.1.217"
            misc_dynamic
            }
        }  
    }

    vrrp_instance VI_2 {
        state BACKUP
        interface em1
        virtual_router_id 236
        priority 90
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.1.238/24
        }
        }
    virtual_server 192.168.1.238 3306 {
        delay_loop 6
        lb_algo wrr
        lb_kind DR
        nat_mask 255.255.255.0
        persistence_timeout 50
        protocol TCP
        real_server 192.168.1.122 3306 {
            weight 1
            MISC_CHECK {
            misc_path "/etc/keepalived/check_slave.pl 192.168.1.122"
            misc_dynamic
            }
        }
      
      
        real_server 192.168.1.68 3306 {
            weight 1
            MISC_CHECK {
            misc_path "/etc/keepalived/check_slave.pl 192.168.1.68"
            misc_dynamic
            }
        }
       
        real_server 192.168.1.218 3306 {
            weight 1
            MISC_CHECK {
            misc_path "/etc/keepalived/check_slave.pl 192.168.1.218"
            misc_dynamic
            }
        }  
    }
    #----------------------------------------------------------------------------------------------------------------------------------


    lvs-02
    #----------------------------------------------------------------------------------------------------------------------------------
    ! Configuration File for keepalived
    global_defs {
       notification_email {
         zhangluya@hichao.com
         64125568@qq.com
       }
       notification_email_from Alexandre.Cassen@firewall.loc
       smtp_server 192.168.200.1
       smtp_connect_timeout 30
       router_id LVS_DEVEL_237
    }
    vrrp_instance VI_1 {
        state BACKUP
        interface em1
        virtual_router_id 235
        priority 90
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.1.237/24
        }
    }
    virtual_server 192.168.1.237 3306 {
        delay_loop 6
        lb_algo wrr
        lb_kind DR
        nat_mask 255.255.255.0
        persistence_timeout 50
        protocol TCP
        real_server 192.168.1.121 3306 {
            weight 1
            MISC_CHECK {
            misc_path "/etc/keepalived/check_slave.pl 192.168.1.121"
            misc_dynamic
           }
         }
      
        real_server 192.168.1.123 3306 {
            weight 1
            MISC_CHECK {
            misc_path "/etc/keepalived/check_slave.pl 192.168.1.123"
            misc_dynamic
           }
         }
        real_server 192.168.1.217 3306 {
            weight 1
            MISC_CHECK {
            misc_path "/etc/keepalived/check_slave.pl 192.168.1.217"
            misc_dynamic
           }
        }  
    }

    vrrp_instance VI_2 {
        state MASTER
        interface em1
        virtual_router_id 236
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.1.238/24
        }
    }
    virtual_server 192.168.1.238 3306 {
        delay_loop 6
        lb_algo wrr
        lb_kind DR
        nat_mask 255.255.255.0
        persistence_timeout 50
        protocol TCP
        real_server 192.168.1.122 3306 {
            weight 1
            MISC_CHECK {
            misc_path "/etc/keepalived/check_slave.pl 192.168.1.122"
            misc_dynamic
           }
         }
      
        real_server 192.168.1.68 3306 {
            weight 1
            MISC_CHECK {
            misc_path "/etc/keepalived/check_slave.pl 192.168.1.68"
            misc_dynamic
           }
         }
        real_server 192.168.1.218 3306 {
            weight 1
            MISC_CHECK {
            misc_path "/etc/keepalived/check_slave.pl 192.168.1.218"
            misc_dynamic
           }
        }  
    }
    #----------------------------------------------------------------------------------------------------------------------------------

    echo "/etc/init.d/keepalived start" >> /etc/rc.local

    check_slave.pl
    #----------------------------------------------------------------------------------------------------------------------------------
    #!/usr/bin/perl -w
    use DBI;
    use DBD::mysql;
    #CONFIG VARIABLES
    $SBM = 120;
    $db = "mysql";
    $host = $ARGV[0];
    $port = 3306;
    $user = "lvs_";
    $pw = "123456";
    #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 gt $SBM ) {
            exit 1;
        } else {
             exit 0;
        }
    }
    #----------------------------------------------------------------------------------------------------------------------------------
    chmod a+x check_slave.pl


    五:lvs monitor部署 监控类
    #----------------------------------------------------------------------------------------------------------------------------------
    1:在LVS上安装web和php服务
    yum install httpd php pango* -y
    2:在LVS上安装rrdtool工具
    wget  http://oss.oetiker.ch/rrdtool/pub/rrdtool-1.4.7.tar.gz
    tar zxvf rrdtool-1.4.7.tar.gz
    cd rrdtool-1.4.7
    ./configure --prefix=/usr/local/rrdtool
    make
    make install
    cd
    echo "/usr/local/rrdtool/lib"   >> /etc/ld.so.conf
    ldconfig -v
    3:下载安装lvs-rrd
    wget http://tepedino.org/lvs-rrd/lvs-rrd-v0.7.tar.gz
    tar -zxvf lvs-rrd-v0.7.tar.gz
    mv lvs-rrd-v0.7 /var/www/html/lvs
    cd /var/www/html/lvs/
    4:修改默认配置,主要是些命令的路径指向
    vim lvs.rrd.update
    #---------------------------------------------------------
    RRDTOOL="/usr/local/rrdtool/bin/rrdtool"
    IPVSADM="/sbin/ipvsadm"
    WORKDIR="/var/www/html/lvs/rrd"
    #---------------------------------------------------------
    vim graph-lvs.sh
    #---------------------------------------------------------
    WORKDIR="/var/www/html/lvs/rrd"
    RRDTOOL="/usr/local/rrdtool/bin/rrdtool"
    GRAPHS="/var/www/html/lvs/graphs"
    WEBPATH="/lvs/graphs"
    #---------------------------------------------------------
    vim lvs-rrd.php
    #---------------------------------------------------------
    <?php
        header("Cache-Control: max-age=300, must-revalidate");
        system("/var/www/html/lvs/graph-lvs.sh -H");
        ?>
    #---------------------------------------------------------

    5:创建rrd绘图目录,并修改文件权限
    mkdir -p /var/www/html/lvs/rrd
    chown  -R apache /var/www/html/lvs/
    6:配置周期收集数据,并开启服务
    */1 * * * * /var/www/html/lvs/lvs.rrd.update > /dev/null 2>&1
    /etc/init.d/httpd start
    echo "/etc/init.d/httpd start" >> /etc/rc.local

  • 运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
    2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
    3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
    4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
    5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
    6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
    7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
    8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

    所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-109246-1-1.html 上篇帖子: lvs + keepalived + httpd 高可用集群(转) 下篇帖子: keepalived问题
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    扫码加入运维网微信交流群X

    扫码加入运维网微信交流群

    扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

    扫描微信二维码查看详情

    客服E-mail:kefu@iyunv.com 客服QQ:1061981298


    QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


    提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


    本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



    合作伙伴: 青云cloud

    快速回复 返回顶部 返回列表