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. OSI和TCP/IP

    OSI和TCP/IP 1.        OSI的七层网络结构(功能及特点) 1)  物理层:为数据链路层提供物理连接,在其上串行传送比特流,即所传送数据的单位是比特.此外,该层中还具有确定连接设备的 ...

  2. ffmpeg: error while loading shared libraries: libavdevice.so.52

    今天在编译安装ffmpeg的时候出现了题目中的问题,最终解决方案如下: errors: ffmpeg正常安装后执行ffmpeg时出现如下错误:ffmpeg: error while loading s ...

  3. QQ通信原理

    转载自http://blog.csdn.net/li_xiao_ming/article/details/8106857 下面有4个基本的问答: 问题一:为什么只要可以连上互联网的计算机都可以用QQ相 ...

  4. SPOJ MAXOR (分块 || 可持久化字典树 || 异或)(好题)

    You are given a sequence A[1], A[2], ..., A[N]. (0 ≤ A[i] < 231, 1 ≤ N ≤ 12000). A query is defin ...

  5. C++之构造函数、参数列表、析构函数

    参考自:https://blog.csdn.net/sunSHINEEzy/article/details/78122485 构造函数之默认构造函数(调用的构造函数不用传递参数) 两种实例化方式都是默 ...

  6. bzoj 4756 [Usaco2017 Jan]Promotion Counting——线段树合并

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4756 线段树合并裸题.那种返回 int 的与传引用的 merge 都能过.不知别的题是不是这 ...

  7. HttpClient入门教程

    HttpClient使用详解与实战一:https://www.jianshu.com/p/375be5929bed

  8. RetHad6.7离线通过.rpm安装

    必须有RetHad6.7系统的.ios镜像文件,我们需要的.rpm都在镜像的Packages里面,针对不能联网的,并且也适用与CentOS系统 1. 查看版本号 参考我的博客 https://www. ...

  9. java读取文件:二进制文件

    FileWriter只能接受字符串形式的参数,也就是说只能把内容存到文本文件.相对于文本文件,采用二进制格式的文件存储更省空间 InputStream用于按字节从输入流读取数据.其中的int read ...

  10. struts2-045漏洞浅析

    http://blog.csdn.net/rossrocket/article/details/67674290