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守护进程实现双主切换提供数据库服务的更多相关文章

  1. 生产环境中mysql数据库由主从关系切换为主主关系

    目录 一.清除原从数据库数据及主从关系 1.1.关闭主从数据库原有的主从关系 1.2.清除从数据库原有数据 二.将主库上的数据备份到从库 2.1.备份主库数据到从库 2.2.在从库使用tsc.sql文 ...

  2. 【原】Storm Local模式和生产环境中Topology运行配置

    Storm入门教程 1. Storm基础 Storm Storm主要特点 Storm基本概念 Storm调度器 Storm配置 Guaranteeing Message Processing(消息处理 ...

  3. 生产环境中CentOS7部署NET Core应用程序

    NET Core应用程序部署至生产环境中(CentOS7) 阅读目录 环境说明 准备你的ASP.NET Core应用程序 安装CentOS7 安装.NET Core SDK for CentOS7. ...

  4. 生产环境中 Ngx_lua 使用技巧和应用的范例

    生产环境中 Ngx_lua 使用技巧和应用的范例 时间 -- :: 51CTO技术博客 原文 http://rfyiamcool.blog.51cto.com/1030776/1252501 主题 L ...

  5. 理解Docker(6):若干企业生产环境中的容器网络方案

    本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...

  6. 生产环境中使用Docker Swarm的一些建议

    译者按: 实践中会发现,生产环境中使用单个Docker节点是远远不够的,搭建Docker集群势在必行.然而,面对Kubernetes, Mesos以及Swarm等众多容器集群系统,我们该如何选择呢?它 ...

  7. Kubernetes 在生产环境中常用架构

    Kubernetes 在生产环境中常用架构 首先,我们来梳理下Kubernetes生产架构,其设计适用于绝大多数环境.如下图所示 在该架构中,我们可以将其分为四层,如下: Client层:即Kuber ...

  8. Kubernetes用户指南(三)--在生产环境中使用Pod来工作、管理部署

    一.在生产环境中使用Pod来工作 本节将介绍一些在生产环境中运行应用非常有用的功能. 1.持久化存储 容器的文件系统只有当容器正常运行时有效,一旦容器奔溃或者重启,所有对文件系统的修改将会丢失,从一个 ...

  9. Dubbo Mesh 在闲鱼生产环境中的落地实践

    本文作者至简曾在 2018 QCon 上海站以<Service Mesh 的本质.价值和应用探索>为题做了一次分享,其中谈到了 Dubbo Mesh 的整体发展思路是“借力开源.反哺开源” ...

随机推荐

  1. 客户端调用cxf发布的服务

    import java.util.ArrayList; import java.util.List; import javax.xml.namespace.QName; import org.apac ...

  2. servlet与jsp理论知识讲解

    servlet是java服务器端编程,是运行在服务器上的.不同于以前的java小程序.                                                         ...

  3. 【转载】malloc和new

    1.malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存2.对于非内部数据类型的对象而言,光用maloc/free无法满足动态对 ...

  4. bootstrap 学习笔记(4)---- 按钮

    平常我们自己写按钮,这次不用我们自己写 了,直接应用bootstrap中的按钮样式,就能设计出很漂亮的按钮样式.接下来就让我们一起学习吧. 1.可以作为按钮使用的标签或元素:<a>< ...

  5. JS自动让手机调出软键盘,进行输入

    $('.search').click(function(){ $('input[type=text]').focus(); //让input框自动聚焦就可以让手机自动调出软键盘 });

  6. 使用BFG清除git仓库中的隐私文件或大文件

    使用git时间不长,在调机械臂项目的时候,由于对TwinCAT3和vs的机制不太了解,没有添加很好的忽略文件(.gitignore).造成git仓库包含了很多没有用的文件,例如vs的sdf文件,Twi ...

  7. NodeJS REST API with MySQL and Express

    http://www.nodewiz.biz/nodejs-rest-api-with-mysql-and-express/ NPM Modules Express felixge/node-mysq ...

  8. HDFS源码分析三-DataNode实现

    3. DataNode 实现( 未完待续 )

  9. 使用jdk获取网页

    参考:https://www.zhihu.com/question/30626103 由于例子比较老了,现在的百度抓不到完整的页面了 import java.io.BufferedReader; im ...

  10. Identity Server 4 原理和实战(完结)_----选看 OpenId Connect 简介

    Identity Procider:身份提供商