生产环境中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 的整体发展思路是“借力开源.反哺开源” ...
随机推荐
- html5--5-11 绘制文字
html5--5-11 绘制文字 学习要点 掌握文字的绘制方法 文字的绘制方法 strokeText("文字",x,y,maxWith) 绘制(描边)空心文字 fillText(& ...
- Yii 表单验证规则---总结
Filter: 过滤,'filter'=>'trim',表示去空格 Required:必须的,表示不能为空 Match: 匹配正则,需要和pattern一起使用,定义正则表达式,'pattern ...
- python 基础之第三天
例子1:8位数的随机密码 #!/usr/bin/python # coding:utf-8 import string import random pwd = '' for i in range(8) ...
- Java笔记(五)
泛型:JDK1.5版本后出现的新特性.用于解决安全问题,是一个类型安全机制. 好处:将运行期间出现问题ClassCastException,转移到了编译时期.方便程序员解决问题,让运行时问题减少. 避 ...
- bzoj 4503 两个串 —— FFT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4503 推式子即可: 不知怎的调了那么久,应该是很清晰的. 代码如下: #include< ...
- Linux 下Input系统应用编程实战
作者:杨源鑫(也是我们的校园代理) 经授权转载于公众号嵌入式开发圈,有些许修改. 什么是input子系统?不管是什么操作系统,都有一个程序用于管理各种输入设备,哪些是输入设备?比如,电脑键盘.鼠标,智 ...
- CV_Assert
转:http://blog.csdn.net/ding977921830/article/details/46376847 Checks a condition at runtime and thro ...
- error: templates may not be ‘virtual’
模板函数不能是虚函数,原因如下: 首先呢,模板函数并不是函数,他需要特定的类型去实例化成为函数.你定义一个函数模板,是不生成任何函数的,只有当你用代码去调用它时,才会根据你的类型去实例化成为特定 ...
- sql之视图、触发器、函数、存储过程、事务
视图 # 视图也是一张表,但在data文件里只有表结构,没有表数据 # 不建议使用,扩展性差,程序需改变时,依赖的视图也要改变 # 视图牵涉到多张表时,视图中的记录不能修改. create view ...
- python数据分析笔记中panda(3)
1 按照空格将一列的内容分为两列 from pandas import Series; from pandas import DataFrame; from pandas import read_cs ...