mysql-----keepalived配置mysql的高可用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql-----keepalived配置mysql的高可用相关的知识,希望对你有一定的参考价值。
生产环境对数据库要求很高的,为了避免数据库的突发情况,给他做个保险--用keepalived做高可用环境(此处ip,密码均是乱造的):
主:192.1.31.161 端口:3306 用户:vnum 密码:[email protected]
从:192.1.31.162 端口:3306
方案介绍
两台mysql互为主从,但只有master写,slave只负责读。主从通过keepalive做成高可用,当master出问题,
由slave接替master工作,即读写都在slave操作。当master恢复正常,master自动同步故障时间段数据,接替slave的写工作。
一:配置主主同步
、配置文件
master my.cnf 主要参数
log_slave_updates
log-bin = mysql-bin
server-id = 1
binlog-ignore-db=mysql
#auto_increment_increment = 2
#auto_increment_offset = 2
slave my.cnf 主要参数
log_slave_updates
log-bin = mysql-bin
server-id = 2
binlog-ignore-db=mysql
#auto_increment_increment = 2
#auto_increment_offset = 1
注:
log_slave_updates 同步数据时也写入日志,二进制记录id号,互为主从时时不会引起循环。建议开启方便实施日志恢复。 可选
slave-skip-errors 跳过错误,可以通过=指定特定的错误,如:slave-skip-errors=1062 可选
log-bin = mysql-bin 开启二进制日志,必须开启,主从同步主要是通过二进制日志。 必须
sync_binlog=n 设置二进制日志在写入多少此后与硬盘同步,1 为最安全的也是效率最低的,根据实际情况设定 可选
server-id 设置mysql的id号,主从不能相同。 必须
binlog-ignore-db 设置不写入日志的库,建议设置不需要的库,节省流量。如需设置多个库可加多个此参数 可选
binlog-do-db 设置写入二进制日志的库,如设置则只有设置的库才能写入二进制日志。如需设置多个库可加多个此参数。 可选
replicate-ignore-db 设置slave不同步的库,如需设置多个库可加多个此参数。 可选
replicate-do-db 设置slave同步的库,如需设置多个库可加多个此参数。 可选
auto_increment_increment 自增增长值,如:id 设置为 auto_increment,则每次插入数据自增值为2,以1,3,5...或2,4,6...方式增长。 可选
auto_increment_offset 自增初始化便宜值,如果前一个id 为2 则 下一个为3 然后在这个基础上按auto_increment_increment 设置的值进行自增。 可选
master-host = 192.168.1.2 设置master 服务器地址,也可以启动时通过change master to 设置 。 可选
master-user = repl 设置更新用的帐号,也可以启动时通过change master to 设置 。 可选
master-password = 123 设置跟新用的密码,也可以启动时通过change master to 设置 。 可选
master-port = 3306 设置master端口,也可以启动时通过change master to 设置 。 可选
binlog-do-db、binlog-ignore-db、replicate_do_db、replicate_ignore_db 在使用时应注意,若加了以上参数,则在操作数据库是要避免跨库操作(例:update test.table1 set...)
如设置 binlog-do-db=test
use mysql;
update test.table1 set ......
第二句会执行但不会写入二进制日志,即从库不能同步,主从数据库出现差异
如设置 binlog_ignore_db=mysql
use mysql;
update test.table1 set ......
第二句会执行但不会写入二进制日志,即从库不能同步,主从数据库出现差异
如设置 replicate_do_db=test
use mysql;
update test.table1 set ......
第二句将不会被执行,即从库不能同步,主从数据库出现差异
如设置 replicate_ignore_db=mysql
use mysql;
update test.table1 set ......
第二句会被忽略执行,即从库不能同步,主从数据库出现差异
原因是设置binlog-do-db、binlog-ignore-db、replicate_do_db或replicate_ignore_db后,MySQL执行sql前检查的是当前默认数据库,所以跨库更新语句被忽略。
登录master数据库
mysql> show master status\G;
同理,查看slave的
master:
mysql>CHANGE MASTER TO
MASTER_HOST=‘192.1.31.162‘,
MASTER_USER=‘vnum‘,
MASTER_PASSWORD=‘[email protected]‘,
MASTER_PORT=3306,
MASTER_LOG_FILE= ‘my_log.00006‘,
MASTER_LOG_POS= 154,
MASTER_CONNECT_RETRY=10;
mysql>start slave;
mysql>show slave status\G;
salve:
mysql>CHANGE MASTER TO
MASTER_HOST=‘192.1.31.161‘,
MASTER_USER=‘vnum‘,
MASTER_PASSWORD=‘[email protected]‘,
MASTER_PORT=3306,
MASTER_LOG_FILE= ‘my_log.00018‘,
MASTER_LOG_POS= 154,
MASTER_CONNECT_RETRY=10;
mysql>start slave;
mysql>show slave status\G;
均出现两个yes,就证明主主配置成功
1.安装keepalived
# yum -y install keepalived
一般配置文件是/etc/keepalived/keepalived.conf
日志在/etc/log/messages
2.修改keepalived的配置
# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id mysql1
}
vrrp_instance VI_1 {
state BACKUP #指定keepalived的角色。两台均配置成BACKUP,这样可以根据优先级决定主从
interface ens160 # 指定HA监控的网络名称
virtual_router_id 51 # 主从保持一致,VRRP的唯一标识
priority 100 #优先级,选举master,主的比从的高
advert_int 1 #发varrp包的时间间隔,即多久选举一次master
nopreempt # 不抢占,即允许一个priority比较低的节点作为主,主要预防脑裂
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #指定VIP的地址
192.1.31.3
}
}
virtual_server 192.1.31.3 3306 { #设置虚拟服务器,需要指定虚拟IP端口,ip和端口之间空格隔开
delay_loop 2 #设置运行检查时间,单位秒
lb_algo rr # 设置后端调度算法,这里设置为rr
lb_kind DR # 设置LVS实现的算法
persistence_timeout 60 # 保持会话60S
peotocol TCP # TCP协议
real_server 192.1.31.161 3306 { # 本机ip 端口
weight 3 # 配置服务点的权值,权值大小用数字标识,数字越大,权值越高,权值是为了区分不同的服务器
notify_down /root/keepalived_check_mysql.sh # 检查mysql是否是down
TCP_CHECK {
connect_timeout 3 # 连接超时时间
nb_get_retry 3 # 重连次数
delay_before_retry 1 # 重连时间间隔
connect_port 3306 # 健康检查端口
}
}
}
同样的也需要修改mysql2的keepalived配置文件(下图中绿色部分为和mysql1不一样的地方)
可以使用scp命令把mysql1主机上配置好的keepalived.conf文件拷贝到server2主机,只需要改
router_id mysql1 ------> router_id mysql2
priority 100 -----> priority 90
nopreempt -----> # nopreempt
real_server 192.1.31.161 3306 -------> real_server 192.1.31.162 3306
3.写脚本
# cat /root/keepalived_check_mysql.sh
#!/bin/sh
# -------------------------------------------------------------------------------
# FileName: check_mysql.sh
# Revision: 1.0
# Date: 2019/05/07
# Author: salarh
# Email: [email protected]
MYSQL=/data/mysql/bin/mysql
MYSQL_HOST=localhost
MYSQL_USER=root
MYSQL_PASSWORD=‘[email protected]‘
CHECK_TIME=3
#mysql is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0
MYSQL_OK=1
check_mysql_helth (){
$MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p${MYSQL_PASSWORD} -e "show status;" &>/dev/null
if [ $? -eq 0 ] ;then
MYSQL_OK=1
else
MYSQL_OK=0
fi
return $MYSQL_OK
}
while [ $CHECK_TIME -ne 0 ]
do
check_mysql_helth
if [ $MYSQL_OK -eq 1 ] ; then
exit 0
fi
if [ $MYSQL_OK -eq 0 ] && [ $CHECK_TIME -eq 1 ];then
systemctl stop keepalived.service
exit 1
fi
let CHECK_TIME--
sleep 1
done
别忘了授权
# chmod +x /root/keepalived_check_mysql.sh
3.开启主从上的keepalived
# systemctl restart keepalived
在打开一个窗口查看日志
(192.1.31.3这个虚拟ip应该在192.1.31.161上)
4.观察,测试
1)登录192.1.31.3(vip)的数据库,进行数据插入,再去162这台机器上看是否同步
2)关闭161这台数据库,vip在162这台数据库上,进行数据插入,是正常的。
但当161这台机器上的mysql和keepalived开启后,161 就相当于备库了,除非162mysql或主机down了,他才能重登大位
最后一步就是做监控报警了
以上是关于mysql-----keepalived配置mysql的高可用的主要内容,如果未能解决你的问题,请参考以下文章
Mysql + Keepalived 实现双主互备高可用详细配置