环境:
MySQL-VIP:192.168.1.3
MySQL-master1:192.168.1.1
MySQL-master2:192.168.1.2

OS版本:CentOS release 6.4 (Final) Linux 2.6.32-358.el6.x86_64
MySQL版本:5.6.14
Keepalived版本:1.2.13

一、MySQL master-master配置

1、修改MySQL配置文件/etc/my.cnf   
# Server1配置
[mysqld]
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_UNSIGNED_SUBTRACTION 
port = 6603
server_id = 1 
lower_case_table_names = 1
character_set_server = utf8
autocommit = off
innodb_flush_log_at_trx_commit = 1
skip_name_resolve = ON
innodb_strict_mode = ON
log_bin = mysql-bin
innodb_data_home_dir = /usr/local/mysql/data
innodb_log_group_home_dir = /usr/local/mysql/data
auto_increment_increment=2
auto_increment_offset=1

# Server2配置
[mysqld]
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_UNSIGNED_SUBTRACTION 
port = 6603
server_id = 2 
lower_case_table_names = 1
character_set_server = utf8
autocommit = off
innodb_flush_log_at_trx_commit = 1
skip_name_resolve = ON
innodb_strict_mode = ON
log_bin = mysql-bin
innodb_data_home_dir = /usr/local/mysql/data
innodb_log_group_home_dir = /usr/local/mysql/data
auto_increment_increment=2
auto_increment_offset=2

2、将192.168.1.1设为192.168.1.2的主服务器
# 在Server1上执行
grant replication slave on *.* to 'repl'@'%' identified by 'repl'; 
show master status;

# 在Server2上执行
change master to 
master_host='192.168.1.1',
master_port=6603,
master_user='repl',
master_password='repl',
master_log_file='mysql-bin.000027',
master_log_pos=120; 
start slave;
show slave status\G

3、将192.168.1.2设为192.168.1.1的主服务器
# 在Server2上执行
grant replication slave on *.* to 'repl'@'%' identified by 'repl'; 
show master status;

# 在Server1上执行
change master to 
master_host='192.168.1.2',
master_port=6603,
master_user='repl',
master_password='repl',
master_log_file='mysql-bin.000010',
master_log_pos=351; 
start slave;
show slave status\G

4、MySQL双Master同步测试

二、keepalived安装及配置

1、192.168.1.1服务器上keepalived安装及配置
安装keepalived
# tar -zxvf keepalived-1.2.13.tar.gz
# cd keepalived-1.2.13
# ./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/2.6.32-358.el6.x86_64
# make
# make install

配置keepalived
新建一个配置文件,默认情况下keepalived启动时会去/etc/keepalived目录下找配置文件
# mkdir /etc/keepalived
# vi /etc/keepalived/keepalived.conf
# Configuration File for keepalived  
global_defs {  
     router_id MySQL-ha  
     }

vrrp_instance VI_1 {  
     state BACKUP   #两台配置此处均是BACKUP  
     interface eth1  
     virtual_router_id 51  
     priority 100   #优先级,另一台改为90  
     advert_int 1  
     nopreempt  #不抢占,只在优先级高的机器上设置即可,优先级低的机器不设置  
     authentication {  
     auth_type PASS  
     auth_pass 1111  
     }  
     virtual_ipaddress {  
     192.168.1.3  
     }  
     }

virtual_server 192.168.1.3 6603 {  
     delay_loop 2   #每个2秒检查一次real_server状态  
     lb_algo wrr   #LVS算法  
     lb_kind DR    #LVS模式  
     persistence_timeout 60   #会话保持时间  
     protocol TCP  
     real_server 192.168.1.1 6603 {  
     weight 3  
     notify_down /usr/local/mysql/bin/failover.sh  #检测到服务down后执行的脚本  
     TCP_CHECK {  
     connect_timeout 10    #连接超时时间  
     nb_get_retry 3       #重连次数  
     delay_before_retry 3   #重连间隔时间  
     connect_port 6603   #健康检查端口  
     }  
     }

编写检测服务down后所要执行的脚本
# vi /usr/local/mysql/bin/failover.sh
#!/bin/sh  
pkill keepalived  
# chmod +x /usr/local/mysql/bin/failover.sh

注:此脚本是上面配置文件notify_down选项所用到的,keepalived使用notify_down选项来检查real_server的服务状态,当发现real_server服务故障时,便触发此脚本;我们可以看到,脚本就一个命令,通过pkill keepalived强制杀死keepalived进程,从而实现了MySQL故障自动转移。另外,我们不用担心两个MySQL会同时提供数据更新操作,因为每台MySQL上的keepalived的配置里面只有本机MySQL的IP+VIP,而不是两台MySQL的IP+VIP

启动keepalived
# /usr/local/keepalived/sbin/keepalived -D
# ps aux | grep keepalived

测试
找一台局域网PC,然后去ping MySQL的VIP,这时候MySQL的VIP是可以ping的通的
停止MySQL服务,看keepalived健康检查程序是否会触发我们编写的脚本

keepalived配置成服务并开机启动
# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
# chkconfig --add keepalived 
# chkconfig --level 345 keepalived on

2、192.168.1.2上keepalived安装及配置
安装keepalived
# tar -zxvf keepalived-1.2.13.tar.gz
# cd keepalived-1.2.13
# ./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/2.6.32-358.el6.x86_64
# make
# make install

配置keepalived
这台配置和Server1上基本一样,但有三个地方不同:优先级为90、无抢占设置、real_server为本机IP
# mkdir /etc/keepalived
# vi /etc/keepalived/keepalived.conf
# Configuration File for keepalived  
global_defs {  
     router_id MySQL-ha  
     }

vrrp_instance VI_1 {  
     state BACKUP   #两台配置此处均是BACKUP  
     interface eth1  
     virtual_router_id 51  
     priority 100   #优先级,另一台改为90  
     advert_int 1  
     nopreempt  #不抢占,只在优先级高的机器上设置即可,优先级低的机器不设置  
     authentication {  
     auth_type PASS  
     auth_pass 1111  
     }  
     virtual_ipaddress {  
     192.168.1.3  
     }  
     }

virtual_server 192.168.1.3 6603 {  
     delay_loop 2   #每个2秒检查一次real_server状态  
     lb_algo wrr   #LVS算法  
     lb_kind DR    #LVS模式  
     persistence_timeout 60   #会话保持时间  
     protocol TCP  
     real_server 192.168.1.1 6603 {  
     weight 3  
     notify_down /usr/local/mysql/bin/failover.sh  #检测到服务down后执行的脚本  
     TCP_CHECK {  
     connect_timeout 10    #连接超时时间  
     nb_get_retry 3       #重连次数  
     delay_before_retry 3   #重连间隔时间  
     connect_port 6603   #健康检查端口  
     }  
     } 
     
编写检测服务down后所要执行的脚本
# vi /usr/local/mysql/bin/failover.sh
#!/bin/sh  
pkill keepalived  
# chmod +x /usr/local/mysql/bin/failover.sh

启动keepalived
# /usr/local/keepalived/sbin/keepalived -D
# ps aux | grep keepalived

测试
停止MySQL服务,看keepalived健康检查程序是否会触发我们编写的脚本

keepalived配置成服务并开机启动
# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
# chkconfig --add keepalived 
# chkconfig --level 345 keepalived on

三、测试
1、MySQL远程登录测试
使用客户端登录VIP测试

2、keepalived故障转移测试
客户端一直去ping VIP,然后关闭192.168.1.1上的keepalived,正常情况下VIP就会切换到192.168.1.2上面去
开启192.168.1.1上的keepalived,关闭192.168.1.2上的keepalived,看是否能自动切换,正常情况下VIP又会属于192.168.1.1
注:keepalived切换速度还是非常块的,整个切换过程只需1-3秒

3、MySQL故障转移测试
在192.168.1.1上关闭MySQL服务,看VIP是否会切换到192.168.1.2上
开启192.168.1.1上的MySQL和keepalived,然后关闭192.168.1.2上的MySQL,看VIP是否会切换到192.168.1.1上
客户端连接的MySQL的VIP,在切换时执行了一个MySQL查询命令

这个方案可以在一定程度上解决MySQL高可用的问题,即应用访问VIP,当一个MySQL Server出现问题,会自动切换到另一个,切换过程很快,对应用透明。但这种简单配置只能有一台服务器工作,另一个备用,这样无法扩展读写,也没法做负载均衡。目前MySQL负载均衡方案一般是一个HA(keepalived、MHA等)+ 一个负载均衡器(LVS、haproxy等)。

关于LVS+keepalived方案,参考:

http://kb.cnblogs.com/page/83944/

http://blog.chinaunix.net/uid-20639775-id-3337471.html
http://wenku.baidu.com/link?url=lNERgU80yUEAKmPO0hCFbDH7_xlIG14itOHx4KkjPNsVVRd2GEblXH-HPdOi39Kf8v8Gu9yfQBfkU_WEJ35QM89DOSU_3kGH8LRhfKGKfLO

MySQL高可用基础之keepalived+双主复制【转】的更多相关文章

  1. MySQL高可用架构之MySQL5.7组复制MGR

    MySQL高可用架构之MySQL5.7组复制MGR########################################################################### ...

  2. MySQL高可用架构之Keepalived+主从架构部署

    针对目前公司的数据库架构要做统计规划和调整,所以针对不同的业务环境要选择合适的架构就比较重要,同时作为运维人员又要考虑到维护的便捷性(不能做过多架构维护),最终停留在mha+vip/主从+vip/my ...

  3. Mysql+Keepalived双主热备高可用操作记录

    我们通常说的双机热备是指两台机器都在运行,但并不是两台机器都同时在提供服务.当提供服务的一台出现故障的时候,另外一台会马上自动接管并且提供服务,而且切换的时间非常短.MySQL双主复制,即互为Mast ...

  4. keepalived+mysql双主复制高可用方案

    MySQL双主复制,即互为Master-Slave(只有一个Master提供写操作),可以实现数据库服务器的热备,但是一个Master宕机后不能实现动态切换.而Keepalived通过虚拟IP,实现了 ...

  5. mysql+keepalived 双主热备高可用

    理论介绍:我们通常说的双机热备是指两台机器都在运行,但并不是两台机器都同时在提供服务.当提供服务的一台出现故障的时候,另外一台会马上自动接管并且提供服务,而且切换的时间非常短.MySQL双主复制,即互 ...

  6. 【转载】MySQL和Keepalived高可用双主复制

    服务器主机IP和虚拟浮动IP配置 RealServer A 192.168.75.133 RealServer B 192.168.75.134 VIP A 192.168.75.110 VIP B ...

  7. MariaDB+Keepalived双主高可用配置MySQL-HA

    利用keepalived构建高可用MySQL-HA,保证两台MySQL数据的一致性,然后用keepalived实现虚拟VIP,通过keepalived自带的服务监控功能来实现MySQL故障时自动切换. ...

  8. mysql高可用架构方案之中的一个(keepalived+主主双活)

    Mysql双主双活+keepalived实现高可用           文件夹 1.前言... 4 2.方案... 4 2.1.环境及软件... 4 2.2.IP规划... 4 2.3.架构图... ...

  9. [转] Haproxy、Keepalived双主高可用负载均衡

    http://blog.chinaunix.net/uid-25266990-id-3989321.html 在测试了Nginx+Keepalived的负载均衡后,也对Haproxy+Keepaliv ...

随机推荐

  1. oracle中使用minus进行数据排除(类似SqlServer except函数)

    minus这个集合操作符号的作用是从一个结果集合中减掉另一个结果集中数据,也就是说从一个结果集中去除两个结果集中的共有部分. 下面是一些例子: 这个例子使用minus从第一个结果集中将两个结果集的公有 ...

  2. singleTask TaskAffinity allowTaskReparenting

    关于singleTask TaskAffinity allowTaskReparenting 一.Activity的LaunchMode 1.standard 2.singleTop:FLAG_ACT ...

  3. 在eclipse中新建Dynamic web project时选择2.5和3.0的区别(里面涉及servlet和tomcat的问题)

    1.是指servlet的版本,是2.5的还是3.0的 servlet3.0以后支持异步 2.dynamic web module和对应的TOMCAT 版本 http://blog.sina.com.c ...

  4. SQL Server主键自动生成_表and存储过程

    主键表: CREATE TABLE [dbo].[KEYCODE]( [KeyName] [varchar](12) NOT NULL, [KeyTableName] [varchar](40) NU ...

  5. IIS网站部署错误总结

    aspx 常见错误 CS0016: 未能写入输出文件“c:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/Temporary ASP.NET Files/... ...

  6. c#读取通达信历史数据的方法

    public Bar ReadBarMin(BinaryReader br, int instrumentId, long size) { int date = br.ReadUInt16(); in ...

  7. thinkphp中ajax用户名校验

    ajax实在是太神奇了,刚刚接触,不足之处,请大家指正. 采用Ajax方式进行页面无刷新提示,来检测用户名是否存在. 搭建一个thinkphp的环境,在index.html中,ajax代码如下: &l ...

  8. C++ 异常处理执行过程

    看<clean code>时,又遇到异常处理的例程. 看不明白是因为我一直都将异常处理束之高阁. 今天晚上下决心去找资料看看,看完之后觉得以前是把它想得太难,其实非常简单. 希望以后遇到问 ...

  9. [转]C++基本功和 Design Pattern系列 ctor & dtor

    今天Aear讲的是class.ctor 也就是constructor, 和  class.dtor, destructor. 相信大家都知道constructor 和 destructor是做什么用的 ...

  10. 获取fragment中的控件的写法

    package com.example.baoxiu.fragment;import com.example.baoxiu.R;import com.example.baoxiu.Register;i ...