主頁 > 前端設計 > MHA高可用配置及故障切換——詳細部署步驟及報錯解決辦法

MHA高可用配置及故障切換——詳細部署步驟及報錯解決辦法

2020-09-21 18:05:09 前端設計

  • 一、了解MHA高可用集群部署
    • 1.傳統的MySQL主從架構存在的問題
    • 2.MHA概述
    • 3.MHA的組成
    • 4.MHA特點
    • 5.MHA作業原理
    • 6.案例設計
  • 二、對三臺主機(mysql1,mysql2,mysql3)安裝mysql資料庫
  • 三、對mysql1,mysql2,mysql3配置主從同步
    • 1.配置mysql1
      • 1.1設定主機名,便于識別
      • 1.2 做主機映射
      • 1.3 修改資料庫檔案/etc/my.cof配置
      • 1.4 登入資料庫授權
      • 1.5 查看master狀態
    • 2. 配置mysql1
      • 2.1設定主機名,便于識別
      • 2.2 做主機映射
      • 2.3 修改資料庫檔案/etc/my.cof配置
      • 2.4 登入資料庫授權
    • 3. 配置mysql3
      • 3.1設定主機名,便于識別
      • 3.2 做主機映射
      • 3.3 修改資料庫檔案/etc/my.cof配置
      • 3.4 登入資料庫授權
    • 4.驗證是否同步
      • 4.1主服務器建庫
      • 4.2兩臺從服務器驗證
  • 四、 配置無密碼認證
    • 1.在 manager 上配置到所有資料庫節點的無密碼認證
    • 2.在 mysql1 上配置到所有資料庫節點的無密碼認證
    • 3.在 mysql2 上配置到所有資料庫節點的無密碼認證
    • 4.在 mysql3 上配置到所有資料庫節點的無密碼認證
  • 五、對所有主機manager,mysql1、mysql2、mysql3安裝cmake-2.8.6.tar.gz
  • 六、安裝MHA并配置MHA
    • 1. 所有服務器上(manager、mysql1、mysql2、mysql3)都安裝 MHA 依賴的環境,首先安裝 epel 源,
    • 2. MHA 軟體包對于每個作業系統版本不一樣,這里 CentOS7.4 必須選擇 0.57 版本,
    • 3.在 MHA-manager上安裝 manager 組件(!注意:一定要先安裝node 組件才能安裝manager 組件)
    • 4.在 manager 節點上復制相關腳本到/usr/local/bin 目錄
    • 5.配置自動切換時 VIP 管理的腳本
    • 6.創建 MHA 軟體目錄并拷貝組態檔app1.cnf
    • 7.檢查MHA是否正常
      • 7.1檢查ssh情況,正常會輸出successfully
      • 7.2檢查群集狀態,正常會輸出Health is OK.
    • 8.啟動MHA
  • 七、模擬故障測驗
    • 1.在manager上查看當前master主機
    • 2、關閉mysql1(master)
    • 3.到manager查看master是否切換
  • 八,將菪機的mysql1恢復為master
    • 1.先將mysql1設定成master(mysql2)的從服務器,設定只讀
    • 2.關掉當前master(mysql2)的同步功能,否則從服務器會報錯
    • 3.手動修改manager上的app1.cnf配置
    • 4. 檢查無密碼認證和 MySQL 主從狀態是否正常,請參考之前的步驟,這里不再列出,
    • 5.查看當前主庫master
    • 6.關閉MAH
    • 7.在manager上手動關閉當前master(mysql2)
    • 8.再次查看,master已經關閉
    • 9.將手動切換腳本拷貝到/usr/local/bin/下,并進行配置修改
    • 10. 在manager上手動設定新的master(mysql1)
    • 11.在manager上查看master是否真的轉換
  • 九、常見報錯
          • 問題1:[warning] relay_log_purge=0 is not set on slave 20.0.0.22(20.0.0.22:3)
          • 問題2:[warning] log-bin is not set on slave 20.0.0.23(20.0.0.23:3306)
          • 問題3:mysqlbinlog: unknown variable ‘default-character-set=utf8‘
          • 問題4:如果在執行程序中,有如下報錯資訊:Can't exec "mysqlbinlog": No such file or directory at /usr/lib64/perl5/vendor_perl/MHA/BinlogManager.pm line 99.
          • 問題5:如果有如下報錯資訊:Bareword "FIXME_xxx" not allowed while "strict subs" in use at /usr/local/bin/master_ip_failover line 100.:

一、了解MHA高可用集群部署

1.傳統的MySQL主從架構存在的問題

  • 只有一臺主服務器負責寫入
  • 存在單點故障
    在這里插入圖片描述

2.MHA概述

  • MHA (MasterHigh Availability)E前在MySQL高可用方面是一個相對成熟的解決方案,它由日本 DeNA公司youshimaton(現就職于Facebook公司)開發的
  • —套優秀的MySQL高可用環境下故障切換和主從復制的軟體
  • MySQL故障程序中,MHA能做到O-30秒內自動完成故障切換
  • 并且在進行故障切換的程序中,MHA能在最大程度上保證資料的一致性,以達到真正意義上的高可用,

3.MHA的組成

  • MHA Manager(管理節點)
  • MHA Node(資料節點)

4.MHA特點

  • 自動故障切換程序中,MHA試圖從宕機的主服務器上保存二進制日志,最大程度的保證資料不丟失
  • 使用半同步復制,可以大大降低資料丟失的風險
  • 目前MHA支持一主多從架構,最少三臺服務,即一主兩從

5.MHA作業原理

該軟體由兩部分組成:MHA Manager(管理節點)和MHA Node(資料節點),MHAManager可以單獨部署在一臺獨立的機器上,管理多個master-slave集群;也可以部署在一臺slave 節點上,MHA Node運行在每臺MySQL服務器上,MHA_Manager會定時探測集群中的master 節點,當master 出現故障時,它可以自動將最新資料的slave提升為新的master,然后將所有其他的slave重新指向新的master,整個故障轉移程序對應用程式完全透明,
在MHA自動故障切換程序中,MHA試圖從宕機的主服務器上保存二進制日志,最大程度的保證資料的不丟失,但這并不總是可行的,例如,如果主服務器硬體故障或無法通過SSH訪問,MHA 沒法保存二進制日志,就會出現只進行故障轉移但丟失了最新的資料的情況,使用MySQL5.5的半同步復制,可以大大降低資料丟失的風險,MHA可以與半同步復制結合起來,如果只有一個slave已經收到了最新的二進制日志,MHA可以將最新的二進制日志應用于其他所有的slave服務器上,因此可以保證所有節點的資料一致性,

6.案例設計

目前MySQL已經成為市場上主流資料庫之一,考慮到業務的重要性,MySQL 資料庫單點問題已成為企業網站架構中大的隱患,隨著技術的發展,MHA的出現就是解決MySQL單點的問題,另外隨著企業資料量越來越龐大,資料庫的壓又成為企業的另一個瓶頸,MySQL多主多從架構的出現可以減輕MySQL本身的壓力,這個實驗主要闡述MHA的搭建和模擬MySQL 故障自動切換的程序,
在這里插入圖片描述

主機作業系統主機名及地址角色
服務器CentOS7.6(64位)manager/20.0.0.11管理節點,安裝manager組件和node組件
服務器CentOS7.6(64位)Mysql1/20.0.0.12Master節點,安裝node組件
服務器CentOS7.6(64位)Mysql2/20.0.0.18Slave 節點,安裝node組件
服務器CentOS7.6(64位)Mysql3/20.0.0.19Slave節點,安裝node組件

二、對三臺主機(mysql1,mysql2,mysql3)安裝mysql資料庫

編譯安裝myaql資料庫詳細步驟連接

三、對mysql1,mysql2,mysql3配置主從同步

1.配置mysql1

1.1設定主機名,便于識別

[root@localhost ~]# hostnamectl set-hostname mysql1
[root@mysql1 ~]# bash

1.2 做主機映射

[root@mysql1 ~]# vi /etc/hosts
20.0.0.12		mysql1

1.3 修改資料庫檔案/etc/my.cof配置

[root@mysql1 ~]# vi /etc/my.cnf
[mysqld]
……省略部分
server-id = 11
log-bin = master-bin
log-slave-updates = true
[root@mysql1 ~]# systemctl restart mysqld
[root@mysql1 ~]# ln -s /usr/local/mysql/bin/mysql /usr/sbin/
[root@mysql1 ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/

1.4 登入資料庫授權

[root@mysql1 ~]# mysql -uroot -p
mysql> grant replication slave on *.* to 'myslave'@'20.0.0.%' identified by '123456';
mysql> grant all privileges on *.* to 'mha'@'20.0.0.%' identified by 'manager';
#######################下面這條授權最好也做一下,防止報錯#####################
mysql>grant all privileges on *.* to 'mha'@'mysql1' identified by 'manager'; 
##########################################################################
mysql> flush privileges;

1.5 查看master狀態

mysql> show master status;
| File 			    | Position | Binlog_Do_DB | Binlog_Ignore_DB 	| Executed_Gtid_Set |
+-------------------------------+------------+---------------------+----------------------------+--------------------------+
| master-bin.000001 	|   154  |             |    			    |                   

2. 配置mysql1

2.1設定主機名,便于識別

[root@localhost ~]# hostnamectl set-hostname mysql2
[root@mysql2 ~]# bash

2.2 做主機映射

[root@mysql2 ~]# vi /etc/hosts
20.0.0.18		mysql2

2.3 修改資料庫檔案/etc/my.cof配置

[root@mysql2 ~]# vi /etc/my.cnf
[mysqld]
……省略部分
server-id = 22
log-bin = master-bin    //這條必須有,因為備選master需要有binlog日志檔案
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
[root@mysql2 ~]# mysql -uroot -p -e 'set global relay_log_purge=0'
[root@mysql2 ~]# systemctl restart mysqld
[root@mysql2 ~]# ln -s /usr/local/mysql/bin/mysql /usr/sbin/
[root@mysql2 ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/

2.4 登入資料庫授權

[root@mysql2 ~]# mysql -uroot -p
mysql> grant replication slave on *.* to 'myslave'@'20.0.0.%' identified by '123456';
mysql> grant all privileges on *.* to 'mha'@'20.0.0.%' identified by 'manager';
#######################下面這條授權最好也做一下,防止報錯#####################
mysql>grant all privileges on *.* to 'mha'@'mysql2' identified by 'manager'; 
##########################################################################
mysql> flush privileges;
mysql> change master to master_host='20.0.0.12',
    -> master_user='myslave',
    -> master_password='123456',
	-> master_port=3306,
    -> master_log_file='master-bin.000001',
    -> master_log_pos=154;

3. 配置mysql3

3.1設定主機名,便于識別

[root@localhost ~]# hostnamectl set-hostname mysql2
[root@mysql1 ~]# bash

3.2 做主機映射

[root@mysql1 ~]# vi /etc/hosts
20.0.0.19		mysql3

3.3 修改資料庫檔案/etc/my.cof配置

[root@mysql1 ~]# vi /etc/my.cnf
[mysqld]
……省略部分
server-id = 33
no_master=1     //no_master表示這個節點不能作為master
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
[root@mysql3 ~]# mysql -uroot -p -e 'set global relay_log_purge=0'  //清除relay-log殘存
[root@mysql3 ~]# systemctl restart mysqld
[root@mysql3 ~]# ln -s /usr/local/mysql/bin/mysql /usr/sbin/
[root@mysql3 ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/

3.4 登入資料庫授權

[root@mysql1 ~]# mysql -uroot -p
mysql> grant replication slave on *.* to 'myslave'@'20.0.0.%' identified by '123456';
mysql> grant all privileges on *.* to 'mha'@'20.0.0.%' identified by 'manager';
#######################下面這條授權最好也做一下,防止報錯#####################
mysql>grant all privileges on *.* to 'mha'@'mysql3' identified by 'manager'; 
##########################################################################
mysql> flush privileges;
mysql> change master to master_host='20.0.0.12',
    -> master_user='myslave',
	-> master_port=3306,
    -> master_password='123456',
    -> master_log_file='master-bin.000001',
    -> master_log_pos=154;

4.驗證是否同步

4.1主服務器建庫

mysql> create database 測驗庫;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| 測驗庫             |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+

4.2兩臺從服務器驗證

mysql> show databases;    //同步成功
+--------------------+  
| Database           |
+--------------------+
| information_schema |
| 測驗庫             |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+

四、 配置無密碼認證

1.在 manager 上配置到所有資料庫節點的無密碼認證

[root@localhost ~]# ssh-keygen -t rsa  //一直回車就可以
[root@localhost ~]# ssh-copy-id 20.0.0.18
[root@localhost ~]# ssh-copy-id 20.0.0.12 
[root@localhost ~]# ssh-copy-id 20.0.0.19

2.在 mysql1 上配置到所有資料庫節點的無密碼認證

[root@mysql1 ~]# ssh-keygen -t rsa  //一直回車就可以
[root@mysql1 ~]# ssh-copy-id 20.0.0.18
[root@mysql1 ~]# ssh-copy-id 20.0.0.12 
[root@mysql1 ~]# ssh-copy-id 20.0.0.19

3.在 mysql2 上配置到所有資料庫節點的無密碼認證

[root@mysql2 ~]# ssh-keygen -t rsa  //一直回車就可以
[root@mysql2 ~]# ssh-copy-id 20.0.0.18
[root@mysql2 ~]# ssh-copy-id 20.0.0.12 
[root@mysql2 ~]# ssh-copy-id 20.0.0.19  

4.在 mysql3 上配置到所有資料庫節點的無密碼認證

[root@mysql3 ~]# ssh-keygen -t rsa  //一直回車就可以
[root@mysql3 ~]# ssh-copy-id 20.0.0.18
[root@mysql3 ~]# ssh-copy-id 20.0.0.12 
[root@mysql3 ~]# ssh-copy-id 20.0.0.19

五、對所有主機manager,mysql1、mysql2、mysql3安裝cmake-2.8.6.tar.gz

[root@localhost ~]# yum -y install ncurses-devel gcc-c++ perl-Module-Install
[root@localhost ~]# tar zxvf cmake-2.8.6.tar.gz -C /opt
[root@localhost ~]# cd /opt/cmake-2.8.6
[root@Mysql1 cmake-2.8.6]# ./configure
[root@Mysql1 cmake-2.8.6]# gmake -j3 && gmake install

六、安裝MHA并配置MHA

1. 所有服務器上(manager、mysql1、mysql2、mysql3)都安裝 MHA 依賴的環境,首先安裝 epel 源,

[root@localhost ~]# yum install epel-release --nogpgcheck \
perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-Mail-Sender \
perl-CPAN

2. MHA 軟體包對于每個作業系統版本不一樣,這里 CentOS7.4 必須選擇 0.57 版本,

在<注意:所有服務器manager、mysql1、mysql2、mysql3>上必須先安裝 node 組件,最后在 MHA-manager 節點上安裝 manager 組件,因為 manager 依賴 node 組件,下面都是在 Mysql1 上操作演示安裝 node 組件,

[root@localhost ~]# tar zxvf mha4mysql-node-0.57.tar.gz -C /opt
[root@localhost mha4mysql-node-0.57]# cd /opt/mha4mysql-node-0.57/
[root@localhost mha4mysql-node-0.57]# perl Makefile.PL
[root@localhost mha4mysql-node-0.57]# make && make install
[root@localhost mha4mysql-node-0.57]# ls /usr/local/bin 
apply_diff_relay_logs  filter_mysqlbinlog  purge_relay_logs  save_binary_logs

node 安裝后也會在/usr/local/bin 下面會生成幾個腳本(這些工具通常由 MHA_Manager 的腳本觸發,無需人為操作)主要如下:

save_binary_logs保存和復制 master 的二進制日志
apply_diff_relay_logs識別差異的中繼日志事件并將其差異的事件應用于其他的 slave
filter_mysqlbinlog去除不必要的 ROLLBACK 事件(MHA 已不再使用這個工具)
purge_relay_logs清除中繼日志(不會阻塞 SQL 執行緒)

3.在 MHA-manager上安裝 manager 組件(!注意:一定要先安裝node 組件才能安裝manager 組件)

[root@localhost ~]# tar zxvf mha4mysql-manager-0.57.tar.gz -C /opt
[root@localhost ~]# cd /opt/mha4mysql-manager-0.57/
[root@localhost mha4mysql-manager-0.57]# perl Makefile.PL
[root@localhost mha4mysql-manager-0.57]# make && make install
[root@localhost mha4mysql-manager-0.57]# ls /usr/local/bin 
masterha_check_repl		masterha_check_status		masterha_manager    masterha_master_switch 	masterha_stop 			masterha_check_ssh 
masterha_conf_host  	    masterha_master_monitor  masterha_secondary_check

manager 安裝后在/usr/local/bin 下面會生成幾個工具,主要包括以下幾個:

工具用途
masterha_check_ssh檢查 MHA 的 SSH 配置狀況
masterha_check_repl檢查 MySQL 復制狀況
masterha_manger啟動 manager的腳本
masterha_check_status檢測當前 MHA 運行狀態
masterha_master_monitor檢測 master 是否宕機
masterha_master_switch控制故障轉移(自動或者手動)
masterha_conf_host添加或洗掉配置的 server 資訊
masterha_stop關閉manager

4.在 manager 節點上復制相關腳本到/usr/local/bin 目錄

[root@localhost ~]# cp -ra /opt/mha4mysql-manager-0.57/samples/scripts/ /usr/local/bin/
[root@localhost ~]# ls /usr/local/bin/scripts/
master_ip_failover  master_ip_online_change  power_manager  send_report
[root@localhost ~]# cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin/

復制“master_ip_failover”腳本到/usr/local/bin 目錄,這里使用腳本管理 VIP,也是推薦的一種方式,生產環境不建議使用 Keepalived,
腳本具體作用如下所示:

master_ip_failover自動切換時 VIP 管理的腳本
master_ip_online_change在線切換時 vip 的管理
power_manager故障發生后關閉主機的腳本
send_report因故障切換后發送報警的腳本

5.配置自動切換時 VIP 管理的腳本

直接復制即可用,ip等引數自行修改

[root@localhost bin]# vi /usr/local/bin/master_ip_failover
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use Getopt::Long;
use MHA::DBHelper;
my (
  $command,        $ssh_user,         $orig_master_host,
  $orig_master_ip, $orig_master_port, $new_master_host,
  $new_master_ip,  $new_master_port,  $new_master_user,
  $new_master_password
);
##################################插入下面這部分內#################################
my $vip = '20.0.0.200';
my $brdc = '20.0.0.255';
my $ifdev = 'ens33';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
my $exit_code = 0;
#my $ssh_stop_vip = "/usr/sbin/ip addr del $vip/24 dev $ifdev label $ifdev:$key";
#my $ssh_start_vip = "/usr/sbin/ip addr add $vip/24 brd $brdc dev $ifdev label $ifdev:$key;/usr/sbin/arping -q -A -c 1 -I $ifdev $vip;iptables -F;";
#################################################################################
GetOptions(
  'command=s'             => \$command,
  'ssh_user=s'            => \$ssh_user,
  'orig_master_host=s'    => \$orig_master_host,
  'orig_master_ip=s'      => \$orig_master_ip,
  'orig_master_port=i'    => \$orig_master_port,
  'new_master_host=s'     => \$new_master_host,
  'new_master_ip=s'       => \$new_master_ip,
  'new_master_port=i'     => \$new_master_port,
  'new_master_user=s'     => \$new_master_user,
  'new_master_password=s' => \$new_master_password,
);

exit &main();

sub main {
  if ( $command eq "stop" || $command eq "stopssh" ) {
    my $exit_code = 1;
    eval {
      $exit_code = 0;
    };
    if ($@) {
      warn "Got Error: $@\n";
      exit $exit_code;
    }
    exit $exit_code;
  }
  elsif ( $command eq "start" ) {
    my $exit_code = 10;
    eval {
      my $new_master_handler = new MHA::DBHelper();
      $new_master_handler->connect( $new_master_ip, $new_master_port,
        $new_master_user, $new_master_password, 1 );
      $new_master_handler->disable_log_bin_local();
      print "Set read_only=0 on the new master.\n";
      $new_master_handler->disable_read_only();
      $new_master_handler->enable_log_bin_local();
      $new_master_handler->disconnect();
      ## Update master ip on the catalog database, etc
\#      FIXME_xxx;    //這一條切記加注釋,刪掉有時也會報錯,注釋掉就可以了
      $exit_code = 0;
    };
    if ($@) {
      warn $@;
      exit $exit_code;
    }
    exit $exit_code;
  }
  elsif ( $command eq "status" ) {
    exit 0;
  }
  else {
    &usage();
    exit 1;
  }
}
sub usage {
  print
"Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";
}

6.創建 MHA 軟體目錄并拷貝組態檔app1.cnf

[root@localhost ~]# mkdir /etc/masterha   //創建MHA軟體存放目錄
[root@localhost ~]# cp /opt/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha
[root@localhost ~]# mkdir -p /var/log/masterha/app1
[root@localhost ~]# vi /etc/masterha/app1.cnf
[server default]
manager_log=/var/log/masterha/app1/manager.log    //指定manager的日志檔案
manager_workdir=/var/log/masterha/app1       //指定manager的作業目錄
master_binlog_dir=/usr/local/mysql/data         //master存放binlog的位置,要與master的存放位置一致
master_ip_failover_script=/usr/local/bin/master_ip_failover   //設定自動failover時候的切換腳本位置
master_ip_online_change_script=/usr/local/bin/master_ip_online_change  //設定手動切換時的切換腳本位置
user=mha   //監控用戶
password=manager   //監控用戶密碼
ping_interval=1      //設定監控主庫,發送ping包的時間間隔,默認是3秒,嘗試三次沒有回應的時候自動				  進行failover故障切換
remote_workdir=/tmp   //設定遠端mysq|在發生切換時binlog的保存位置
repl_password=123456   //設定復制用戶(從服務器用戶)的密碼
repl_user=myslave       //設定復制用戶(從服務器用戶
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 20.0.0.18 -s 20.0.0.19  
shutdown_script=""   //設定故障發生后關閉故障主機腳本(該腳本的主要作用是關閉主機防止發生腦裂)
ssh_user=root      //使用ssh登錄時的用戶
report script=/usr/local/send_report               //設定發生切換后發送的報警的腳本

[server1]
hostname=20.0.0.12
port=3306

[server2]
hostname=20.0.0.18
port=3306
candidate_master=1
check_repl_delay=0

[server3]
hostname=20.0.0.19
port=3306


##################################配置含義########################################

  • candidate_master=1:設定為候選 master,如果設定該引數以后,發生主從切換以后 會將此從庫提升為主庫,即使這個主庫不是集群中最新的 slave,
  • check_repl_delay=0:默認情況下如果一個 slave 落后 master 100M 的 relay logs 的話, MHA 將不會選擇該 slave 作為一個新的 master,因為對于這個 slave 的恢復需要花費 很長時間,通過設定 check_repl_delay=0,MHA 觸發切換在選擇一個新的 master 的時 候將會忽略復制延時,這個引數對于設定了 candidate_master=1 的主機非常有用,因 為這個候選主在切換的程序中一定是新的 master

7.檢查MHA是否正常

7.1檢查ssh情況,正常會輸出successfully

[root@localhost perl5]# masterha_check_ssh -conf=/etc/masterha/app1.cnf  
Sat Sep 19 00:15:33 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Sat Sep 19 00:15:33 2020 - [info] Reading application default configuration from /etc/masterha/app1.cnf..
……省略部分
Sat Sep 19 00:15:41 2020 - [info] All SSH connection tests passed successfully.

7.2檢查群集狀態,正常會輸出Health is OK.

[root@localhost bin]# masterha_check_repl -conf=/etc/masterha/app1.cnf  
Sat Sep 19 01:23:56 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Sat Sep 19 01:23:56 2020 - [info] Reading application default configuration from /etc/masterha/app1.cnf..
Sat Sep 19 01:23:56 2020 - [info] Reading server configuration from /etc/masterha/app1.cnf..
Sat Sep 19 01:23:56 2020 - [info] MHA::MasterMonitor version 0.57.
Sat Sep 19 01:23:57 2020 - [info] GTID failover mode = 0
……省略部分
Sat Sep 19 01:24:36 2020 - [info] Checking replication health on 20.0.0.19..
Sat Sep 19 01:24:36 2020 - [info]  ok.
Sat Sep 19 01:24:36 2020 - [info] Checking master_ip_failover_script status:
Sat Sep 19 01:24:36 2020 - [info]   /usr/local/bin/master_ip_failover --command=status --ssh_user=root --orig_master_host=20.0.0.12 --orig_master_ip=20.0.0.12 --orig_master_port=3306 

Sat Sep 19 01:24:36 2020 - [info]  OK.
Sat Sep 19 01:24:36 2020 - [warning] shutdown_script is not defined.
Sat Sep 19 01:24:36 2020 - [info] Got exit code 0 (Not master dead).
MySQL Replication Health is OK.

8.啟動MHA

[root@localhost ~]# nohup masterha_manager \           //啟動MHA行程
--conf=/etc/masterha/app1.cnf \
--remove_dead_master_conf \
--ignore_last_failover \
< /dev/null > \
/var/log/masterha/app1/manager.log \
2>&1 &       
[1] 18955
[root@localhost ~]# masterha_check_status --conf=/etc/masterha/app1.cnf app1   
                               //查看master節點,即當前的master是那臺主機
app1 (pid:18955) is running(0:PING_OK), master:20.0.0.12
[root@localhost ~]# cat /var/log/masterha/app1/manager.log  
                                          //通過日志也可以查看到當前master節點
……省略部分
Sat Sep 19 16:37:45 2020 - [info] Slaves settings check done.
Sat Sep 19 16:37:45 2020 - [info] 
20.0.0.12(20.0.0.12:3306) (current master)
 +--20.0.0.18(20.0.0.18:3306)
 +--20.0.0.19(20.0.0.19:3306)
[root@localhost ~]#  masterha_stop --conf=/etc/masterha/app1.cnf   //關閉MHA
MHA Manager is not running on app1(2:NOT_RUNNING).

七、模擬故障測驗

1.在manager上查看當前master主機

[root@localhost ~]#  masterha_check_status --conf=/etc/masterha/app1.cnf app1 
app1 (pid:19085) is running(0:PING_OK), master:20.0.0.12

2、關閉mysql1(master)

[root@mysql1 data]# systemctl stop mysqld

3.到manager查看master是否切換

[root@localhost ~]# tail -f /var/log/masterha/app1/manager.log
……省略部分
Selected 20.0.0.18(20.0.0.18:3306) as a new master
Generating relay diff files from the latest slave succeeded.
20.0.0.19(20.0.0.19:3306): OK: Applying all logs succeeded. Slave started, replicating from 20.0.0.18(20.0.0.18:3306)
20.0.0.18(20.0.0.18:3306): Resetting slave info succeeded.
Master failover to 20.0.0.18(20.0.0.18:3306) completed successfully.   // master已經轉化成功

八,將菪機的mysql1恢復為master

1.先將mysql1設定成master(mysql2)的從服務器,設定只讀

mysql> CHANGE MASTER TO MASTER_HOST='20.0.0.18',
	-> MASTER_PORT=3306,
	-> MASTER_LOG_FILE='master-bin.000006',
	-> MASTER_LOG_POS=154, MASTER_USER='myslave', 
	->MASTER_PASSWORD='123456';
mysql> start slave;
mysql> set global read_only=1;

2.關掉當前master(mysql2)的同步功能,否則從服務器會報錯

mysql> stop slave;
mysql> reset slave;

3.手動修改manager上的app1.cnf配置

將剛剛手動宕機 Mysql1 庫作為主庫繼續提供服務,注意手動切換 VIP 不會漂移,重新檢查資料庫主從狀態是否正常,修改后的 app1.cnf 檔案內容如下

[root@localhost ~]# vi /etc/masterha/app1.cnf  
[server default]
manager_log=/var/log/masterha/app1/manager.log
……省略部分
user=mha

[server1]
candidate_master=1
check_repl_delay=0
hostname=20.0.0.12
port=3306

[server2]
hostname=20.0.0.18
port=3306

[server3]
hostname=20.0.0.19
port=3306

4. 檢查無密碼認證和 MySQL 主從狀態是否正常,請參考之前的步驟,這里不再列出,

 最后啟動 MHA 檢查是否正常
[root@localhost ~]# nohup masterha_manager \           //啟動MHA行程
--conf=/etc/masterha/app1.cnf \
--remove_dead_master_conf \
--ignore_last_failover \
< /dev/null > \
/var/log/masterha/app1/manager.log \
2>&1 &       

5.查看當前主庫master

[root@localhost ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:19335) is running(0:PING_OK), master:20.0.0.18

6.關閉MAH

[root@localhost ~]# masterha_stop --conf=/etc/masterha/app1.cnf
Stopped app1 successfully.
[1]+  Exit 1           

7.在manager上手動關閉當前master(mysql2)

[root@localhost ~]# masterha_master_switch --conf=/etc/masterha/app1.cnf \
--master_state=dead \
--dead_master_host=20.0.0.18

8.再次查看,master已經關閉

[root@localhost ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 is stopped(2:NOT_RUNNING).

9.將手動切換腳本拷貝到/usr/local/bin/下,并進行配置修改

[root@localhost ~]# cp /usr/local/bin/scripts/master_ip_online_change /usr/local/bin/
[root@localhost ~]# vi /usr/local/bin/master_ip_online_change
……省略部分
  151      print current_time_us() . " Drpping app user on the orig master..\n";
  152  #   FIXME_xxx_drop_app_user($orig_master_handler);  //將這行注釋掉
……省略部分

10. 在manager上手動設定新的master(mysql1)

[root@localhost ~]# masterha_master_switch \
--conf=/etc/masterha/app1.cnf \
--master_state=alive \
--new_master_host=20.0.0.12 \
--orig_master_is_new_slave
……省略部分
Sun Sep 20 04:14:49 2020 - [info]  20.0.0.12: Resetting slave info succeeded.
Sun Sep 20 04:14:49 2020 - [info] Switching master to 20.0.0.12(20.0.0.12:3306) completed successfully.   //提示切換成功

11.在manager上查看master是否真的轉換

[root@localhost ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 monitoring program is now on initialization phase(10:INITIALIZING_MONITOR). Wait for a while and try checking again.   //提示正在初始化,需要等待
[root@localhost ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:19517) is running(0:PING_OK), master:20.0.0.12  //大概等待2分鐘,可以查看到master已經換成mysql1了

至此,MHA高可用集群部署完成

九、常見報錯

問題1:[warning] relay_log_purge=0 is not set on slave 20.0.0.22(20.0.0.22:3)

在從服務器上:
mysql -uroot -p -e ‘set global relay_log_purge=0’

問題2:[warning] log-bin is not set on slave 20.0.0.23(20.0.0.23:3306)

在從服務器上:vi /etc/my.cnf
在[mysqld]引數下增加 log_bin=on

問題3:mysqlbinlog: unknown variable ‘default-character-set=utf8‘

在從服務器上:vi /etc/my.cnf
在[client]引數下注釋 #default-character-set=utf8

問題4:如果在執行程序中,有如下報錯資訊:Can’t exec “mysqlbinlog”: No such file or directory at /usr/lib64/perl5/vendor_perl/MHA/BinlogManager.pm line 99.

采用設定軟連接的方式解決,三臺 MySQL 上都需要執行
[root@Mysql1 ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
[root@Mysql1 ~]# ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql

問題5:如果有如下報錯資訊:Bareword “FIXME_xxx” not allowed while “strict subs” in use at /usr/local/bin/master_ip_failover line 100.:

在 manager 機器上面使用如下解決方法,
[root@mha-manager ~]# vim /usr/local/bin/master_ip_failover
## Update master ip on the catalog database, etc
#FIXME_xxx; ###將此行注釋

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/98810.html

標籤:其他

上一篇:阿里資深JAVA架構帶你深度剖析dubbo和zookeeper關系

下一篇:全堆疊專案-寵物樂園

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • vue移動端上拉加載

    可能做得過于簡單或者比較low,請各位大佬留情,一起探討技術 ......

    uj5u.com 2020-09-10 04:38:07 more
  • 優美網站首頁,頂部多層導航

    一個個人用的瀏覽器首頁,可以把一下常用的網站放在這里,平常打開會比較方便。 第一步,HTML代碼 <script src=https://www.cnblogs.com/szharf/p/"js/jquery-3.4.1.min.js"></script> <div id="navigate"> <ul> <li class="labels labels_1"> ......

    uj5u.com 2020-09-10 04:38:47 more
  • 頁面為要加<!DOCTYPE html>

    最近因為寫一個js函式,需要用到$(window).height(); 由于手寫demo的時候,過于自信,其實對前端方面的認識也不夠體系,用文本檔案直接敲出來的html代碼,第一行沒有加上<!DOCTYPE html> 導致了$(window).height();的結果直接是整個document的高 ......

    uj5u.com 2020-09-10 04:38:52 more
  • WordPress網站程式手動升級要做好資料備份

    WordPress博客網站程式在進行升級前,必須要做好網站資料的備份,這個問題良家佐言是遇見過的;在剛開始接觸WordPress博客程式的時候,因為升級問題和博客網站的修改的一些嘗試,良家佐言是吃盡了苦頭。因為購買的是西部數碼的空間和域名,每當佐言把自己的WordPress博客網站搞到一塌糊涂的時候 ......

    uj5u.com 2020-09-10 04:39:30 more
  • WordPress程式不能升級為5.4.2版本的原因

    WordPress是一款個人博客系統,受到英文博客愛好者和中文博客愛好者的追捧,并逐步演化成一款內容管理系統軟體;它是使用PHP語言和MySQL資料庫開發的,用戶可以在支持PHP和MySQL資料庫的服務器上使用自己的博客。每一次WordPress程式的更新,就會牽動無數WordPress愛好者的心, ......

    uj5u.com 2020-09-10 04:39:49 more
  • 使用CSS3的偽元素進行首字母下沉和首行改變樣式

    網頁中常見的一種效果,首字改變樣式或者首行改變樣式,效果如下圖。 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ......

    uj5u.com 2020-09-10 04:40:09 more
  • 關于a標簽的講解

    什么是a標簽? <a> 標簽定義超鏈接,用于從一個頁面鏈接到另一個頁面。 <a> 元素最重要的屬性是 href 屬性,它指定鏈接的目標。 a標簽的語法格式:<a href=https://www.cnblogs.com/summerxbc/p/"指定要跳轉的目標界面的鏈接">需要展示給用戶看見的內容</a> a標簽 在所有瀏覽器中,鏈接的默認外觀如下: 未被訪問的鏈接帶 ......

    uj5u.com 2020-09-10 04:40:11 more
  • 前端輪播圖

    在需要輪播的頁面是引入swiper.min.js和swiper.min.css swiper.min.js地址: 鏈接:https://pan.baidu.com/s/15Uh516YHa4CV3X-RyjEIWw 提取碼:4aks swiper.min.css地址 鏈接:https://pan.b ......

    uj5u.com 2020-09-10 04:40:13 more
  • 如何設定html中的背景圖片(全屏顯示,且不拉伸)

    1 <style>2 body{background-image:url(https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture); 3 background-size:cover;background ......

    uj5u.com 2020-09-10 04:40:16 more
  • Java學習——HTML詳解(上)

    HTML詳解 初識HTML Hyper Text Markup Language(超文本標記語言) 1 <!--DOCTYPE:告訴瀏覽器我們要使用什么規范--> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <!--meta 描述性的標簽,描述一些 ......

    uj5u.com 2020-09-10 04:40:33 more
最新发布
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 07:59:23 more
  • 生產事故-走近科學之消失的JWT

    入職多年,面對生產環境,盡管都是小心翼翼,慎之又慎,還是難免捅出簍子。輕則滿頭大汗,面紅耳赤。重則系統停擺,損失資金。每一個生產事故的背后,都是寶貴的經驗和教訓,都是專案成員的血淚史。為了更好地防范和遏制今后的各類事故,特開此專題,長期更新和記錄大大小小的各類事故。有些是親身經歷,有些是經人耳傳口授 ......

    uj5u.com 2023-04-18 07:55:04 more
  • 記錄--Canvas實作打飛字游戲

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 打開游戲界面,看到一個畫面簡潔、卻又富有挑戰性的游戲。螢屏上,有一個白色的矩形框,里面不斷下落著各種單詞,而我需要迅速地輸入這些單詞。如果我輸入的單詞與螢屏上的單詞匹配,那么我就可以獲得得分;如果我輸入的單詞錯誤或者時間過長,那么我就會輸 ......

    uj5u.com 2023-04-04 08:35:30 more
  • 了解 HTTP 看這一篇就夠

    在學習網路之前,了解它的歷史能夠幫助我們明白為何它會發展為如今這個樣子,引發探究網路的興趣。下面的這張圖片就展示了“互聯網”誕生至今的發展歷程。 ......

    uj5u.com 2023-03-16 11:00:15 more
  • 藍牙-低功耗中心設備

    //11.開啟藍牙配接器 openBluetoothAdapter //21.開始搜索藍牙設備 startBluetoothDevicesDiscovery //31.開啟監聽搜索藍牙設備 onBluetoothDeviceFound //30.停止監聽搜索藍牙設備 offBluetoothDevi ......

    uj5u.com 2023-03-15 09:06:45 more
  • canvas畫板(滑鼠和觸摸)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canves</title> <style> #canvas { cursor:url(../images/pen.png),crosshair; } #canvasdiv{ bo ......

    uj5u.com 2023-02-15 08:56:31 more
  • 手機端H5 實作自定義拍照界面

    手機端 H5 實作自定義拍照界面也可以使用 MediaDevices API 和 <video> 標簽來實作,和在桌面端做法基本一致。 首先,使用 MediaDevices.getUserMedia() 方法獲取攝像頭媒體流,并將其傳遞給 <video> 標簽進行渲染。 接著,使用 HTML 的 < ......

    uj5u.com 2023-01-12 07:58:22 more
  • 記錄--短視頻滑動播放在 H5 下的實作

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 短視頻已經無數不在了,但是主體還是使用 app 來承載的。本文講述 H5 如何實作 app 的視頻滑動體驗。 無聲勝有聲,一圖頂百辯,且看下圖: 網址鏈接(需在微信或者手Q中瀏覽) 從上圖可以看到,我們主要實作的功能也是本文要講解的有: ......

    uj5u.com 2023-01-04 07:29:05 more
  • 一文讀懂 HTTP/1 HTTP/2 HTTP/3

    從 1989 年萬維網(www)誕生,HTTP(HyperText Transfer Protocol)經歷了眾多版本迭代,WebSocket 也在期間萌芽。1991 年 HTTP0.9 被發明。1996 年出現了 HTTP1.0。2015 年 HTTP2 正式發布。2020 年 HTTP3 或能正... ......

    uj5u.com 2022-12-24 06:56:02 more
  • 【HTML基礎篇002】HTML之form表單超詳解

    ??一、form表單是什么

    ??二、form表單的屬性

    ??三、input中的各種Type屬性值

    ??四、標簽 ......

    uj5u.com 2022-12-18 07:17:06 more