zoukankan      html  css  js  c++  java
  • mysql的MHA高可用集群

    前言

    mysql可以通过主从复制,多主复制,半同步复制等方法解决单点故障问题和io瓶颈。但是复制集群的一个问题就是每次master宕机都需要手动去提升从节点,那么有没有比较好的方法来解决此问题呢?MHA就是这样的解决方案。
    MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
    MHA由两部分组成,MHA Manageer和MHA Node。MHA manager主要是监控mysql集群的状态,当master发生故障之后其可以自动提升数据相对更接近于master的slave为主节点,然后将其他slave指向新的master。

    注意:
    mysql的slave总是会复制master的二进制日志到自己的中继日志进行数据同步,但是这存在一定的问题。比如master刚把数据写入二进制日志,而从节点还没有同步,因为它们之间默认是通过异步方式进行同步的,此时就会发生数据不一致。所以此问题可以通过mysql的半同步复制解决,选择一台slave采用同步方式和master同步数据,当集群发生故障,则MHA自动提升半同步slave节点为master。

    实验环境

    采用四台服务器来进行此配置:

    • MHA manager:192.168.11.197
    • master节点:192.168.11.194
    • slave节点-1:192.158.11.195
    • slave节点-2:192.168.11.196
      MHA要求各节点能够通过ssh密钥无障碍通信,因为各个节点需要同步日志。所以需要设置ssh密钥通信。

    实验步骤

    1. 各节点之间配置ssh,因为是4台服务器,为了避免每个服务器都生成ssh密钥,此处在一台服务器生成ssh密钥,然后4台服务器共用此密钥
    ssh-keygen -t rsa
    ssh-copy-id -i .ssh/id_rsa.pub root@192.168.11.194
    scp -p .ssh/authorized_keys .ssh/id_rsa{,.pub} root@192.168.11.195:/root/.ssh/
    scp -p .ssh/authorized_keys .ssh/id_rsa{,.pub} root@192.168.11.196:/root/.ssh/
    scp -p .ssh/authorized_keys .ssh/id_rsa{,.pub} root@192.168.11.197:/root/.ssh/
    
    1. 下载MHA安装包进行安装,安装包有如下两个包,node包和manager包:
    2. MHA master需要安装master包和node包,其他节点只需要安装node包即可
    3. 数据库服务器master节点配置mysql配置文件如下:
    [mysqld]
    skip_name_resolve=ON
    innodb_file_per_table=ON
    
    server_id=13       #配置服务器id
    relay_log=relay-log    #开启中继日志,因为master可能会变成slave
    log_bin=master-log    #开启二进制日志
    
    1. slave节点配置文件如下:
    [mysqld]
    skip_name_resolve=ON
    innodb_file_per_table=ON
    
    server_id=11
    relay_log=relay-log
    log-bin=master-log
    relay_log_purge=0    #关闭中继日志裁剪,因为其他slave可能会从此服务器同步relay日志
    read_only=1        #开启只读功能,当其提升为master之后该功能会自动关闭
    
    1. 配置好mysql主从复制,所有数据库节点安装MHA node安装包。MHA需要mysql提前配置好主从复制,配置文档见此博客:http://www.cnblogs.com/stacks/p/7171648.html
    2. manager创建/etc/masterha/app1.cnf,文件名随便起,添加如下内容:
    [server default]
    user=mhaadmin    #MHA连接mysql的管理用户
    password=1234567a    #MHA连接mysql的管理用户密码
    manager_workdir=/data/masterha/app1    #MHA工作目录
    manager_log=/data/masterha/app1/manager.log    #MHA日志存储路径
    remote_workdir=/data/masterha/app1    #其他节点MHA工作路径
    ssh_user=root    #ssh用户
    repl_user=repluser    #mysql复制用户
    repl_password=1234567a    #mysql复制用户密码
    ping_interval=1    #每个多久检测一下master是否在线
    
    [server1]
    hostname=192.168.11.194
    candidate_master=1	#是否允许成为master#
    
    [server2]
    hostname=192.168.11.195
    candidate_master=1
    
    [server3]
    hostname=192.168.11.196
    candidate_master=1
    
    1. 进行ssh检测
    masterha_check_ssh --conf=/etc/masterha/app1.cnf
    
    1. 进行复制功能检测
    masterha_check_repl --conf=/etc/masterha/app1.cnf
    
    1. 启动mha服务
    nohup masterha_manager --conf=/etc/masterha/app1.cnf &> /data/masterha/app1/manager.log &
    

    注意:
    当master发生变更之后此脚本会自动退出,当修复完故障服务器之后此脚本需要重新启动

    1. 发生master变更,修复前master服务器
      1. 发生master变更,修复前master服务器
      2. 恢复数据库
      3. mysql配置文件添加read_only=1和relay_log_purge=0
      4. 通过change master to成为主节点的从节点并开启slave功能
    2. 修复完成开启mha服务

    总结

    MHA虽然可以检测master并自动切换,但是其却不能够切换master对外提供服务的ip,此功能需要手动写脚本来实现,MHA支持导入此类脚本进行ip地址变更。

  • 相关阅读:
    抽象线程之Parallel类
    任务
    创建线程之Thread类和线程池
    创建线程之异步委托
    折半插入排序
    单链表的使用(插入,查找,删除,链表的倒置,删除相同结点)
    插入排序
    [Python]小甲鱼Python视频第034课(with else)课后题及参考解答
    [Python]小甲鱼Python视频第033课(except)课后题及参考解答
    [Python]小甲鱼Python视频第32课(except)课后题及参考解答
  • 原文地址:https://www.cnblogs.com/stacks/p/7197325.html
Copyright © 2011-2022 走看看