Mysql主从高可用方案

MySQL-Replication+keepalived

背景描述:因某项目组需要一套保证数据高可用性方案,故研究了MySQL-Replication+keepalived来做数据的高可用性。

1.1MySQL Replication

主从复制(也称 AB 复制)允许将来自一个MySQL数据库服务器(主服务器)的数据复制到一个或多个MySQL数据库服务器(从服务器)。
复制是异步的 从站不需要永久连接以接收来自主站的更新。
根据配置,您可以复制数据库中的所有数据库,所选数据库甚至选定的表。
MySQL中复制的优点包括:
•    横向扩展解决方案 - 在多个从站之间分配负载以提高性能。在此环境中,所有写入和更新都必须在主服务器上进行。但是,读取可以在一个或多个从设备上进行。该模型可以提高写入性能(因为主设备专用于更新),同时显着提高了越来越多的从设备的读取速度。
•    数据安全性 - 因为数据被复制到从站,并且从站可以暂停复制过程,所以可以在从站上运行备份服务而不会破坏相应的主数据。
•    分析 - 可以在主服务器上创建实时数据,而信息分析可以在从服务器上进行,而不会影响主服务器的性能。
•    远程数据分发 - 您可以使用复制为远程站点创建数据的本地副本,而无需永久访问主服务器。

主服务器上面的任何修改都会通过自己的 I/O tread(I/O 线程)保存在二进制日志 Binary log 里面。

从服务器上面也启动一个 I/O thread,通过配置好的用户名和密码, 连接到主服务器上面请求读取二进制日志,然后把读取到的二进制日志写到本地的一个Realy log(中继日志)里面。

从服务器上面同时开启一个 SQL thread 定时检查 Realy log(这个文件也是二进制的),如果发现有更新立即把更新的内容在本机的数据库上面执行一遍。

 

每个从服务器都会收到主服务器二进制日志的全部内容的副本。

从服务器设备负责决定应该执行二进制日志中的哪些语句。

除非另行指定,否则主从二进制日志中的所有事件都在从站上执行。

如果需要,您可以将从服务器配置为仅处理一些特定数据库或表的事件。

重要: 您无法将主服务器配置为仅记录特定事件。

每个从站(从服务器)都会记录二进制日志坐标:

     文件名

     文件中它已经从主站读取和处理的位置。

 

 

由于每个从服务器都分别记录了自己当前处理二进制日志中的位置,因此可以断开从服务器的连接,重新连接然后恢复继续处理。

1.1.1一主多从

如果一主多从的话,这时主库既要负责写又要负责为几个从库提供二进制日志。此时可以稍做调整,将二进制日志只给某一从,这一从再开启二进制日志并将自己的二进制日志再发给其它从。或者是干脆这个从不记录只负责将二进制日志转发给其它从,这样架构起来性能可能要好得多,而且数据之间的延时应该也稍微要好一些。工作原理图如下:

1.1.2关于二进制日志

mysqld将数字扩展名附加到二进制日志基本名称以生成二进制日志文件名。每次服务器创建新日志文件时,该数字都会增加,从而创建一系列有序的文件。每次启动或刷新日志时,服务器都会在系列中创建一个新文件。服务器还会在当前日志大小达到max_binlog_size参数设置的大小后自动创建新的二进制日志文件 。二进制日志文件可能会比max_binlog_size使用大型事务时更大, 因为事务是以一个部分写入文件,而不是在文件之间分割。
为了跟踪已使用的二进制日志文件,mysqld还创建了一个二进制日志索引文件,其中包含所有使用的二进制日志文件的名称。默认情况下,它具有与二进制日志文件相同的基本名称,并带有扩展名'.index'。在mysqld运行时,您不应手动编辑此文件。
术语二进制日志文件通常表示包含数据库事件的单个编号文件。
术语二进制日志表示含编号的二进制日志文件集加上索引文件。
SUPER权限的用户可以使用SET sql_log_bin=0语句禁用其当前环境下自己的语句的二进制日志记录

1.2配置Replication

1.2.1相关准备

mysql1:192.168.10.120  ----master
mysql2:192.168.10.130  ----slave
VIP:    192.168.10.125  
主机名和hosts配置
在192.168.10.120服务器上
[root@localhost ~]# hostnamectl set-hostname mysql1
[root@mysql1 ~]# vim /etc/hosts
192.168.10.120 mysql1
192.168.10.130 mysql2
在192.168.10.130服务器上
[root@localhost ~]# hostnamectl set-hostname mysql2
[root@mysql2 ~]# vim /etc/hosts
192.168.10.120 mysql1
192.168.10.130 mysql2

1.2.2配置步骤:

1. 在主服务器上,您必须启用二进制日志记录并配置唯一的服务器ID。需要重启服务器。
编辑主服务器的配置文件 `my.cnf`,添加如下内容
[root@mysql1 ~]# vim /etc/my.cnf
[mysqld]
log-bin=/var/log/mysql/mysql-bin
server-id=1
创建日志目录并赋予权限
[root@mysql1 ~]#  mkdir /var/log/mysql
[root@mysql1 ~]#  chown mysql.mysql /var/log/mysql
重启服务
[root@mysql1 ~]#  systemctl restart mysqld 
注意
如果省略server-id(或将其显式设置为默认值0),则主服务器拒绝来自从服务器的任何连接。

为了在使用带事务的InnoDB进行复制设置时尽可能提高持久性和一致性,
您应该在master my.cnf文件中使用以下配置项:
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1

确保未在复制主服务器上启用skip-networking选项。
如果已禁用网络,则从站无法与主站通信,并且复制失败。
2.应该创建一个专门用于复制数据的用户
每个从服务器需要使用MySQL 主服务器上的用户名和密码连接到主站。
例如,计划使用用户 `test` 可以从任何主机上连接到 `master` 上进行复制操作, 并且用户 test 仅可以使用复制的权限。
在主服务器上执行如下操作
[root@mysql1 ~]#
MariaDB [(none)]> CREATE USER 'test'@'%' 
MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.*  TO  'test'@'%'  identified by '123';
3.在从服务器上使用刚才的用户进行测试连接
[root@mysql2 ~]# mysql -utest -p'123' –hmysql1
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 171
Server version: 10.3.9-MariaDB-log MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.001 sec)

MariaDB [(none)]>
[root@mysql2 ~]# mysql -u用户 -p密码 -h主ip

1.2.3下面的操作根据如下情况继续

1.2.3.1主中有数据
如果在启动复制之前有现有数据需要与从属设备同步,请保持客户端正常运行,以便锁定保持不变。这可以防止进行任何进一步的更改,以便复制到从站的数据与主站同步。
1. 在主服务器中导出先有的数据
如果主数据库包含现有数据,则必须将此数据复制到每个从站。有多种方法可以实现:
使用mysqldump工具创建要复制的所有数据库的转储。这是推荐的方法,尤其是在使用时 InnoDB
[root@mysql1 ~]# mysqldump  -u用户名  -p密码  --all-databases  --master-data=1 > dbdump.db
这里的用户是主服务器的用户
如果不使用 --master-data 参数,则需要手动锁定单独会话中的所有表。

2.从主服务器中使用 scp 或 rsync 等工具,把备份出来的数据传输到从服务器中。
在主服务中执行如下命令
[root@mysql1~]# scp  dbdump.db root@mysql2:/root/
这里的 mysql2 需要能被主服务器解析出 IP 地址,或者说可以在主服务器中 ping 通。

3.配置从服务器,并重启
在从服务器上编辑其配置文件my.cnf并添加如下内容
[root@mysql2 ~]# vim /etc/my.cnf
[mysqld]
server-id=2

4.导入数据到从服务器,并配置连接到主服务器的相关信息
登录到从服务器上,执行如下操作
[root@mysql2 ~]# mysql> source   /root/dbdump.db  或
[root@mysql2 ~]# mysql -uroot -p123 < /root/dbdump.db

5在从服务器配置连接到主服务器的相关信息登录到从服务器上
[root@mysql2 ~]# mysql –uroot –p123
MariaDB [(none)]> CHANGE MASTER TO
MASTER_HOST='mysql1,  -- 主服务器的主机名(也可以是 IP) 
MASTER_USER='test',           -- 连接到主服务器的用户
MASTER_PASSWORD='123';        -- 到主服务器的密码

6. 启动从服务器的复制线程
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.09 sec)
检查是否成功
在从服务上执行如下操作,加长从服务器端 IO线程和 SQL 线程是否是 `OK`
MariaDB [(none)]> show slave status\G
输出结果中应该看到 I/O 线程和 SQL 线程都是 `YES`, 就表示成功。
执行此过程后,在主服务上操作的修改数据的操作都会在从服务器中执行一遍,这样就保证了数据的一致性。
最后的效果应为:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
1.2.3.2主服务器中无数据
主服务器配置
1.    my.cnf配置文件
[root@mysql1 ~]# vim /etc/my.cnf
[mysqld]
log-bin=/var/log/mysql/mysql-bin
server-id=1

2.    创建日志目录并赋予权限
[root@mysql1 ~]#  mkdir /var/log/mysql
[root@mysql1 ~]#  chown mysql.mysql /var/log/mysql

3.    重启服务
[root@mysql1 ~]#  systemctl restart mysqld 
从服务器设置
4配置从服务器,并重启
在从服务器上编辑其配置文件my.cnf并添加如下内容
[root@mysql2 ~]# vim /etc/my.cnf
[mysqld]
server-id=2
[root@mysql2~]#  systemctl restart mysqld 

5.查看主服务器的二进制日志的名称
通过使用命令行客户端连接到主服务器来启动主服务器上的会话,并通过执行以下 `FLUSH TABLES WITH READ LOCK`  语句来刷新所有表和阻止写语句:
[root@mysql1 ~]# mysql –uroot –p123
MariaDB [(none)]> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> show master status \G
*************************** 1. row ***************************
            File: mysql-bin.000010
        Position: 473
    Binlog_Do_DB: 
Binlog_Ignore_DB: 
1 row in set (0.000 sec)
MariaDB [(none)]>



6在从服务器的 mariadb 中执行如下语句
MariaDB [(none)]> CHANGE MASTER TO
MASTER_HOST='mysql1',
MASTER_USER='test',
MASTER_PASSWORD='123',
MASTER_LOG_FILE=' mysql-bin.000010',
MASTER_LOG_POS=0;
启动从服务器的复制线程
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.09 sec)
检查是否成功
在从服务上执行如下操作,加长从服务器端 IO线程和 SQL 线程是否是 `OK`
MariaDB [(none)]> show slave status\G
输出结果中应该看到 I/O 线程和 SQL 线程都是 `YES`, 就表示成功。
执行此过程后,在主服务上操作的修改数据的操作都会在从服务器中执行一遍,这样就保证了数据的一致性。
最后的效果应为:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes


7.查看
在master上执行show binlog events命令,可以看到第一个binlog文件的内容
MariaDB [(none)]> show binlog events\G
*************************** 1. row ***************************
   Log_name: mysql-bin.000001
        Pos: 4
 Event_type: Format_desc
  Server_id: 1
End_log_pos: 256
       Info: Server ver: 10.3.9-MariaDB-log, Binlog ver: 4
*************************** 2. row ***************************
   Log_name: mysql-bin.000001
        Pos: 256
 Event_type: Gtid_list
  Server_id: 1
End_log_pos: 285
       Info: []
*************************** 3. row ***************************
Log_name 是二进制日志文件的名称,一个事件不能横跨两个文件
Pos 这是该事件在文件中的开始位置
Event_type 事件的类型,事件类型是给slave传递信息的基本方法,每个新的binlog都以Format_desc类型开始,以Rotate类型结束
Server_id 创建该事件的服务器id
End_log_pos 该事件的结束位置,也是下一个事件的开始位置,因此事件范围为Pos~End_log_pos  -  1
Info 事件信息的可读文本,不同的事件有不同的信息

8. 在从站上暂停复制
可以使用STOP SLAVE和 START SLAVE语句停止并启动从站上的复制 。
要停止从主服务器处理二进制日志,请使用 STOP SLAVE:
MariaDB [(none)]> STOP SLAVE;
当复制停止时,从I / O线程停止从主二进制日志读取事件并将它们写入中继日志,并且SQL线程停止从中继日志读取事件并执行它们。您可以通过指定线程类型单独暂停I / O或SQL线程:
MariaDB [(none)]> STOP SLAVE IO_THREAD;
MariaDB [(none)]> STOP SLAVE SQL_THREAD;
要再次开始执行,请使用以下START SLAVE语句:
MariaDB [(none)]> START SLAVE;
要启动特定线程,请指定线程类型:
MariaDB [(none)]> START SLAVE IO_THREAD;
MariaDB [(none)]> START SLAVE SQL_THREAD;
1.2.3.3关于Slave_IO_Running:     Slave_SQL_Running:的解决方法
若出现:
Slave_IO_Running: Connecting
Slave_SQL_Running: Yes
可能是主配置文件里面的权限问题,若是这样则在主机中更改权限配置
GRANT ALL PRIVILEGES ON *.* TO '用户'@'IP' IDENTIFIED BY '密码';
更改完成后刷新服务:systemctl restart mysqld
在从中:stop slave; start salve;
检查是否成功:MariaDB [(none)]> show slave status\G
也有可能是从配置文件出错,则在从里面更改配置文件;
最后的效果应为:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes


若出现:
Slave_IO_Running: no
Slave_SQL_Running: Yes
则可能是
[root@mysql1 ~]# vim /usr/local/mysqld/data/auto.cnf中主从的UUID相同
更改文件中的UUID刷新即可。

检查主从server_id
主库:
MariaDB [(none)]>  show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+
1 row in set (0.01 sec)
————————————————

从库:
MariaDB [(none)]>  show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+
1 row in set (0.01 sec)
————————————————
若slave节点/etc/my.cnf文件中已存在server-id=2,则重启mysql(systemctl restart mysqld)即可;
若不存在,则加上重启即可。

也有可能是因为主从日志号不同而导致
查看主日志号show master status\G
   File :mysql-bin.000007
 在从中查看slave日志文件号show slave status\G
   File :mysql-bin.000005
发现是因为主从日志文件号不同而导致 
在从中stop slave;
 CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000026', MASTER_LOG_POS=0; 
 flush privileges;
 start slave;
show slave status\G

若出现:
Slave_IO_Running: Yes
Slave_SQL_Running: No
解决方法一:
可能是slave机器重起后,事务回滚造成的.
MariaDB [(none)]> stop slave ;
MariaDB [(none)]> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;    #客户端运行,用来跳过几个事件,只有当同步进程出现错误而停止的时候才可以执行。
MariaDB [(none)]> start slave ;

解决办法二、

首先停掉Slave服务:slave stop
到主服务器上查看主机状态:
记录File和Position对应的值

进入master

mysql> show master status;
+----------------------+----------+--------------+------------------+
| File                 | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+----------------------+----------+--------------+------------------+
| localhost-bin.000094 | 33622483 |              |                  | 
+----------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

 然后到slave服务器上执行手动同步:
mysql> change master to 
> master_host='master_ip',
> master_user='user', 
> master_password='pwd', 
> master_port=3306, 
> master_log_file=localhost-bin.000094', 
> master_log_pos=33622483 ;
1 row in set (0.00 sec)
MariaDB [(none)]> start slave ;
其他问题:https://www.cnblogs.com/wangxin37/p/6398755.html

2.1 keepalived 高可用

 

2.1.1 Keepalived VRRP 介绍

Virtual Route Redundancy Protocol,即虚拟路由冗余协议。它主要是实现路由器高可用的容错协议。
将多台路由器组成路由器组(Router Group),组中包括Master及Backup,在外部看来就像一台路由
器,拥有一个VIP。Master会发送组播消息,当Backup在指定的时间收不到vrrp包就会认为master宕掉,
然后通过VRRP协议再次竞选新的路由器当Master,从而保证路由器的高可用。

在VRRP协议实现中,虚拟路由器使用00-00-5E-00-01-XX作为虚拟MAC地址,XX就是唯一的VRID。

2.2相关步骤

一、安装keepalived 
二、keepalived 主备配置文件
三、mysql状态检测脚本/etc/keepalived/keepalived_check_mysql.sh
四、检测与恢复
注 keepalived之间使用vrrp组播方式通信使用的IP地址是192.168.10.125  
2.2.1 安装keepalived
yum安装
[root@mysql1 ~]# yum -y install keepalived
[root@mysql2 ~]# yum -y install keepalived
2.2.2配置keepalived
192.168.10.120 Master配置
[root@mysql1 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id mysql1
}

vrrp_script check_run {
   script "/root/keepalived_check_mysql.sh"
   interval 5
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0   #设置实例绑定的网卡 VRRP心跳包从哪块网卡发出
    virtual_router_id 88 #组ID
    priority 100 #优先级别,高优先级竞选为master
    advert_int 1 检查间隔,默认1秒 VRRP心跳包的发送周期,单位为s; 组播信息发送间隔,两个节点设置必须一样
    authentication { #设置认证
        auth_type PASS  #认证方式
        auth_pass 12345 #认证密码(密码只识别前8位)
    }

    track_script {
        check_run
    }

    virtual_ipaddress {
        192.168.10.125 #VIP
    }
}

=====================================================================



192.168.10.130 Slave配置
 [root@mysql2 ~]# vim /etc/keepalived/keepalived.conf
=====================================================================
! Configuration File for keepalived

global_defs {
   router_id mysql2
}

vrrp_script check_run {
   script "/root/keepalived_check_mysql.sh"
   interval 5
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 88
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 12345
    }

    track_script {
        check_run
    }

    virtual_ipaddress {
        192.168.10.125
    }
}
2.2.3keepalived 主备配置文件
版本一:简单使用:
[root@mysql1  ~]#  vim /etc/keepalived/keepalived_check_mysql.sh
#!/bin/bash
/usr/bin/mysql -uroot -p123 -e "show status" &>/dev/null 
if [ $? -ne 0 ] ;then 
    service keepalived stop
fi 

版本二:检查多次:
[root@mysql1  ~]#  vim /etc/keepalived/keepalived_check_mysql.sh
#!/bin/bash 
MYSQL=/usr/bin/mysql
MYSQL_HOST=localhost 
MYSQL_USER=root 
MYSQL_PASSWORD=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
             /etc/init.d/keepalived stop                    
             exit 1                                
     fi                                        
    let CHECK_TIME--
     sleep 1 
done
[root@mysql1  ~]#  chmod 755 /etc/keepalived/keepalived_check_mysql.sh
[root@mysql2  ~]#  chmod 755 /etc/keepalived/keepalived_check_mysql.sh
两边均启动keepalived
[root@mysql1 ~]# systemctl start keepalived
[root@mysql1 ~]# systemctl enable keepalived
[root@mysql2 ~]# systemctl start keepalived
[root@mysql2 ~]# systemctl enable keepalived
2.2.4 检测与恢复
开启keepalived后主中检查
[root@mysql1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:11:fc:e8 brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.120/24 brd 192.168.10.255 scope global noprefixroute dynamic ens33
       valid_lft 1412sec preferred_lft 1412sec
    inet 192.168.10.125/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::bc23:8c3:3e65:9409/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever 
开启keepalived后从中检查

[root@mysql2 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:1a:47:ab brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.130/24 brd 192.168.10.255 scope global noprefixroute dynamic ens33
       valid_lft 1387sec preferred_lft 1387sec
    inet6 fe80::bc23:8c3:3e65:9409/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever
    inet6 fe80::e6bc:d8b3:5b9a:d738/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
此时可以发现VIP192.168.10.125在mysql1服务器上。

将主中mariadb停止,观看VIP是否会飘到从节点。
[root@mysql1 ~]# systemctl stop mysqld
Mysql1节点观察
[root@mysql1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:11:fc:e8 brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.120/24 brd 192.168.10.255 scope global noprefixroute dynamic ens33
       valid_lft 1690sec preferred_lft 1690sec
    inet6 fe80::bc23:8c3:3e65:9409/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
Mysql2节点观察
[root@mysql2 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:1a:47:ab brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.130/24 brd 192.168.10.255 scope global noprefixroute dynamic ens33
       valid_lft 1615sec preferred_lft 1615sec
    inet 192.168.10.125/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::bc23:8c3:3e65:9409/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever
    inet6 fe80::e6bc:d8b3:5b9a:d738/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

此时可以发现VIP已经飘到mysql2节点上。
[root@mysql ~]# mysql -uroot -p123
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 680
Server version: 10.3.9-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| alisa              |
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.001 sec)

MariaDB [(none)]>
已验证从数据库中与主数据库相同

恢复
[root@mysql1 ~]# systemctl start mysqld
[root@mysql1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:11:fc:e8 brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.120/24 brd 192.168.10.255 scope global noprefixroute dynamic ens33
       valid_lft 1412sec preferred_lft 1412sec
    inet 192.168.10.125/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::bc23:8c3:3e65:9409/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever 
开启keepalived后从中检查

[root@mysql2 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:1a:47:ab brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.130/24 brd 192.168.10.255 scope global noprefixroute dynamic ens33
       valid_lft 1387sec preferred_lft 1387sec
    inet6 fe80::bc23:8c3:3e65:9409/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever
    inet6 fe80::e6bc:d8b3:5b9a:d738/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
此时可以发现VIP192.168.10.125飘回mysql1服务器上,mysql2服务器恢复原状。
posted @ 2020-08-17 15:10  alisapine  阅读(306)  评论(1编辑  收藏  举报