您的位置:首页 > 运维架构 > 网站架构

Mysql+Keepalived双主互备高可用详细配置

2017-03-27 23:12 766 查看
Mysql+Keepalived双主互备架构搭架配置前进行校时操作
#安装ntpdate工具
yuminstallntpdate-y
#使用ntpdate校时(后面的是ntp服务器)
ntpdatepool.ntp.org
[/code]一配置mysql双主备0.测试mysql安装
yuminstallmariadbmariadb-server-y
systemctlrestartmariadb
systemctlenablemariadb
mysql_secure_installation
[/code]1.DB1修改配置文件(需重启)
vim/etc/my.cnf
#在[mysqld]添加
server-id=166
#开启mysql日志功能
log-bin=mysql-bin
#定义日志命名格式
relay-log=mysql-relay-bin
#以下table复制过滤
#replicate-wild-ignore-table=test.%
#replicate-wild-ignore-table=mysql.%
#replicate-wild-ignore-table=performance_schema.%
[/code]2.DB2修改配置文件(需重启)
vim/etc/my.cnf
#在[mysqld]添加
server-id=168
#开启mysql日志功能
log-bin=mysql-bin
#定义日志命名格式
relay-log=mysql-relay-bin
[/code]3.DB1,DB2分别创建复制帐号
mysql-uroot-p
#创建用户slave_up允许从192.168.1网段登录
createuser'slave_cp'@'192.168.1.%'identifiedby'pass';
grantreplicationslaveon*.*to'slave_cp'@'192.168.1.%';
exit
[/code]4.DB1获取二进制日志信息
mysql-uroot-p
#对数据库进行只读锁定(防止查看二进制日志同时有人对数据库修改操作)
flushtableswithreadlock;
#查询主机二进制文件信息
showmasterstatus;
+------------------+----------+--------------+------------------+
|File|Position|Binlog_Do_DB|Binlog_Ignore_DB|
+------------------+----------+--------------+------------------+
|mysql-bin.000001|494|||
+------------------+----------+--------------+------------------+
1rowinset(0.00sec)
#解除只读锁定
unlocktables;
exit
[/code]5.同步数据库
#DB1
#备份主数据库,并上传给从数据库
mysqldump-uroot-p123456--all-databases--lock-all-tables>/tmp/dbdump.sql
scp/tmp/dbdump.sql192.168.1.168:/tmp/
#DB2
#从服务器导入主服务器数据库
mysql-uroot-p</tmp/dbdump.sql
[/code]6.在DB2上将DB1设置为主服务器
#开启mysql防火墙端口
firewall-cmd--add-port=3306/tcp--permanent
firewall-cmd--reload
[/code]
changemasterto
master_host='192.168.1.168',
master_user='slave_cp',
master_password='pass',
master_log_file='mysql-bin.000001',
master_log_pos=494;
#启动slave
startslave;
#查看是否正常工作
showslavestatus\G
exit
[/code]7.在DB2获取二进制日志信息
mysql-uroot-p
#对数据库进行只读锁定(防止查看二进制日志同时有人对数据库修改操作)
flushtableswithreadlock;
#查询主机二进制文件信息
showmasterstatus;
+------------------+----------+--------------+------------------+
|File|Position|Binlog_Do_DB|Binlog_Ignore_DB|
+------------------+----------+--------------+------------------+
|mysql-bin.000001|513721|||
+------------------+----------+--------------+------------------+
1rowinset(0.00sec)
#解除只读锁定
unlocktables;
exit
[/code]8.在DB1将DB2设置为主服务器
changemasterto

[code]master_host='192.168.1.168',
master_user='slave_cp',
master_password='pass',
master_log_file='mysql-bin.000001',
master_log_pos=513721;
#启动slave
startslave;
#查看是否正常工作
showslavestatus\G
exit
[/code]二Keepalived配置(/etc/keepalived/keepalived.conf)(yuminstallkeepalived-y)(注意:关闭selinux策略setenforce0)1.keepalived配置文件配置
!ConfigurationFileforkeepalived
global_defs{
#设置报警通知邮件地址,可以设置多个
notification_email{
msun1996@163.com
}
#设置邮件的发送地址
notification_email_fromkeepalived@msun.com
#设置smtpserver的地址,该地址必须是存在的
smtp_server127.0.0.1
#设置连接smtpserver的超时时间
smtp_connect_timeout30
#运行Keepalived服务器的标识,发邮件时显示在邮件标题中的信息
router_idmysql_msun
}
#检测haproxy脚本
vrrp_scriptchk_mysql{
script"/etc/keepalived/mysqlcheck/check_slave.sh"
interval2
weight2
}
#定义VRRP实例,实例名自定义
vrrp_instancemysql_msun{
#指定Keepalived的角色,MASTER主机BACKUP备份
stateBACKUP#此处两个都设置为BACKUP
#指定HA监测的接口
interfaceeno16777736
#虚拟路由标识,这个标识是一个数字(1-255),在一个VRRP实例中主备服务器ID必须一样
virtual_router_id68
#优先级,数字越大优先级越高,在一个实例中主服务器优先级要高于备服务器
priority100#从服务器99
#设置主备之间同步检查的时间间隔单位秒
advert_int1
#设置不抢占模式(DB1设置即可)
nopreempt
#设置验证类型和密码
authentication{
#验证类型有两种{PASS|HA}
auth_typePASS
#设置验证密码,在一个实例中主备密码保持一样
auth_pass1689
}
track_script{
chk_mysql#执行监控的服务
}
#定义虚拟IP地址,可以有多个,每行一个
virtual_ipaddress{
192.168.1.160
}
}
[/code]2.创建监控脚本(/etc/keepalived/mysqlcheck/check_slave.sh)
#!/bin/bash
#ThisscriptsischeckforMysqlSlavestatus
Mysqlbin=/usr/bin/mysql
user=root
pw='123456'
port=3306
host=127.0.0.1
#最大延时
sbm=120
#Checkfor$Mysqlbin
if[!-f$Mysqlbin];then
echo'Mysqlbinnotfound,checkthevariableMysqlbin'
exit99
fi
#GetMysqlSlaveStatus
IOThread=`$Mysqlbin-h$host-P$port-u$user-p$pw-e'showslavestatus\G'2>/dev/null|grep'Slave_IO_Running:'|awk'{print$NF}'`
SQLThread=`$Mysqlbin-h$host-P$port-u$user-p$pw-e'showslavestatus\G'2>/dev/null|grep'Slave_SQL_Running:'|awk'{print$NF}'`
SBM=`$Mysqlbin-h$host-P$port-u$user-p$pw-e'showslavestatus\G'2>/dev/null|grep'Seconds_Behind_Master:'|awk'{print$NF}'`
#Checkifthemysqlrun
if[[-z"$IOThread"]];then
exit1
fi
#Checkifthethreadrun
if[["$IOThread"=="No"||"$SQLThread"=="No"]];then
exit1
elif[[$SBM-ge$sbm]];then
exit1
else
exit0
fi
[/code]3.防火墙策略
#运行VPPR组播(keepalived)
firewall-cmd--permanent--add-rich='rulefamily="ipv4"destinationaddress="224.0.0.18"protocolvalue="vrrp"accept'
firewall-cmd--reload
[/code]4.测试1.正常启动DB1、DB2信息
[root@DB1~]#ipa
1:lo:<LOOPBACK,UP,LOWER_UP>mtu65536qdiscnoqueuestateUNKNOWN
link/loopback00:00:00:00:00:00brd00:00:00:00:00:00
inet127.0.0.1/8scopehostlo
valid_lftforeverpreferred_lftforever
inet6::1/128scopehost
valid_lftforeverpreferred_lftforever
2:eno16777736:<BROADCAST,MULTICAST,UP,LOWER_UP>mtu1500qdiscpfifo_faststateUPqlen1000
link/ether00:0c:29:43:30:13brdff:ff:ff:ff:ff:ff
inet192.168.1.166/24brd192.168.1.255scopeglobaleno16777736
valid_lftforeverpreferred_lftforever
inet192.168.1.160/32scopeglobaleno16777736
valid_lftforeverpreferred_lftforever
inet6fe80::20c:29ff:fe43:3013/64scopelink
valid_lftforeverpreferred_lftforever
[/code]
[root@DB2~]#ipa
1:lo:<LOOPBACK,UP,LOWER_UP>mtu65536qdiscnoqueuestateUNKNOWN
link/loopback00:00:00:00:00:00brd00:00:00:00:00:00
inet127.0.0.1/8scopehostlo
valid_lftforeverpreferred_lftforever
inet6::1/128scopehost
valid_lftforeverpreferred_lftforever
2:eno16777736:<BROADCAST,MULTICAST,UP,LOWER_UP>mtu1500qdiscpfifo_faststateUPqlen1000
link/ether00:0c:29:da:7d:9dbrdff:ff:ff:ff:ff:ff
inet192.168.1.168/24brd192.168.1.255scopeglobaleno16777736
valid_lftforeverpreferred_lftforever
inet6fe80::20c:29ff:feda:7d9d/64scopelink
valid_lftforeverpreferred_lftforever
[/code]2.关闭DB1数据库,观察IP
[root@DB1~]#systemctlstopmariadb
[root@DB1~]#ipa
1:lo:<LOOPBACK,UP,LOWER_UP>mtu65536qdiscnoqueuestateUNKNOWN
link/loopback00:00:00:00:00:00brd00:00:00:00:00:00
inet127.0.0.1/8scopehostlo
valid_lftforeverpreferred_lftforever
inet6::1/128scopehost
valid_lftforeverpreferred_lftforever
2:eno16777736:<BROADCAST,MULTICAST,UP,LOWER_UP>mtu1500qdiscpfifo_faststateUPqlen1000
link/ether00:0c:29:43:30:13brdff:ff:ff:ff:ff:ff
inet192.168.1.166/24brd192.168.1.255scopeglobaleno16777736
valid_lftforeverpreferred_lftforever
inet62001:da8:4002:3301:20c:29ff:fe43:3013/64scopeglobalnoprefixroutedynamic
valid_lft2591817secpreferred_lft604617sec
inet6fe80::20c:29ff:fe43:3013/64scopelink
valid_lftforeverpreferred_lftforever
[/code]
[root@DB2~]#ipa
1:lo:<LOOPBACK,UP,LOWER_UP>mtu65536qdiscnoqueuestateUNKNOWN
link/loopback00:00:00:00:00:00brd00:00:00:00:00:00
inet127.0.0.1/8scopehostlo
valid_lftforeverpreferred_lftforever
inet6::1/128scopehost
valid_lftforeverpreferred_lftforever
2:eno16777736:<BROADCAST,MULTICAST,UP,LOWER_UP>mtu1500qdiscpfifo_faststateUPqlen1000
link/ether00:0c:29:da:7d:9dbrdff:ff:ff:ff:ff:ff
inet192.168.1.168/24brd192.168.1.255scopeglobaleno16777736
valid_lftforeverpreferred_lftforever
inet192.168.1.160/32scopeglobaleno16777736
valid_lftforeverpreferred_lftforever
inet62001:da8:4002:3301:20c:29ff:feda:7d9d/64scopeglobalnoprefixroutedynamic
valid_lft2591669secpreferred_lft604469sec
inet6fe80::20c:29ff:feda:7d9d/64scopelink
valid_lftforeverpreferred_lftforever
[/code]3.重启主机mariadb,观察IP
[root@DB1~]#ipa#DB1不切换成主机(因为设置为不抢占模式)
1:lo:<LOOPBACK,UP,LOWER_UP>mtu65536qdiscnoqueuestateUNKNOWN
link/loopback00:00:00:00:00:00brd00:00:00:00:00:00
inet127.0.0.1/8scopehostlo
valid_lftforeverpreferred_lftforever
inet6::1/128scopehost
valid_lftforeverpreferred_lftforever
2:eno16777736:<BROADCAST,MULTICAST,UP,LOWER_UP>mtu1500qdiscpfifo_faststateUPqlen1000
link/ether00:0c:29:43:30:13brdff:ff:ff:ff:ff:ff
inet192.168.1.166/24brd192.168.1.255scopeglobaleno16777736
valid_lftforeverpreferred_lftforever
inet62001:da8:4002:3301:20c:29ff:fe43:3013/64scopeglobalnoprefixroutedynamic
valid_lft2591605secpreferred_lft604405sec
inet6fe80::20c:29ff:fe43:3013/64scopelink
valid_lftforeverpreferred_lftforever
[/code]
[root@DB2~]#ipa
1:lo:<LOOPBACK,UP,LOWER_UP>mtu65536qdiscnoqueuestateUNKNOWN
link/loopback00:00:00:00:00:00brd00:00:00:00:00:00
inet127.0.0.1/8scopehostlo
valid_lftforeverpreferred_lftforever
inet6::1/128scopehost
valid_lftforeverpreferred_lftforever
2:eno16777736:<BROADCAST,MULTICAST,UP,LOWER_UP>mtu1500qdiscpfifo_faststateUPqlen1000
link/ether00:0c:29:da:7d:9dbrdff:ff:ff:ff:ff:ff
inet192.168.1.168/24brd192.168.1.255scopeglobaleno16777736
valid_lftforeverpreferred_lftforever
inet192.168.1.160/32scopeglobaleno16777736
valid_lftforeverpreferred_lftforever
inet62001:da8:4002:3301:20c:29ff:feda:7d9d/64scopeglobalnoprefixroutedynamic
valid_lft2591533secpreferred_lft604333sec
inet6fe80::20c:29ff:feda:7d9d/64scopelink
valid_lftforeverpreferred_lftforever
[/code]4.再次关闭DB2的maraiadb,问题出现了,预想当DB2宕机,IP未能正常漂移!!!
[root@DB2~]#systemctlstopmariadb
[root@DB2~]#ipa
1:lo:<LOOPBACK,UP,LOWER_UP>mtu65536qdiscnoqueuestateUNKNOWN
link/loopback00:00:00:00:00:00brd00:00:00:00:00:00
inet127.0.0.1/8scopehostlo
valid_lftforeverpreferred_lftforever
inet6::1/128scopehost
valid_lftforeverpreferred_lftforever
2:eno16777736:<BROADCAST,MULTICAST,UP,LOWER_UP>mtu1500qdiscpfifo_faststateUPqlen1000
link/ether00:0c:29:da:7d:9dbrdff:ff:ff:ff:ff:ff
inet192.168.1.168/24brd192.168.1.255scopeglobaleno16777736
valid_lftforeverpreferred_lftforever
inet192.168.1.160/32scopeglobaleno16777736
valid_lftforeverpreferred_lftforever
inet62001:da8:4002:3301:20c:29ff:feda:7d9d/64scopeglobalnoprefixroutedynamic
valid_lft2591326secpreferred_lft604126sec
inet6fe80::20c:29ff:feda:7d9d/64scopelink
valid_lftforeverpreferred_lftforever
[/code]
[root@DB1~]#ipa
1:lo:<LOOPBACK,UP,LOWER_UP>mtu65536qdiscnoqueuestateUNKNOWN
link/loopback00:00:00:00:00:00brd00:00:00:00:00:00
inet127.0.0.1/8scopehostlo
valid_lftforeverpreferred_lftforever
inet6::1/128scopehost
valid_lftforeverpreferred_lftforever
2:eno16777736:<BROADCAST,MULTICAST,UP,LOWER_UP>mtu1500qdiscpfifo_faststateUPqlen1000
link/ether00:0c:29:43:30:13brdff:ff:ff:ff:ff:ff
inet192.168.1.166/24brd192.168.1.255scopeglobaleno16777736
valid_lftforeverpreferred_lftforever
inet62001:da8:4002:3301:20c:29ff:fe43:3013/64scopeglobalnoprefixroutedynamic
valid_lft2591241secpreferred_lft604041sec
inet6fe80::20c:29ff:fe43:3013/64scopelink
valid_lftforeverpreferred_lftforever
[/code]关于这个问题的思考:先说说本案例中采用的是Keepalived+mysql的组合,Keepalived用了双备模式,采用脚本检测应用是否正常来决定keepalived的权重,从而让正常的数据库能得到VIP而正常工作,考虑到了如果DB1宕掉(仅mysql服务)(DB1的权重会低于DB2),DB2接管服务,而DB1再次正常时(权重又会高于DB2),为了避免数据库来回切换,而在DB1的keepalived配置中设置了不抢占模式来避免此问题。但是,导致了一个新的问题,就算是DB2的数据库不正常工作,(权重更低于DB2),但因为DB1不抢占模式,DB2仍然会占有VIP,(除非是Keepalived服务宕掉)。关于这个问题的思考解决方案:1.keepalived取消使用不抢占模式,从而使主机切换正常,但这样也就使DB1的数据库服务宕掉再正常启动时,会抢占DB2的VIP,使数据库进行不必要的切换。2.修改检测脚本,keepalived使用检测脚本正常时返回0,不正常时,直接让keepalived服务本身宕掉。这样情况下,DB1服务mysql服务再次正常(并启动keepalived),不会抢占DB2的VIP;当DB2mysql服务不正常工作时,(会自动停止keepalived),从而使DB1正常得到VIP。
#!/bin/bash
#ThisscriptsischeckforMysqlSlavestatus
Mysqlbin=/usr/bin/mysql
user=root
pw='123456'
port=3306
host=127.0.0.1
#最大延时
sbm=120
#Checkfor$Mysqlbin
if[!-f$Mysqlbin];then
echo'Mysqlbinnotfound,checkthevariableMysqlbin'
pkillkeepalived
fi
#GetMysqlSlaveStatus
IOThread=`$Mysqlbin-h$host-P$port-u$user-p$pw-e'showslavestatus\G'2>/dev/null|grep'Slave_IO_Running:'|awk'{print$NF}'`
SQLThread=`$Mysqlbin-h$host-P$port-u$user-p$pw-e'showslavestatus\G'2>/dev/null|grep'Slave_SQL_Running:'|awk'{print$NF}'`
SBM=`$Mysqlbin-h$host-P$port-u$user-p$pw-e'showslavestatus\G'2>/dev/null|grep'Seconds_Behind_Master:'|awk'{print$NF}'`
#Checkifthemysqlrun
if[[-z"$IOThread"]];then
pkillkeepalived
fi
#Checkifthethreadrun
if[["$IOThread"=="No"||"$SQLThread"=="No"]];then
pkillkeepalived
elif[[$SBM-ge$sbm]];then
pkillkeepalived
else
exit0
fi
[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息