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 statusG 输出结果中应该看到 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 statusG 输出结果中应该看到 I/O 线程和 SQL 线程都是 `YES`, 就表示成功。 执行此过程后,在主服务上操作的修改数据的操作都会在从服务器中执行一遍,这样就保证了数据的一致性。 最后的效果应为: Slave_IO_Running: Yes Slave_SQL_Running: Yes 7.查看 在master上执行show binlog events命令,可以看到第一个binlog文件的内容 MariaDB [(none)]> show binlog eventsG *************************** 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 statusG 也有可能是从配置文件出错,则在从里面更改配置文件; 最后的效果应为: 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 statusG File :mysql-bin.000007 在从中查看slave日志文件号show slave statusG 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 statusG 若出现: 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服务器恢复原状。