生产环境中mysql+keepalive双主模式,keepalive守护进程实现双主切换提供数据库服务
mysql+keepalive实现浮动地址自动切换,由于keepalive无自带健康检查功能,所以必须自动编写健康检查守护进程(监控DB1和DB2数据库的监控状态,来保证浮动地址双机自动切换。)
一,部署说明及拓扑架构:

1、mysql安装在非root用户下(Mysql 版本5.7.18)
2、keepalive安装在root用户下
3、两台服务器安装mysql+keepalive,DB1真实ip地址为:10.112.188.70;DB2真实IP地址为:10.112.188.71;两台数据库除了建立同步账号rep1外,需建立用于守护进程账号check权限只有selecte。
4、DB1与DB2采用双主模式进行部署,但正常情况下只有DB1采用keepalive虚拟浮动IP:10.112.188.69提供服务;一旦DB2异常则由keepalive虚拟浮动IP地址:10.112.188.69自动切换至DB2主机上提供服务。
5、keepalive虚拟浮动地址切换思路(编写守护进程需要);
1)正常情况下只有DB1采用keepalive虚拟浮动IP:10.112.188.69提供服务;DB2中keepalive为stop状态。DB1采用守护进程检查自身mysql状态是否异常:mysql -ucheck-p'check1' -S /iddbs/mysql.sock -e "select version();"一旦DB1自身数据库异常则自动stop keepalive 否则保证 keepalive是启动状态;且还需监控浮动虚拟地址:10.112.188.69下的mysql是否能连接成功,若能连接不成功启动keepalive(备注:监控浮动虚拟地址主要用途是:当DB1异常发生且恢复后(此时DB2已经自动启动keepalive采用虚拟IP地址接管提供服务),监控DB2是否已经释放浮动IP,保证IP地址不冲突。)
2)正常情况下只有DB1采用keepalive虚拟浮动IP:10.112.188.69提供服务;DB2中keepalive为stop状态。DB2采用守护进程监控DB1(真实IP:10.112.188.70)Mysql数据状态(是否异常)采用mysql -ucheck -p'check1' -h 10.112.188.70 -e "select version();" 一旦DB1中MYSQL数据库出现异常(或者宕机)DB2则启动keepalive并浮动VIP为:10.112.188.69
6、keepalive浮动地址切换逻辑图:

二、mysql双主部署及权限账号建立:
1、同步账号建立:
在10.112.188.70上建立:
mysql> grant replication slave on *.* to 'rep1'@'10.112.188.71' identified by 'rep1';
在10.112.188.71
mysql> grant replication slave on *.* to 'rep1'@'10.112.188.70' identified by 'rep1';
2、守护进程账号建立:
在DB1和DB2上均建立守护进程状态查询权限,只授予select:
mysql> GRANT select ON *.* TO 'check'@'10.112.188.70' identified by 'check';
mysql> GRANT select ON *.* TO 'check'@'10.112.188.71' identified by 'check';
3、同步操作以下在DB2上操作:
1)在DB1和DB2库配置文件中my.cnf开启log-bin
server-id = 1
# Uncomment the following if you want to log updates
log-bin=/iddbsdata/mysql-bin
2)mysql> show variables like 'log%'; #查看主库的binlog开关是否生效(ON状态)
+---------------------------------+---------------------------------------------+
| Variable_name | Value |
+---------------------------------+---------------------------------------------+
| log | OFF |
| log_bin | ON |
3)查看binlog节点位置。
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 | 1160 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
4)同步(以10.112.188.71同步10.112.188.70为例,及DB2同步DB1):
mysql>CHANGE MASTER TO
>MASTER_HOST='10.112.188.71',
>MASTER_PORT=3307,
>MASTER_USER='rep1',
>MASTER_PASSWORD='rep1',
>MASTER_LOG_FILE='mysql-bin.000002',
>MASTER_LOG_POS=1160;
4、在DB1上重复进行3操作。
5、注意,由于DB1和DB2属于是新库(新安装无数据),在同步之前省去了mysqldump,如果是有数据的数据库必须进行mysqldump操作才能进行数据同步。
三、keepalive部署(需在root用户下)
1、安装部署:
yum install -y openssl openssl-devel
gunzip keepalived-1.2.12.tar.gz
tar -xvf keepalived-1.2.12.tar
cd keepalived-1.2.12
./configure --prefix=/usr/local/keepalived
make
make install
ls -lart /usr/local/keepalived/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived
cd /etc
cp keepalived.conf keepalived.conf.bak
2、配置文件
[root@xqcldb001 /etc/keepalived]#cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
# notification_email_from Alexandre.Cassen@firewall.loc
# smtp_server 192.168.200.1
# smtp_connect_timeout
router_id mysql
} vrrp_instance VI_1 {
state BACKUP
interface bond0
virtual_router_id
priority
nopreempt
advert_int
authentication {
auth_type PASS
auth_pass
}
virtual_ipaddress {
#10.208.218.99 dev eth0 label eth0:
10.112.188.69/
}
} virtual_server 10.112.188.69 {
delay_loop
lb_algo rr
lb_kind NAT
net_mask 255.255.255.0
persistence_timeout
protocol TCP real_server 10.112.188.70 {
weight
# notify_down /iddbs/app/check_mysql.sh
TCP_CHECK {
connect_timeout
nb_get_retry
connect_port
}
}
}
DB1
[root@xqcldb002 /etc/keepalived]#cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
# notification_email_from Alexandre.Cassen@firewall.loc
# smtp_server 192.168.200.1
# smtp_connect_timeout
router_id mysql
} vrrp_instance VI_1 {
state BACKUP
interface bond0
virtual_router_id
priority
nopreempt
advert_int
authentication {
auth_type PASS
auth_pass
}
virtual_ipaddress {
#10.208.218.99 dev eth0 label eth0:
10.112.188.69/
}
} virtual_server 10.112.188.69 {
delay_loop
lb_algo rr
lb_kind NAT
net_mask 255.255.255.0
persistence_timeout
protocol TCP real_server 10.112.188.71 {
weight
# notify_down /iddbs/app/check_mysql.sh
TCP_CHECK {
connect_timeout
nb_get_retry
connect_port
}
}
}
DB2
备注经测试VRRP state BACKUP两台必须均为BACKUP,否则一旦重启keepalive会导致网卡IP错误。
四、keepalive守护进程
#!/bin/sh
while true
do /iddbs/bin/mysql -uroot -p'Siina@678' -S /iddbsdata/mysql.sock -e "select version();">/dev/null >&
if [ $? -eq ] then
/etc/init.d/keepalived start >/dev/null >&
else
/etc/init.d/keepalived stop >/dev/null >& fi
sleep /iddbs/bin/mysql -h10.112.188. -ucheck -p'check1' -P -e "select version();">/dev/null >& if [ $? -eq ]
then
/etc/init.d/keepalived stop >/dev/null >&
else
/etc/init.d/keepalived start >/dev/null >&
fi
sleep
done
DB1守护进程
#!/bin/sh
while true
do /iddbs/bin/mysql -h10.112.188. -ucheck -p'check1' -P -e "select version();">/dev/null >& if [ $? -eq ]
then
/etc/init.d/keepalived stop >/dev/null >&
sleep
else
/etc/init.d/keepalived start >/dev/null >& fi
sleep
done
DB2守护进程
守护进程启动:[root@xqcldb001 ~]#sh check_mysql.sh &
五、双主同步及模拟数据库异常keepalive自动切换浮动IP
1、正常情况下:
正常情况在备用服务器上bond0网卡上只有一个地址。
xqcldb002:/iddbs>ip a
10: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 70:79:90:a1:0b:48 brd ff:ff:ff:ff:ff:ff
inet 10.112.188.71/26 brd 10.112.188.127 scope global bond0
inet6 fe80::7279:90ff:fea1:b48/64 scope link
valid_lft forever preferred_lft forever
正常情况在主服务器上bond0网卡上有一个地址和一个虚拟IP地址
xqcldb001:/iddbs>ip a
10: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 70:79:90:7d:bf:3e brd ff:ff:ff:ff:ff:ff
inet 10.112.188.70/26 brd 10.112.188.127 scope global bond0
inet 10.112.188.69/26 scope global secondary bond0
inet6 fe80::7279:90ff:fe7d:bf3e/64 scope link
valid_lft forever preferred_lft forever
2、正常情况下:10.112.188.70数据库异常(模拟宕机):
此种情况下70(DB1)bond0网卡上有一个真实地址,已经无浮动IP地址10.112.188.69
xqcldb001:/iddbs>sh mysql_start stop
stop Mysql. [ OK ]
xqcldb001:/iddbs>ip a
10: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 70:79:90:7d:bf:3e brd ff:ff:ff:ff:ff:ff
inet 10.112.188.70/26 brd 10.112.188.127 scope global bond0
inet6 fe80::7279:90ff:fe7d:bf3e/64 scope lin
71(DB2)bond0网卡上有一个真实地址,浮动IP地址10.112.188.69
xqcldb002:/iddbs>ip a
10: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 70:79:90:a1:0b:48 brd ff:ff:ff:ff:ff:ff
inet 10.112.188.71/26 brd 10.112.188.127 scope global bond0
inet 10.112.188.69/26 scope global secondary bond0
inet6 fe80::7279:90ff:fea1:b48/64 scope link
valid_lft forever preferred_lft forever
3、数据库恢复:
xqcldb001:/iddbs>sh mysql_start start
starting Mysql.... [ OK ]
xqcldb001:/iddbs>
xqcldb001:/iddbs>
xqcldb001:/iddbs>ps -ef | grep mysql
root 2182 24200 0 11:30 pts/2 00:00:00 sh check_mysql.sh #守护进程
iddbs 4485 1 0 11:35 pts/2 00:00:00 /bin/sh /iddbs/bin/mysqld_safe --defaults-file=/iddbs/my.cnf
iddbs 4890 4485 93 11:35 pts/2 00:00:06 /iddbs/bin/mysqld --defaults-file=/iddbs/my.cnf --basedir=/iddbs --datadir=/iddbsdata --plugin-dir=/iddbs/lib/plugin --log-error=/iddbsdata/mysql-error.log --pid-file=/iddbsdata/mysql.pid --socket=/iddbsdata/mysql.sock --port=3307
iddbs 4949 3619 0 11:36 pts/2 00:00:00 grep mysql
地址已经自动切换至DB1:
xqcldb001:/iddbs>ip a
10: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 70:79:90:7d:bf:3e brd ff:ff:ff:ff:ff:ff
inet 10.112.188.70/26 brd 10.112.188.127 scope global bond0
inet 10.112.188.69/26 scope global secondary bond0
inet6 fe80::7279:90ff:fe7d:bf3e/64 scope link
valid_lft forever preferred_lft forever
DB2只有真实地址而无虚拟浮动地址:
xqcldb002:/iddbs>ip a
10: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 70:79:90:a1:0b:48 brd ff:ff:ff:ff:ff:ff
inet 10.112.188.71/26 brd 10.112.188.127 scope global bond0
inet6 fe80::7279:90ff:fea1:b48/64 scope link
valid_lft forever preferred_lft forever
生产环境中mysql+keepalive双主模式,keepalive守护进程实现双主切换提供数据库服务的更多相关文章
- 生产环境中mysql数据库由主从关系切换为主主关系
目录 一.清除原从数据库数据及主从关系 1.1.关闭主从数据库原有的主从关系 1.2.清除从数据库原有数据 二.将主库上的数据备份到从库 2.1.备份主库数据到从库 2.2.在从库使用tsc.sql文 ...
- 【原】Storm Local模式和生产环境中Topology运行配置
Storm入门教程 1. Storm基础 Storm Storm主要特点 Storm基本概念 Storm调度器 Storm配置 Guaranteeing Message Processing(消息处理 ...
- 生产环境中CentOS7部署NET Core应用程序
NET Core应用程序部署至生产环境中(CentOS7) 阅读目录 环境说明 准备你的ASP.NET Core应用程序 安装CentOS7 安装.NET Core SDK for CentOS7. ...
- 生产环境中 Ngx_lua 使用技巧和应用的范例
生产环境中 Ngx_lua 使用技巧和应用的范例 时间 -- :: 51CTO技术博客 原文 http://rfyiamcool.blog.51cto.com/1030776/1252501 主题 L ...
- 理解Docker(6):若干企业生产环境中的容器网络方案
本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...
- 生产环境中使用Docker Swarm的一些建议
译者按: 实践中会发现,生产环境中使用单个Docker节点是远远不够的,搭建Docker集群势在必行.然而,面对Kubernetes, Mesos以及Swarm等众多容器集群系统,我们该如何选择呢?它 ...
- Kubernetes 在生产环境中常用架构
Kubernetes 在生产环境中常用架构 首先,我们来梳理下Kubernetes生产架构,其设计适用于绝大多数环境.如下图所示 在该架构中,我们可以将其分为四层,如下: Client层:即Kuber ...
- Kubernetes用户指南(三)--在生产环境中使用Pod来工作、管理部署
一.在生产环境中使用Pod来工作 本节将介绍一些在生产环境中运行应用非常有用的功能. 1.持久化存储 容器的文件系统只有当容器正常运行时有效,一旦容器奔溃或者重启,所有对文件系统的修改将会丢失,从一个 ...
- Dubbo Mesh 在闲鱼生产环境中的落地实践
本文作者至简曾在 2018 QCon 上海站以<Service Mesh 的本质.价值和应用探索>为题做了一次分享,其中谈到了 Dubbo Mesh 的整体发展思路是“借力开源.反哺开源” ...
随机推荐
- 理解数学公式与numpy矩阵运算
1.矩阵的初始化 (1)创建一个 3*5的全0矩阵和全1矩阵 import numpy as np myzero = np.zeros([3,5]) print myzero myones = np. ...
- Ubuntu安装基础教程
作者:TeliuTe 来源:基础教程网 二十三.安装Ubuntu14.04 返回目录 下一课 14.04 版安装与前面版本类似,学习中遇到不清楚的地方,可以参考一下前面的内容,操作中注意细心,下面来看 ...
- poj分类解题报告索引
图论 图论解题报告索引 DFS poj1321 - 棋盘问题 poj1416 - Shredding Company poj2676 - Sudoku poj2488 - A Knight's Jou ...
- hdu-5596 GTW likes gt(模拟+优先队列)
题目链接: GTW likes gt Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- Map容器线程安全问题
一.HashMap在非线程安全的环境下使用会出现什么样的问题? public class HashMapMultiThread { static Map<String,String> ma ...
- MSTAR GUI
1.架构 WIN32 SDK ACT->CTL->API->GE/GOP ACT: Customized logic parts CTL: Behavior widgets API: ...
- jQuery.validator.addMethod方法的使用
该方法有三个api接口参数,name,method,messages addMethod(name,method,message)方法 参数 name 是添加的方法的名字. 参数 method 是一个 ...
- SetConsoleCtrlHandler() -- 设置控制台信号处理函数
http://www.groad.net/bbs/thread-8253-1-1.html 当你在命令行里工作时,经常会输入 Ctrl-C 这个组合键以停止程序的运行.SetConsoleCtrlHa ...
- Identity Server 4 原理和实战(完结)_单点登录实例(添加Flask客户端,Express.js的API)
idp授权资源的添加 如果下面哪个客户端想访问api2这个资源的话 就把它写上scope里面就可以了 nodeJS的客户端 python的库 MVC客户端分别访问API和API2 python客户端演 ...
- C# in查询
一.前言 在做项目中,我们会经常使用到 in 查询语句.那么如果我们用 EF 和 Linq 怎么写?接下来看代码 二.实例 我使用的是区域查询的例子,基本的 sql 语句如下: SELECT * FR ...