配置Keepalived实现mysql双主高可用

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

本文为南非蚂蚁的书籍《循序渐进linux-第二版-8.3.6的读笔记

在DB1和DB2上安装Keepalived软件

先安装编译工具

# yum install gcc* gcc-c++ autoconf automake

上传keepalived-1.2.19.tar.gz至/server/tools目录下

# cd /server/tools

# tar zxvf keepalived-1.2.19.tar.gz

# cd keepalived-1.2.19

# ./configure --sysconf=/etc --with-kernel-dir=/usr/src/kernels/2.6.32-504.el6.x86_64/

# make

# make install

# ln -s /usr/local/sbin/keepalived /sbin/

# chkconfig --add keepalived

# chkconfig --level 35 keepalived on

# cd ../

安装完成后,进入DB1的配置过程

DB1服务器上/etc/keepalived/keepalived.conf的配置内容,其中绿色字体为新增部分

! Configuration File for keepalived

global_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_scripts check_mysqld {

   scripts "/etc/keepalived/mysqlcheck/check_slave.pl 127.0.0.1"     #检测mysql复制状态的脚本

interval 2

weight 21

   }

vrrp_instance HA_1 {

   state BACKUP       #在DB1和DB2上均配置为BACKUP


interface eth0

   virtual_router_id 80

priority 90

   advert_int 2

   nopereempt         #不抢占模式,只在优先级高的机器上设置即可,优先级低的机器上不设置


authentication {

auth_type PASS

auth_pass qweasdzxc

   }

   

   track_script {

   check_mysqld

   } 

   

   virtual_ipaddress {

     10.24.24.110/24 dev eth0        #mysql的对外服务IP,即VIP

   }

}

vrrp_instance VI_1 {

    state MASTER

    interface eth0

    virtual_router_id 51

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.200.16

        192.168.200.17

        192.168.200.18

    }

}

-----------------------------------------

# mkdir /etc/keepalived/mysqlcheck/

其中,/etc/keepalived/mysqlcheck/check_slave.pl文件的内容如下:

# vim /etc/keepalived/mysqlcheck/check_slave.pl

#!/usr/bin/perl -w

use DBI;

use DBD::mysql;

# CONFIG VARIABLES

$SBM = 120;

$db = "ywadmin";

$host = $ARGV[0];

$port = 3306;

$user = "root";

$pw = "jzh0024";

# SQL query

$query = "show slave status";

$dbh = DBI->connect("DBI:mysql:$db:$host:$port", $user, $pw, { RaiseError => 0,PrintError => 0 });

if (!defined($dbh)) {

    exit 1;

}

$sqlQuery = $dbh->prepare($query);

$sqlQuery->execute;

$Slave_IO_Running =  "";

$Slave_SQL_Running = "";

$Seconds_Behind_Master = "";

while (my $ref = $sqlQuery->fetchrow_hashref()) {

    $Slave_IO_Running = $ref->{'Slave_IO_Running'};

    $Slave_SQL_Running = $ref->{'Slave_SQL_Running'};

    $Seconds_Behind_Master = $ref->{'Seconds_Behind_Master'};

}

$sqlQuery->finish;

$dbh->disconnect();

if ( $Slave_IO_Running eq "No" || $Slave_SQL_Running eq "No" ) {

    exit 1;

} else {

    if ( $Seconds_Behind_Master > $SBM ) {

        exit 1;

    } else {

        exit 0;

    }

}

只需要修改红色的数据库名\数据库端口\用户名和密码即可

添加可执行权限

# chmod +x /etc/keepalived/mysqlcheck/check_slave.pl

将keepalived.conf和check_slave.pl文件复制到DB2服务器对应的位置,将DB2上的keepalived.conf中的priority值修改为90,同时去掉nopreempt选项

DB2上

[root@DB2 keepalived]# mkdir /etc/keepalived/mysqlcheck/

[root@DB2 keepalived]# cd /etc/keepalived/mysqlcheck/

上传check_slave.pl脚本

[root@DB2 mysqlcheck]# rz

[root@DB2 mysqlcheck]# ll

total 4

-rw-r--r-- 1 root root 919 Sep 12 14:57 check_slave.pl

[root@DB2 mysqlcheck]# chmod +x check_slave.pl 

完成所有配置后,分别启动DB1和DB2上启动keepalived服务,正常情况下VIP地址应该运行在DB1服务器上

[root@DB1 tools]# /etc/init.d/keepalived start

Starting keepalived:                                       [  OK  ]

[root@DB2 keepalived]# /etc/init.d/keepalived start

Starting keepalived:                                       [  OK  ]

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

8.3.7 测试mysql主从同步功能

首先在DB1,DB2上添加远程访问授权;

DB1上授权

mysql> grant all on *.* to 'root'@'10.24.24.%' identified by 'jzh0024';

Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

mysql> select user,host from mysql.user;

DB2上授权

mysql> grant all on *.* to 'root'@'10.24.24.%' identified by 'jzh0024';

Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

mysql> select user,host from mysql.user;

1.在远程客户端通过VIP登录测试


[root@mysql01 ~]# mysql -uroot -p -h 10.24.24.110

Enter password: 

mysql> show variables like "%hostname%";

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| hostname      | DB1   |

+---------------+-------+

1 row in set (0.00 sec)

mysql> show variables like "%server_id%";

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| server_id     | 1     |

+---------------+-------+

1 row in set (0.00 sec)

从SQL输出结果看,可以通过VIP登录,并且登录到了DB1服务器

2.数据复制功能测试

wKiom1fqEvnCZV8XAAD3yI_Y_cw753.jpg

[root@mysql01 ~]# mysql -uroot -p -h 10.24.24.110

Enter password: 

mysql> create database repldb;

Query OK, 1 row affected (0.00 sec)

mysql> use repldb;

Database changed

mysql> create table repl_table(id int,email varchar(86),password varchar(40) not null);

Query OK, 0 rows affected (0.00 sec)

mysql> show tables;

+------------------+

| Tables_in_repldb |

+------------------+

| repl_table       |

+------------------+

1 row in set (0.00 sec)

mysql> insert into repl_table (id,email,password) values(1,"ywliyq@163.com","qwessd");

Query OK, 1 row affected (0.00 sec)

mysql> select * from repl_table;

+------+----------------+----------+

| id   | email          | password |

+------+----------------+----------+

|    1 | ywliyq@163.com | qwessd   |

+------+----------------+----------+

1 row in set (0.00 sec)

在DB2数据库中查询数据是否已经同步

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| db01               |

| db02               |

| mysql              |

| repldb             |

| ywadmin            |

+--------------------+

6 rows in set (0.00 sec)

mysql> use repldb;

Database changed

mysql> show tables;

+------------------+

| Tables_in_repldb |

+------------------+

| repl_table       |

+------------------+

1 row in set (0.00 sec)

mysql> select * from repl_table;

+------+----------------+----------+

| id   | email          | password |

+------+----------------+----------+

|    1 | ywliyq@163.com | qwessd   |

+------+----------------+----------+

1 row in set (0.00 sec)

证明在其他mysql客户端登录写入VIP的数据已经同步到DB2数据库中。

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

8.3.8 测试keepalived实现mysql故障切换

为了测试keepalived实现的故障切换功能,需要模拟一些故障。

比如,可以断开DB1主机的网络、关闭DB1主机、关闭DB1上mysql服务等各种操作实现;

这里停止DB1服务器的网络连接,模拟DB1的mysql故障;

由于在DB1、DB2服务器上都添加了监控MYSQL运行状态的脚本 check_slave.pl,因此当关闭DB1的MYSQL日志接收功能后,keepalived会立刻检测到,接着执行切换操作

测试过程如下:

1.停止DB1服务器的网络连接


在远程mysql客户端以VIP地址登录到mysql系统中,不要退出这个连接;

中断DB1服务器的网络连接;

[root@DB1 ~]# /etc/init.d/network stop

2.在mysql远程客户端测试

继续在刚才打开的远程mysql连接中执行命令

mysql> show variables like "%hostname%";

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| hostname      | DB2   |

+---------------+-------+

1 row in set (0.00 sec)

mysql> show variables like "%server_id%";

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| server_id     | 2     |

+---------------+-------+

1 row in set (0.00 sec)

wKioL1fqEwmgtA8KAACaUDJOKfU047.jpg

接着重新开启DB1的网络连接,发现keepalived将不再执行切换操作了,因为上面将keepalived配置为抢占模式了。

此时,mysql服务将一直在DB2服务器上运行,每次切换的代价很大,因而关闭了keepalived的主动抢占模式。


本文转自    蜗牛远途   51CTO博客,原文链接:http://blog.51cto.com/ywliyq/1856964

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
存储 SQL 关系型数据库
Mysql高可用架构方案
本文阐述了Mysql高可用架构方案,介绍了 主从模式,MHA模式,MMM模式,MGR模式 方案的实现方式,没有哪个方案是完美的,开发人员在选择何种方案应用到项目中也没有标准答案,合适的才是最好的。
118 3
Mysql高可用架构方案
|
2月前
|
SQL 关系型数据库 MySQL
mysql主从复制概述和配置
【10月更文挑战第22天】MySQL 主从复制是一种将主服务器的数据复制到一个或多个从服务器的技术,实现读写分离,提高系统性能和可用性。主服务器记录变更日志,从服务器通过 I/O 和 SQL 线程读取并应用这些变更。适用于读写分离、数据备份和恢复、数据分析等场景。配置步骤包括修改配置文件、创建复制用户、配置从服务器连接主服务器并启动复制进程。
|
1月前
|
存储 SQL 关系型数据库
2024Mysql And Redis基础与进阶操作系列(1)作者——LJS[含MySQL的下载、安装、配置详解步骤及报错对应解决方法]
Mysql And Redis基础与进阶操作系列(1)之[MySQL的下载、安装、配置详解步骤及报错对应解决方法]
|
1月前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
91 2
|
2月前
|
SQL 关系型数据库 MySQL
Mysql中搭建主从复制原理和配置
主从复制在数据库管理中广泛应用,主要优点包括提高性能、实现高可用性、数据备份及灾难恢复。通过读写分离、从服务器接管、实时备份和地理分布等机制,有效增强系统的稳定性和数据安全性。主从复制涉及I/O线程和SQL线程,前者负责日志传输,后者负责日志应用,确保数据同步。配置过程中需开启二进制日志、设置唯一服务器ID,并创建复制用户,通过CHANGE MASTER TO命令配置从服务器连接主服务器,实现数据同步。实验部分展示了如何在两台CentOS 7服务器上配置MySQL 5.7主从复制,包括关闭防火墙、配置静态IP、设置域名解析、配置主从服务器、启动复制及验证同步效果。
Mysql中搭建主从复制原理和配置
|
2月前
|
关系型数据库 MySQL Java
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
77 0
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
|
2月前
|
数据可视化 关系型数据库 MySQL
【IDEA】配置mysql环境并创建mysql数据库
【IDEA】配置mysql环境并创建mysql数据库
152 0
|
4天前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
24天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
34 1
|
26天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
37 4