13 MySQL MHA集群

MySQL MHA 集群

[toc]

MHA 簡介

MHA ( Master High Availability )

  • youshimaton 開發(fā) https://github.com/yoshinorim
  • 一套優(yōu)秀的實現(xiàn) MySQL 高可用的解決方案
  • 數(shù)據(jù)庫的自動故障切換操作能做到在 0~30 秒之內(nèi)
  • MHA 能確保在故障切換過程中保證數(shù)據(jù)的一致性,以達到真正意義上的高可用

MHA 組成

  • MHA Manager ( 管理節(jié)點 )

    可以單獨部署在一臺獨立的機器上,管理其他節(jié)點

    也可以部署在一臺slave節(jié)點上

  • MHA Node ( 數(shù)據(jù)節(jié)點 )

    運行在每臺MySQL服務器上

MHA 工作過程

  • 由 Manager 定時探測集群中的 master 節(jié)點
  • 當 master 故障時,Manager 自動將擁有最新數(shù)據(jù)的 slave 提升為新的 master
  • 關(guān)鍵點
    1. 從宕機崩潰的 master 保存二進制日志事件
    2. 識別含有最新更新的 slave
    3. 應用差異的中繼日志 ( relay log ) 到其他的 slave
    4. 應用從 master 保存的二進制日志事件
    5. 提升一個slave為新的master
    6. 使其他的slave 連接新的 master 進行復制

部署 MHA 集群

部署MySQL 高可用集群 ( MHA + 主從同步 )

1549818084936

拓撲結(jié)構(gòu)

拓撲圖

1549817915989

IP 規(guī)劃

角色 IP地址 主機名
Master主節(jié)點 192.168.1.101 test1
備用1主節(jié)點 192.168.1.102 test2
備用2主節(jié)點 192.168.1.103 test3
第一臺slave 192.168.1.104 test4
第二臺slave 192.168.1.105 test5
MHA_manager (無mysqld) 192.168.1.106 test6
VIP地址 192.168.1.100

開始部署

部署 數(shù)據(jù)主機

101 ~ 105

  1. 配置一主多從

    主機 角色
    數(shù)據(jù)主機 192.168.1.101 master
    數(shù)據(jù)主機 192.168.1.102 slave 備用1主節(jié)點
    數(shù)據(jù)主機 192.168.1.103 slave 備用2主節(jié)點
    數(shù)據(jù)主機 192.168.1.104 slave
    數(shù)據(jù)主機 192.168.1.105 slave
    管理主機 192.168.1.106 manager
  2. 安裝依賴的 perl 軟件包

#配置好 epel 源,yum node節(jié)點時,可自動安裝以下 perl 依賴包
perl-Compress-Raw-Bzip2-2.061-3.el7.x86_64.rpm
perl-Compress-Raw-Zlib-2.061-4.el7.x86_64.rpm
perl-Data-Dumper-2.145-3.el7.x86_64.rpm
perl-DBD-MySQL-4.023-6.el7.x86_64.rpm
perl-DBI-1.627-4.el7.x86_64.rpm
perl-IO-Compress-2.061-2.el7.noarch.rpm
perl-Net-Daemon-0.48-5.el7.noarch.rpm
perl-PlRPC-0.2020-14.el7.noarch.rpm
  1. 安裝軟件 mha-node
yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm
  1. 配置數(shù)據(jù)節(jié)點 ssh 認證,彼此之間 root 用戶無密碼登陸
#配置好后可測試, mha_check_ssh 腳本也可測試.
ssh host hostname;
  1. 授權(quán)監(jiān)控用戶
# 為所有數(shù)據(jù)主機授權(quán) root用戶 管理主機訪問監(jiān)控使用
grant all on *.* to 'root'@'%' identified by '123456';
  1. 所有數(shù)據(jù)主機服務器啟用不自動刪除本機的中繼日志文件
# 101~105
set global relay_log_purge=off;
# 永久配置
[mysqld]
relay_log_purge=off
  1. 主庫 及 備用主庫 特殊配置
# 為主庫 和 備用主庫 創(chuàng)建主從復制用戶 repl
# 此拓撲中 為 192.168.1.102 和 103 添加 repl 用戶,當默認主庫宕機,接管主庫的機器需要此用戶用作新的主從同步.
grant replication slave on *.* to 'repl'@'%' identified by '123456'

# 為主庫 和 備用主庫 半同步復制 101~103
# 高可用架構(gòu)下,master和slave需同時啟動,以便在主從切換后能繼續(xù)使用半同步復制
[mysqld]
plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl_semi_sync_master_enabled=1
rpl_semi_sync_slave_enabled=1

配置 管理主機

  1. 安裝依賴的 perl 軟件包
#配置好 epel 源,yum node節(jié)點時,可自動安裝以下 perl 依賴包
perl-Compress-Raw-Bzip2-2.061-3.el7.x86_64.rpm
perl-Compress-Raw-Zlib-2.061-4.el7.x86_64.rpm
perl-Data-Dumper-2.145-3.el7.x86_64.rpm
perl-DBD-MySQL-4.023-6.el7.x86_64.rpm
perl-DBI-1.627-4.el7.x86_64.rpm
perl-IO-Compress-2.061-2.el7.noarch.rpm
perl-Net-Daemon-0.48-5.el7.noarch.rpm
perl-PlRPC-0.2020-14.el7.noarch.rpm
  1. 安裝 node 和 manager 軟件包
#先安裝 node 節(jié)點包,manager 依賴 node 
yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm
yum install mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
  1. 配置 ssh 認證, manager 主機,可以 使用 root 用戶訪問所有數(shù)據(jù)主機

  2. 修改配置文件

MHA 配置文件 app1.cnf

mkdir -p /etc/mha/
cat > /etc/mha/app1.cnf <<EOF
#默認配置 可單獨寫入 /etc/masterha_default.cnf
[server default]
manager_workdir=/etc/mha
manager_log=/etc/mha/manager.log
master_ip_failover_script=/etc/mha/master_ip_failover

# ssh 認證用戶 端口
ssh_user=root
ssh_port=22

#主從用戶 密碼
repl_user=repl
repl_password=123123

# manager 主機監(jiān)控用戶 密碼 訪問所有 數(shù)據(jù)主機
user=root
password=123456

[server1]
hostname=192.168.1.101
#默認3306,可省略
port=3306   
candidate_master=1

[server2]
hostname=192.168.1.102
#設(shè)置為候選master
candidate_master=1

[server3]
hostname=192.168.1.103
candidate_master=1

[server4]
hostname=192.168.1.104
#不競選master
no_master=1

[server5]
hostname=192.168.1.105
no_master=1

EOF

master_ip_failover 腳本

腳本修改 25 - 28

my $vip = '192.168.1.100/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";

完整腳本,默認腳本無法正常執(zhí)行

cat > /etc/mha/master_ip_failover << EOF
#!/usr/bin/env perl

#  Copyright (C) 2011 DeNA Co.,Ltd.
#  You should have received a copy of the GNU General Public License
#   along with this program; if not, write to the Free Software
#  Foundation, Inc.,
#  51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

## Note: This is a sample script and is not complete. Modify the script based on your environment.

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 = '192.168.1.100/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";

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 {
    print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";
    if ( $command eq "stop" || $command eq "stopssh" ) {
        my $exit_code = 1;
        eval {
            print "Disabling the VIP on old master: $orig_master_host \n";
            &stop_vip();
            $exit_code = 0;
        };
        if ($@) {
            warn "Got Error: $@\n";
            exit $exit_code;
        }
        exit $exit_code;
    }
    elsif ( $command eq "start" ) {
        my $exit_code = 10;
        eval {
            print "Enabling the VIP - $vip on the new master - $new_master_host \n";
            &start_vip();
            $exit_code = 0;
        };
        if ($@) {
            warn $@;
            exit $exit_code;
        }
        exit $exit_code;
    }
    elsif ( $command eq "status" ) {
        print "Checking the Status of the script.. OK \n";
        exit 0;
    }
    else {
        &usage();
        exit 1;
    }
}
sub start_vip() {
    `ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
sub stop_vip() {
     return 0  unless  ($ssh_user);
    `ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}
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";
}

測試配置文件

測試 ssh 認證

masterha_check_ssh --conf=/etc/mha/app1.cnf

測試 主從 狀態(tài)

masterha_check_repl --conf=/etc/mha/app1.cnf

啟動服務

手動部署 vip 至 當前主庫上

ifconfig eth0:1 192.168.1.100/24

常用參數(shù)

  • 刪除宕機主庫配置

--remove_dead_master_conf

  • 忽略xxx.health文件 ( 即8小時內(nèi) 連續(xù)切換主庫 )

--ignore_last_failover

啟動命令

masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover

查看MHA運行狀態(tài)

masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:8842) is running(0:PING_OK), master:192.168.1.101

測試高可用集群

  1. 客戶端連接vip地址訪問數(shù)據(jù)庫
mysql -uweb -p123123 -h192.168.1.100
  1. 測試高可用

把主機 101 數(shù)據(jù)庫服務停止,自動切換主庫,和vip

mysql -uweb -p123123 -h192.168.1.100
mysql> select @@hostname;
+------------+
| @@hostname |
+------------+
| test1      |
+------------+

# 停止mysql 當前主庫
systemctl stop mysqld

mysql> select @@hostname;
+------------+
| @@hostname |
+------------+
| test2      |
+------------+

恢復 MHA 集群

  1. 把宕機的數(shù)據(jù)庫 A 服務器修復.

  2. 重新設(shè)置已修復 A 服務器 為當前主庫的從庫,保證數(shù)據(jù)主從同步.

    生產(chǎn)環(huán)境,需要保證 A 數(shù)據(jù)先和 當前主庫數(shù)據(jù)保持一致.

  3. 重新添加服務器 A 配置文件.至app1.cnf

  4. 重新啟動MHA,測試

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末超升,一起剝皮案震驚了整個濱河市捷沸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌新症,老刑警劉巖恳蹲,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虐块,死亡現(xiàn)場離奇詭異,居然都是意外死亡嘉蕾,警方通過查閱死者的電腦和手機贺奠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荆针,“玉大人敞嗡,你說我怎么就攤上這事『奖常” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵棱貌,是天一觀的道長玖媚。 經(jīng)常有香客問我,道長婚脱,這世上最難降的妖魔是什么今魔? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任勺像,我火速辦了婚禮,結(jié)果婚禮上错森,老公的妹妹穿的比我還像新娘吟宦。我一直安慰自己,他們只是感情好涩维,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布殃姓。 她就那樣靜靜地躺著,像睡著了一般瓦阐。 火紅的嫁衣襯著肌膚如雪蜗侈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天睡蟋,我揣著相機與錄音踏幻,去河邊找鬼。 笑死戳杀,一個胖子當著我的面吹牛该面,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播信卡,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼隔缀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了坐求?” 一聲冷哼從身側(cè)響起蚕泽,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎桥嗤,沒想到半個月后须妻,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡泛领,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年荒吏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片渊鞋。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡绰更,死狀恐怖反番,靈堂內(nèi)的尸體忽然破棺而出奴拦,到底是詐尸還是另有隱情抛姑,我是刑警寧澤惰瓜,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布寝贡,位于F島的核電站晓勇,受9級特大地震影響戳粒,放射性物質(zhì)發(fā)生泄漏力图。R本人自食惡果不足惜役首,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一尝丐、第九天 我趴在偏房一處隱蔽的房頂上張望显拜。 院中可真熱鬧,春花似錦爹袁、人聲如沸远荠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽譬淳。三九已至,卻和暖如春根时,著一層夾襖步出監(jiān)牢的瞬間瘦赫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工蛤迎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留确虱,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓替裆,卻偏偏與公主長得像校辩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子辆童,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容

  • http://blog.sina.com.cn/s/blog_166c0ec620102wz03.html 一、M...
    SkTj閱讀 2,967評論 0 10
  • MySQL MHA 架構(gòu)介紹:MHA由兩部分組成MHA Manager(管理節(jié)點)和MHA Node(數(shù)據(jù)節(jié)點)庭砍,...
    XuDongTian閱讀 874評論 0 3
  • feisky云計算场晶、虛擬化與Linux技術(shù)筆記posts - 1014, comments - 298, trac...
    不排版閱讀 3,855評論 0 5
  • 如果有一天 你我在這塵世欣然相遇 那是我輾轉(zhuǎn)了幾個世紀 查找所有關(guān)于你的蛛絲馬跡 只為了這一世能和你把美好回憶 如...
    孤獨殘雨閱讀 329評論 4 7
  • 突然地會看見一些之前的記憶 我總感覺,是昨天剛剛經(jīng)歷過 我們都在彼此的祝福與期盼中長大 我們學會互相鼓勵在扶持中變...
    flurrys閱讀 298評論 0 0