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 status\G;

             如果正常,就没问题了,

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

            从新主库备份的命令:

             /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
           

 

posted @ 2020-04-08 10:29  学的都会  阅读(591)  评论(0编辑  收藏  举报