• keepalived+mysql构建主从HA架构全过程,附配置文件


         我没去公司之前,公司一直都是单节点mysql,且mysql的版本和安装方式配置文件等也不具有统一化,初期做了数据库的基础调整,就是做了mysql的默认架构,主从复制,跑了半年,一切稳定,为了更加的提升自己,只能多打打小怪兽,持续升级了,否则很快对一家公司你就没有特别大的利用价值,也没有加薪的空间,废话不多说,说一下我的部署架构。

    目前所要构建HA架构的mysql是mysql 5.7版本,数据量极少,几十M,目前没有做MHA的架构需求,和老板讨论,加之研究了keepalived+mysql的HA架构,决定一试。

    一.目前架构和keepalived+mysql的HA架构和MHA架构的对比

    优势:搭建比较简单,只需要主从安装keepalived的服务,启动vip即可以实现。

    劣势:1.主从只可以实现一次切换,切换后,之前的主库,即使重启也无法直接使用,因为主从数据不一致,而需要手动创建主从,而这个过程可能遇到各种奇葩的问题,需要时间重新构建主从。

               2.当主从不同步,此时进行主从切换,可能会出现,数据丢失的惨况。

               3.受一些因素的影响,可能会出现脑裂,比如VIP两台服务器都没有,或者同时出现。

     二.搭建过程

                1.ip分配如下

            

          2.构建mysql主从
              略。正常的构建主从,基于GTID

              配置文件:

    主:

     [root@im_prod_master ~]# cat /etc/my.cnf
    [mysqld]
    #************** basic ***************
    user=mysql
    basedir=/usr/local/mysql
    datadir=/data/mysql
    log-error=/var/log/mysql.log
    log_bin=/data/mysql/binlog/mysql-bin
    server-id=162
    sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    skip-name-resolve
    gtid-mode=on
    enforce-gtid-consistency=true
    default_storage_engine=InnoDB
    default_tmp_storage_engine=InnoDB
    internal_tmp_disk_storage_engine=InnoDB
    autocommit=1
    log_timestamps=SYSTEM


    ##***********binlog & relaylog&slow log**************
    binlog_format=row
    binlog_cache_size=128k
    binlog_stmt_cache_size=128k
    max_binlog_cache_size=2G
    max_binlog_stmt_cache_size=2G
    log-bin-trust-function-creators=1
    expire_logs_days=7
    max_binlog_size=500M
    slow_query_log=1
    slow_query_log_file=/data/mysql/slowlog/slow.log
    long_query_time=2
    log_queries_not_using_indexes=ON
    relay_log_recovery=ON
    skip-slave-start
    log-bin-trust-function-creators=1
    ##************character set ********************
    character_set_server=utf8mb4
    character-set-client-handshake=FALSE
    character-set-server=utf8mb4
    collation-server=utf8mb4_general_ci
    ##skip-grant-tables
    ##***********slave config************************
    log-slave-updates=1
    ##************system*****************************
    key_buffer_size         = 16M
    max_allowed_packet      = 16M
    thread_stack            = 192K
    thread_cache_size       = 16
    query_cache_size        = 0
    query_cache_type        = OFF


    [mysql]
    socket=/tmp/mysql.sock

    从:

    [mysqld]
    #************** basic ***************
    user=mysql
    basedir=/usr/local/mysql
    datadir=/data/mysql
    log-error=/var/log/mysql.log
    log_bin=/data/mysql/binlog/mysql-bin
    server-id=161
    sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    skip-name-resolve
    gtid-mode=on
    enforce-gtid-consistency=true
    default_storage_engine=InnoDB
    default_tmp_storage_engine=InnoDB
    internal_tmp_disk_storage_engine=InnoDB
    autocommit=1
    log_timestamps=SYSTEM

    ##binlog & relaylog
    binlog_cache_size=128k
    binlog_stmt_cache_size=128k
    max_binlog_cache_size=2G
    max_binlog_stmt_cache_size=2G
    binlog_format=row
    expire_logs_days=7
    max_binlog_size=500M
    slow_query_log=1
    slow_query_log_file=/data/mysql/slowlog/slow.log
    long_query_time=2
    log_queries_not_using_indexes=ON
    relay_log_recovery=ON
    skip-slave-start
    log-bin-trust-function-creators=1

    ##************character set ********************

    character_set_server=utf8mb4
    character-set-client-handshake=FALSE
    character-set-server=utf8mb4
    collation-server=utf8mb4_general_ci
    #skip-grant-tables
    #***********slave config************************
    log-slave-updates=1
    #read_only=1
    ##************system*****************************

    key_buffer_size         = 16M
    max_allowed_packet      = 16M
    thread_stack            = 192K
    thread_cache_size       = 16
    query_cache_limit       = 1M
    query_cache_size        = 16M
    [mysql]
    socket=/tmp/mysql.sock

         3.安装keepalived
               yum install -y keepalived 也可以源码安装

               編輯keepalived的配置文件:

               主:

                   [root@im_prod_master ~]# cat /etc/keepalived/keepalived.conf
    ! Configuration File for keepalived

    global_defs {
            router_id HA_MySQL   ###定义一个全局变量
    }
    vrrp_script check_mysql {
         script "/server/scripts/check_mysql.sh"  ####监控脚本
         interval 2                            
         }
    vrrp_instance V1_1 {        ####实例名称(主备一致)
        state BACKUP       #####主备必须都是backup
        interface ens160  #####网卡信息
        virtual_router_id 162 #####路由ID主备必须一致,否则会出现脑裂
        priority 100 ####优先级
        advert_int 1  #检查间隔,默认1秒 VRRP心跳包的发送周期,单位为s 组播信息发送间隔
        nopreempt  ###设置为不抢占 两个节点的state都必须配置为BACKUP两个节点都必须加上配置 nopreempt
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
           10.2.22.80  ###设置vip
        }
    }
    track_script {                              
         check_mysql ###指定检查脚本,定期运行它们来改变优先级,并最终引发主备交换
    }
    virtual_server 10.2.22.80 3306 {
        delay_loop 2  #健康检查间隔时间
        lb_algo wrr  #lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh  wrr加权轮询算法
        lb_kind DR  #负载均衡转发规则NAT|DR|RUN
        persistence_timeout 60 #会话保持时间
        protocol TCP  ##使用协议

        real_server 10.2.22.162 3306 {
            notify_down /server/scripts/kill_keepalived.sh  ###keepalived自杀脚本
            TCP_CHECK {
                 connect_timeout 10
                 nb_get_retry 3
                 delay_before_retry 3
                 connect_port 3306
            }
        }
    }
    .........

    從:

         ! Configuration File for keepalived

    global_defs {
            router_id HA_MySQL
    }
    vrrp_script check_mysql {
         script "/server/scripts/check_mysql.sh"
         interval 2                            
         }
    vrrp_instance V1_1 {
        state BACKUP
        interface ens160
        virtual_router_id 162
        priority 90
        advert_int 1
        nopreempt
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
           10.2.22.80
        }
    }
    track_script {                              
         check_mysql
    }
    virtual_server 10.2.22.80 3306 {
        delay_loop 2
        lb_algo wrr
        lb_kind DR
        persistence_timeout 60
        protocol TCP

        real_server 10.2.22.161 3306 {
            notify_down /server/scripts/kill_keepalived.sh
            TCP_CHECK {
                 connect_timeout 10
                 nb_get_retry 3
                 delay_before_retry 3
                 connect_port 3306
            }
        }
    }

    附:配置文件 check_mysql.sh

      MYSQL=/usr/local/mysql/bin/mysql
    MYSQL_HOST=localhost
    MYSQL_USER=root
    MYSQL_PASSWORD=1qaz@WSX
    $MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "show status;" >/root/check_mysql.log
    if [ $? == 0 ]
    then
        echo " $host mysql login successfully "
        exit 0
    else
        systemctl stop keepalived.service
        exit 2
    fi

    [root@im_prod_master ~]# cat /server/scripts/kill_keepalived.sh
    #!/bin/bash
    kill -9 $(cat /var/run/keepalived.pid)

    3.切换测试

          1). 首先kill掉主库,查看ip是否会漂移

                   因为测试时候未截图,但是依以上配置,可以实现vip漂移,并且访问正常,无中断

          2).挂掉主库恢复

                 首先将挂掉的主库启动,

                 reset master;

                 reset slave;

                 change master to master_host='10.2.22.161',master_user='repl',master_password='123456' ,MASTER_AUTO_POSITION=1;

                 start slave;
                 show slave statusG;

                 如果正常,就没问题了,

                 如果不正常,建议,直接重新初始化数据库,重新构建和新主库的主从关系,

                从新主库备份的命令:

                 /usr/local/mysql/bin/mysqldump -uroot -p'1qaz@WSX' -h10.2.22.161 --single-transaction --triggers --set-gtid-purged=ON --routines --events --master-data=2 -A  |gzip > $path/im_prod/all_${ttime}.sql.gz
               

  • 相关阅读:
    Vue1.0学习总结(4)———Vue1.0自定义组件、Vue1.0组件之间的通信、slot的使用
    Vue1.0学习总结(3)———vue1.0的生命周期、vue计算属性computed的使用、vue实例(vm)上方法总结、vue结合动画使用
    Vue1.0学习总结(2)———交互(vue-resoucre的使用)
    Vue1.0学习总结(1)———指令、事件、绑定属性、模板、过滤器
    你需要的是坚定自己
    ES6新增—ES6自带的模块化、ES6新增Promise、ES6新增Generator
    ES6新增—ES6中的对象、面向对象、面向对象的继承、面向对象和继承的应用
    ES6新增—新增循环、箭头函数
    ES6新增—let、const、字符串连接、解构赋值、复制数组
    lucene&solr学习——索引维护
  • 原文地址:https://www.cnblogs.com/liuxiuxiu/p/12658307.html
Copyright © 2020-2023  润新知