千家信息网

MySQL高可用之KeepAlived+双主

发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,MySQL高可用之KeepAlived双主生产环境中一台mysql主机存在单点故障,所以要确保mysql的高可用性,即两台MySQL服务器。如果其中有一台MySQL服务器挂掉后,另外一台能立马接替其进
千家信息网最后更新 2025年01月19日MySQL高可用之KeepAlived+双主

MySQL高可用之KeepAlived双主

生产环境中一台mysql主机存在单点故障,所以要确保mysql的高可用性,即两台MySQL服务器。如果其中有一台MySQL服务器挂掉后,另外一台能立马接替其进行工作。
MySQL的高可用方案一般有如下几种:keepalived+双主,MHA,PXC,MMM,Heartbeat+DRBD等,比较常用的是keepalived+双主,MHA和PXC。
主要介绍利用 keepalived 实现 MySQL 数据库的高可用。 Keepalived+mysql双主来实现MySQL-HA,我们必须保证两台MySQL数据库的数据完全一样。

基本思路

两台MySQL互为主从关系,通过Keepalived配置虚拟IP,实现当其中的一台MySQL数据库宕机后,应用能够自动切换到另外一台MySQL数据库,保证系统的高可用。

环境

Mysql版本:mysql 5.7Keepalived: keepalived-1.2.20 
主机操作系统mysql-VIPIP地址
mysql-master01CentOS 7192.168.10.100192.168.1.1
mysql-master02CentOS 7192.168.10.100192.168.1.8

一、配置两台服务器主主同步

该过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前, master在二进制日志记录这些改变。MySQL将事务写入二进制日志。在事件写入二进制日志完成后, master通知存储引擎提交事务。 下一步就是slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程--I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经同步了master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。 SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。 主主同步就是两台机器互为主的关系,在任何一台机器上写入都会同步。 若mysql主机开启了防火墙,需要关闭防火墙或创建规则。

1、修改MySQL配置文件 两台MySQL均要开启binlog日志功能。

开启方法:在MySQL配置文件[MySQLd]段中加上log-bin=MySQL-bin选项,两台MySQL的server-ID不能一样,默认情况下两台MySQL的serverID都是1需将其中一台修改为2即可。mysql-master01:[root@mysql-master01 ~]# vim /etc/my.cnf[mysqld]basdir=/usr/local/mysqldatadir=/usr/local/mysql/datapid-file=/usr/local/mysql/data/mysqld.pidlog-error=/usr/local/mysql/data/mysql.errsocket=/tmp/mysql.socklog-bin=mysql-bin   //二进制日志server-id=1relay-log=relay-bin         //中继日志,存储所有主库TP过来的binlog事件relay-log-index=relay-bin.indexauto_increment_increment=2  auto_increment_offset=1     [root@mysql-master01 ~]# systemctl restart mysqldmysql-master02:[root@mysql-master02 ~]# vim /etc/my.cnf[mysqld]basdir=/usr/local/mysqldatadir=/usr/local/mysql/datapid-file=/usr/local/mysql/data/mysqld.pidlog-error=/usr/local/mysql/data/mysql.errsocket=/tmp/mysql.socklog-bin=mysql-binserver-id=2relay-log=relay-binrelay-log-index=relay-bin.indexauto_increment_increment=2auto_increment_offset=2[root@mysql-master02 ~]# systemctl restart mysqld

PS:master1和master2只有server-id不同和 auto-increment-offset不同

mysql中有自增长字段,在做数据库的主主同步时需要设置自增长的两个相关配置:auto_increment_offset和auto_increment_increment。
auto-increment-increment表示自增长字段每次递增的量,其默认值是1。它的值应设为整个结构中服务器的总数,本案例用到两台服务器,所以值设为2。
auto-increment-offset是用来设定数据库中自动增长的起点(即初始值)。因为这两能服务器都设定了一次自动增长值2,所以它们的起点必须得不同,这样才能避免两台服务器数据同步时出现主键冲突,主键自增:防止因为网络问题发生故障,导致数据冲突

2、将mysql-master01设为mysql-master02的主服务器 在mysql-master01主机上创建授权账户,允许在mysql-master02(192.168.1.8)主机上连接

[root@mysql-master01 ~]# mysql -uroot -p123.commysql> grant replication slave on *.* to rep@'192.168.1.%' identified by '123';mysql> flush privileges;

查看master1的当前binlog状态信息

mysql> show master status;

在mysql-master02上将mysql-master01设为自已的主服务器并开启slave功能。[root@mysql-master02 ~]# mysql -uroot -p123.commysql> change master to master_host='192.168.1.1',master_user='rep',master_password='123',master_log_file='mysql-bin.000001',master_log_pos=608;Query OK, 0 rows affected, 2 warnings (0.01 sec)mysql> start slave;Query OK, 0 rows affected (0.00 sec)针对MySQl的防火墙规则:    设置规则:        #iptables I INPUT -p tcp -dport 3306 -j ACCEPT        #service iptables save    或者关闭防火墙        #systemctl stop firewalld

查看从的状态,以下两个值必须为yes,代表从服务器能正常连接主服务器

PS :如果是克隆,会报UUID相同的错误信息,导致Slave_IO_Running为NO,这种情况直接到任意一台主机的/usr/local/mysql/data/auto.cnf文件,将里面的UUID删除,重启mysql服务就行。

mysql> show slave status\G

3、将mysql-master02设为mysql-master01的主服务器 在mysql-master02主机上创建授权账户,允许在mysql-master01(192.168.1.1)主机上连接

mysql-master02:mysql>  grant replication slave on *.* to rep@'192.168.1.%' identified by '123';Query OK, 0 rows affected, 1 warning (0.01 sec)mysql> flush privileges;Query OK, 0 rows affected (0.00 sec)

查看mysql-master02的当前binlog状态信息

mysql> show master status;

在mysql-master01上将mysql-master02设为自已的主服务器并开启slave功能。

mysql> change master to master_host='192.168.1.8',master_user='rep',master_password='123',master_log_file='mysql-bin.000001',master_log_pos=608;Query OK, 0 rows affected, 2 warnings (0.01 sec)mysql> start slave;Query OK, 0 rows affected (0.00 sec)

防火墙同上。
查看从的状态,以下两个值必须为yes,代表从服务器能正常连接主服务器

mysql> show slave status\G

4、测试主主同步 在mysql-master01上创建要同步的数据库如test_db,并在test_db中创建一张测试表如tab1

mysql> create database test_db;mysql> use test_db;mysql> create table tab1(id int);查看mysql-master02主机是否同步了mysql-master01上的数据变化mysql> show databases;

mysql> use test_db;mysql> show tables;

在mysql-master02主机上向tab1表中插入数据,查看mysql-master01是否同步了数据

mysql> insert into tab1 values(1);mysql> select * from tab1;


使用mysql-master01查看:

mysql> select  * from tab1;


双主同步完成

PS:若主MYSQL服务器已经存在,只是后期才搭建从MYSQL服务器,在置配数据同步前应先将主MYSQL服务器的要同步的数据库拷贝到从MYSQL服务器上(如先在主MYSQL上备份数据库,再用备份在从MYSQL服务器上恢复).

二、keepalived的安装配置实现高可用

下面就来完成keepalived的高可用性。 keepalived是集群管理中保证集群高可用的一个软件解决方案,其功能类似于heartbeat,用来防止单点故障 keepalived是以VRRP协议为实现基础的,VRRP全称Virtual RouterRedundancy Protocol,即虚拟路由冗余协议。 虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip,master会发组播(组播地址为224.0.0.18),当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。keepalived主要有三个模块,分别是core 、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。

1、在mysql-master01和mysql-master02上安装软件包keepalived 。安装keepalived软件包与服务控制在编译安装Keepalived之前,必须先安装内核开发包kernel-devel以及openssl-devel、popt-devel等支持库。

[root@mysql-master01 ~]# yum install kernel-devel openssl-devel popt-devel[root@mysql-master02 ~]# yum install kernel-devel openssl-devel popt-devel下载keepalived包:https://www.keepalived.org/




编译安装:

[root@mysql-master01 ~]#  tar zxf keepalived-2.0.20.tar.gz [root@mysql-master01 ~]#  cd keepalived-2.0.20/[root@mysql-master01 keepalived-2.0.20]# ./configure --prefix=/ && make && make install###第二台省略…

PS:如不知道keepalived需要哪些依赖包,可到下载后的源码解压目录下查看INSTALL 文件内容, 执行makeinstall操作之后,会自动生成/etc/init.d/keepalived脚本文件,但还需要手动添加为系统服务,这样就可以使用service、chkconfig工具来对keepalived服务程序进行管理了。

针对keepalived的防火墙规则:        添加规则:            # firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --in-interfaceenp0s3 --destination 224.0.0.18 --protocol vrrp -j ACCEPT            # firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interfaceenp0s3 --destination 224.0.0.18 --protocol vrrp -j ACCEPT            # firewall-cmd --reload        关闭防火墙:            # systemctl stop firewalld

2、修改Keepalived的配置文件 keepalived只有一个配置文件keepalived.conf,里面主要包括以下几个配置区域,分别是global_defs、vrrp_instance和virtual_server

 global_defs:主要是配置故障发生时的通知对象以及机器标识。
 vrrp_instance:用来定义对外提供服务的VIP区域及其相关属性。
 virtual_server:虚拟服务器定义

mysql-master01主机上的keepalived.conf文件的修改:

[root@mysql-master01 ~]# vim /etc/keepalived/keepalived.conf! Configuration File for keepalived     //注释global_defs {   router_id mysql-master01     //keepalived服务器的一个标识}vrrp_instance VI_1 {    state BACKUP        //指定keepalived的角色, 两台配置此处均是BACKUP,设为BACKUP将根据优先级决定主或从    interface ens33     //指定HA监测网络的接口virtual_router_id 51    //虚拟路由标识,这个标识是一个数字(取值在0-255之间,用来区分多个instance的VRRP组播),同一个vrrp实例使用唯一的标识,确保和master2相同,同网内不同集群此项必须不同,否则发生冲突。priority 100    //用来选举master的,要成为master,该项取值范围是1-255(在此范围之外会被识别成默认值100),此处master2上设置为50nopreempt   //不抢占,即允许一个priority比较低的节点作为master,即使有priority更高的节点启动advert_int 1    //发VRRP包的时间间隔,即多久进行一次master选举(可以认为是健康查检时间间隔)    authentication {    //认证区域,认证类型有PASS和HA(IPSEC),推荐使用PASS(密码只识别前8位)        auth_type PASS        auth_pass 1111    }       virtual_ipaddress {     //VIP区域,指定vip地址        192.168.1.100    }   }   virtual_server 192.168.1.100 3306 { //设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开    delay_loop 6    //设置运行情况检查时间,单位是秒    lb_algo rr      //设置后端调度算法,这里设置为rr,即轮询算法    lb_kind DR      //设置LVS实现负载均衡的机制,有NAT、TUN、DR三个模式可选    persistence_timeout 50  //会话保持时间,单位是秒。这个选项对动态网页是非常有用的,为集群系统中的session共享提供了一个很好的解决方案。有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话的保持时间。    protocol TCP    //指定转发协议类型,有TCP和UDP两种    real_server 192.168.1.1 3306 {  //配置服务节点1,需要指定real server的真实IP地址和端口,IP与端口之间用空格隔开    notify_down /etc/keepalived/bin/mysql.sh        weight 1    //配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小为了区分不同性能的服务器    notify_down /etc/keepalived/bin/mysql.sh    //检测到realserver的mysql服务down后执行的脚本        TCP_CHECK {            connect_port 3306   //健康检查端口            connect_timeout 3   //连接超时时间            retry 3 //重连次数            delay_before_retry 3    //重连间隔时间        }     } }

mysql-master01上有关keepalived.conf的具体配置如下:

! Configuration File for keepalivedglobal_defs {   router_id mysql-master01}vrrp_instance VI_1 {    state BACKUP    interface ens33    virtual_router_id 51    priority 100    nopreempt    advert_int 1    authentication {        auth_type PASS        auth_pass 1111    }    virtual_ipaddress {        192.168.1.100    }}virtual_server 192.168.1.100 3306 {    delay_loop 6    lb_algo rr    lb_kind DR    persistence_timeout 50    protocol TCP    real_server 192.168.1.1 3306 {    notify_down /etc/keepalived/bin/mysql.sh        weight 1        TCP_CHECK {            connect_port 3306            connect_timeout 3            retry 3            delay_before_retry 3        }    }}

编写脚本文件中对应的脚本,并启动服务

[root@mysql-master01 ~]# mkdir /etc/keepalived/bin/[root@mysql-master01 ~]# vim /etc/keepalived/bin/mysql.sh#!/bin/bashpkill keepalived[root@mysql-master01 ~]# chmod +x /etc/keepalived/bin/mysql.sh  //添加执行权限,不然没有权限执行脚本,则关闭不了keepalived[root@mysql-master01 ~]# systemctl start keepalived.service

mysql-master02主机上的keepalived.conf文件的修改:

[root@mysql-master01 ~]# scp /etc/keepalived/keepalived.conf 192.168.1.8:/etc/keepalived/[root@mysql-master02 ~]# vim /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs {   router_id mysql-master02}vrrp_instance VI_1 {    state BACKUP    interface ens33    virtual_router_id 51    priority 50    nopreempt    advert_int 1    authentication {        auth_type PASS        auth_pass 1111    }     virtual_ipaddress {        192.168.1.100     } } virtual_server 192.168.1.100 3306 {    delay_loop 6    lb_algo rr     lb_kind DR     persistence_timeout 50    protocol TCP    real_server 192.168.1.8 3306 {    notify_down /etc/keepalived/bin/mysql.sh        weight 1        TCP_CHECK {            connect_port 3306            connect_timeout 3            retry 3            delay_before_retry 3        }     }} 

编写脚本,并启动服务

[root@mysql-master02 ~]# mkdir /etc/keepalived/bin/[root@mysql-master02 ~]# vim /etc/keepalived/bin/mysql.sh#!/bin/bashpkill keepalived[root@mysql-master02 ~]# chmod +x /etc/keepalived/bin/mysql.sh[root@mysql-master02 ~]# systemctl start keepalived.service

3、测试 在mysql-master01和mysql-master02分别执行命令查看mysql-master01和mysql-master02对VIP(群集虚拟IP)的控制权。

mysql-master01:

[root@mysql-master01 ~]# ip a

mysql-master02:

[root@mysql-master02 ~]# ip a

模拟mysql-master01宕机,查看是否会自动关闭keepalived服务,并且漂移地址转换到了mysql-master02

[root@mysql-master01 ~]#  ps -ef |grep keep


mysql-master02:

[root@mysql-master02 ~]# ip a

因为两台keepalived的配置文件都关闭了占先权,所以即使mysql-master01的服务再次启动,漂移地址也依然在mysql-master02上。

总结:

Keepalived+mysql双主一般来说,中小型规模的时候,采用这种架构是最省事的。 在master节点发生故障后,利用keepalived的高可用机制实现快速切换到备用节点。

在这个方案里,需要注意的地方:

1、采用keepalived作为高可用方案时,两个节点最好都设置成BACKUP模式,避免因为意外情况下(比如脑裂(通过心跳机制来监听对方状态,如果心跳失效,每台电脑都认为对方失效了,从而把自己提升为主,导致数据不一致))相互抢占导致往两个节点写入相同数据而引发冲突;
2、把两个节点的auto_increment_increment(自增步长)和auto_increment_offset(自增起始值)设成不同值。其目的是为了避免master节点意外宕机时,可能会有部分binlog未能及时复制到slave上被应用,从而会导致slave新写入数据的自增值和原先master上冲突了,因此一开始就使其错开;但是,如果有合适的容错机制能解决主从自增ID冲突的话,也可以不这么做;
3、slave节点服务器配置不要太差,否则更容易导致复制延迟。作为热备节点的slave服务器,硬件配置不能低于master节点;
4、如果对延迟问题很敏感的话,可考虑使用MariaDB分支版本,或者直接上线MySQL 5.7最新版本,利用多线程复制的方式可以很大程度降低复制延迟;

服务 服务器 数据 配置 节点 日志 主机 文件 同步 数据库 线程 不同 事件 地址 时间 路由 防火墙 防火 两个 二进制 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 腾讯云轻量服务器怎么绑定域名 计算机网络技术实训去哪里 任子行网络技术 笔试 关于网络安全法正确 东南和西电的网络安全 微服务可以部署在单台服务器上吗 奉贤区现代化网络技术试验设备 什么是汽车车载网络技术 诛仙3服务器提示网络错误 服务器地址不可用怎么解决 河北业务中台数据库 软件开发智能设备做什么工作 宝塔数据库查找和替换 服务器 市场 大学生应该如何注意网络安全 网络安全保密意识心得体会 地调数据用的数据库 亳州物业管理软件开发外包公司 北京戴姆勒软件开发待遇 super-2000数据库结构 tsql数据库代码 打雷用流量安全还是网络安全 新版本超凡先锋怎么换服务器 师生网络安全风险 自贡网络安全新闻 服务器老提醒文件已打开 济南莘学互联网科技 派出所网络安全保密教育内容 方德服务器配置ip 无锡编程软件开发服务
0