文档章节

利用keepalive+mysql replication 实现数据库的高可用

五大三粗
 五大三粗
发布于 2015/04/20 17:11
字数 1184
阅读 60
收藏 1
点赞 0
评论 0
利用mysql 自带的replication 和 keepalive 提供的虚拟IP和故障检查来实现数据库的高可用
原理如下:
       mysql 版本为5.5,设置为单向主从,开启半同步复制
       mysql 主从机器上都安装keepalived,并配置keepalived文件
       mysql 的检测通过:mysql_check.sh 实现(检测进程,确认mysql宕机,关闭keepalived)
       当keepalived停止后,执行stop.sh脚本(更改前端密码,设置参数,保证数据不丢失,查看是否有写操作,1分钟后,强制退出) ==> 这个脚本一般是手动停止keepalived时,执行的脚本
       当keepalive 的状态值为master时,执行master.sh脚本(判断同步是否执行完毕,等待1分钟,不管是否执行完毕,都停止主从,更改前端的程序连接的账号密码,并记录切换以后的日志和pos点)
       当keepalive 的状态值为backup时,执行backup.sh脚本
原理图如下:
keepalived+mysql replication
项目实验环境:
       mysql version:mysql 5.5.37
       keepalived:keepalived-1.2.13
       mysql master:10.207.130.50
       mysql slave:10.207.130.60
       vip:10.207.130.100
项目实施:
mysql的主从配置,半同步复制就不演示,各位自行配置
下面主要配置keepalived和一些脚本(以下步骤,两台keepalived都需执行,这里只演示1台机器)
1.安装配置keepalived
[root @localhost keepalived-1.2.13]# ./configure
[root @localhost keepalived-1.2.13]# make && make install

[root@localhost keepalived-1.2.13]# cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/

[root @localhost keepalived-1.2.13]# cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
[root @localhost keepalived-1.2.13]# mkdir /etc/keepalived
[root@localhost keepalived-1.2.13]# cp /usr/local/etc/keepalived/keepalived.conf  /etc/keepalived/
[root@localhost keepalived-1.2.13]# cp /usr/local/sbin/keepalived /usr/sbin/
[root@localhost keepalived-1.2.13]# chkconfig --add keepalived
[root@localhost keepalived-1.2.13]# chkconfig --level 345 keepalived on
[root@localhost keepalived-1.2.13]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@localhost keepalived-1.2.13]# mkdir /app/daily_test/shell
2.修改 :keepalived的配置文件,指定运行脚本,虚拟ip等
[root@localhost keepalived-1.2.13]# vim /etc/keepalived/keepalived.conf
global_defs {
router_id KeepAlive_Mysql
}vrrp_script check_run {
script "/app/daily_test/shell/mysql_check.sh"
interval 300
}

vrrp_sync_group VG1 {
group {
VI_1
}
}

vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
check_run
}

notify_master /app/daily_test/shell/master.sh
notify_master /app/daily_test/shell/backup.sh
notify_master /app/daily_test/shell/stop.sh
virtual_ipaddress {
10.207.130.59
}

}

3.修改 :keepalived的配置文件,指定运行脚本,虚拟ip等
[root@localhost keepalived-1.2.13]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id KeepAlive_Mysql
}vrrp_script check_run {
script "/app/daily_test/shell/mysql_check.sh"
interval 300
}

vrrp_sync_group VG1 {
group {
VI_1
}
}

vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
check_run
}

notify_master /app/daily_test/shell/master.sh
notify_master /app/daily_test/shell/backup.sh
notify_master /app/daily_test/shell/stop.sh
virtual_ipaddress {
10.207.130.59
}

}

4.编写在keepalived里指定需要执行的脚本
(1). mysql检测脚本:mysql_check.sh
[root@localhost shell]# vim mysql_check.sh
count=1
while true
do
mysql -e "show status;">/dev/null 2>&1
i=$?
ps aux | grep mysqld | grep -v grep > /dev/null 2>&1
j=$?
if [ $i = 0 ] && [ $j = 0 ];then
exit 0
else
if [ $i = 1 ] && [ $j = 0 ];then
exit 0
else
if [ $count -gt 5 ];then
break
fi
let count++
continue
fi
fi
done
/etc/init.d/keepalived stop
(2).当mysql状态为master时的执行脚本:master.sh
[root@localhost shell]# vim master.sh
#!/bin/bash
master_Log_File=$(mysql -e "show slave status\G" |grep -w master_Log_File |awk -F":" '{print $2}')
Relay_Log_File=$(mysql -e "show slave status\G" |grep -w Relay_master_Log_File |awk -F":" '{print $2}')
Read_master_Log_Pos=$(mysql -e "show slave status\G" |grep -w Read_master_Log_Pos |awk -F":" '{print $2}')
Exec_master_Log_Pos=$(mysql -e "show slave status\G" |grep -w Exec_master_Log_Pos |awk -F":" '{print $2}')
i=1
while true
do
if [ $master_Log_File = $Relay_Log_File ] && [ $Read_master_Log_Pos = $Exec_master_Log_Pos ];then
echo "ok"
break
else
sleep 1
if [ $i -gt 60 ];then
break
fi
continue
let i++
fi
done
mysql -e "stop slave;"
mysql -e "set global innodb_support_xa=1;"
mysql -e "set global sync_binlog=0;"
mysql -e "set global innodb_flush_log_at_trx_commit=2;"
mysql -e "set global event_scheduler=1;"
mysql -e "flush logs;grant all privileges on *.* to 'admin'@'%' identified by '123456';flush privileges;"
mysql -e "show master status;" > /tmp/master_status_$(date "+%y%m%d-%H%M").txt
(3).当mysql状态为backup时的执行脚本:backup.sh
[root@localhost shell]# vim backup.sh
#!/bin/bash
mysql -e "grant all privileges on *.* to 'admin'@'%' identified by '123456';flush privileges;"
mysql -e "set global event_scheduler=0;"
mysql -e "set global innodb_support_xa=1;"
mysql -e "set global sync_binlog=0;"
mysql -e "set global innodb_flush_log_at_trx_commit=2;"
(4)当keepalived停止后,执行的脚本: stop.sh
[root@localhost shell]# vim stop.sh
#!/bin/bash
mysql -e "grant all privileges on *.* to 'admin'@'%' identified by '123456';flush privileges;"
mysql -e "set global innodb_support_xa=1;"
mysql -e "set global sync_binlog=1;"
mysql -e "set global innodb_flush_log_at_trx_commit=1;"
i=1
while true
do
M_File1=$(mysql -e "show master status\G" | grep -w File | awk -F":" '{print $2}')
M_Position1=$(mysql -e "show master status\G" | grep -w Position | awk -F":" '{print $2}')
sleep 1
M_File2=$(mysql -e "show master status\G" | grep -w File | awk -F":" '{print $2}')
M_Position2=$(mysql -e "show master status\G" | grep -w Position | awk -F":" '{print $2}')
if [ $M_File1 = $M_File2 ] && [ $M_Position1 = $M_Position2 ];then
echo "ok"
break
else
sleep 1
if [ $i -gt 60 ];then
break
fi
continue
let i++
fi
done
5.以上脚本,在主从机器上都需要有
6.测试的话,可以关掉mysql或者关掉keepalived,看利用虚拟IP是否可以访问,这里就不详细演示,有问题,可联系
建议关闭mysql,然后看keepalived是否停止(这个需要几秒钟);然后,在新主的tmp目录下,是否有关master日志的记录文件,如果都有,基本脚本就都执行了
现在可以考虑压测,数据丢失情况的测试

© 著作权归作者所有

共有 人打赏支持
五大三粗
粉丝 156
博文 2211
码字总数 4560008
作品 0
广州
程序员
浅析开源数据库 MySQL 架构

数据库是所有应用系统的核心,故保证数据库稳定、高效、安全地运行是所有企业日常工作的重中之重。数据库系统一旦出现问题无法提供服务,有可能导致整个系统都无法继续工作。所以,一个成功的...

HongJack
2017/09/14
0
0
究竟啥才是互联网架构“高可用”

原创 2016-12-05 58沈剑 架构师之路 一、什么是高可用 高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。 假设系...

毛爷爷夸我帅
2016/12/06
10
0
互联网高可用架构技术实践

一、什么是高可用 高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。 假设系统一直能够提供服务,我们说系统的可...

LionelShen
2016/12/06
45
0
浅析开源数据库MySQL架构

数据库是所有应用系统的核心,故保证数据库稳定、高效、安全地运行是所有企业日常工作的重中之重。数据库系统一旦出现问题无法提供服务,有可能导致整个系统都无法继续工作。所以,一个成功的...

个推君
2017/09/08
0
0
MySQL高可用在网易的最佳应用与实践

本文根据DBAplus社群第102期线上分享整理而成。 主题简介: 1、常见的MySQL高可用架构 2、分布式数据库高可用实践 3、基于keepalive的MySQL高可用改造 大家好,我是来自杭州研究院的潘威,今...

潘威
2017/05/08
0
0
lvs-nat模型的实现 和 lvs-dr模型的实现

1.使用NAT模型的TCP协议类型的lvs服务负载均衡一个php应用,如Discuz!论坛或者phpMyAdmin; 2.使用DR模型的FWM类型的lvs服务负载均衡一个php应用,如Discuz!论坛或者phpMyAdmin; 注意:以上...

刘景宇
06/08
0
0
Exchange 2013新特性之高可用篇

微软在Exchange高可用方面方案上面随着Exchange 2013的推出,DAG方案变得越来越成熟了。Exchange的高可用方案在exchange2003到Exchange 2010三个版本中变化非常大,在Exchange 2003的时代,微...

taotie_ksl
06/26
0
0
2-06 使用网络存储SAN和NAS

网络存储适用的场景 顺序io的性能还是不错的,对随机io的性能比较慢,往往性能瓶颈出现在随机io上,所以不适合存放mysql数据库数据存放的文件,用网络存储实现数据库的高可用性,比如有两台服...

skinglzw
01/29
0
0
三流程序员与一流程序员之间的区别,看看你是属于哪一类?

源码系列 手写spring mvc框架 基于Spring JDBC手写ORM框架 实现自己的MyBatis Spring AOP实战之源码分析 Spring IOC高级特性应用分析 ORM框架底层实现原理剖析 手写Spring MVC框架实现 手把手...

茶轴的青春
04/17
0
0
MySQL深入10-利用Ameoba实现读写分离

本篇博文主要介绍利用Ameoba实现MySQL的读写分离功能,而MySQL官方的mysql-proxy需要自己编写复杂的lua脚本才能实现同样的功能,故个人还是倾向使用amoeba哦; ============================...

xxrenzhe11
2014/05/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

shell中的函数、shell中的数组、告警系统需求分析

shell中的函数 格式: 格式: function f_name() { command } 函数必须要放在最前面 示例1(用来打印参数) 示例2(用于定义加法) 示例3(用于显示IP) shell中的数组 shell中的数组1 定义数...

Zhouliang6
53分钟前
2
0
用 Scikit-Learn 和 Pandas 学习线性回归

      对于想深入了解线性回归的童鞋,这里给出一个完整的例子,详细学完这个例子,对用scikit-learn来运行线性回归,评估模型不会有什么问题了。 1. 获取数据,定义问题     没有...

wangxuwei
今天
1
0
MAC安装MAVEN

一:下载maven压缩包(Zip或tar可选),解压压缩包 二:打开终端输入:vim ~/.bash_profile(如果找不到该文件新建一个:touch ./bash_profile) 三:输入i 四:输入maven环境变量配置 MAVEN_HO...

WALK_MAN
今天
0
0
33.iptables备份与恢复 firewalld的9个zone以及操作 service的操作

10.19 iptables规则备份和恢复 10.20 firewalld的9个zone 10.21 firewalld关于zone的操作 10.22 firewalld关于service的操作 10.19 iptables规则备份和恢复: ~1. 保存和备份iptables规则 ~2...

王鑫linux
今天
2
0
大数据教程(2.11):keeperalived+nginx高可用集群搭建教程

上一章节博主为大家介绍了目前大型互联网项目的系统架构体系,相信大家应该注意到其中很重要的一块知识nginx技术,在本节博主将为大家分享nginx的相关技术以及配置过程。 一、nginx相关概念 ...

em_aaron
今天
1
0
Apache Directory Studio连接Weblogic内置LDAP

OBIEE默认使用Weblogic内置LDAP管理用户及组。 要整理已存在的用户及组,此前办法是导出安全数据,文本编辑器打开认证文件,使用正则表达式获取用户及组的信息。 后来想到直接用Apache Dire...

wffger
今天
2
0
HFS

FS,它是一种上传文件的软件。 专为个人用户所设计的 HTTP 档案系统 - Http File Server,如果您觉得架设 FTP Server 太麻烦,那么这个软件可以提供您更方便的档案传输系统,下载后无须安装,...

garkey
今天
1
0
Java IO类库之BufferedInputStream

一、BufferedInputStream介绍 /** * A <code>BufferedInputStream</code> adds * functionality to another input stream-namely, * the ability to buffer the input and to * sup......

老韭菜
今天
0
0
STM 32 窗口看门狗

http://bbs.elecfans.com/jishu_805708_1_1.html https://blog.csdn.net/a1985831055/article/details/77404131...

whoisliang
昨天
1
0
Dubbo解析(六)-服务调用

当dubbo消费方和提供方都发布和引用完成后,第四步就是消费方调用提供方。 还是以dubbo的DemoService举例 -- 提供方<dubbo:application name="demo-provider"/><dubbo:registry address="z...

青离
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部