mysql(五)-----keepalived配置mysql的高可用

不打扰是莪最后的温柔 提交于 2020-03-27 23:19:15

生产环境对数据库要求很高的,为了避免数据库的突发情况,给他做个保险--用keepalived做高可用
环境(此处ip,密码均是乱造的):
主:192.1.31.161 端口:3306 用户:vnum 密码:vnum@123
从:192.1.31.162 端口:3306

方案介绍
两台mysql互为主从,但只有master写,slave只负责读。主从通过keepalive做成高可用,当master出问题,
由slave接替master工作,即读写都在slave操作。当master恢复正常,master自动同步故障时间段数据,接替slave的写工作。

一:配置主主同步

、配置文件
master my.cnf 主要参数

log_slave_updates
log-bin = mysql-bin
server-id = 1
binlog-ignore-db=mysql
#auto_increment_increment = 2
#auto_increment_offset = 2

slave my.cnf 主要参数

log_slave_updates
log-bin = mysql-bin
server-id = 2
binlog-ignore-db=mysql
#auto_increment_increment = 2
#auto_increment_offset = 1

注:
log_slave_updates  同步数据时也写入日志,二进制记录id号,互为主从时时不会引起循环。建议开启方便实施日志恢复。 可选
slave-skip-errors  跳过错误,可以通过=指定特定的错误,如:slave-skip-errors=1062  可选
log-bin = mysql-bin 开启二进制日志,必须开启,主从同步主要是通过二进制日志。 必须
sync_binlog=n  设置二进制日志在写入多少此后与硬盘同步,1 为最安全的也是效率最低的,根据实际情况设定 可选
server-id  设置mysql的id号,主从不能相同。 必须
binlog-ignore-db 设置不写入日志的库,建议设置不需要的库,节省流量。如需设置多个库可加多个此参数  可选
binlog-do-db 设置写入二进制日志的库,如设置则只有设置的库才能写入二进制日志。如需设置多个库可加多个此参数。 可选
replicate-ignore-db 设置slave不同步的库,如需设置多个库可加多个此参数。 可选
replicate-do-db 设置slave同步的库,如需设置多个库可加多个此参数。 可选
auto_increment_increment  自增增长值,如:id 设置为 auto_increment,则每次插入数据自增值为2,以1,3,5...或2,4,6...方式增长。 可选
auto_increment_offset 自增初始化便宜值,如果前一个id 为2 则 下一个为3 然后在这个基础上按auto_increment_increment 设置的值进行自增。 可选
master-host = 192.168.1.2 设置master 服务器地址,也可以启动时通过change master to 设置 。 可选
master-user = repl 设置更新用的帐号,也可以启动时通过change master to 设置 。 可选
master-password = 123 设置跟新用的密码,也可以启动时通过change master to 设置 。 可选
master-port = 3306 设置master端口,也可以启动时通过change master to 设置 。 可选

binlog-do-db、binlog-ignore-db、replicate_do_db、replicate_ignore_db 在使用时应注意,若加了以上参数,则在操作数据库是要避免跨库操作(例:update test.table1 set...)
如设置 binlog-do-db=test
use mysql;
update test.table1 set ......
第二句会执行但不会写入二进制日志,即从库不能同步,主从数据库出现差异

如设置 binlog_ignore_db=mysql
use mysql;
update test.table1 set ......
第二句会执行但不会写入二进制日志,即从库不能同步,主从数据库出现差异

如设置 replicate_do_db=test
use mysql;
update test.table1 set ......
第二句将不会被执行,即从库不能同步,主从数据库出现差异

如设置 replicate_ignore_db=mysql
use mysql;
update test.table1 set ......
第二句会被忽略执行,即从库不能同步,主从数据库出现差异

原因是设置binlog-do-db、binlog-ignore-db、replicate_do_db或replicate_ignore_db后,MySQL执行sql前检查的是当前默认数据库,所以跨库更新语句被忽略。

登录master数据库
mysql> show master status\G;

mysql(五)-----keepalived配置mysql的高可用

同理,查看slave的

mysql(五)-----keepalived配置mysql的高可用

master:
mysql>CHANGE MASTER TO
MASTER_HOST='192.1.31.162',    
MASTER_USER='vnum',           
MASTER_PASSWORD='vnum@123',   
MASTER_PORT=3306,                 
MASTER_LOG_FILE= 'my_log.00006',   
MASTER_LOG_POS= 154,                         
MASTER_CONNECT_RETRY=10;  

mysql>start slave;
mysql>show slave status\G;

salve:
mysql>CHANGE MASTER TO
MASTER_HOST='192.1.31.161',    
MASTER_USER='vnum',           
MASTER_PASSWORD='vnum@123',   
MASTER_PORT=3306,                 
MASTER_LOG_FILE= 'my_log.00018',   
MASTER_LOG_POS= 154,                         
MASTER_CONNECT_RETRY=10;  

mysql>start slave;
mysql>show slave status\G;

均出现两个yes,就证明主主配置成功

1.安装keepalived
   # yum -y install  keepalived
         一般配置文件是/etc/keepalived/keepalived.conf
         日志在/etc/log/messages

2.修改keepalived的配置
   # cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id mysql1

}

vrrp_instance VI_1 {
    state BACKUP  #指定keepalived的角色。两台均配置成BACKUP,这样可以根据优先级决定主从
    interface ens160   # 指定HA监控的网络名称
    virtual_router_id 51  # 主从保持一致,VRRP的唯一标识
    priority 100   #优先级,选举master,主的比从的高
    advert_int 1  #发varrp包的时间间隔,即多久选举一次master
    nopreempt  # 不抢占,即允许一个priority比较低的节点作为主,主要预防脑裂
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {   #指定VIP的地址
     192.1.31.3
    }
}
virtual_server 192.1.31.3 3306 {  #设置虚拟服务器,需要指定虚拟IP端口,ip和端口之间空格隔开
    delay_loop 2     #设置运行检查时间,单位秒
    lb_algo rr          # 设置后端调度算法,这里设置为rr
    lb_kind DR       # 设置LVS实现的算法
    persistence_timeout 60  # 保持会话60S

    peotocol TCP  # TCP协议

   real_server 192.1.31.161  3306 {  # 本机ip  端口
     weight 3         # 配置服务点的权值,权值大小用数字标识,数字越大,权值越高,权值是为了区分不同的服务器
       notify_down    /root/keepalived_check_mysql.sh  # 检查mysql是否是down

       TCP_CHECK { 
            connect_timeout 3  # 连接超时时间
            nb_get_retry 3    # 重连次数
            delay_before_retry 1   # 重连时间间隔
            connect_port 3306  # 健康检查端口

       }

   }

}

同样的也需要修改mysql2的keepalived配置文件(下图中绿色部分为和mysql1不一样的地方)
可以使用scp命令把mysql1主机上配置好的keepalived.conf文件拷贝到server2主机,只需要改
 router_id mysql1    ------> router_id mysql2
 priority 100    ----->    priority  90
  nopreempt   ----->    #  nopreempt 
    real_server 192.1.31.161 3306  ------->   real_server 192.1.31.162 3306

3.写脚本
  # cat /root/keepalived_check_mysql.sh 
    #!/bin/sh
# -------------------------------------------------------------------------------
# FileName:    check_mysql.sh
# Revision:    1.0
# Date:        2019/05/07
# Author:      salarh
# Email:       salarh@163.com

MYSQL=/data/mysql/bin/mysql
MYSQL_HOST=localhost
MYSQL_USER=root
MYSQL_PASSWORD='root@123'
CHECK_TIME=3

#mysql  is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0
MYSQL_OK=1

check_mysql_helth (){
    $MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p${MYSQL_PASSWORD} -e "show status;" &>/dev/null
    if [ $? -eq 0 ] ;then
        MYSQL_OK=1
    else
        MYSQL_OK=0
    fi
    return $MYSQL_OK
}

while [ $CHECK_TIME -ne 0 ]
do
        check_mysql_helth
        if [ $MYSQL_OK -eq 1 ] ; then
                exit 0
        fi

        if [ $MYSQL_OK -eq 0 ] &&  [ $CHECK_TIME -eq 1 ];then
                systemctl stop keepalived.service
                exit 1
        fi
        let CHECK_TIME--
        sleep 1
done

别忘了授权
# chmod +x  /root/keepalived_check_mysql.sh
3.开启主从上的keepalived
  # systemctl restart keepalived
    在打开一个窗口查看日志
(192.1.31.3这个虚拟ip应该在192.1.31.161上)
4.观察,测试
1)登录192.1.31.3(vip)的数据库,进行数据插入,再去162这台机器上看是否同步
2)关闭161这台数据库,vip在162这台数据库上,进行数据插入,是正常的。
但当161这台机器上的mysql和keepalived开启后,161 就相当于备库了,除非162mysql或主机down了,他才能重登大位

最后一步就是做监控报警了
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!