> 文档中心 > Centos 7 安装系列(6):MySQL + KeepAlived 双主热备

Centos 7 安装系列(6):MySQL + KeepAlived 双主热备

MySQL + KeepAlived 双主热备

  • 一、系统环境
  • 二、安装MySQL
  • 三、MySQL 主主模式
    • 3.1 修改 master1 的配置文件
    • 3.2 修改 master2 的配置文件
    • 3.3 配置master2 -> master1 的主从
      • 3.3.1 登录master2 的MySQL 命令行界面
        • 3.3.1.1 给用户授权备份的权限
        • 3.3.1.2 查看主节点的状态
      • 3.3.2 登录master1 的MySQL 命令行界面
    • 3.4 配置master1 -> master2 的主从
      • 3.4.1 登录master2 的MySQL 命令行界面
        • 3.4.1.1 给用户授权备份的权限
        • 3.4.1.2 查看主节点的状态
      • 3.4.2 登录master1 的MySQL 命令行界面
      • 3.5 开启从库
  • 四、MySQL 主主模式测试
    • 4.1 新增数据库
    • 4.2 新增数据表
    • 4.3 新增数据
    • 4.4 修改数据
  • 五、KeepAlived 虚拟IP
    • 5.1 master2 安装keepalived
    • 5.2 master2 修改keepalived 配置
    • 5.3 master2 安装killall 命令
    • 5.4 master1 按照master2 的操作重复一遍
    • 5.5 【踩坑】Keepalived主备都含有VIP
      • 5.5.1 关闭SELINUX
      • 5.5.2 开放VRRP 规则
      • 5.5.3 开放端口112
    • 5.6 keepalived 测试
      • 5.6.1 虚拟IP 漂移
      • 5.6.2 虚拟IP 数据库连接
      • 5.6.3 查看当前实际数据库主机
  • 六、总结

一、系统环境

操作系统:Centos 7.6

主机名 主机IP 角色 备注
master1 10.90.21.106 MySQL主机、keepalived (BACKUP) 全新的机器
master2 10.90.21.113 MySQL主机、keepalived(MASTER) 将由106克隆而得
虚拟IP 10.90.21.114 虚拟IP 未与任何机器绑定

二、安装MySQL

在 master1(106) 上安装MySQL,具体操作请参考文章 Centos 7 安装系列(1):MySQL 5.7.35 ,在这里不再讲解。

三、MySQL 主主模式

3.1 修改 master1 的配置文件

打开配置文件进行修改:

vi /etc/my.cnf

在文件末尾添加以下内容:

#开启binlog日志log-bin=/var/lib/mysql/mysql-bin# 配置server-id 每个MySQL实例的server-id都不能相同server-id=123# 作为从库时 更新操作是否写入日志 on:写入 其他数据库以此数据库为主库时才能进行同步log-slave-updates=on# MySQL系统库的日志不计入binlogbinlog-ignore-db=information_schemabinlog-ignore-db=mysqlbinlog-ignore-db=performance_schemabinlog-ignore-db=sys#忽略所有复制产生的错误slave-skip-errors = all# MySQL系统库的数据不需要同步 我们这里写了3个  更加保险# 同步数据时忽略一下数据库 但是必须在使用use db的情况下才会忽略;如果没有使用use db 比如create user  数据还是会同步的replicate-ignore-db=information_schemareplicate-ignore-db=mysqlreplicate-ignore-db=performance_schemareplicate-ignore-db=sys# 使用通配符忽略MySQL系统库的表  这样在create user时也不会进行同步了replicate_wild_ignore_table=information_schema.%replicate_wild_ignore_table=mysql.%replicate_wild_ignore_table=performance_schema.%replicate_wild_ignore_table=sys.%

修改完配置文件后,重启MySQL:

service mysqld restart

3.2 修改 master2 的配置文件

克隆主机master1(106) ,并修改克隆机的静态IP 为10.90.21.113,名为master2。

打开配置文件进行修改:

server-id=124

修改完配置文件后,重启MySQL。

service mysqld restart

3.3 配置master2 -> master1 的主从

3.3.1 登录master2 的MySQL 命令行界面

3.3.1.1 给用户授权备份的权限

grant replication slave, replication client on . to ‘repl_master’@‘192.168.147.103’ identified by ‘Root123456+’;

这一步我们没有做,因为我们在MySQL 安装那一步已经给root 用户授予了所有的权限,在这里我们将使用该用户来进行操作。

若你想使用新的用户,可在MySQL 命令行界面执行上述命令(按实际情况修改)。

3.3.1.2 查看主节点的状态

show master status;

结果如下:
在这里插入图片描述
记住binlog 文件名称及位置:mysql-bin.000004 | 154

3.3.2 登录master1 的MySQL 命令行界面

执行以下命令:

CHANGE MASTER TO MASTER_HOST='10.90.21.113',MASTER_PORT=3306,MASTER_USER='root', MASTER_PASSWORD='M&3ezZ&fW04SOSuMfsQ',MASTER_LOG_FILE='mysql-bin.000004',MASTER_LOG_POS=154;

3.4 配置master1 -> master2 的主从

3.4.1 登录master2 的MySQL 命令行界面

3.4.1.1 给用户授权备份的权限

grant replication slave, replication client on . to ‘repl_master’@‘192.168.147.103’ identified by ‘Root123456+’;

这一步我们没有做,因为我们在MySQL 安装那一步已经给root 用户授予了所有的权限,在这里我们将使用该用户来进行操作。

若你想使用新的用户,可在MySQL 命令行界面执行上述命令(按实际情况修改)。

3.4.1.2 查看主节点的状态

show master status;

结果如下:
在这里插入图片描述

记住binlog 文件名称及位置:mysql-bin.000002 | 154

3.4.2 登录master1 的MySQL 命令行界面

执行以下命令:

CHANGE MASTER TO MASTER_HOST='10.90.21.106',MASTER_PORT=3306,MASTER_USER='root', MASTER_PASSWORD='M&3ezZ&fW04SOSuMfsQ',MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=154;

3.5 开启从库

开启从库:

start slave;

在两台主机的MySQL 上都执行上述命令。

查看从库状态:

show slave status\G;

结果如下:
在这里插入图片描述

Slave_IO_Running 与 Slave_SQL_Running 均为Yes才算是完成了主从同步。

这里我们是出现了错误,查看MySQL 日志找寻报错信息:

tail /var/log/mysqld.log

结果如下:
在这里插入图片描述
提示MySQL 的uuid 必须不一致。

之所以会出现这个报错是因为master2(113) 主机是由master1(106) 主机克隆而来,所以两者的配置是一模一样的。

那么我们就需要修改master2(113) 的uuid了,登录master2(113) 的MySQL:

执行以下命令:

select uuid();

结果如下:
Centos 7 安装系列(6):MySQL + KeepAlived 双主热备
查找uuid 配置文件:

find / -name 'auto.cnf'

结果如下:
Centos 7 安装系列(6):MySQL + KeepAlived 双主热备
修改uuid 配置文件:

vi /var/lib/mysql/auto.cnf

用在MySQL 中查出的uuid 替换文件中的uuid。
重启MySQL:

service mysqld restart

两台主机的MySQL 都执行以下命令:

stop slave;start slave;show slave status\G;

结果如下:
在这里插入图片描述
可以看到两个关键指标均已是Yes 的值。

四、MySQL 主主模式测试

4.1 新增数据库

原始MySQL 状态:

在这里插入图片描述

在106 上新建一个数据库 test_jq:

在这里插入图片描述

可以看到106 上已经新增了test_jq 数据库,那么113 上是否会真的同时拥有该数据库呢?让我们刷新下113 的MySQL:

Centos 7 安装系列(6):MySQL + KeepAlived 双主热备

可以看到113 上也拥有test_jq 数据库。

4.2 新增数据表

在106 的test_jq 数据库中新建数据表test_table:

在这里插入图片描述

那么在113 上是否会将该数据表进行同步呢?打开113 的test_jq 数据库:

在这里插入图片描述

很明显,106 的数据表已经被成功的同步到113 了。

4.3 新增数据

在113 的test_jq 数据库的test_table 数据表中新增一条数据(100,“张三”):

Centos 7 安装系列(6):MySQL + KeepAlived 双主热备

让我们也紧跟着查看106 对应的数据表:

Centos 7 安装系列(6):MySQL + KeepAlived 双主热备

显然,新增的数据也可以进行同步。

4.4 修改数据

将113 中刚刚增加的数据修改为(100,“李四”):

在这里插入图片描述

此时我们还没刷新106 对应的数据表,所以看到的数据仍然是“张三”,那么我们接下来刷新下106 的test_table 数据表:

在这里插入图片描述

可以看出对应行数据的修改值也已经被同步了过来。

那么MySQL 主主模式备份已经算是圆满成功了。

五、KeepAlived 虚拟IP

MySQL 主主结构已经搭建好了,无论从哪个MySQL插入数据,都会同步到另外一个MySQL。

虽然有了MySQL主主结构,但是不能保证高可用,比如,我们的应用程序连接的是master1(106),master1(106) 的MySQL挂掉了,我们的应用程序并不能自动的切换到master2(113),我们的应用程序也是不可用的状态。

要做到这一点,就要借助于Keepalived。
Keepalived有两个主要的功能:

  1. 提供虚IP,实现双机热备
  2. 通过LVS,实现负载均衡

我们这里使用Keepalived,只需要使用其中的一个功能,提供虚IP,实现双机热备。

我们先在master2(113) 进行操作。

5.1 master2 安装keepalived

直接使用yum 安装keepalived:

yum install keepalived -y

报错了,提示缺少依赖libmysqlclient.so.18()
Centos 7 安装系列(6):MySQL + KeepAlived 双主热备
那么先安装这个依赖:

yum install -y wgetwget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-community-libs-compat-5.7.25-1.el7.x86_64.rpmrpm -ivh mysql-community-libs-compat-5.7.25-1.el7.x86_64.rpm

再次执行keepalived 的安装:

yum install keepalived -y

安装成功:
在这里插入图片描述

5.2 master2 修改keepalived 配置

备份好原配置文件后,进行修改:

cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.originalvi /etc/keepalived/keepalived.conf

修改后文件所有内容如下:

! Configuration File for keepalivedglobal_defs {   notification_email {     acassen@firewall.loc     failover@firewall.loc     sysadmin@firewall.loc   }   notification_email_from Alexandre.Cassen@firewall.loc   smtp_server 192.168.200.1   smtp_connect_timeout 30   router_id LVS_DEVEL   vrrp_skip_check_adv_addr   #vrrp_strict   vrrp_garp_interval 0   vrrp_gna_interval 0}# 检查mysql服务是否存活的脚本vrrp_script chk_mysql {    script "/usr/bin/killall -0 mysqld"}vrrp_instance VI_1 {    state MASTER    interface ens192    virtual_router_id 51    priority 100    advert_int 1    authentication { auth_type PASS auth_pass 1111    }    virtual_ipaddress { 10.90.21.114    } # 检查脚本 vrrp_script的名字    track_script { chk_mysql    }}

主要修改内容:

  1. 注释 vrrp_strict
  2. 修改网卡:interface ens192
  3. 修改虚拟IP:virtual_ipaddress {
    10.90.21.114
    }
  4. 删除vrrp_instance VI_1 后的所有 virtual_server

5.3 master2 安装killall 命令

killall命令不是系统自带的,需要安装。
先查询一下killall:

yum search killall

安装对应的组件:

yum install psmisc -y

在这里插入图片描述
这样我们就可以使用killall 命令了。

killall -0 并不是杀掉进程,而是检查进程是否存在,如果存在则返回0,如果不存在则返回1。
当返回1时,keepalived 就会切换主备状态。

5.4 master1 按照master2 的操作重复一遍

其中keepalived 的配置文件/etc/keepalived/keepalived.conf 的修改内容有以下变化:

  1. 修改state MASTER 为state BACKUP
  2. 修改优先级为 priority 50

通过keepalived 的配置,我们对外提供10.90.21.114 的IP,这个IP实际指向是10.90.21.113(master1),因为它的state 是MASTER。

当keepalived 检测到10.90.21.113(master1)上的MySQL 不可用时,会自动切换到10.90.21.106(master2)。对于外部用户是无感知的,因为外部统一使用的是10.90.21.114。

5.5 【踩坑】Keepalived主备都含有VIP

在两台主机上都执行以下命令:

service keepalived startip addr

可以看到在106 和113 两台主机上都有虚拟IP 的存在,也就是说我们的主备根本就没有成功。

Centos 7 安装系列(6):MySQL + KeepAlived 双主热备
Centos 7 安装系列(6):MySQL + KeepAlived 双主热备
以下是解决方案:
在两台主机上都执行以下步骤:

5.5.1 关闭SELINUX

setenforce 0

该命令可以临时关闭SELinux。

若要永久关闭SELinux ,可以修改 /etc/selinux/config 文件,将参数SELINUX=enforcing 修改为SELINUX=disabled,随后需要重启主机使该配置文件生效。

5.5.2 开放VRRP 规则

在防火墙规则中增加开放VRRP :

firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0  --protocol vrrp -j ACCEPTfirewall-cmd --reload

5.5.3 开放端口112

开放防火墙112 端口:

firewall-cmd --zone=public --add-port=112/tcp --permanentfirewall-cmd --reload

5.6 keepalived 测试

5.6.1 虚拟IP 漂移

再次查看两台主机的IP:
Centos 7 安装系列(6):MySQL + KeepAlived 双主热备
Centos 7 安装系列(6):MySQL + KeepAlived 双主热备
可以看到此时的虚拟IP 在10.90.21.113 上(state MASTER)。
我们停掉10.90.21.113 的MySQL,看下虚拟IP 会不会 ‘ 飘走 ’ :

service mysqld stopip addr

可以看到113 上面已经没有虚拟IP 114 了。
在这里插入图片描述
那么该虚拟IP 会不会 ‘ 漂移 ’ 到106 上面呢?

在这里插入图片描述
可以看到,虚拟IP 已经进行了正常的切换。

【提醒】
重启MySQL 的时候也需要重新启动keepalived ,因为keepalived 在MySQL 关闭时便紧跟着被停掉了。

5.6.2 虚拟IP 数据库连接

在Navicat 上连接虚拟IP(114) 的MySQL 数据库(账号密码与master1(106) 的一致):

在这里插入图片描述
可以看到,我们可以直接登录该虚拟IP 的数据库。

5.6.3 查看当前实际数据库主机

在Navicat 上连接虚拟IP(114) 的数据库,在SQL 命令行界面输入以下命令:

show variables like "server_id";

结果如下:
Centos 7 安装系列(6):MySQL + KeepAlived 双主热备

可以看到当前的server_id 值是123 ,这是master1(106) 的配置(113 的MySQL 在5.6.1 已经停掉了)。

我们先把master2(113) 的MySQL 和keepalived 重新启动:

service mysqld startservice keepalived start

此时虚拟IP(114) 仍挂在master1(106) 上。

接下来,我们停掉master1(106) 的MySQL,那么虚拟IP 应该就会漂移到master2(113) 上。

service mysqld stop

我们在虚拟IP(114) 的SQL 命令行界面再次查询server_id :

show variables like "server_id";

结果如下:
Centos 7 安装系列(6):MySQL + KeepAlived 双主热备
可以看到,虚拟IP(114) 已经漂移到了master2(113) 上了,故障切换成功。

六、总结

好了,本文到此截至,主要介绍了如何在Centos 7 服务器上部署MySQL 双主结构以及使用keepalived 提供MySQL 双主结构的对外虚拟IP 。
注意要点:

  1. 防火墙规则及端口的开放
  2. keepalived 配置中的router_id 、virtual_router_id 与authentication 主备必须一致
  3. MySQL重启时也要重启keepalived
  4. MySQL 的server-id 具备唯一性

同类型文章推荐:
Centos 7 安装系列(5):MySQL 8.0.26
Centos 7 安装系列(4):Redis 单主机集群
Centos 7 安装系列(3):Redis 6.2.5
Centos 7 安装系列(2):MongoDB 5.0.2
Centos 7 安装系列(1):MySQL 5.7.35
Linux 搭建Java 环境,部署项目
Centos 7 nginx+php 实现公网访问