Mysql +keepalived+MHA高可用(学习笔记十六)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
日志服务 SLS,月写入数据量 50GB 1个月
简介: https://blog.csdn.net/yiyuf/article/details/40340895http://www.cnblogs.com/yuanermen/p/3726572.htmlhttp://www.cnblogs.com/yuanermen/p/3726961.htmlhttp://www.cnblogs.com/yuanermen/p/3735263.html一、MHA的简单介绍MHA是由perl语言编写的,用外挂脚本的方式实现mysql主从复制的高可用性。

https://blog.csdn.net/yiyuf/article/details/40340895

http://www.cnblogs.com/yuanermen/p/3726572.html

http://www.cnblogs.com/yuanermen/p/3726961.html

http://www.cnblogs.com/yuanermen/p/3735263.html

一、MHA的简单介绍

MHA是由perl语言编写的,用外挂脚本的方式实现mysql主从复制的高可用性。

MHA可以自动检测mysql是否宕机,如果宕机,在10-30s内完成new master的选举,应用所有差异的binlog日志到所有slave,将所有的slave切换到新的master上来。

MHA除了自动检测mysql是否宕机,还能够交互式的切换master,在日常的数据库维护中,这个功能还是挺有用的。

由于MHA本身只负责数据库主从的切换,但是应用程序并不知道数据库的master变了。针对这种情况,可以使用MHA预留的几个脚本接口,通过虚拟IP或者修改全局配置文件的方法通知应用程序,master数据库已经改变。

MHA还是一个很活跃的项目,生产环境的使用者众多,不乏大公司,MHA的版本也很快,MHA作者在持续更新版本,最新版本已经支持GTID了。

二、环境部署

OS : Centos /RedHat 6.x

Mysql: Percona 5.5/5.6

主机(hostname)角色IP安装

master.mysql.comMaster192.168.56.110Mysq,mha node,keepalived

Slave1.mysq.comCandidate master

( slave1 )

192.168.56.111Mysql, MHA node,

keepalived

Slave2.mysql.comslave2192.168.56.112Mysql,keepalived

mha.mysql.comMHA manager192.168.56.111MHA manager

Vip192.168.56.188  

三、软件安装

yum源准备(修改 /etc/yum.repos.d/)

epel yum源:http://blog.csdn.net/yiyuf/article/details/40148125

Percona yum源:http://blog.csdn.net/yiyuf/article/details/40148183

关闭selinux 

#cat  /etc/sysconfig/selinux

SELINUX=disabled

关闭 iptables

#service iptables stop

chkconfig iptables off

修改 /etc/hosts 增加如下:

192.168.56.110 master.mysql.com

192.168.56.112 slave1.mysql.com

192.168.56.113 slave2.mysql.com 

并scp /etc/hosts 到其它各个节点。

mysql 安装:

yum -y install Percona-Server-server-55.x86_64  (5.5 版本)

yum -y install Percona-Server-server-56.x86_64  (5.6版本 )

搭建mysql 一主两从配置 (略)

SSH互信配置:

在master(192.168.56.110)上执行:ssh-keygen (一路回车)

# cd ~/.ssh

#cat id_rsa.pub >authorized_keys

#chmod 600 *

scp -r .ssh 192.168.56.111:~/

scp -r .ssh 192.168.56.112:~/

scp -r .ssh 192.168.56.113:~/

至此,mysql的主从也搭建好了,并可以正常运行了。接下来开始安装MHA软件:

1. mha manager节点安装(192.168.56.111上):

 yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager -----安装perl相关库文件

从https://code.google.com/p/mysql-master-ha/wiki/Downloads上面下载:

MHA Manager 0.56 rpm RHEL6

MHA Node 0.56 rpm RHEL6

MHA Manager 0.56 tarball    #####下载此tar包的目的是为了copy相关的配置文件和scripts

在192.168.56.111上安装:

#rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm 

#rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm

2. mha node节点安装(192.168.56.110, 192.168.56.112,192.168.56.113):

# yum -y install perl-DBD-MySQL

#rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm

3. MHA配置 (只需要在mha manager端配置即可):

该配置文件默认是分为两个(appxxx.cnf ,masterha_default.cnf ),其中masterha_default.cnf 是属于全局配置文件,当管理多个集群时,就显得特别有用。避免app.conf写的太长。app1.conf作用范围为master/slave结构,

全局参数文件配置(masterha_default.cnf)

#cat /etc/masterha_default.cnf

[server default]

user=yyf    

password=yyf

ssh_user=root

repl_user=replica

repl_password=zjjzjj

master_binlog_dir=/var/lib/mysql3307

#monitor

ping_interval=1

shutdown_script=""

secondary_check_script="masterha_secondary_check -s 192.168.56.112 -s 192.168.56.113"  #此处 56.112和56.113在每次切换完后必须要调整。例:当前112和113是slave,110是master,如果MHA发生自动切换,master由110切换到112后,下次这部分就该修改为:-s 192.168.56.110 -s 192.168.56.113。否则下次切换时,将导致失败。

master_ip_failover_script="/root/scripts/master_ip_failover.sh" ##点击打开链接(master_ip_failover.sh)

参数解释:

user 用于管理MySQL的用户名。这个最后需要root用户,因为它需要执行:stop slave; change master to , reset slave. 默认: root

password MySQL的管理用户的密码。 默认是空的

ssh_user当前使用的系统用户,用于ssh登入检测状态

repl_userMySQL用于复制的用户

repl_passwordMySQL用于复制的用户的密码

ping_interva l                      设置MHA Manager多长时间去ping一下master(执行一些SQL语句). 当3次ping失败后,MHA Manager会认为MySQL Master死掉了。也就是说,最大的故障切换时间是4次ping_interval的时间,默认是3秒。

shutdown_script定义关掉主master的脚本

secondary_check_script当MHA Manager检测master失败后,不会立即判断该master已宕机,而是通过ssh到secondary_check_script定义的主机再次进行检测失败后,方可认为master无法响应。这从一定程度上也防止脑裂的现象出现。

master_ip_failover_scriptfailvoer时,控制VIP转移的脚本。通常有两种方式实现:

(1)通过命令 "/sbin/ifconfig eth1:1  192.168.56.188";

(2) 结合keepalived 来实现

master_binlog_dir 用于存储binary日志的全路径。这个参数用于当master上mysql死掉后,通过ssh连到mysql服务器上,找到需要binary日志事件。这个参数可以帮助用于无法找到master进程死掉后binary日志存储位置。可以设置多个存放位置用逗号隔开如:/var/lib/mysql , /var/lib/mysql3307

app1.conf参数文件介绍(作用于某组master / slave结构)

#cat /etc/app1.conf

[server default]

manager_log=/var/log/masterha/app1/app1.log

manager_workdir=/var/log/masterha/app1

remote_workdir=/var/log/masterha/app1

[server1]

candidate_master=1

check_repl_delay=0

hostname=192.168.56.112

port=3306

[server2]

candidate_master=1

check_repl_delay=0

hostname=192.168.56.110

port=3306

[server3]

check_repl_delay=0

hostname=192.168.56.113

ignore_fail=1

no_master=1

port=3306

参数解释:

manager_log指定MHA manager的绝对路径的文件名日志文件

manager_workdir指定MHA manager产生相关状态文件全路径。 如果没设置 默认是/var/tmp

remote_workdirMHA node上工作目录的全路径名。如果不存在,MHA node会自动创建,如果不允许创建,MHA Node自动异常退出

[server1] [server2] [server3]在各个APP中所包含,定义每个主机的属性。

candidate_master作用是当设计candidate_master = 1时,这个服务器有较高的优先级提升为新的master(条件:开启binglog,服务无延迟)如果设置了多台机器的caddidate_master = 1 , 优先策略依赖于块名字([server_xxx]),如:[server_1] 优衔权高于[server_2]

check_repl_delay在默认情况下,当一个slave同步延迟超过100M relay log(需要应用超过100M relay log), MHA在做故障切换时不会选择这个slave做为新的master,因为恢复需要经过很长时间.当设置了check_repl_delay = 0, MHA将忽略被选择的slave上的同步延迟。 这个选项在设置了candidate_master = 1特声明的期望这台机器成为master的情况下特别有用。

hostname配置MySQL服务器的机器名或是IP地址,这个配置项是必须的,而且只能配置在[server_xxx]这个块下面。

ignore_fail在默认情况下,MHA manager不会在slave存在故障的情况下进行Master的故障切换。当设置了ignore_fail = 1时,MHA会在所有的机器有问题的时间也会进行故障切换。 默认是0.

no_master当设置了no_master = 1的服务器,这个服务器永远不会提升为新的master

portdb的端口号,默认是3306 :port=3307

中继日志的处理:

默认情况下,从服务器上的中继日志在SQL线程执行完后会被自动删除的。但是这些中继日志在恢复其他从服务器时候可能会被用到,

因此需要禁用中继日志的自动清除和定期清除旧的中继日志。定期清除中继日志需要考虑到复制延时的问题。在ext3文件系统下,

删除大的文件需要一定的时间,会导致严重的复制延时。为了避免复制延时,暂时为中继日志创建硬链接。

MHA节点包含pure_relay_logs命令工具,它可以为中继日志创建硬链接,执行SET GLOBAL relay_log_purge=1,等待几秒中以便SQL线程切换到新的中继日志,

再执行SET GLOBAL relay_log_purge=0。

pure_relay_logs参数如下所示:

–user mysql用户名

–password mysql密码

–host mysql服务器地址

–port 端口号

–workdir 创建和删除中继日志硬链接目录。成功执行脚本后,硬链接的中继日志文件将被删除。默认目录是/var/tmp。

因此purge_relay_logs脚本删除中继日志不会阻塞SQL线程,在每台从节点上设置计划任务

定期清除中继日志0 15 * * * /usr/bin/purge_relay_logs  -user=yyf -password=yyf -disable_relay_log_purge -port=3307 -host=192.168.56.110 >> /var/log/masterha/app1/purge_relay_logs.log 2>&1

至此,MHA的配置已经完成。很简单吧。配置文件只需存在于MHA Manager端即可。相关测试:将在下篇文章介绍,请戳开:点击打开链接

接下来就可以启动 MHA 监控了:

[root@mha scripts]#nohup masterha_manager --conf=/etc/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/app1.log 2>&1 &

查看MHA状态:

[root@mha ~]# masterha_check_status  --conf=/etc/app1.cnf

app1 (pid:9130) is running(0:PING_OK), master:192.168.56.110

停止MHA监控:

[root@mha ~]# masterha_stop  --conf=/etc/app1.cnf

解释:

--conf 一组master/slave的配置文件,会同时读取全局配置文件 

/etc/masterha_default.cnf

--remove_dead_master_conf  该参数代表当发生主从切换后,老的主库的IP将会从配置文件(app1.conf)中移除.

--ignore_last_failover  在缺省情况下,如果MHA检测到连续发生宕机,且两次宕机间隔不足8小时的话,则不会进行Failover.这样限制是为了避免ping-pong效应。该参数代表忽略上次MHA触发切换产生的文件,默认情况下,MHA发生切换后会在日志目录,也就是上面我设置的/var/log/masterha/app产生app1.failover.complete文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件,为了方便,这里设置为--ignore_last_failover。

监控开启后,就可以做相关测试了,把master上的mysql进程kill掉(pkill mysql )。测试下会不会自动进行failover测试,为了缩短文章篇幅,相关测试

请戳开:点击打开链接

keepalived 安装:

软件下载最新版本:http://www.keepalived.org/software/

keepalived-1.2.13.tar.gz

#yum -y install openssl-devel 

#tar -zxvf keepalived-1.2.13.tar.gz

# cd keepalived-1.2.13

    #./configure  --prefix=/usr/local/keepalived

#make && make install

#cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/

#cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/

#mkdir /etc/keepalived

#cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/

#cp /usr/local/sbin/keepalived /usr/sbin/

keepalived配置及配置文件(在主master 192.168.56.110上的配置)

[root@master ~]# 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 30

   router_id LVS_DEVEL

}

vrrp_instance VI_1 {

    state backup

    interface eth1

    nopreempt

    virtual_router_id 51

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.56.188

    }

  notify_master "/etc/keepalived/arp.sh"

}

其中router_id MySQL HA表示设定keepalived组的名称,将192.168.56.188这个虚拟ip绑定到该主机的eth1网卡上,并且设置了状态为backup模式,将keepalived的模式设置为非抢占模式(nopreempt),priority 150表示设置的优先级为150。下面的配置略有不同,但是都是一个意思。

在候选master上配置(192.168.56.112)如下:

[root@agent ~]# 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 30

   router_id LVS_DEVEL

}

vrrp_instance VI_1 {

    state master

    interface eth1

         nopreempt

    virtual_router_id 51

    priority 100  #此处很重要,一定要低于当前master的优先级别。值比主master小即可

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.56.188

    }

  notify_master "/etc/keepalived/arp.sh"   ###定义的清除arp路由的脚本。

}

至此,依次把主master和候选master上的keepalived进程开启:

service keepalived start|stop|restart

#ip add 命令查看VIP的绑定情况:

[root@master keepalived]# ip add

1: lo:  mtu 65536 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:  mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 08:00:27:70:b3:d8 brd ff:ff:ff:ff:ff:ff

    inet 192.168.2.40/24 brd 192.168.2.255 scope global eth0

    inet6 fe80::a00:27ff:fe70:b3d8/64 scope link 

       valid_lft forever preferred_lft forever

3: eth1:  mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 08:00:27:75:5b:94 brd ff:ff:ff:ff:ff:ff

    inet 192.168.56.110/24 brd 192.168.56.255 scope global eth1

    inet 192.168.56.188/32 scope global eth1

    inet6 fe80::a00:27ff:fe75:5b94/64 scope link 

       valid_lft forever preferred_lft forever

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
19天前
|
存储 SQL 关系型数据库
Mysql高可用架构方案
本文阐述了Mysql高可用架构方案,介绍了 主从模式,MHA模式,MMM模式,MGR模式 方案的实现方式,没有哪个方案是完美的,开发人员在选择何种方案应用到项目中也没有标准答案,合适的才是最好的。
91 3
Mysql高可用架构方案
|
1月前
|
存储 SQL 关系型数据库
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
131 6
|
1月前
|
SQL 关系型数据库 MySQL
Mysql学习笔记(三):fetchone(), fetchmany(), fetchall()详细总结
MySQL中用于数据检索的`fetchone()`, `fetchmany()`, `fetchall()`函数的功能、SQL语句示例和应用场景。
59 3
Mysql学习笔记(三):fetchone(), fetchmany(), fetchall()详细总结
|
1月前
|
SQL Ubuntu 关系型数据库
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
本文为MySQL学习笔记,介绍了数据库的基本概念,包括行、列、主键等,并解释了C/S和B/S架构以及SQL语言的分类。接着,指导如何在Windows和Ubuntu系统上安装MySQL,并提供了启动、停止和重启服务的命令。文章还涵盖了Navicat的使用,包括安装、登录和新建表格等步骤。最后,介绍了MySQL中的数据类型和字段约束,如主键、外键、非空和唯一等。
71 3
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
|
1月前
|
关系型数据库 MySQL 数据库
Mysql学习笔记(四):Python与Mysql交互--实现增删改查
如何使用Python与MySQL数据库进行交互,实现增删改查等基本操作的教程。
67 1
|
14天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
29 1
|
16天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
29 4
|
1月前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
63 3
Mysql(4)—数据库索引
|
22天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
111 1
|
25天前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
74 2
下一篇
无影云桌面