通过KeepAlived搭建MySQL双主模式的高可用集群系统

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

    企业级MySQL集群具备高可用、可扩展、易管理、低成本的特点。下面将介绍企业环境中经常应用的一个解决方案,即MySQL的双主互备架构,主要设计思路是通过MySQL Replication技术将两台MySQL Server互相将对方作为自己的Master,自己又同时作为对方的Slave来进行复制。这样就实现了高可用构架中的数据同步功能,同时,将采用KeepAlived来实现Mysql的自动failover。在这个构架中,虽然两台MySQL Server互为主从,但同一时刻只有一个MySQL Server可读写,另一个MySQL Server只能进行读操作,这样可保证数据的一致性。整个架构下图所示。

wKiom1cfNieTAYBOAABpeFzay4I925.png


     

MySQL主主互备模式配置环境

主机名              操作系统版本         MySQL版本            主机IP                        MySQL VIP

DB1(Master)        CentOS release 6.7                mysql-5.6.17                        192.168.1.85

DB2(Slave)         CentOS release 6.7                mysql-5.6.17                        192.168.1.89


第一步要做的工作是在这两天机器上都安装mysql,在做主从复制的时候mysql的版本尽量保持一致。即使不一样一定要以主服务的版本为最高的版本,从服务器的版本不能高于主服务器的版本。

Mysql的安装与配置

Mysql5.6版本之后,编译mysql方式变为cmake

 

安装cmake

#yum install cmake

 

#cd mysql-5.6.17

#cmake \

-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \

-DMYSQL_DATADIR=/usr/local/mysql/data \

-DSYSCONFDIR=/etc \

-DWITH_MYISAM_STORAGE_ENGINE=1 \

-DWITH_INNOBASE_STORAGE_ENGINE=1 \

-DWITH_MEMORY_STORAGE_ENGINE=1 \

-DWITH_READLINE=1 \

-DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock \

-DMYSQL_TCP_PORT=3306 \

-DENABLED_LOCAL_INFILE=1 \

-DWITH_PARTITION_STORAGE_ENGINE=1 \

-DEXTRA_CHARSETS=all \

-DDEFAULT_CHARSET=utf8 \

-DDEFAULT_COLLATION=utf8_general_ci

 

make && make install

 

如果没有就创建用户就创建如下用户:

#groupadd mysql

#useradd -g mysql mysql

修改/usr/local/mysql权限:

#chown -R mysql:mysql /usr/local/mysql

 

#cd /usr/local/mysql

进入安装路径,执行初始化配置脚本,创建系统自带的数据库和表

#scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql

 

注:在启动MySQL服务时,会按照一定次序搜索my.cnf,先在/etc目录下找,找不到则会搜索"$basedir/my.cnf",在本例中就是 /usr/local/mysql/my.cnf,这是新版MySQL的配置文件的默认位置!如果发现/etc下存在my.cof文件,直接删掉,这样启动mysql时才会去/usr/local/mysql/my.cnf目录下下去找自己安装的文件


启动MySQL

 

添加服务,拷贝服务脚本到init.d目录,并设置开机启动

#cd /usr/local/mysql

#cp support-files/mysql.server /etc/init.d/mysql

#chkconfig mysql on

#service mysql start  --启动MySQL




配置mysql主从服务器

1.1修改MySQL配置文件


在默认情况下MySQL的配置文件是/etc/my.cnf。但我们需要修改的路径是自己安装MySQL的路径。首先修改DB1主机的配置文件,在/usr/local/mysql/my.cnf文件中的“[mysqld]”段添加如下内容:

server-id = 1

log-bin=mysql-bin

relay-log = mysql-relay-bin

replicate-wild-ignore-table=mysql.%

replicate-wild-ignore-table=test.%

replicate-wild-ignore-table=information_schema.%


然后修改DB2主机的配置文件,在/usr/local/mysql/my.cnf文件中的“[mysqld]”段添加如下内容:

server-id = 2

log-bin=mysql-bin(如果只有一主一从,在从库上是不需要开启binlog日志的,后面是为了演示互为主从这才加上去的)

relay-log = mysql-relay-bin

replicate-wild-ignore-table=mysql.%

replicate-wild-ignore-table=test.%

replicate-wild-ignore-table=information_schema.%

其中,server-id是节点标识,主、从节点不能相同,必须全局唯一。log-bin表示开启MySQLbinlog日志功能。“mysql-bin”表示日志文件的命名格式,会生成文件名为mysql-bin.000001mysql-bin.000002等的日志文件。relay-log用来定义relay-log日志文件的命名格式。replicate-wild-ignore-table是个复制过滤选项,可以过滤掉不需要复制的数据库或表,例如“mysql.%“表示不复制mysql库下的所有对象,其他依此类推。与此对应的是replicate_wild_do_table选项,用来指定需要复制的数据库或表。

这里需要注意的是,不要在主库上使用binlog-do-dbbinlog-ignore-db选项,也不要在从库上使用replicate-do-dbreplicate-ignore-db选项,因为这样可能产生跨库更新失败的问题。推荐在从库上使用replicate_wild_do_tablereplicate-wild-ignore-table两个选项来解决复制过滤问题

1.2手动同步数据库

如果DB1上已经有mysql数据,那么在执行主主互备之前,需要将DB1DB2上两个mysql的数据保持同步,首先在DB1上备份mysql数据,执行如下SQL语句:

mysql>FLUSH TABLES WITH READ LOCK;       (解锁:unlock tables;)

Query OK, 0 rows affected (0.00 sec)

不要退出这个终端,否则这个锁就失效了。在不退出终端的情况下,再开启一个终端直接打包压缩数据文件或使用mysqldump工具来导出数据。这里通过打包mysql文件来完成数据的备份,操作过程如下:

[root@DB1 ~]# cd /usr/local

[root@DB1 lib]# tar zcvf mysql.tar.gz mysql

[root@DB1 lib]# scp mysql.tar.gz  DB2:/usr/local/

将数据传输到DB2后,依次重启DB1DB2上面的mysql

1.3 创建复制用户并授权

首先在DB1mysql库中创建复制用户,操作过程如图所示。

    mysql> grant replication slave on *.* to 'repl_user'@'192.168.1.89' identified by 'repl_passwd';

wKiom1crFPzCe1riAACCuzHOJwc306.jpg

然后在DB2mysql库中将DB1设为自己的主服务器,操作如下所示。

change master to master_host='192.168.1.85',master_user='repl_user',master_password='repl_passwd',master_log_file='mysql-bin.000001',master_log_pos=431;

这里需要注意master_log_filemaster_log_pos两个选项,这两个选项的值刚好是在DB1上通过SQL语句“show master status”查询到的结果。

接着就可以在DB2上启动slave服务了,可执行如下SQL命令:

mysql> start slave;

下面查看DB2slave的运行状态,如图所示。

wKioL1crFh3xydcQAAFkjATniqU310.jpg

通过查看slave的运行状态发现,一切运行正常,这里需要重点关注的是Slave_IO_RunningSlave_SQL_Running,这两个就是在Slave节点上运行的主从复制线程,正常情况下这两个值都应该为Yes。另外还需要注意的是Slave_IO_StateMaster_HostMaster_Log_FileRead_Master_Log_PosRelay_Log_FileRelay_Log_PosRelay_Master_Log_File几个选项,从中可以查看出mysql复制的运行原理及执行规律。最后还有一个Replicate_Wild_Ignore_Table选项,这个是之前在my.cnf中添加过的,通过此选项的输出值可以知道过滤掉了哪些数据库。

到这里位置,从DB1DB2mysql主从复制已经完成了。接下来开始配置从DB2DB1mysql主从复制,这个配置过程与上面的完全一样,首先在DB2mysql库中创建复制用户,操作如图

grant replication slave on *.* to 'repl_user'@'192.168.1.85' identified by 'repl_passwd';

wKioL1crFm2g1sUqAAB5fIW77KM531.jpg

然后在DB1mysql库中将DB2设为自己的主服务器,操作如下

change master to master_host='192.168.1.89',master_user='repl_user',master_password='repl_passwd',master_log_file='mysql-bin.000001',master_log_pos=862;

接着就可以在DB1上启动slave服务了,可执行如下SQL命令:

mysql> start slave;

下面查看DB1slave的运行状态,如图所示。

wKioL1crFruBELGYAAFqGsJNXMA809.jpg

从图中可以看出Slave_IO_RunningSlave_SQL_Running都是Yes状态,表明DB1上复制服务运行正常。至此,mysql双主模式的主从复制已经配置完毕了


2、配置KeepAlived实现MySQL双主高可用

在进行高可用配置之前,首先需要在DB1DB2服务器上安装KeepAlived软件。关于KeepAlived会在后面做详细介绍,这里主要关注下KeepAlived的安装和配置,安装过程如下:

[root@keepalived-master app]#tar zxvf keepalived-1.2.12.tar.gz

[root@keepalived-master app]#cd keepalived-1.2.12

[root@keepalived-master keepalived-1.2.12]#./configure   --sysconf=/etc \

> --with-kernel-dir=/usr/src/kernels/2.6.32-431.5.1.el6.x86_64

[root@keepalived-master keepalived-1.2.12]#make

[root@keepalived-master keepalived-1.2.12]#make install

[root@keepalived-master keepalived-1.2.12]#ln -s /usr/local/sbin/keepalived  /sbin/

[root@keepalived-master keepalived-1.2.12]# chkconfig  --add keepalived

[root@keepalived-master keepalived-1.2.12]# chkconfig  --level 35 keepalived on

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

下面是DB1服务器上/etc/keepalived/keepalived.conf文件的内容。

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_script check_mysqld {

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

    interval 2

    }


vrrp_instance VI_1 {

    state BACKUP  #DB1DB2上均配置为BACKUP

    interface eth0

    virtual_router_id 80

    priority 100

    advert_int 2

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


    authentication {   #效验DB1和DB2需一致

        auth_type PASS

        auth_pass qweasdzxc

    }


    track_script {

    check_mysqld

    }


    virtual_ipaddress {

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

    }

}

   

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

#!/usr/bin/perl -w

use DBI;

use DBD::mysql;

 

# CONFIG VARIABLES

$SBM = 120;

$db = "mysql";

$host = $ARGV[0];

$port = 3306;

$user = "root";

$pw = "xxxxxx";

 

# 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;

    }

}

 



这是个用perl写的检测mysql复制状态的脚本,ixdba是本例中的一个数据库名,读者只需修改文件中数据库名、数据库的端口、用户名和密码即可直接使用,但在使用前要保证此脚本有可执行权限。

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

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


启动之前,先检测是脚本是否可以正常运行 

wKiom1ctrIPRzBnEAABynVxRkSo623.jpg如出现下图情况

wKioL1ctrk6zu1lDAAErVauMa7U042.jpg那么不要想太多,直接安装

yum install perl-DBD-MySQL

然后再启动keepalinved

3、测试MySQL主从同步功能

为了验证mysql的复制功能,可以编写一个简单的程序进行测试,也可以通过远程客户端登录进行测试。这里通过一个远程mysql客户端,然后利用mysqlVIP地址登录,看是否能登录,并在登录后进行读、写操作,看看DB1DB2之间是否能够实现数据同步。由于是远程登录测试,因此DB1DB2两台MySQL服务器都要事先做好授权,允许从远程登录。

授权:grant all privileges on *.* to 'root'@'192.168.1.82' identified by 'root';

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

wKiom1ctr2DSDtgCAACuCP8gIjY907.jpgwKioL1cttXPzZItIAABtheUaxzQ219.jpg

2) 数据复制功能测试

4、测试KeepAlived实现MySQL故障转移

为了测试KeepAlived实现的故障转移功能,需要模拟一些故障,比如,可以通过断开DB1主机的网络、关闭DB1主机、关闭DB1mysql服务等各种操作实现,这里在DB1服务器上关闭mysql的日志接收功能,以此来模拟DB1mysql的故障。由于在DB1DB2服务器上都添加了监控mysql运行状态的脚本check_slave.pl,因此当关闭DB1mysql日志接收功能后,KeepAlived会立刻检测到,接着执行切换操作。




     本文转自诚之恋 51CTO博客,原文链接:http://blog.51cto.com/vickyzhang/1771041,如需转载请自行联系原作者



相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
16天前
|
存储 关系型数据库 MySQL
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
|
16天前
|
存储 关系型数据库 MySQL
轻松入门MySQL:优化进销存管理,掌握MySQL索引,提升系统效率(11)
轻松入门MySQL:优化进销存管理,掌握MySQL索引,提升系统效率(11)
|
18天前
|
存储 Java 关系型数据库
社区医院管理服务系统【GUI/Swing+MySQL】(Java课设)
社区医院管理服务系统【GUI/Swing+MySQL】(Java课设)
24 1
|
18天前
|
存储 Java 关系型数据库
实验室设备管理系统【GUI/Swing+MySQL】(Java课设)
实验室设备管理系统【GUI/Swing+MySQL】(Java课设)
17 0
|
2月前
|
前端开发 关系型数据库 MySQL
基于python+mysql的宠物领养网站系统
基于python+mysql的宠物领养网站系统
36 2
|
2月前
|
监控 数据可视化 关系型数据库
微服务架构+Java+Spring Cloud +UniApp +MySql智慧工地系统源码
项目管理:项目名称、施工单位名称、项目地址、项目地址、总造价、总面积、施工准可证、开工日期、计划竣工日期、项目状态等。
304 6
|
2月前
|
存储 SQL 关系型数据库
MySQL 系统文件你了解吗
MySQL 系统文件你了解吗
37 0
|
28天前
|
SQL 存储 运维
MySQL高可用性:主从复制和集群
MySQL高可用性:主从复制和集群
34 0
|
1天前
|
Java 关系型数据库 MySQL
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。一套UWB精确定位系统,最高定位精度可达10cm,具有高精度,高动态,高容量,低功耗的应用。
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
|
9天前
|
监控 安全 关系型数据库
基于vue2 + element +mysql医院不良事件上报系统源码
不良事件管理系统从时间上报、PDCA分析、事件整改、评估效果实行闭环管理和分析,满足医院追根溯源,全流程闭环管理,提高不良事件上报率,减少同类不良事件发生,提高医疗安全。通过报告不良事件,及时发现潜在的不安全因素
18 1