注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

PostgreSQL 中文网

 
 
 

日志

 
 

MySQL + Keepalived 实现 HA  

2015-03-04 18:59:55|  分类: MySQL |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

           今天学习了 MySQL 高可用的相关方案, MySQL  HA 方案很多,这里仅介绍使用 Keepalived 和 MySQL 本身的主从复制实现高可用。

一 环境信息

主库  192.168.2.37/3306       主库VIP  192.168.2.137
备库  192.168.2.38/3306       备库VIP: 192.168.2.138
版本  5.6.20
系统: RHEL 6.2

备注: 主备节点 mysql 安装略,主备节点都分配单独 VIP,此 HA 方案应用程序不同时连两个节点,例如,应用程序仅连主库,当主库发生故障时,才切换到连备库。


二  主从复制搭建
--创建复制用户

root@localhost:(none)>create user 'rep1'@'192.168.2.%' identified by 'rep1abcd1243d';
Query OK, 0 rows affected (0.02 sec)

root@localhost:(none)>GRANT REPLICATION SLAVE ON *.* TO 'rep1'@'192.168.2.%';
Query OK, 0 rows affected (0.01 sec)

备注:  创建新用户并赋予  REPLICATION SLAVE 权限,这个用户用来接收主节点的 binary log.

--主节点 my.cnf

basedir = /opt/mysql
datadir = /database/mysql/data
port = 3306
server_id = 1
log_bin = "/database/mysql/data/binlog/bin-log"
binlog_format = "STATEMENT"
master-info-repository=TABLE
log_output = 'FILE,TABLE'
slow_query_log = on
long_query_time = 1
max_connections = 800
max_user_connections = 100
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
prompt="\\u@\\h:\\d>"


--备节点 my.cnf

basedir = /opt/mysql
datadir = /database/mysql/data
port = 3306
server_id = 2
report-host=192.168.2.38(db2)
log_bin = "/database/mysql/data/binlog/bin-log"
binlog_format = "STATEMENT"
master-info-repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=on
log_output = 'FILE,TABLE'
slow_query_log = on
long_query_time = 1
max_connections = 1000
max_user_connections = 100
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
prompt="\\u@\\h:\\d>"


--主库上执行

 CHANGE MASTER TO
   MASTER_HOST='192.168.2.38',
   MASTER_PORT=3306,
   MASTER_USER='rep1',
   MASTER_PASSWORD='rep1abcd1243d',
   MASTER_LOG_FILE='bin-log.000023',
   MASTER_LOG_POS=2298;
 
mysql> start slave;


--备库上执行

 CHANGE MASTER TO
   MASTER_HOST='192.168.2.37',
   MASTER_PORT=3306,
   MASTER_USER='rep1',
   MASTER_PASSWORD='rep1abcd1243d',
   MASTER_LOG_FILE='bin-log.000023',
   MASTER_LOG_POS=552;
 
mysql> start slave;

备注:MASTER_LOG_FILE 和 MASTER_LOG_POS 参数根据实际情况调整下, 其它主从复制相关步骤略,具体参考  MySQL:主从复制(Replication)搭建   http://francs3.blog.163.com/blog/static/40576727201411621130382/


三 安装  Keepalived
--下载

wget http://www.keepalived.org/software/keepalived-1.2.13.tar.gz


-- 安装 OpenSSL , popt 包

yum -y install openssl  openssl-devel popt


--解压安装

[root@db1 soft_bak]# tar xvf keepalived-1.2.13.tar.gz

# ./configure --prefix=/usr/local/keepalived --sysconf=/etc
# make
# make install


--遇到的错误

[root@db1 ~]# /etc/init.d/keepalived start
Starting keepalived: /bin/bash: keepalived: command not found
                                                           [FAILED]

                                                
--解决方法

[root@db1 etc]# cp /usr/local/keepalived/sbin/keepalived   /usr/sbin

[root@db1 etc]# service keepalived restart
Stopping keepalived:                                       [  OK  ]
Starting keepalived:                                       [  OK  ]

[root@db1 etc]# chkconfig keepalived off



四  配置 Keepalived
--主库 keepalived 配置

[root@db1 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     xxx@163.com
   }
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id MYSQL_BALANCE
}

 vrrp_script check_mysql_alived {
    script "/usr/local/bin/mysql_moniter.sh"
    interval 5
}

vrrp_instance VI_1 {
    state BACKUP
    nopreempt  # 主VIP 为非抢占模式
    interface eth0
    virtual_router_id 61
    priority 100 # 注意这里将优先级设置比备节点高
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 7BwhNLYpF6Ihs
    }
     track_script {
        check_mysql_alived
     }
    virtual_ipaddress {
        192.168.2.137
    }
    # smtp_alert
     #notify_master /usr/local/bin/active_standby.sh
}

vrrp_instance VI_2 {
    state BACKUP
    preempt     # 备VIP 为抢占模式
    interface eth0
    virtual_router_id 62
    priority 90   # 注意这里将优先级设置比备节点低
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 7BwhNLYpF6Ihs
    }
     track_script {
        check_mysql_alived
     }
    virtual_ipaddress {
        192.168.2.138
    }
    # smtp_alert
     #notify_master /usr/local/bin/active_standby.sh
}



--备库 keepalived 配置

[root@db2 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     xxx@163.com
   }
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id MYSQL_BALANCE
}

 vrrp_script check_mysql_alived {
    script "/usr/local/bin/mysql_moniter.sh"
    interval 5
}

vrrp_instance VI_1 {
    state BACKUP
    nopreempt
    interface eth0
    virtual_router_id 61
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 7BwhNLYpF6Ihs
    }
     track_script {
        check_mysql_alived
     }
    virtual_ipaddress {
        192.168.2.137
    }
    # smtp_alert
     #notify_master /usr/local/bin/active_standby.sh
}

vrrp_instance VI_2 {
    state BACKUP
    preempt
    interface eth0
    virtual_router_id 62
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 7BwhNLYpF6Ihs
    }
     track_script {
        check_mysql_alived
     }
    virtual_ipaddress {
        192.168.2.138
    }
    # smtp_alert
     #notify_master /usr/local/bin/active_standby.sh
}


--/usr/local/bin/mysql_moniter.sh 脚本

#!/bin/bash
# check mysqld status
MYSQL_PORT=3306

nmap localhost -p ${MYSQL_PORT} | grep "${MYSQL_PORT}/tcp open"

if [ $? -ne 0 ]; then
  exit 1
else
  exit 0
fi

备注: 这里通过检测 mysql 服务端口方式判断 mysqld 服务是否正常。


五 HA 测试
1) 停主库

[root@db1 ~]# /etc/init.d/mysqld stop
Shutting down MySQL............                            [  OK  ]

备注: 发现主库 VIP 192.168.2.137 漂到备库上了,切换正常。

2) 停主 Keepalived 服务

[root@db1 ~]# /etc/init.d/keepalived stop
Stopping keepalived:

备注: 发现主库 VIP 192.168.2.137 漂到备库上了,切换正常。

3) 关主库主机

[root@db1 ~]# shutdown -h now

备注: 发现主库 VIP 192.168.2.137 漂到备库上了,切换正常。


六总结
      此文通过 keepalived + MySQL 主从实现了 HA,   但这种方法并不严谨,因为在切换前并没有主备延迟判断,当备库落后主库很长时间后,显然不适合切换了,建议将主备延迟监控起来。如果主备延迟超过阀值,则发出告警。

       相关脚本需后续完善。


七 参考
  评论这张
 
阅读(628)| 评论(2)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018