设为首页 收藏本站
查看: 1210|回复: 0

[经验分享] MySQL MHA+Keepalived

[复制链接]

尚未签到

发表于 2015-9-4 08:05:43 | 显示全部楼层 |阅读模式
  一、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.com  Candidate master
  ( slave1 )
192.168.56.111  Mysql, 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.iyunv.com/yiyuf/article/details/40148125
  Percona yum源:http://blog.iyunv.com/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_script  failvoer时,控制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 监控了:
  [iyunv@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状态:
  [iyunv@mha ~]# masterha_check_status  --conf=/etc/app1.cnf
app1 (pid:9130) is running(0:PING_OK), master:192.168.56.110
  停止MHA监控:
  [iyunv@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上的配置)
[iyunv@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)如下:
[iyunv@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的绑定情况:
[iyunv@master keepalived]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-109191-1-1.html 上篇帖子: HAProxy+Keepalived+PXC负载均衡和高可用的PXC环境 下篇帖子: keepalived安装出错
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表