• mysql高可用之LVS + KEEPALIVE + MYSQL


    1.架构图

     

    注意

    (一)   Mysql需要把bind-address的配置去掉,否则无法实现虚拟ip访问

    (二)   关闭所有linux防火墙:/sbin/iptables –F(可能没用)

    (三)   重启networking:sudo /etc/init.d/networking restart(可能没用)

    2. 架构

    Mysql:

    master<=slave

    10.24.6.5:3306(system   !System)<=10.24.6.6:3306(system          !System) 

    LB

    10.24.6.4 Master

    10.24.6.7 BACKUP

    VIP:

    10.24.6.2

    3.LVS负载均衡配置

    3.1. Lvs模块检测

    Ipvs 具体实现是由ipvsadm 这个程序来完成,因此判断一个系统是否具备ipvs 功能,只需要察看ipvsadm 程序是否被安装。察看ipvsadm 程序最简单的办法就是在任意路径执行命令ipvsadm。表6-1 为安装ipvsadm 及未安装ipvsadm 的输出对比。

    执行 ipvsadm 后的输出

    未安装ipvsadm

    bash: /sbin/ipvsadm: 没有那个文件或目录

    安装ipvsadm

    IP Virtual Server version 1.2.1 (size=4096)

    Prot LocalAddress:Port Scheduler Flags

      ->RemoteAddress:Port           Forward Weight ActiveConn InActConn

    表6-1 ipvsadm 输出对比

     

    a)         通过系统命令比较简单:apt-get install ipvsadm

    b)        检验ipvsadm 是否被正确安装

                                        i.              执行ipvsadm,看是否有表6-1 第2 栏的输出。

                                      ii.              检查当前加载的内核模块,看是否存在ip_vs 模块。

    modprobe -l |grep ipvs 

    或lsmod | grep ip_vs

     

    Ubuntu9.10已经用了2.6的内核,所以不需要再编译内核了

     

    3.2.配置

    LVS默认不需要配置

    4.KeepAlived高可用配置

    4.1. 安装

     

    4.2. MASTER配置(/etc/keepalived/keepalived.conf)

    global_defs {

        router_id HaMySQL_1

    }

    vrrp_instance VI_MYSQL {

        state MASTER

        interface eth0

        virtual_router_id 51

        priority 100

        advert_int 1

        authentication {

            auth_type PASS

            auth_pass 1111

        }

        virtual_ipaddress {

            10.24.6.2

        }

    }

    virtual_server 10.24.6.2 3306 {

        delay_loop 6

        lb_algo wrr

        lb_kind DR

        persistence_timeout 60

        protocol TCP

        real_server 10.24.6.5 3306 {

            weight 3

            TCP_CHECK {

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

            connect_port 3306

            }

        }

        real_server 10.24.6.6 3306 {

            weight 3

            TCP_CHECK {

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

            connect_port 3306

            }

    }

    }

    4.3. SLAVE配置(/etc/keepalived/keepalived.conf)

    global_defs {

        router_id HaMySQL_1

    }

    vrrp_instance VI_MYSQL {

        state BACKUP

        interface eth0

        virtual_router_id 51

        priority 50

        advert_int 1

        authentication {

            auth_type PASS

            auth_pass 1111

        }

        virtual_ipaddress {

            10.24.6.2

        }

    }

    virtual_server 10.24.6.2 3306 {

        delay_loop 6

        lb_algo wrr

        lb_kind DR

        persistence_timeout 60

        protocol TCP

        real_server 10.24.6.5 3306 {

            weight 3

            TCP_CHECK {

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

            connect_port 3306

            }

        }

        real_server 10.24.6.6 3306 {

            weight 3

            TCP_CHECK {

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

            connect_port 3306

            }

        }

    }

    4.4. 日志

    Ubuntu下面是/var/log/syslog

    All daemon messages are logged through the Linux syslog. If you start Keepalived with the “dump

    configuration data” option, you should see in your /var/log/messages (on Debian this may be

    /var/log/daemon.log depending on your syslog configuration) something like this :

    4.5. 负载均衡服务的启用和验证

    Lvs 客户端的启用和验证在前面的有过详细的说明,此处略过。前面我们也提过,keepalived 启动过程不会检查配置文件的语法,因此在启动keepalived 以前,需要人工对/etc/keepalived/keepalived.conf 文件做全面的语法检查。一个比较容易犯的错误就是把花括号“}”写漏了,不成对!当lvs 客户端都正常启动并且配置文件经检查无误后(当然有错误也无妨,随时可以修改嘛!),执行命令 /usr/local/keepalived/sbin/keepalived –D ,然后我们查看系统进程,看是否是3 个keepalived 进程。如果配置文件的路径不是/etc/keepalived/keepalived.conf 则需要在启动时用选项-f 指定。

    最能反映keepalived 启动情况的地方当属系统日志。手动执行启动操作后,使用命令 tail –f /var/log/syslog 滚动查看输出,就能详细了解其运行情况。图6-3 为某个lvs 环境的keepalived 启动输出:

    另外一个反映keepalived 正常运行状态的地方是网络接口vip 的启用。通过执行ip add 即可看见vip 已经被绑定在制定的网络接口(注意:ifconfig 不能显示 vip)。需要注意的是,BACKUP 的vip 暂时不绑定。如下图所示:

    4.6. Vip验证

    Master

     

    Slave

     

    4.7. IPVSADM验证

    Master

     

    Clave

     

    4.8. 测试验证

    实体mysql

     

    Vip mysql

     

    4.9. 高可用测试结果

    LB:

    10.24.6.4 Master关闭以后,10.24.6.7 BACKUP启用接管

    MYSQL:

    10.24.6.5:3306

    10.24.6.6:3306

    任意一个mysql异常之后,可连接到其他mysql

    5. 遇到问题

    5.1. Mysql连接不上(错误码111)分析

    1.Mysql连接vip

     

    2.Mysql连接vip的抓包情况

     

    通过抓包可知,10.24.6.2:3306是可以连上的,它有回包,只不过回包的状态为R

    3.TCP连接出现RST的情况分析:

      @1端口未打开

      @2请求超时

      @3提前关闭

      @4在一个已关闭的socket上收到数据

    4.在结合mysql返回值为111可以知道应该是mysql服务提前关闭了,

    Google了下mysql111的解决办法:

    QT链接Mysql的时候出现QSqlError(2003, "QMYSQL: Unable to connect", "Can't connect to MySQL server on '172.18.186.244' (111)")错误,google之后发现是mysql为了安全,对hostname进行了绑定。

    解决办法:修改/etc/mysql/my.cnf(不同Linux发行版位置可能不同,我用的是Ubuntu 11.04,windows是my.ini文件),里面有一句:bind-address = 127.0.0.1用#注释掉,重启mysql服务就OK了。

    原文地址:http://stackoverflow.com/questions/1420839/cant-connect-to-mysql-server-error-111

    5. 解决方案(去掉bind-address):

    修改在10.24.6.5的mysql配置:

     

    修改在10.24.6.6的mysql配置:


    6. 总结

    • 主mysql和从mysql可以同时存在服务
    • Keepalive从可用的服务列表里面选择一个服务访问
    • 主mysql和从mysql随机选择
    • 适合做负载均衡,主从备份
    • share nothing架构
  • 相关阅读:
    关于JS中判断两个数组相等
    用JS实现二叉树
    elementUI select组件 默认选择第一项
    angular [src] 绑定url或src 报XSS错误
    easy-mock本地搭建工程实操
    array splice split || string split slice 傻傻分不清楚=>终于弄清楚了
    循环=>轮回=>js循环比拼
    vue-cli 搭建工程配置 => 你想要这里都有
    git分支问题 查看、创建、关联、删除本地/远程分支
    vue知识点 && 错误点 => 持续更新
  • 原文地址:https://www.cnblogs.com/zhanchenjin/p/5378906.html
Copyright © 2020-2023  润新知