keepalive配置mysql自动故障转移

原创 2016年02月29日 02:16:52
  • 2640

本文先配置了一个双master环境,互为主从,然后通过Keepalive配置了一个虚拟IP,客户端通过虚拟IP连接master1,当master1宕机,自动切换到master2。一次只能连接其中一个master进行读写,所以是active-passive模式。

一 Mysql主主复制搭建

 

1.1 实验环境

两台机器事先都已经装好了mysql单实例。

二者的端口号需要保持一致,否则在最后用vip连接的时候,不能使用相同端口号连接。

1.2 实验步骤

 

1.2.1 修改配置文件

修改master1:

在[mysqld]下面添加:

server-id =  1

relay-log=/data/server/mysql_3307/binlog/ZabbixServer-relay-bin

relay-log-index=/data/server/mysql_3307/binlog/ZabbixServer-relay-bin.index

auto-increment-offset = 1

auto-increment-increment = 2

log-slave-updates=true

修改master2:

在[mysqld]下面添加:

server-id =  3

relay-log =/data/server/mysql/binlog/single-relay-bin

relay-log-index=/data/server/mysql/binlog/single-relay-bin.index

auto-increment-offset = 2

auto-increment-increment = 2

log-slave-updates=true

添加auto-increment-offset那两项,是为了避免在MySQL INSERT时主键冲突。

修改完后记得重启mysql

1.2.2 建复制用户

分别在两台mysql上执行

GRANT REPLICATION SLAVE ON *.* TO 'RepUser'@'%'identified by 'beijing';

1.2.3 指向master

两台服务器均为新建立,且无其它写入操作,各服务器只需记录当前自己二进制日志文件及事件位置,以之作为另外的服务器复制起始位置即可。否则,需要先备份主库,在备库进行恢复,从而保持数据一致,然后再指向master。

Master1:

mysql> show master status;

+------------------+----------+--------------+------------------+-------------------+

| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+-------------------+

| mysql-bin.000001 |      302|              |                  |                   |

+------------------+----------+--------------+------------------+-------------------+

1 row in set (0.00 sec)

Master2:

mysql> show master status;

+------------------+----------+--------------+------------------+-------------------+

| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+-------------------+

| mysql-bin.000001 |      120 |              |                  |                   |

+------------------+----------+--------------+------------------+-------------------+

1 row in set (0.00 sec)

#Master1指向Master2

  1. CHANGE MASTER TO MASTER_USER='RepUser',MASTER_HOST='192.168.1.21',MASTER_PASSWORD='beijing',MASTER_PORT=3307,MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=120;

#Master2指向Master1

  1. CHANGE MASTER TO MASTER_USER='RepUser',MASTER_HOST='192.168.1.22',MASTER_PASSWORD='beijing', MASTER_PORT=3307,MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=302;

1.2.4 分别启动slave

start slave ;

确保show slave status

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

测试两边是否同步,略。

二:配置keepalived

 

1 keepalive安装

分别在master1,master2上安装keepalive

  1. yum install -y popt-devel
  2. cd /usr/local/src
  3. wget http://www.keepalived.org/software/keepalived-1.2.2.tar.gz
  4. tar zxvf keepalived-1.2.2.tar.gz
  5. cd keepalived-1.2.2
  6. ./configure --prefix=/
  7. make
  8. make install

#假如在执行./configure --prefix=/时报错: OpenSSL is not properly installed on your system !!!Can notinclude OpenSSL headers files,则yum install openssl-devel -y

2 分别在master1,master2上新建检查mysql脚本

vi /root/check_mysql.sh

内容如下

  1. MYSQL=/usr/local/mysql/bin/mysql
  2. MYSQL_HOST=localhost
  3. MYSQL_USER=root
  4. MYSQL_PASSWORD=system@123
  5. $MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "show status;" >/dev/null 2>&1
  6. #$mysqlclient --host=$host --port=$port --user=$user --password=$password  -e "show databases;" > /dev/null 2>&1
  7. if [ $? == 0 ]
  8. then
  9. echo " $host mysql login successfully "
  10. exit 0
  11. else
  12. #echo " $host mysql login faild"
  13. /etc/init.d/keepalived stop
  14. exit 2
  15. fi

chmod +x /root/check_mysql.sh

3 修改配置文件

vi /etc/keepalived/keepalived.conf

master1和master2配置文件内容相同。

内容:

  1. #ConfigurationFile for keepalived
  2. global_defs {
  3. notification_email {                        ######定义接受邮件的邮箱
  4. wangjj@hrloo.com
  5. }
  6. notification_email_from jiankong@staff.tuge.com    ######定义发送邮件的邮箱
  7. smtp_server mail.tuge.com
  8. smtp_connect_timeout 10
  9. }
  10. vrrp_script check_mysql {                   ######定义监控mysql的脚本
  11. script "/root/check_mysql.sh"
  12. interval 2                             ######监控时间间隔
  13. weight 2                               ######负载参数
  14. }
  15. vrrp_instance vrrptest {                 ######定义vrrptest实例
  16. state BACKUP              ######服务器状态
  17. interface eth0                      ######使用的接口
  18. virtual_router_id 51                ######虚拟路由的标志,一组lvs的虚拟路由标识必须相同,这样才能切换
  19. priority 150                        ######服务启动优先级,值越大,优先级越高,BACKUP 不能大于MASTER
  20. advert_int 1                        ######服务器之间的存活检查时间
  21. authentication {
  22. auth_type PASS                      ######认证类型
  23. auth_pass ufsoft       ######认证密码,一组lvs 服务器的认证密码必须一致
  24. }
  25. track_script {                              ######执行监控mysql进程的脚本
  26. check_mysql
  27. }
  28. virtual_ipaddress {                         ######虚拟IP地址
  29. 192.168.1.60
  30. }
  31. }

这里state不配置MASTER,且优先级一样,是期望在MASTER1宕机后再恢复时,不主动将MASTER状态抢过来,避免MySQL服务的波动。

由于不存在使用lvs进行负载均衡,不需要配置虚拟服务器virtual server,下同。

vi /etc/sysconfig/iptables

#注意,在两台机器上都要修改。

添加:

-A INPUT -d 192.168.1.60/32 -j ACCEPT

-A INPUT -d 224.0.0.18 -j ACCEPT #添加VRRP通讯支持

注意:第一行中的192.168.1.60需要改成你自己的vip。

service iptables restart

5 启动keepalived

在master1、master2上分别启动:
service keepalived start

分别执行ip addr命令,可以在其中一台机器上看到虚拟IP.如:

[root@slave1 keepalived]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_faststate UP qlen 1000
    link/ether 08:00:27:04:05:16 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.22/24 brd 192.168.1.255 scope global eth0
    inet 192.168.1.60/32 scope global eth0
    inet6 fe80::a00:27ff:fe04:516/64 scope link tentativedadfailed 
       valid_lft forever preferred_lft forever

说明虚拟vip连在了master1这台机器上。

如果自动只连接到了master2,关闭master2的keepalived,再启动,自动就连接到master1了。

现在都可以ping通虚拟ip了。

6 测试

停止master1服务器keepalived,检查VIP是否切换到master2服务器(用ip addr命令验证即可);

三 测试高可用环境是否配置成功

 

3.1 建允许远程访问的用户

在master1,master2创建允许远程访问的用户:

grant select,update,delete,insert on *.* to 'dandan' identified by 'dandan';

3.2 访问虚拟IP

用一台同网段的机器访问通过vip访问数据库:

mysql -u dandan-pdandan -h 192.168.1.60 --port 3307

停止master1服务器的mysql,VIP切换到了master2服务器。

在master2上查看:

  1. mysql> showprocesslist;
  2. +----+-------------+--------------------+------+---------+------+-----------------------------------------------------------------------------+------------------+
  3. | Id | User        | Host               | db   | Command | Time | State                                                                      | Info             |
  4. +----+-------------+--------------------+------+---------+------+-----------------------------------------------------------------------------+------------------+
  5. |  3 | root        | localhost          | dba | Query   |    0 | init                                                                       | show processlist |
  6. | 14 | systemuser |                    | NULL |Connect |  247 | Reconnecting after afailed master event read                               | NULL             |
  7. | 15 | systemuser |                    | NULL |Connect |  207 | Slave has read all relaylog; waiting for the slave I/O thread to update it | NULL             |
  8. | 90 |dandan      | 192.168.1.60:39995 |dba  | Sleep   |    8|                                                                            | NULL             |
  9. +----+-------------+--------------------+------+---------+------+-----------------------------------------------------------------------------+------------------+

看到了dandan的连接信息。

keepalive配置mysql自动故障转移的更多相关文章

  1. 3.16 使用Zookeeper对HDFS HA配置自动故障转移及测试

    一.说明 从上一节可看出,虽然搭建好了HA架构,但是只能手动进行active与standby的切换: 接下来看一下用zookeeper进行自动故障转移: # 在启动HA之后,两个NameNode都是s ...

  2. 基于MGR+Atlas的读写分离尝试,以及MGR+Keepalived+Atlas自动故障转移+读写分离设想

    目的是尝试altas的读写分离,现有一套搭建好做测试的MGR(单主),于是就腿搓绳,在MGR基础上搭建altas. 复制环境准备 读写分离理论上讲,跟复制模式没有关系,atlas负责的是重定向读写,至 ...

  3. Redis集群以及自动故障转移测试

    在Redis中,与Sentinel(哨兵)实现的高可用相比,集群(cluster)更多的是强调数据的分片或者是节点的伸缩性,如果在集群的主节点上加入对应的从节点,集群还可以自动故障转移,因此相比Sen ...

  4. 非域环境下搭建自动故障转移镜像无法将 ALTER DATABASE 命令发送到远程服务器实例的解决办法

    非域环境下搭建自动故障转移镜像无法将 ALTER DATABASE 命令发送到远程服务器实例的解决办法 环境:非域环境 因为是自动故障转移,需要加入见证,事务安全模式是,强安全FULL模式 做到最后一 ...

  5. SQL非域环境下带自动故障转移数据库镜像的实现方法(包括镜像服务器)

    使用数据库镜像来提高数据库的高可用性,在镜像服务器创建镜像数据库的快照以卸载报表查询对生产数据库的负载.TechNet有讲座对此技术进行介绍,但看到大家在讲座的讨论区中遇到了很多问题,下面我把在非域环 ...

  6. InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移

    系列目录 InterSystems Ensemble学习笔记(一) Ensemble介绍及安装InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移 一 ...

  7. (2)MongoDB副本集自动故障转移原理

    前文我们搭建MongoDB三成员副本集,了解集群基本特性,今天我们围绕下图聊一聊背后的细节. 默认搭建的replica set均在主节点读写,辅助节点冗余部署,形成高可用和备份, 具备自动故障转移的能 ...

  8. (2)MongoDB副本集自动故障转移全流程原理

    前文我们搭建MongoDB三成员副本集,了解集群基本特性,今天我们围绕下图聊一聊背后的细节. 默认搭建的replica set均在主节点读写,辅助节点冗余部署,形成高可用和备份, 具备自动故障转移的能 ...

  9. MongoDB 主从复制及 自动故障转移

    1.MongoDB 主从复制 MongoDB复制是将数据同步在多个服务器的过程. 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性. 复制还允许您从 ...

随机推荐

  1. stack.isEmpty()和empty()

    public class Stack<E> extends Vector<E> 可以看到Stack类继承了Vector类 这个是stack类里面的方法: /** * Tests ...

  2. textview自定义跳转链接

    设置方式 ,主要是遍历html中的url,然后加一个自定义的跳转 private void setTextLink(String rule) { if(TextUtils.isEmpty(rule)) ...

  3. [ 随手记6 ] C/C++ 形参、实参、按值传参、指针传参、引用传参

    个人原创: 1. 形参:形式上的参数,一般多在函数声明.函数定义的参数上: 2. 实参:实体参数,有实际的值,在运算上被循环使用的值: 3. 按值传参:按值,就是把实际的值传给函数内部: 4. 指针传 ...

  4. android studio连接真机大概问题

    首先,确定手机Android的版本(最好用统一版本) 版本一样的话错误会少一点... 手机打开开发者选项(每个手机不同,百度可查) 开发者选项中打开USB调试 点击OK,可以进入Android mon ...

  5. NPM,bower的安装目录

    npm安装成功的话(需设置系统环境变量,见http://www.cnblogs.com/liaocheng/p/4531898.html有介绍) npm的安装目录 安装nodejs时,如果没有设置以下 ...

  6. uWSGI+Django+nginx(下)

    在上篇文章 说的uWSGI和Django都已没问题的情况下 找到 nginx的配置文件 我的是:/etc/nginx/nginx.conf 修改这个文件 在http{}里加入 下面的 server { ...

  7. 冰水挑战 HDU - 6495

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6495 题解:DP!!! dp[i][j] 表示前i个挑战,接受了j个剩余的最大体力,最后输出体力大于0 ...

  8. 2019嘉韦思杯线上初赛writeup

    1 土肥原贤二 看到页面怀疑是sql注入,写了个4'进去就发生报错.could not to the database You have an error in your SQL syntax; ch ...

  9. robotframework中的用evaluate关键字进行运算(随机数+转换+运算)

    当我们在写rf测试用例时,可能需要随机产生一些数据,可能需要将已有的数据进行转换,做简单的运算等:此时我们可以用万能的evaluate来实现 ,后面一般均适用python表达式来进行实现. 接下来详细 ...

  10. Pycharm桌面图标(Fedora)

    1.解压pycharm压缩包至/usr/local/pycharm文件夹下 2.在/usr/share/applications/目录下,新建Pycharm.desktop文件,内容如下: [Desk ...