Mysql高可用.docx
- 文档编号:29986951
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:18
- 大小:176.65KB
Mysql高可用.docx
《Mysql高可用.docx》由会员分享,可在线阅读,更多相关《Mysql高可用.docx(18页珍藏版)》请在冰豆网上搜索。
Mysql高可用
KeepAlived+MySQL互为主从
项目描述
主从复制解决方案:
这是MySQL自身提供的一种高可用解决方案,数据同步方法采用的是MySQLreplication技术。
MySQLreplication就是从服务器到主服务器拉取二进制日志文件,然后再将日志文件解析成相应的SQL在从服务器上重新执行一遍主服务器的操作,通过这种方式保证数据的一致性。
为了达到更高的可用性,在实际的应用环境中,一般都是采用MySQLreplication技术配合高可用集群软件keepalived来实现自动failover,这种方式可以实现95.000%的SLA。
架构图
实现方案
使用2台CentOS6.9虚拟机,其中192.168.2.100是MySQL主服务器,负责提供同步源;另一台192.168.2.101作为MySQL从服务器,通过调取主服务器上的binlog日志,在本地重做对应的库、表,实现与主服务器的AB复制(同步)。
安装环境
主机名
操作系统版本
Mysql版本
主机IP
Mysqlvip
DB1(MASTER)
CentOS6.9
mysql-server-5.1.73
192.168.2.100
192.168.2.200
DB2(SLAVE)
CentOS6.9
mysql-server-5.1.73
192.168.2.101
Mysql互为主从配置
提前为两台MySQL服务器安装好MySQL-server、MySQL-Client软件包,并为数据库用户root修改密码;
1.安装mysql软件
#yum-yinstallmysql-servermysql
#mysql-uroot-p
mysql>updateusersetpassword=PASSWORD('Navinfo')whereuser='root';
mysql>flushprivileges;
mysql>quit
2.修改Mysql配置文件
在默认情况下,Mysql的配置文件是/etc/f,首先修改DB1上面的配置文件,在/etc/f文件中的”[mysqld]”段添加如下内容:
[root@MASTERmysql]#vim/etc/f
[mysqld]
log_bin=mysql-bin//启用binlog日志,并指定文件名前缀
server_id=1//指定服务器ID号
relay-log=mysql-relay-bin
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%
然后修改DB2主机的配置文件,在/etc/f文件中的”[mysqld]”段添加如下内容:
[root@SLAVEmysql]#vim/etc/f
[mysqld]
log_bin=mysql-bin
server_id=2
relay-log=mysql-relay-bin
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%
注:
replicate-wild-ignore-table表示过滤不需要的数据库或表,mysql.%表示mysql的所有对象。
与此对应的是replicate-wild-do-table,用来指定需要复制的库和表。
此处不要在主和从库上使用binlog-do-db或binglog-ignore-do选项,这样会存在跨库更新失败的问题推荐在主从库上使用replicate-wild-ignore-table和replicate-wild-do-table来解决复制过滤问题。
3.手动同步数据库
如果DB1上已经有Mysql数据,则在执行主主互备之前,需要将DB1和DB2上两个Mysql数据保持同步,首先在DB1上备份Mysql数据,执行如下SQL语句:
示例:
1)在Master上操作数据库、表、表记录
新建newdb库、newtable表,随意插入几条表记录:
mysql>CREATEDATABASEnewdb;//新建库newdb
QueryOK,1rowaffected(0.04sec)
mysql>USEnewdb;//切换到newdb库
Databasechanged
mysql>CREATETABLEnewtable(idint(4));//新建newtable表
QueryOK,0rowsaffected(0.14sec)
mysql>INSERTINTOnewtableVALUES(1234),(5678);//插入2条表记录
QueryOK,2rowsaffected(0.05sec)
Records:
2Duplicates:
0Warnings:
0
mysql>SELECT*FROMnewtable;//确认表数据
+------+
|id|
+------+
|1234|
|5678|
+------+
2rowsinset(0.00sec)
mysql>FLUSHTABLESWITHREADLOCK;
QueryOK,0rowsaffected(0.00sec)
不要退出这个终端,否则这个锁就失效了。
在不退出终端的情况下,在开启一个终端打包压缩数据文件或使用mysqldump工具导出数据。
这里通过打包mysql文件来完成数据的备份,操作过程如下
[root@MASTER~]#cd/var/lib/
[root@MASTERlib]#tarzcvfmysql.tar.gzmysql
[root@MASTERlib]#scpmysql.tar.gzroot@192.168.2.101:
/var/lib/
将数据传输到DB2后
[root@SLAVElib]#tarxfmysql.tar.g
一次重启DB1和DB2上面的Mysql
4.创建复制用户并授权
首先在DB1的Mysql库中创建复制用户,操作如下:
新建一个备份用户,授予复制权限
需要的权限为REPLICATIONSLAVE,允许其从Slave服务器访问:
mysql>GRANTREPLICATIONSLAVEON*.*TO'replicater'@'192.168.2.101'IDENTIFIEDBY'pwd123';
QueryOK,0rowsaffected(0.04sec)
mysql>showmasterstatus;或者\G;
+--------------------------+---------------+------------------+-------------------------+
|File|Position|Binlog_Do_DB|Binlog_Ignore_DB|
+--------------------------+---------------+------------------+-------------------------+
|mysql-bin.000002|266|||
+-------------------------+----------------+------------------+-------------------------+
1rowinset(0.00sec)
然后在DB2的MySQL库中将DB1设为自己的主服务器,操作如下:
登入mysql>环境,发起同步操作
通过CHANGEMASTER语句指定MASTER服务器的IP地址、同步用户名/密码、起始日志文件、偏移位置(参考MASTER上的状态输出):
mysql>CHANGEMASTERTOMASTER_HOST='192.168.2.100',
->MASTER_USER='replicater',
->MASTER_PASSWORD='pwd123',
->MASTER_LOG_FILE='mysql-bin.000002',//对应Master的日志文件
->MASTER_LOG_POS=266;//对应Master的日志偏移位置
QueryOK,0rowsaffected,2warnings(0.12sec)
遇到的错误
ERROR1201(HY000):
Couldnotinitializemasterinfostructure的问题
做MySQL主从复制时遇到个ERROR1201(HY000):
Couldnotinitializemasterinfostructure.
出现这个问题的原因是之前曾做过主从复制!
解决方案是:
运行命令stopslave;
成功执行后继续运行resetslave;
然后进行运行GRANT命令重新设置主从复制。
注:
注意MASTER_LOG_FILE和MASTER_LOG_FILE两个选项,这两个选项是是在DB1上通过SQL语句“showmasterstatus;”查到的结果。
接着就可以在DB2上启动slave服务了,可执行如下SQL命令:
mysql>startslave;
QueryOK,0rowsaffected(0.01sec)
下面查看DB2上启动slave的运行状态,如下
mysql>showslavestatus\G
***************************1.row***************************
Slave_IO_State:
Waitingformastertosendevent
Master_Host:
192.168.2.100
Master_User:
replicater
Master_Port:
3306
Connect_Retry:
60
Master_Log_File:
mysql-bin.000002
Read_Master_Log_Pos:
266
Relay_Log_File:
mysql-relay-bin.000002
Relay_Log_Pos:
251
Relay_Master_Log_File:
mysql-bin.000002
Slave_IO_Running:
Yes
Slave_SQL_Running:
Yes
……
Replicate_Wild_Ignore_Table:
mysql.%,test.%,information_schema.%
1rowinset(0.00sec)
若STARTSLAVE直接报错失败,请检查CHANGEMASTER相关设置是否有误,纠正后再重试;若IO线程或SQL线程有一个为“No”,则应检查服务器的错误日志,分析并排除故障后重启主从复制。
Replicate_Wild_Ignore_Table:
通过此项输出可以看见过滤掉了哪些数据库。
到这里,从DB1到DB2的Mysql主从复制已经完成。
验证:
在DB1上操作:
在DB2上查看:
结论:
DB1主----DB2从已配置完成
配置DB2到DB1的主从复制
此配置过程与上面的过程完全一样
首先在DB2的Mysql库中创建复制用户。
mysql>GRANTREPLICATIONSLAVEON*.*TO'replicater'@'192.168.2.100'IDENTIFIEDBY'pwd123';
QueryOK,0rowsaffected(0.04sec)
mysql>showmasterstatus\G
***************************1.row***************************
File:
mysql-bin.000010
Position:
271
Binlog_Do_DB:
Binlog_Ignore_DB:
1rowinset(0.00sec)
然后在DB1的Mysql库中将DB2设为自己的主服务器,如下
mysql>CHANGEMASTERTOMASTER_HOST='192.168.2.101',
->MASTER_USER='replicater',
->MASTER_PASSWORD='pwd123',
->MASTER_LOG_FILE='mysql-bin.000010',//对应Master的日志文件
->MASTER_LOG_POS=271;//对应Master的日志偏移位置
QueryOK,0rowsaffected,2warnings(0.12sec)
最后在DB1上启动slave服务,可执行如下SQL命令
mysql>startslave;
QueryOK,0rowsaffected(0.00sec)
DB1上查看复制状态
mysql>showslavestatus\G
***************************1.row***************************
Slave_IO_State:
Waitingformastertosendevent
Master_Host:
192.168.2.101
Master_User:
replicater
Master_Port:
3306
Connect_Retry:
60
Master_Log_File:
mysql-bin.000010
Read_Master_Log_Pos:
271
Relay_Log_File:
mysql-relay-bin.000002
Relay_Log_Pos:
251
Relay_Master_Log_File:
mysql-bin.000010
Slave_IO_Running:
Yes
Slave_SQL_Running:
Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
mysql.%,test.%,information_schema.%
……
1rowinset(0.00sec)
验证:
在DB2上面插入数据
在DB1上面查看
至此,Mysql的双主模式的主从复制配置完成
配置Keepalived实现Mysql双主高可用
首先需要在DB1和DB2服务器安装Keepalived软件。
软件的安装
软件的下载
#wget http:
//www.keepalived.org/software/keepalived-1.2.12.tar.gz
安装依赖包
#yum-yinstallopenssl-devel
#uname-r
2.6.32-696.1.1.el6.x86_64
keepalived的安装配置
#tarxfkeepalived-1.2.12.tar.gz
#cdkeepalived-1.2.12
#./configure--sysconf=/etc--with-kernel-dir=/usr/src/kernels/2.6.32-431.el6.x86_64
#make&&makeinstall
#ln-s/usr/local/sbin/keepalived/sbin/keepalived
#chkconfig--addkeepalived
#chkconfig--level2345keepalivedon
注:
--sysconf 指定Keepalived配置文件的安装路径。
即路径为
/etc/keepalived/keepalived.conf
--with-kernel-dir 指定使用源码中的头文件,即include目录。
只有在使用LVS时,才使用到 --with-kernel-dir 参数,其他时候是不需要的。
#cp-rf/etc/keepalived/keepalived.conf{,.bak}
下边是DB1服务器上/etc/keepalived/keepalived.conf文件的配置
!
ConfigurationFileforkeepalived
global_defs{
notification_email{
pengjc@it-
}
notification_email_fromadmin@
smtp_server127.0.0.1
smtp_connect_timeout30
router_idMYSQL_HA#标识,双主相同
}
vrrp_instanceHA_1{
stateBACKUP#master和slave都配置为BACKUP
interfaceeth0#指定HA检测的网络接口
virtual_router_id80#虚拟路由标识,主备相同
priority100#优先级,slave设置90
advert_int1#设定master和slave之间同步检查的时间间隔
nopreempt#不主动抢占资源,只在master这台优先级高的设置,backup不设置
authentication{
auth_typePASS
auth_pass1111
}
virtual_ipaddress{#设置虚拟IP,可以设置多个,
#每行一个MySQL对外服务的IP,即VIP
192.168.2.200/24deveth0
}
}
virtual_server192.168.2.2003306{
delay_loop2
#lb_algowrr#lvs算法
#lb_kinfDR
persistence_timeout50#同一IP的连接60秒内被分配到同一台真实服务器
protocolTCP
real_server192.168.2.1003306{#检测本地mysql,backup也要写检测本地mysql
weight1
notify_down/etc/keepalived/mysql.sh#当mysq服down时,执行此脚本,杀死keepalived实现切换
TCP_CHECK{
connect_timeout3#连接超时
nb_get_retry3#重试次数
delay_before_retry3#重试间隔时间
connect_port3306#健康检查端口
}
}
)
其中/etc/keepalived/check_mysql.sh文件的内容为:
#vim/etc/keepalived/check_mysql.sh
#!
/bin/bash
pkill keepalived
[root@master~]#chmod+x/etc/keepalived/check_mysql.sh
[root@master~]#/etc/init.d/keepalivedstart
注:
只修改文件中的Mysql数据库的端口/用户名和密码即可直接使用,但在使用前要保证脚本具有可执行权限。
其次配置DB2,把DB1的文件复制过去
[root@MASTER~]#scp/etc/keepalived/keepalived.conf192.168.2.101:
/etc/keepalived/
[root@MASTER~]#scp/etc/keepalived/check_mysql.pl192.168.2.101:
/etc/keepalived/
将keepalived.conf中修改如下3处:
1.priority90
2.由于配置的是不抢占模式,则还需要去掉nopreempt选项。
3.修改自己主机的IP地址
然后分别启动DB1和DB2上的keepalived服务
#servicekeepalivedstart
正常情况下VIP地址应该运行在DB1服务器上。
关闭DB1上面的keepalived服务,则,DB2上面查询结果
测试Mysql主从同步功能
MySQL远程登录测试
我们找一台安装有MySQL客户端,然后登录VIP,看是否能登录,在登录之两台MySQL服务器都要授权允许从远程登录。
例如:
mysql>grantallon*.*toroot@'%'identifiedby'pwd123';
QueryOK,0rowsaffected(0.00sec)
mysql>grantallon*.*toroot@'localhost'identifiedby'pwd123';
mysql>flushprivileges;
QueryOK,0rowsaffected(0.00sec)
通过远程客户端登陆进行测试。
通过Mysql的VIP地址登陆看是否可以登录,登陆后并进行读写操作。
查看DB1和DB2之间能否实现数据同步。
由于采用的是远程登陆测试,则DB1和DB2两台Mysql服务器都要事先做好授权,允许远程登录。
注:
由于切换服务,此时虚拟IP在DB2上。
从SQL输出看到,可以通过VIP进行登录,并且登陆了DB2服务器。
数据复制功能测试
继续上面的操作,通过远程客户端链接VIP,进行读写操作测试。
createdatabasemy_test;
usemy_test;
为了验证DB1,登陆DB1的命令行测试查询
从输出可以看出刚才创建的库和表都同步到了DB1服务器上。
反之,测试DB2
测试Keepalived实现Mysql故障转移
模拟故障,如可以断开DB2主机的网络/关闭DB2主机/关闭DB2上面的Mysql服务进行各种操作实现。
这里在DB2服务器上关闭mysql的日志接收功能,以此模拟DB1上的Mysql的故障,都添加了监控Mysql运行状态的脚本check_slave.pl。
因此,关闭DB1的Nysql日志
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Mysql 可用
![提示](https://static.bdocx.com/images/bang_tan.gif)