通过KeepAlived搭建MySQL双主模式的高可用集群系统概要.docx
- 文档编号:6856983
- 上传时间:2023-01-11
- 格式:DOCX
- 页数:12
- 大小:864.71KB
通过KeepAlived搭建MySQL双主模式的高可用集群系统概要.docx
《通过KeepAlived搭建MySQL双主模式的高可用集群系统概要.docx》由会员分享,可在线阅读,更多相关《通过KeepAlived搭建MySQL双主模式的高可用集群系统概要.docx(12页珍藏版)》请在冰豆网上搜索。
通过KeepAlived搭建MySQL双主模式的高可用集群系统概要
通过KeepAlived搭建MySQL双主模式的高可用集群系统
一、整体架构
企业级mysql集群具备高可用、可扩展、易管理、低成本的特点。
下面将介绍企业环境中经常应用的一个解决方案,即MySQL的双主互备架构,主要设计思路是通过MySQLReplication技术将两台MySQLServer互相将对方作为自己的Master,自己又同时作为对方的Slave来进行复制。
这样就实现了高可用构架中的数据同步功能,同时,将采用KeepAlived来实现Mysql的自动failover。
在这个构架中,虽然两台MySQLServer互为主从,但同一时刻只有一个MySQLServer可读写,另一个MySQLServer只能进行读操作,这样可保证数据的一致性。
整个架构下图所示。
二、MySQL主主互备模式配置环境
第一步要做的工作是在这两天机器上都安装mysql,在做主从复制的时候mysql的版本尽量保持一致。
即使不一样一定要以主服务的版本为最高的版本,从服务器的版本不能高于主服务器的版本。
1、Mysql的安装与配置
Mysql5.6版本之后,编译mysql方式变为cmake
安装cmake:
#yuminstallcmake
#cdmysql-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&&makeinstall
如果没有就创建用户就创建如下用户:
#groupaddmysql
#useradd-gmysqlmysql
修改/usr/local/mysql权限:
#chown-Rmysql:
mysql/usr/local/mysql
#cd/usr/local/mysql
进入安装路径,执行初始化配置脚本,创建系统自带的数据库和表:
#scripts/mysql_install_db--basedir=/usr/local/mysql--datadir=/usr/local/mysql/data--user=mysql
2、启动MySQL
添加服务,拷贝服务脚本到init.d目录,并设置开机启动
#cd/usr/local/mysql
#cpsupport-files/mysql.server/etc/init.d/mysql
#chkconfigmysqlon
#servicemysqlstart--启动MySQL
三、配置mysql主从服务器
1、修改MySQL配置文件
在默认情况下MySQL的配置文件是/etc/f。
但我们需要修改的路径是自己安装MySQL的路径。
首先修改DB1主机的配置文件,在/usr/local/mysql/f文件中的“[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/f文件中的“[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表示开启MySQL的binlog日志功能。
“mysql-bin”表示日志文件的命名格式,会生成文件名为mysql-bin.000001、mysql-bin.000002等的日志文件。
relay-log用来定义relay-log日志文件的命名格式。
replicate-wild-ignore-table是个复制过滤选项,可以过滤掉不需要复制的数据库或表,例如“mysql.%“表示不复制mysql库下的所有对象,其他依此类推。
与此对应的是replicate_wild_do_table选项,用来指定需要复制的数据库或表。
2、手动同步数据库
如果DB1上已经有mysql数据,那么在执行主主互备之前,需要将DB1和DB2上两个mysql的数据保持同步,首先在DB1上备份mysql数据,执行如下SQL语句:
mysql>FLUSHTABLESWITHREADLOCK;(解锁:
unlocktables;)
QueryOK,0rowsaffected(0.00sec)
在不退出终端的情况下,再开启一个终端直接打包压缩数据文件或使用mysqldump工具来导出数据。
这里通过打包mysql文件来完成数据的备份,操作过程如下:
[root@DB1~]#cd/usr/local
[root@DB1lib]#tarzcvfmysql.tar.gzmysql
[root@DB1lib]#scpmysql.tar.gzDB2:
/usr/local/
将数据传输到DB2后,依次重启DB1和DB2上面的mysql。
3、创建复制用户并授权
首先在DB1的mysql库中创建复制用户,操作过程如图所示。
mysql>grantreplicationslaveon*.*to'repl_user'@'192.168.1.89'identifiedby'repl_passwd';
然后在DB2的mysql库中将DB1设为自己的主服务器,操作如下所示。
Changemastertomaster_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_file和master_log_pos两个选项,这两个选项的值刚好是在DB1上通过SQL语句“showmasterstatus”查询到的结果。
接着就可以在DB2上启动slave服务了,可执行如下SQL命令:
mysql>startslave;
下面查看DB2上slave的运行状态,如图所示。
通过查看slave的运行状态发现,一切运行正常,这里需要重点关注的是Slave_IO_Running和Slave_SQL_Running,这两个就是在Slave节点上运行的主从复制线程,正常情况下这两个值都应该为Yes。
另外还需要注意的是Slave_IO_State、Master_Host、Master_Log_File、Read_Master_Log_Pos、Relay_Log_File、Relay_Log_Pos和Relay_Master_Log_File几个选项,从中可以查看出mysql复制的运行原理及执行规律。
最后还有一个Replicate_Wild_Ignore_Table选项,这个是之前在f中添加过的,通过此选项的输出值可以知道过滤掉了哪些数据库。
到这里位置,从DB1到DB2的mysql主从复制已经完成了。
接下来开始配置从DB2到DB1的mysql主从复制,这个配置过程与上面的完全一样,首先在DB2的mysql库中创建复制用户,操作如图
grantreplicationslaveon*.*to'repl_user'@'192.168.1.85'identifiedby'repl_passwd';
然后在DB1的mysql库中将DB2设为自己的主服务器,操作如下
changemastertomaster_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>startslave;
下面查看DB1上slave的运行状态,如图所示。
从图上中可以看出Slave_IO_Running和Slave_SQL_Running都是Yes状态,表明DB1上复制服务运行正常。
至此,mysql双主模式的主从复制已经配置完毕了。
四、配置KeepAlived实现MySQL双主高可用
在进行高可用配置之前,首先需要在DB1和DB2服务器上安装KeepAlived软件。
KeepAlived的安装和配置过程如下:
[root@keepalived-masterapp]#tarzxvfkeepalived-1.2.12.tar.gz
[root@keepalived-masterapp]#cdkeepalived-1.2.12
[root@keepalived-masterkeepalived-1.2.12]#./configure--sysconf=/etc\
>--with-kernel-dir=/usr/src/kernels/2.6.32-431.5.1.el6.x86_64
[root@keepalived-masterkeepalived-1.2.12]#make
[root@keepalived-masterkeepalived-1.2.12]#makeinstall
[root@keepalived-masterkeepalived-1.2.12]#ln-s/usr/local/sbin/keepalived/sbin/
[root@keepalived-masterkeepalived-1.2.12]#chkconfig--addkeepalived
[root@keepalived-masterkeepalived-1.2.12]#chkconfig--level35keepalivedon
安装完成后,进入keepalived的配置过程。
下面是DB1服务器上/etc/keepalived/keepalived.conf文件的内容。
global_defs{
notification_email{
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_fromAlexandre.Cassen@firewall.loc
smtp_server192.168.200.1
smtp_connect_timeout30
router_idLVS_DEVEL
}
vrrp_scriptcheck_mysqld{
script"/etc/keepalived/mysqlcheck/check_slave.pl127.0.0.1"#检测mysql复制状态的脚本
interval2
}
vrrp_instanceVI_1{
stateBACKUP#在DB1和DB2上均配置为BACKUP
interfaceeth0
virtual_router_id80
priority100
advert_int2
nopreempt#不抢占模式,只在优先级高的机器上设置即可,优先级低的机器不设置
authentication{#效验DB1和DB2需一致
auth_typePASS
auth_passqweasdzxc
}
track_script{
check_mysqld
}
virtual_ipaddress{
192.168.1.84/24deveth0#mysql的对外服务IP,即VIP
}
}
其中,/etc/keepalived/mysqlcheck/check_slave.pl文件的内容为:
#!
/usr/bin/perl-w
useDBI;
useDBD:
:
mysql;
#CONFIGVARIABLES
$SBM=120;
$db="mysql";
$host=$ARGV[0];
$port=3306;
$user="root";
$pw="xxxxxx";
#SQLquery
$query="showslavestatus";
$dbh=DBI->connect("DBI:
mysql:
$db:
$host:
$port",$user,$pw,{RaiseError=>0,PrintError=>0});
if(!
defined($dbh)){
exit1;
}
$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_Runningeq"No"||$Slave_SQL_Runningeq"No"){
exit1;
}else{
if($Seconds_Behind_Master>$SBM){
exit1;
}else{
exit0;
}
}
这是个用perl写的检测mysql复制状态的脚本,ixdba是本例中的一个数据库名,读者只需修改文件中数据库名、数据库的端口、用户名和密码即可直接使用,但在使用前要保证此脚本有可执行权限。
接着将keepalived.conf文件和check_slave.pl文件复制到DB2服务器上对应的位置,然后将DB2上keepalived.conf文件中priority值修改为90,同时去掉nopreempt选项。
在完成所有配置后,分别在DB1和DB2上启动keepalived服务,在正常情况下VIP地址应该运行在DB1服务器上。
启动之前,先检测是脚本是否可以正常运行
五、测试MySQL主从同步功能
为了验证mysql的复制功能,可以编写一个简单的程序进行测试,也可以通过远程客户端登录进行测试。
这里通过一个远程mysql客户端,然后利用mysql的VIP地址登录,看是否能登录,并在登录后进行读、写操作,看看DB1和DB2之间是否能够实现数据同步。
由于是远程登录测试,因此DB1和DB2两台MySQL服务器都要事先做好授权,允许从远程登录。
授权:
grantallprivilegeson*.*to'root'@'192.168.1.82'identifiedby'root';
1、在远程客户端通过VIP登录测试
2、数据复制功能测试
六、测试KeepAlived实现MySQL故障转移
为了测试KeepAlived实现的故障转移功能,需要模拟一些故障,比如,可以通过断开DB1主机的网络、关闭DB1主机、关闭DB1上mysql服务等各种操作实现,这里在DB1服务器上关闭mysql的日志接收功能,以此来模拟DB1上mysql的故障。
由于在DB1和DB2服务器上都添加了监控mysql运行状态的脚本check_slave.pl,因此当关闭DB1的mysql日志接收功能后,KeepAlived会立刻检测到,接着执行切换操作。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 通过 KeepAlived 搭建 MySQL 模式 可用 集群 系统 概要
![提示](https://static.bdocx.com/images/bang_tan.gif)