mysql+MHA+keepalived高可用方案

关于基础介绍及原理略过,直接上操作步骤吧。
mysql:5.7
操作系统:centos7.4

地址规划:
MHA manage:10.21.20.89
mysql主:10.21.20.71
mysql从1:10.21.20.131
mysql从2:10.21.20.132
vip:10.21.20.77

  1. 安装好mysql及主从同步建立以后,先在主库上创建监听用户。
      create user 'admin'@'%' identified by 'admin';
      grant all on *.* to 'admin'@'10.21.20.%' identified by 'admin';
    
    在各个主机上建立互信,为了方便直接一路回车到底。然后将私钥文件及authorized_keys文件复制给其他主机。四台服务器都要执行。
     # ssh-keygen -t rsa
        Generating public/private rsa key pair.
         Enter file in which to save the key (/root/.ssh/id_rsa): 
         Enter passphrase (empty for no passphrase): 
         Enter same passphrase again: 
         Your identification has been saved in /root/.ssh/id_rsa.
         Your public key has been saved in /root/.ssh/id_rsa.pub.
         The key fingerprint is:
         SHA256:wyMb8WZ6yJ0jxXN1FgWOwbVAPwW/GJRaKHfaefvXak0                   
         The key's randomart image is:
         +---[RSA 2048]----+
          |           o=o*+o|
          |         . ooX = |
          |      .   o O.O .|
          |       =   + =oo.|
          |      o S .  ....|
          |     . @ *     .E|
          |      * =      oo|
          |       o .    . =|
          |             ....|
         +----[SHA256]-----+
     # ssh-copy-id -i .ssh/id_rsa.pub migumysql@10.21.20.71
     # ssh-copy-id -i .ssh/id_rsa.pub migumysql@10.21.20.131
     # ssh-copy-id -i .ssh/id_rsa.pub migumysql@10.21.20.132
    
  2. 安装MHA
    首先下载mha4mysql-manager、mha4mysql-node。
    # wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
    # wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
    
    由于我的安装环境没有公网,因此我将下载好的MHA安装包及依赖包做成了本地yum源。具体方法如下:
    (1)找到一台可以连接公网的服务器,利用yum工具将依赖包下载到服务器。做成yum源以后,打包上传到安装的服务器。
    # yum install yum-utils -y
    # yumdownloader mha4mysql-manager mha4mysql-node --resolve --destdir=/home/mysql/MHA/mharepo
    # yum install -y createrepo
    
    (2) 将mha4mysql-manager、mha4mysql-node复制到/home/mysql/MHA/mharepo目录下,然后创建yum源。
   #  createrepo -pdo /home/mysql/MHA/mharepo
   #  cd /home/mysql/MHA/
   #  tar -czvf mharepo.tar.gz mharepo

(3)将mharepo.tar.gz上传四台需要安装的服务器解压。然后新建一个yum文件,指向解压的目录。

    # cat /etc/yum.repos.d/abc.repo 
       [abc]
       name=test
       baseurl=file:///root/mharepo
       gpgcheck=0
       enabled=1

(4) 安装MHA,在3台mysql上安装node,在管理节点安装manager。

 # yum install mha4mysql-manager -y
 # yum install mha4mysql-node -y
  1. 在管理节点编辑MHA的配置文件,并启动MHA manager
      # cat conf/mha.cnf 
         [server default]
         manager_workdir=/home/mysql/MHA
         manager_log=/home/mysql/MHA/log/manager.log
         user=admin
         password=admin
         ssh_user=mysql
         ssh_port=22
         repl_user=slave
         repl_password=abc123
         ping_interval=1
         shutdown_script=""
         master_ip_online_change_script=""
         report_script=""
         master_ip_failover_script="/home/mysql/MHA/scripts/master_ip_failover"
    
         [server1]
         hostname=10.21.20.71
         port=13306
         candidate_master=1
         master_binlog_dir="/home/mysql/mysql/logs/"
    
    
         [server2]
         hostname=10.21.20.131
         port=13306
         candidate_master=1
         master_binlog_dir="/home/mysql/mysql/logs/"
    
         [server3]
         hostname=10.21.20.132
         port=13306
    
    测试ssh及集群状态
     # masterha_check_ssh --conf=/home/mysql/MHA/conf/mha.cnf
     # masterha_check_repl --conf=/home/mysql/MHA/conf/mha.cnf
                       忽略部分内容
        10.21.20.71(10.21.20.71:13306) (current master)
        +--10.21.20.131(10.21.20.131:13306)
        +--10.21.20.132(10.21.20.132:13306)
    
        Sat Apr 11 11:45:12 2020 - [info] Checking replication health on      10.21.20.131..
        Sat Apr 11 11:45:12 2020 - [info]  ok.
        Sat Apr 11 11:45:12 2020 - [info] Checking replication health on     10.21.20.132..
        Sat Apr 11 11:45:12 2020 - [info]  ok.
        Sat Apr 11 11:45:12 2020 - [warning] master_ip_failover_script is not defined.
        Sat Apr 11 11:45:12 2020 - [warning] shutdown_script is not defined.
        Sat Apr 11 11:45:12 2020 - [info] Got exit code 0 (Not master dead).
    
        MySQL Replication Health is OK.
        
    
          # ln -s /home/migumysql/mysql/bin/mysql /usr/local/bin/mysql
          # ln -s /home/migumysql/mysql/bin/mysqlbinlog /usr/local/bin/mysqlbinlog
    
    直接nohup masterha_manager -conf=conf/mha.cnf > log/mha-0318.log &启动,当crt关闭时MHA manager可能会自动停止,网上找了下资料,可能是crt的bug,将启动命令写到shell里可以避免此情况。有待验证。
    # cat start_mah.sh 
      #!/bin/bash
      cd `dirname $0`
      nohup masterha_manager  -conf=conf/mha.cnf > log/mha-0410.log &
    
    # ./start_mah.sh
    
  2. 在数据库节点安装keepalived(本例中为10.21.20.71、10.21.20.131)。主库的priority要比从库的高。
      # yum install keepalived -y 
      # cat /etc/keepalived/keepalived.conf
          
          global_defs {
              notification_email {
              123456.qq.com
              }
          notification_email_from 123456.qq.com
          smtp_server 127.0.0.1
          smtp_connect_timeout 30
          router_id MYSQL-HA
          script_user root
          enable_script_security
          }
    
          vrrp_script check_mysql_alived {
              script "/etc/keepalived/mysql_monitor.sh" 
              interval 5 
          }
    
          vrrp_instance VI_1 {
             state BACKUP       
             interface eth0
             virtual_router_id 191
             priority 120 
             nopreempt
             advert_int 2
             authentication {
             auth_type PASS
             auth_pass Cmcc
           }
    
           track_script {
             check_mysql_alived
           }
    
           virtual_ipaddress {
                10.21.20.77/24
            }
           }
    
      #
      # cat /etc/keepalived/mysql_monitor.sh 
        #!/bin/bash
        check(){
        /home/migumysql/mysql/bin/mysql -u'root' -p'Migu123!' -S       /home/migumysql/mysql/logs/mysql.sock  -e "select user()" > /dev/null 2>&1
         r1=$?
         r2=$(/usr/sbin/ss -nltp | grep 3306 | wc -l)
         if [[ $r1 -ne 0 ]] || [[ $r2 -eq 0 ]];then
               echo "error"
         else
               echo "ok"
         fi
         }
    
         if [ $(check) = "ok" ];then
              echo "MySQL OK!"
              exit 0
         else
              sleep 2
              if [ $(check) = "error" ];then
                    systemctl  stop keepalived
                    pkill -9 keepalived
                    echo "MySQL Error! Keepalived Stop."
               fi
          fi
    
       #
       #  chmod a+x /etc/keepalived/mysql_monitor.sh 
       #  systemctl start keepalived
    
  3. 此时查看vip是否在主库上,从库没有vip。验证正确后,停止主库查看主从是否自动切换,vip是否会漂移到从库。
     #  tailf log/manager.log 
         忽略部分内容
         ----- Failover Report -----
    
         mha: MySQL Master failover 10.21.20.71(10.21.20.71:13306) to         10.21.20.131(10.21.20.131:13306) succeeded
    
         Master 10.21.20.71(10.21.20.71:13306) is down!
    
         Check MHA Manager logs at localhost:/home/migumysql/MHA/log/manager.log for details.
    
         Started automated(non-interactive) failover.
         The latest slave 10.21.20.131(10.21.20.131:13306) has all relay logs for recovery.
         Selected 10.21.20.131(10.21.20.131:13306) as a new master.
         10.21.20.131(10.21.20.131:13306): OK: Applying all logs succeeded.
         10.21.20.132(10.21.20.132:13306): This host has the latest relay log events.
         Generating relay diff files from the latest slave succeeded.
         10.21.20.132(10.21.20.132:13306): OK: Applying all logs succeeded.   Slave started, replicating from 10.21.20.131(10.21.20.131:13306)
         10.21.20.131(10.21.20.131:13306): Resetting slave info succeeded.
         Master failover to 10.21.20.131(10.21.20.131:13306) completed successfully.
    

在主库和从库上观察ip发现,vip已经自动漂移到从库上。至此高可用完成。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容