mysql 双机主备 -keepalived 版

本文介绍了如何配置MySQL主从复制,确保数据一致性,并通过Keepalived实现高可用。详细步骤包括修改配置文件、创建复制账户、同步数据以及配置Keepalived进行故障切换。在实践中遇到的问题如主库数据修改未锁定和主备切换后的数据不一致也进行了讨论,提出了相应解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IP 

192.168.105.11

 master

192.168.105.13

 slave

主备机安装 MySQL 数据库 

1 修改配置文件

  1. my.cnf(主)

[mysqld]

symbolic-links=0

log-bin=mysql-bin

server-id=117

binlog_format=MIXED

user=mysql

  2 .my.cnf (备)

 

symbolic-links=0

log-bin=mysql-bin

server-id=190

user=mysql

2. 分别重启 master,slave

systemctl start mysql

3.创建主从复制账户 

登录 master 执行:

GRANT REPLICATION SLAVE ON *.* TO 'mysync'@'192.168.%' IDENTIFIED BY 'mysync';

FLUSH PRIVILEGES;

(mysync 用户用于备机复制主机数据,ip 支持通配符)

1 .查看主机binlog

show master status:

2. 若主机之前已有数据,需要先备份数据到备机

mysqldump --all-databases  --master-data -uxxxx -pxxxx -P 3306 > /XXXX/node01-master.db

scp  node01-master.db 到备机

4.备机同步

登录slave 执行

stop salve;

source /xxxx/node01-master.db;(同步前,加载主机数据)

change master to

>master_host='192.168.105.11',

>master_port=3306,

>master_user='mysync',

>master_password='mysync',

>master_log_file='mysql-bin.000007',

>master_log_pos=6556622; (show master status file/pos的值)

start slave;      (启动同步命令)

1.Show slave status (备机状态) 

复制过程关键进程:Slave_IO_Running --> 负责与主机通信(拷贝主机binlog二进制文件)

Slave_SQL_Running ------>备机mysql 进程(同步执行二进制文件)

5 keepalived 配置

版本:keepalived-2.0.18.tar.gz

1.编译

tar -zxvf keepalived-2.0.18.tar.gz

Cd  keepalived-2.0.18

./configure --prefix=/usr/local/keepalived

make && make install

cp  keepalived-2.0.18/keepalived/etc/init.d   /etc/init.d

cp /usr/local/keepalived/etc/keepalived/keepalived.conf   /etc/keepalived/

cp /usr/local/keepalived/etc/sysconfig/keepalived   /etc/sysconfig/

Chkconfig --add  keepalived

Chkconfig  keepalived on

 2. 修改配置文件 keepalived.conf

    主机:

global_defs {

    router_id HA_MYSQL

}

vrrp_script chk_mysql_port {

    script "/xxxx/keepalived_down"

    interval 2

    weight -5

    fall 2

    rise 1

}

vrrp_instance VI_1 {

    state MASTER

    interface eno1    ---》 网卡

    virtual_router_id 51

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.105.199

    }

   track_script{

   chk_mysql_port

   }

}

 virtual_server 192.168.105.199 3306 {

    delay_loop 6

    lb_algo rr

    lb_kind DR

    persistence_timeout 60

    protocol TCP

    real_server 192.168.105.11 3306 {

        weight 3

        notify_down /xxxx/keepalived

        TCP_CHECK {

            connect_timeout 10

            nb_get_retry 3

            delay_before_retry 3

            connect_port 3306

        }

    }

}

 备机 :

global_defs {

    router_id HA_MYSQL

}

vrrp_script chk_mysql_port {

    script "/xxxx/keepalived_down"

    interval 2

    weight -5

    fall 2

    rise 1

}

vrrp_instance VI_1 {

    state BACKUP

    interface eno1

    virtual_router_id 51

    priority 90

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.105.199    -----》 设置虚地址

    }

    track_script{

 chk_mysql_port

}

}

virtual_server 192.168.105.199 3306 {

    delay_loop 6

    lb_algo rr

    lb_kind DR

    persistence_timeout 60

    protocol TCP

    real_server 192.168.105.13 3306 {

        weight 3

        notify_down /xxxx/keepalived_down

        TCP_CHECK {

            connect_timeout 10

            nb_get_retry 3

            delay_before_retry 3

            connect_port 3306

        }

    }

}

3. keepalived_down

#!/bin/bash

counter=$(ps -C mysqld --no-heading|wc -l)

if [ ${counter} -eq 0 ]; then

     systemctl restart mysqld

     counter1=$(ps -C keepalived --no-heading|wc -l)

     if [ ${counter1} -ne 0 ]; then

        /etc/init.d/keepalived stop

     fi

fi

4.  设定周期性监测keepalived状态:

#!/bin/bash

counter=$(ps -C keepalived --no-heading|wc -l)

if [ ${counter} -ne 0 ]; then

     /etc/init.d/keepalived restart

fi

 5  查看 主机状态 ip addr 

 其中 192.68.105.199 为虚拟地址

6.测试

  1. 用 Navicat 工具 链接数据库 192.168.105.199:3306
  2. 修改主库,检查备库
  3. 关闭主库(备库升级为主库),navicat 访问正常

7. 问题 

1. 主机执行 mysqldump 前,执行 FLUSH TABLES WITH READ LOCK 防止修改主库数据,但是发现表依旧被修改(貌似FLUSH TABLES WITH READ LOCK 没起作用),导致同步前导入备机的数据与主机不一致  。

======》检查,停掉所有写主机应用。

2 备机同步时,应用写备机。

=====》停掉备机同步,手动同步;或  set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;

3 .在发生一次切换后,备机(x.x.105.13)变为主机;此时若备机(x.x.105.11) 恢复,备机上升为主机,若(x.x.105.13) 为主机的过程中有更新,导致 (x.x.105.13) 与 (x.x.105.11)数据不一致。  ======= >  (1) 在检测脚本中不对keepalived做周期拉起,一次主备切换后,需手工处理,(2) 配置主主双活模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值