生产环境中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 的整体发展思路是“借力开源.反哺开源” ...
随机推荐
- OSI和TCP/IP
OSI和TCP/IP 1. OSI的七层网络结构(功能及特点) 1) 物理层:为数据链路层提供物理连接,在其上串行传送比特流,即所传送数据的单位是比特.此外,该层中还具有确定连接设备的 ...
- ffmpeg: error while loading shared libraries: libavdevice.so.52
今天在编译安装ffmpeg的时候出现了题目中的问题,最终解决方案如下: errors: ffmpeg正常安装后执行ffmpeg时出现如下错误:ffmpeg: error while loading s ...
- QQ通信原理
转载自http://blog.csdn.net/li_xiao_ming/article/details/8106857 下面有4个基本的问答: 问题一:为什么只要可以连上互联网的计算机都可以用QQ相 ...
- SPOJ MAXOR (分块 || 可持久化字典树 || 异或)(好题)
You are given a sequence A[1], A[2], ..., A[N]. (0 ≤ A[i] < 231, 1 ≤ N ≤ 12000). A query is defin ...
- C++之构造函数、参数列表、析构函数
参考自:https://blog.csdn.net/sunSHINEEzy/article/details/78122485 构造函数之默认构造函数(调用的构造函数不用传递参数) 两种实例化方式都是默 ...
- bzoj 4756 [Usaco2017 Jan]Promotion Counting——线段树合并
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4756 线段树合并裸题.那种返回 int 的与传引用的 merge 都能过.不知别的题是不是这 ...
- HttpClient入门教程
HttpClient使用详解与实战一:https://www.jianshu.com/p/375be5929bed
- RetHad6.7离线通过.rpm安装
必须有RetHad6.7系统的.ios镜像文件,我们需要的.rpm都在镜像的Packages里面,针对不能联网的,并且也适用与CentOS系统 1. 查看版本号 参考我的博客 https://www. ...
- java读取文件:二进制文件
FileWriter只能接受字符串形式的参数,也就是说只能把内容存到文本文件.相对于文本文件,采用二进制格式的文件存储更省空间 InputStream用于按字节从输入流读取数据.其中的int read ...
- struts2-045漏洞浅析
http://blog.csdn.net/rossrocket/article/details/67674290