詳細検索

마스터하이 가용 관리자(MHA) 배포 설정

아바타
글쓴이 komi

마스터하이 가용 관리자(MHA) 배포 설정
日本語에서 번역 • 원문 보기

MHA(MasterHigh AvailabilityManager) 배포 설정 사용 버전: mha4mysql-manager-0.53-0, MySQL-5.5

mha-img1

(1) 간단한 혜택 설명 등.

MHA는 MySQL 마스터 실패 시 최신 슬레이브를 마스터로 사용하고, 다른 슬레이브의 차이를 보정하며, 마스터의 방향을 변경하는 제품입니다.
Heartbeat+mon+mysql과 비교하면, 복제를 재구성하기 때문에 전환해도 DB가 단일 데이터베이스가 되지 않습니다. (3개 이상의 유닛 구성의 경우)

저자 슬라이드 공식 웹사이트
MHA 제한사항: LOAD DATA INFILE은 mysql 5.0 이상과 SBR(문장 기반 복제)에 사용할 수 없습니다.
*관리자는 관리자 서버이고, 노드는 DB 서버(마스터와 슬레이브에 공통)입니다.

(2) 관리자 *이하 ADM 서버에서 수행 완료 시

설치
[php]

http://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.53-0.noarch.rpm

http://mysql-master-ha.googlecode.com/files/mha4mysql-manager-0.53-0.noarch.rpm

맛있어 --enablerepo=rpmforge 설치 \

perl-Config-Tiny \ perl-Time-HiRes \ perl-Log-Dispatch \ perl-Parallel-ForkManager \ perl-Params-Validate

yum install perl-DBD-MySQL

rpm -ivh MHA4mysql*

[/php]

[shell]yum install --enablerepo=remi mysql mysql-server perl-DBD-MySQL[/shell] *mysql-server에 관리자가 필요하지 않을 수도 있습니다

(3) 노드 설치(이하 DB 서버에서 수행됨)
[쉘]

http://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.53-0.noarch.rpm

rpm -ivh MHA4MySQL-Node*

[/shell] (4) 설정 변경(관리자)

・SSH 공개키 설정
관리자의 루트(root)로 노드에 로그인할 수 있어야 합니다
키 생성 (ssh-keygen -t rsa -N ""
각 노드의 공개키 링(/root/.ssh/authorized_keys)에 공개키(~.pub)를 추가하세요.

·설정 파일 및 스크립트 설치
[쉘]

# vi /etc/app1.cnf

[서버 기본값]

MySQL 사용자 및 비밀번호

user=root 비밀번호= ssh_user=root

매니저에 관한 작업 디렉터리

Manager_workdir=/var/log/masterha/app1 manager_log=/var/log/masterha/app1/manager.log

MySQL 서버의 작업 디렉터리

Remote_workdir=/var/log/masterha/app1

주인 빈로그 감독

Master_binlog_dir=/USR/local/MySQL/VAR

Master_ip_failover_script=/USR/local/Bin/Master_ip_failover report_host=/USR/local/bin/send_report ping_interval=3

[서버1] hostname=192.168.100.1 port=3306

[서버2] 호스트네임=192.168.100.2 포트=3306 후보_master=1

[서버3] hostname=192.168.100.3 port=3306

아니_master=1

[/shell] 주요 구성 매개변수는 여기에서 확인할 수 있습니다

*더 나은 다른 매개변수들
부차_check_script
 두 번째 인터페이스에서 확인할 스크립트와 호스트를 지정하세요.
무시_fail
 두 번째 슬레이브가 쓰러지더라도, 마스터가 쓰러지더라도 전환하고 싶으면 슬레이브 상태에서 무시할 수 있습니다.
셧다운_script
 스플릿브레인 등을 막기 위해 마스터를 완전히 버리고 싶다면 이 옵션이 포함된 스크립트를 지정하는 것이 좋을 것 같습니다.

VIP 전환 스크립트
[쉘]

# vi /USR/로컬/BIN_ip_failover

#!/usr/bin/env perl

strict를 사용하세요; 경고를 사용하세요 FATAL => '모두';

Getopt::long;

내 ( ( $command, $ssh_user, $orig_master_host, $orig_master_ip, $orig_master_port, $new_master_host, $new_master_ip, $new_master_port );

내 $vip = '192.168.100.5/24'; # 가상 IP 내 $key = "1"; 내 $ssh_start_vip = "sudo /sbin/ifconfig eth1:$key $vip"; 내 $ssh_stop_vip = "sudo /sbin/ifconfig eth1:$key 다운"; 내 $ssh_stop_mysqld = "sudo /sbin/service mysqld stop";

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, );

exit &main();

서브 메인 {

print "\n\nSCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";

만약 ( $command eq "stop" || $command eq "stopssh" ) {

$orig_master_host, $orig_master_ip, $orig_master_port 지나갔다.

# 글로벌 카탈로그 데이터베이스에서 마스터 IP 주소를 관리한다면, # 여기서 원본_master_ip 무효화하세요. 내 $exit_code = 1; eval { print "구 마스터에서 VIP 비활성화: $orig_master_host \n"; eval { &stop_vip(); print "구마스터에서 mysqld 중지: $orig_master_host \n"; system("ssh $ssh_user\@$orig_master_host \" $ssh_stop_mysqld \"); }; system("/usr/local/bin/mod_lvs_weight.sh"); $exit_code = 0; }; if ($@) {warn "오류 발생: $@\n";

출구 $exit_code;

}

출구 $exit_code;

} 엘시프 ( $command EQ "시작" ) {

모든 논쟁은 통과되었습니다.

# 글로벌 카탈로그 데이터베이스에서 마스터 IP 주소를 관리한다면, # 여기서 새 파일을 활성화_master_ip. # 여기서도 쓰기 권한을 부여할 수 있습니다(사용자 생성, 읽기_only=0 설정 등). 내 $exit_code = 10; eval { print "VIP 활성화 - 새 마스터에서 $vip - $new_master_host \n"; &start_vip(); $exit_code = 0; }; if ($@) { warn $@; exit $exit_code; } exit $exit_code; } elsif ($command eq "status" ) { print "스크립트 상태 확인 중.. OK \n";

'ssh $ssh_user@gentoo8 " $ssh_start_VIP "'';

출구 0; } 그렇지 않으면 { &usage(); 출구 1; } }

새 마스터에서 VIP를 활성화하는 간단한 시스템 호출

서브 시작_vip() { 'ssh $ssh_user@$new_master_host " $ssh_start_VIP "''; }

간단한 시스템 호출로 옛 VIP를 비활성화_master

sub stop_vip() { '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";

}

[/shell] *IP, IF, mysql 삭제, LVS 가중치 변경 같은 처리 부분은 필요에 따라 변경되어야 합니다.
원작 대본

VIP를 전환하는 스크립트에서 호출된 LVS의 가중치를 바꾸는 스크립트
[쉘]

# vi /USR/local/bin/mod_lvs_weight.sh

#!/빈/배쉬 #

이 대본은 마스터_ip_failover-스크립트에서 강요당해.

스크립트-작업: 관리자 서버에서 lvs-weight와 backup-script-weight를 수정하세요.

isao-unyou 2012.11.5 - 창조

수정해 주세요. (그리고 ldirectod.cf.failover를 확인해!)

제목=테스트 읽기=192. 168.100.8 LVSSRV1=192.168.100.6 LVSSRV2=192.168.100.7 NIC=eth1 DB1=192.168.100.1 DB2=192.168.100.2 DB3=192.168.100.3 NETWORK=192.168.100 LVS_CF=/etc/ha.d/ldirectord.cf MAILADDR=XXXX@isao.net BKUPSRV=192.168.100.3 BKUP_SH=/opt/bin/mysql-back.sh DB1_WEIGHT=0 DB2_WEIGHT=2 DB3_WEIGHT=4 BK_WEIGHT=4 MHA_LOG=/var/log/masterha/app1/manager.log

VIP 서버 점검 읽기

srv_chk() { RVIP_CHK='ssh $LVSSRV 1 ip addr show $NIC|grep $READVIP|awk '{print $2}'|awk -F / '{print $1}''' if [ "$READVIP" = "$RVIP_CHK" ]; then LVSSRV=$LVSSRV 1 LVSBKSRV=$LVSSRV 2 RVIP_CHK2='ssh $LVSSRV 2 ip addr show $NIC|grep $READVIP|awk '{print $2}'|awk -F / '{print $1}'' if [ "$READVIP" = "$RVIP_CHK2" ]; 그리고 에코 "'LANG=C;date': LVS가 VIP 스플릿-브레인 'uname -n'을 읽습니다." \ | 메일 -s "NG_READ_VIP $READVIP" $MAILADDR 에코 'ERROR: LVS가 vip split-brain을 읽습니다. ' exit 1 fi else RVIP_CHK2='ssh $LVSSRV 2 ip addr show $NIC|grep $READVIP|awk '{print $2}'|awk -F / '{print $1}'' 만약 [ "$READVIP" = "$RVIP_CHK2" ]; 그럼 LVSSRV=$LVSSRV 2 LVSBKSRV=$LVSSRV 1 그렇지 않으면 에코 "'LANG=C;date': LVS가 vip unknown 'uname -n'을 읽습니다." \ | 메일 -s "NG_READ_VIP $READVIP" $MAILADDR 에코 '오류: LVS 읽음 VIP 알 수 없음. ' 출구 1 fi }

LMS 무게와 메일을 수정해 unyou로 바꾸세요. (LVS 무게 정보)

모드_weight() { ssh $LVSSRV "IPvsadm -e -t $READVIP:3306 -R $DB 1 -G -W $DB 1_WEIGHT" ssh $LVSSRV "ipvsadm -e -t $READVIP:3306 -r $DB 2 -G -W $DB 2_WEIGHT" ssh $LVSSRV "ipvsadm -e -t $READVIP:3306 -r $DB 3 -G -W $DB 3_WEIGHT" ssh $LVSSRV "CP -P $LVS_CF{,.' 날짜 +%Y%m%d.%H%M'} \ && \cp -pf $LVS_CF.failover $LVS_CF \ & & 서비스 ldirectord 강제-재장전" \ && scp -Cp $LVSSRV:$LVS_CF /tmp/ \ & scp -Cp /tmp/ldirectord.cf $LVSBKSRV:/etc/ha.d/ 에코 -e "'LANG=C;date'\n현재 가중치: \n\n 'ssh $LVSSRV ipvsadm -Ln'" \ | mail -s "$TITLE mysql-master Failover. LVS와 bkupscript 무게를 수정하세요." $MAILADDR

백업 스크립트를 수정해.

#ssh $BKUPSRV "cp -p $BKUP_SH{,.'date +%Y%m%d.%H%M'} && sed -i \"s/WEIGHT=[0-9]{1,100}/WEIGHT=$BK_WEIGHT/g\" $BKUP_SH" }

메인

exec >> $MHA_LOG exec 2>&1 에코 "시작하세요 lvs 가중치 변경. '날짜 '+%Y%m%d %T''" srv_weight_chk 에코 "END lvs 가중치 변경. '날짜 '+%Y%m%d %T''"

출구 0

chmod +x /usr/local/bin/mod_lvs_weight.sh

[/shell]
신고 이메일 발송 스크립트

[쉘]# vi /USR/로컬/빈/전송_report

#!/USR/bin/Perl

참고: 이 스크립트는 샘플 스크립트이며 완성되지 않았습니다. 환경에 맞게 스크립트를 수정하세요.

strict를 사용하세요; 경고를 사용하세요 FATAL => '모두';

Getopt::long;

#new_master_host와 new_slave_hosts는 회복 마스터가 내 ($dead_master_host, $new_master_host, $new_slave_hosts, $subject, $body 할 때만 설정됩니다). GetOptions('orig_master_host=s' => \$dead _master_host, 'new_master_host=s' => \$new_master_host, 'new_slave_hosts=s' => \$new_slave_hosts, 'subject=s' => \$subject, 'body=s' => \$body, );

여기서 하고 싶은 대로 해.

#my $vip = '/sbin/ip addr show eth0'; my $vip = '/usr/bin/ssh $new_master_host /sbin/ip addr show eth0'; 내 $datetime = '/bin/date +%Y%m%d_%H:%M:%S'; 내 $manager_cnf='/etc/app1.cnf'; my $manager_workdir='grep manager_workdir $manager_cnf|sed -e 's/[^=]=//g''; my $remote_workdir='grep remote_workdir $manager_cnf|sed -e 's/[^=]=//g''; my $sendmail = '/usr/sbin/sendmail'; # sendmailcommand 경로 내 $from = 'hoge@isao.net'; # 이메일 #my $to에서 = 'hoge@isao.co.jp'; # 이메일 주소에서 내 $to = 'hoge@isao.net'; # 내 이메일 주소로 $cc = 'hoge@ezweb.ne.jp'; # 참조: 이메일 주소 #$subject = '테스트'; # 이메일 제목 #$msg = <"_TEXT_"; #="" メールの本文(ヒアドキュメントで変数に代入)="" #message="" #_text_="" #="" sendmail="" コマンド起動="" open(sdml,"|="" $sendmail="" -t="" -i")="" ||="" die="" 'sendmail="" error';="" #="" メールヘッダ出力="" print="" sdml="" "from:="" $from\n";="" print="" sdml="" "to:="" $to\n";="" print="" sdml="" "cc:="" $cc\n";="" print="" sdml="" "subject:="" $subject="" $datetime\n";="" print="" sdml="" "content-transfer-encoding:="" 7bit\n";="" print="" sdml="" "content-type:="" text/plain;charset="\"ISO-2022-JP\"\n\n";" #="" メール本文出力="" #print="" sdml="" "$msg";="" print="" sdml="" "$body";="" print="" sdml="" "\n";="" print="" sdml="" "ip="" addr="" show="" eth0:\n";="" print="" sdml="" "="" $vip";="" print="" sdml="" "\n";="" print="" sdml="" "="" manager_workdir:\n";="" print="" sdml="" /bin/ls="" -l="" $manager_workdir\n;="" print="" sdml="" "="" remote_workdir:\n";="" print="" sdml="" /bin/ls="" -l="" $remote_workdir\n;="" #="" sendmail="" コマンド閉じる="" close(sdml);="" exit="" 0;="" ------------------------------------------[/shell]="" ※tarからダウンロードしてきたものに追記。="" ※適宜、sendmailのセットアップとレポートが送付されるか動作確認する。="" ⑤="" 設定変更(ノード)="" ・sudo設定="" [shell]="" ##="" #="" visudo="" defaults="" requiretty="" ↓="" ##="" #defaults="" requiretty="" [/shell]="" ※ssh越しにsudoして以下のメッセージが出る場合の設定(master_ip_failoverスクリプトを利用する場合に必要)="" sudo:="" sorry,="" you="" must="" have="" a="" tty="" to="" run="" sudo="" ・mysql的な初期ユーザ設定(ノード側)="" rootでセグメント許可でgrantつけず(mysqlのユーザ名はrootでなくても大丈夫)="" [sql]="" #="" mysql="" -u="" root="" -p=""> . 모든 권한을 'root'@'192.168.100.%'로 부여 '****'로 식별; mysql.user에서 사용자, 호스트, 비밀번호를 선택; [/sql] ・복제 구축

마스터의 로그 파일과 위치를 확인하세요
주인님
[sql] 마스터 리셋; 마스터 상태 표시; [/sql] 로그 파일 이름과 위치를 확인하고 기록하세요.

슬레이브 서버에 마스터 정보를 지정하고 복제를 시작하세요
노예
[sql] 마스터 리셋; 마스터 상태 표시; 마스터 변경 MASTER → _HOST='마스터의 IP 주소', MASTER_USER='REPL', MASTER_PASSWORD='**', MASTER_LOG_FILE='mysql-bin.0000001', MASTER_LOG_POS=106; START slave; 슬레이브 상태 표시\\G 설정 전역 읽기_only=1; 'read_only' 같은 전역 변수 표시; [/sql] 기본 상태일 경우 마스터 재설정; 슬레이브 재설정; 해야 할 일은 위치를 일치시키는 것뿐입니다.
데이터가 있다면 마스터에 위치를 기록하고, mysqldump로 데이터를 가져오고 전송한 뒤, 데이터를 mysql에 입력하고 위치를 매칭한 후 슬레이브를 시작하세요.
Replicate_Ignore_DB와 같은 필터링 규칙은 공통이어야 합니다

・릴레이 로그 스위칭 설정
퍼지_relay_logs는 MHA가 도입될 때 노드에 릴레이 로그 세트가 발생하지 않도록 설정에 대한 보완 명령어입니다.
마스터가 전환될 때는 릴레이 로그가 마스터와의 차이를 보정하는 데 사용되므로 필요하다고 해서 삭제하지 마세요.
[shell]

mysql -u root -p'cat /path_to_file'

글로벌 릴레이_log_purge=0을 설정; '릴레이_log%'와 같은 글로벌 변수를 표시;

ls -l /var/lib/mysql/mysqld-relay-bin.*

/USR/bin/Perl /USR/bin/purge_relay_logs --user=root --password='cat /path_to_file' --disable_relay_log_purge >> /var/log/masterha/purge_relay_logs.log 2>&1

ls -l /var/lib/mysql/mysqld-relay-bin.*

꼬리 /var/log/masterha/purge_relay_logs.log

크론탭 -에

----------slave1---------- 30 2,4,6,10,14,16 * * * /usr/bin/perl /usr/bin/purge_relay_logs --user=root --password='cat /path_to_file' --disable_relay_log_purge >> /var/log/masterha/purge_relay_logs.log 2>&1 ----------slave2----------

30 3,5,9,11,15,17 * * * /usr/bin/perl /usr/bin/purge_relay_logs --user=root --password='cat /path_to_file' --disable_relay_log_purge >> /var/log/masterha/purge_relay_logs.log 2>&1

[/shell] *노예 간에 크론을 호출하는 것이 권장됩니다. (모든 노예가 동시에 정리를 시작하면_relay_logs 충돌 시 필요한 릴레이 로그 이벤트가 없을 수 있습니다.) )
*다른 집계 배치와 겹치지 않도록 주의하세요. (부하 기준)
릴레이 로그가 너무 많이 쌓여 문제를 일으킨다면, 매시간 설치해야 합니다.
*마스터를 반환하지 않는 연산의 경우, 마스터를 주석 종료 상태로 교차 시점에 등록하는 것이 좋습니다.
*ioDrive에 마운트되어 있고 /var/tmp에 하드링크할 수 없다면, 마운트할 디렉터리를 –workdir 옵션으로 지정해야 합니다.

purge_relay_logs 명령 옵션과 사양에 대한 자세한 정보는 여기를 참조하세요.

릴레이 로그 사양
http://dev.mysql.com/doc/refman/5.1/ja/slave-logs-relaylog.htmlhttp://open-groove.net/mysql/binlog-relay-log/ 다음은 전환 테스트입니다.

・참고 URL
mha-for-mysqldenaMHA for MySQL: MySQL용 마스터 고가용성 관리자 및 도구들 MySQL-MHA 도입 MySQL-MHA를 자신의 환경에 적용할 때 고려할 사항MySQL-MHAT를 시도해 보세요 MySQL-MHAT를 이용해 자동 MySQL 장애 조치 시도 DeNA의 MySQL 운영과 NHN 테크놀로지 컨퍼런스에서 Amazon RDS를 비교합니다. mysql-mha를 추가해 보았습니다! 2부MHA, 무라쿠모 & 미atomd / master_ip_failover MHA와 HAProxy로 MySQL 복제를 페일오버해 봅시다 MHA + HAProxy MHA(MasterHigh AvailabilityManager) 배포 설정으로 MySQL 중복성을 만들어봅시다 사용 버전: mha4mysql-manager-0.53-0, MySQL-5.5

mha-img1

(1) 간단한 혜택 설명 등.

MHA는 MySQL 마스터 실패 시 최신 슬레이브를 마스터로 사용하고, 다른 슬레이브의 차이를 보정하며, 마스터의 방향을 변경하는 제품입니다.
Heartbeat+mon+mysql과 비교하면, 복제를 재구성하기 때문에 전환해도 DB가 단일 데이터베이스가 되지 않습니다. (3개 이상의 유닛 구성의 경우)

저자 슬라이드 공식 웹사이트
MHA 제한사항: LOAD DATA INFILE은 mysql 5.0 이상과 SBR(문장 기반 복제)에 사용할 수 없습니다.
*관리자는 관리자 서버이고, 노드는 DB 서버(마스터와 슬레이브에 공통)입니다.

(2) 관리자 *이하 ADM 서버에서 수행 완료 시

설치
[php]

http://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.53-0.noarch.rpm

http://mysql-master-ha.googlecode.com/files/mha4mysql-manager-0.53-0.noarch.rpm

맛있어 --enablerepo=rpmforge 설치 \

perl-Config-Tiny \ perl-Time-HiRes \ perl-Log-Dispatch \ perl-Parallel-ForkManager \ perl-Params-Validate

yum install perl-DBD-MySQL

rpm -ivh MHA4mysql*

[/php]

[shell]yum install --enablerepo=remi mysql mysql-server perl-DBD-MySQL[/shell] *mysql-server에 관리자가 필요하지 않을 수도 있습니다

(3) 노드 설치(이하 DB 서버에서 수행됨)
[쉘]

http://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.53-0.noarch.rpm

rpm -ivh MHA4MySQL-Node*

[/shell] (4) 설정 변경(관리자)

・SSH 공개키 설정
관리자의 루트(root)로 노드에 로그인할 수 있어야 합니다
키 생성 (ssh-keygen -t rsa -N ""
각 노드의 공개키 링(/root/.ssh/authorized_keys)에 공개키(~.pub)를 추가하세요.

·설정 파일 및 스크립트 설치
[쉘]

# vi /etc/app1.cnf

[서버 기본값]

MySQL 사용자 및 비밀번호

user=root 비밀번호= ssh_user=root

매니저에 관한 작업 디렉터리

Manager_workdir=/var/log/masterha/app1 manager_log=/var/log/masterha/app1/manager.log

MySQL 서버의 작업 디렉터리

Remote_workdir=/var/log/masterha/app1

주인 빈로그 감독

Master_binlog_dir=/USR/local/MySQL/VAR

Master_ip_failover_script=/USR/local/Bin/Master_ip_failover report_host=/USR/local/bin/send_report ping_interval=3

[서버1] hostname=192.168.100.1 port=3306

[서버2] 호스트네임=192.168.100.2 포트=3306 후보_master=1

[서버3] hostname=192.168.100.3 port=3306

아니_master=1

[/shell] 주요 구성 매개변수는 여기에서 확인할 수 있습니다

*더 나은 다른 매개변수들
부차_check_script
 두 번째 인터페이스에서 검사할 스크립트와 호스트를 지정하세요
무시_fail
 두 번째 슬레이브가 쓰러지더라도, 마스터가 쓰러지더라도 전환하고 싶으면 슬레이브 상태에서 무시할 수 있습니다.

VIP 전환 스크립트
[쉘]

# vi /USR/로컬/BIN_ip_failover

#!/usr/bin/env perl

strict를 사용하세요; 경고를 사용하세요 FATAL => '모두';

Getopt::long;

내 ( ( $command, $ssh_user, $orig_master_host, $orig_master_ip, $orig_master_port, $new_master_host, $new_master_ip, $new_master_port );

내 $vip = '192.168.100.5/24'; # 가상 IP 내 $key = "1"; 내 $ssh_start_vip = "sudo /sbin/ifconfig eth1:$key $vip"; 내 $ssh_stop_vip = "sudo /sbin/ifconfig eth1:$key 다운"; 내 $ssh_stop_mysqld = "sudo /sbin/service mysqld stop";

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, );

exit &main();

서브 메인 {

print "\n\nSCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";

만약 ( $command eq "stop" || $command eq "stopssh" ) {

$orig_master_host, $orig_master_ip, $orig_master_port 지나갔다.

# 글로벌 카탈로그 데이터베이스에서 마스터 IP 주소를 관리한다면, # 여기서 원본_master_ip 무효화하세요. 내 $exit_code = 1; eval { print "구 마스터에서 VIP 비활성화: $orig_master_host \n"; eval { &stop_vip(); print "구마스터에서 mysqld 중지: $orig_master_host \n"; system("ssh $ssh_user\@$orig_master_host \" $ssh_stop_mysqld \"); }; system("/usr/local/bin/mod_lvs_weight.sh"); $exit_code = 0; }; if ($@) {warn "오류 발생: $@\n";

출구 $exit_code;

}

출구 $exit_code;

} 엘시프 ( $command EQ "시작" ) {

모든 논쟁은 통과되었습니다.

# 글로벌 카탈로그 데이터베이스에서 마스터 IP 주소를 관리한다면, # 여기서 새 파일을 활성화_master_ip. # 여기서도 쓰기 권한을 부여할 수 있습니다(사용자 생성, 읽기_only=0 설정 등). 내 $exit_code = 10; eval { print "VIP 활성화 - 새 마스터에서 $vip - $new_master_host \n"; &start_vip(); $exit_code = 0; }; if ($@) { warn $@; exit $exit_code; } exit $exit_code; } elsif ($command eq "status" ) { print "스크립트 상태 확인 중.. OK \n";

'ssh $ssh_user@gentoo8 &quot; $ssh_start_VIP &quot;'';

출구 0; } 그렇지 않으면 { &usage(); 출구 1; } }

새 마스터에서 VIP를 활성화하는 간단한 시스템 호출

서브 시작_vip() { 'ssh $ssh_user@$new_master_host &quot; $ssh_start_VIP &quot;''; }

간단한 시스템 호출로 옛 VIP를 비활성화_master

sub stop_vip() { 'ssh $ssh_user@$orig_master_host &quot; $ssh_stop_VIP &quot;'; }

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";

}

[/shell] *IP, IF, mysql 삭제, LVS 가중치 변경 같은 처리 부분은 필요에 따라 변경되어야 합니다.
원작 대본

VIP를 전환하는 스크립트에서 호출된 LVS의 가중치를 바꾸는 스크립트
[쉘]

# vi /USR/local/bin/mod_lvs_weight.sh

#!/빈/배쉬 #

이 대본은 마스터_ip_failover-스크립트에서 강요당해.

스크립트-작업: 관리자 서버에서 lvs-weight와 backup-script-weight를 수정하세요.

isao-unyou 2012.11.5 - 창조

수정해 주세요. (그리고 ldirectod.cf.failover를 확인해!)

제목=테스트 읽기=192. 168.100.8 LVSSRV1=192.168.100.6 LVSSRV2=192.168.100.7 NIC=eth1 DB1=192.168.100.1 DB2=192.168.100.2 DB3=192.168.100.3 NETWORK=192.168.100 LVS_CF=/etc/ha.d/ldirectord.cf MAILADDR=XXXX@isao.net BKUPSRV=192.168.100.3 BKUP_SH=/opt/bin/mysql-back.sh DB1_WEIGHT=0 DB2_WEIGHT=2 DB3_WEIGHT=4 BK_WEIGHT=4 MHA_LOG=/var/log/masterha/app1/manager.log

VIP 서버 점검 읽기

srv_chk() { RVIP_CHK='ssh $LVSSRV 1 ip addr show $NIC|grep $READVIP|awk '{print $2}'|awk -F / '{print $1}''' if [ "$READVIP" = "$RVIP_CHK" ]; then LVSSRV=$LVSSRV 1 LVSBKSRV=$LVSSRV 2 RVIP_CHK2='ssh $LVSSRV 2 ip addr show $NIC|grep $READVIP|awk '{print $2}'|awk -F / '{print $1}'' if [ "$READVIP" = "$RVIP_CHK2" ]; 그리고 에코 "'LANG=C;date': LVS가 VIP 스플릿-브레인 'uname -n'을 읽습니다." \ | 메일 -s "NG_READ_VIP $READVIP" $MAILADDR 에코 'ERROR: LVS가 vip split-brain을 읽습니다. ' exit 1 fi else RVIP_CHK2='ssh $LVSSRV 2 ip addr show $NIC|grep $READVIP|awk '{print $2}'|awk -F / '{print $1}'' 만약 [ "$READVIP" = "$RVIP_CHK2" ]; 그럼 LVSSRV=$LVSSRV 2 LVSBKSRV=$LVSSRV 1 그렇지 않으면 에코 "'LANG=C;date': LVS가 vip unknown 'uname -n'을 읽습니다." \ | 메일 -s "NG_READ_VIP $READVIP" $MAILADDR 에코 '오류: LVS 읽음 VIP 알 수 없음. ' 출구 1 fi }

LMS 무게와 메일을 수정해 unyou로 바꾸세요. (LVS 무게 정보)

모드_weight() { ssh $LVSSRV "IPvsadm -e -t $READVIP:3306 -R $DB 1 -G -W $DB 1_WEIGHT" ssh $LVSSRV "ipvsadm -e -t $READVIP:3306 -r $DB 2 -G -W $DB 2_WEIGHT" ssh $LVSSRV "ipvsadm -e -t $READVIP:3306 -r $DB 3 -G -W $DB 3_WEIGHT" ssh $LVSSRV "CP -P $LVS_CF{,.' 날짜 +%Y%m%d.%H%M'} \ && \cp -pf $LVS_CF.failover $LVS_CF \ & & 서비스 ldirectord 강제-재장전" \ && scp -Cp $LVSSRV:$LVS_CF /tmp/ \ & scp -Cp /tmp/ldirectord.cf $LVSBKSRV:/etc/ha.d/ 에코 -e "'LANG=C;date'\n현재 가중치: \n\n 'ssh $LVSSRV ipvsadm -Ln'" \ | mail -s "$TITLE mysql-master Failover. LVS와 bkupscript 무게를 수정하세요." $MAILADDR

백업 스크립트를 수정해.

#ssh $BKUPSRV "cp -p $BKUP_SH{,.'date +%Y%m%d.%H%M'} && sed -i \"s/WEIGHT=[0-9]{1,100}/WEIGHT=$BK_WEIGHT/g\" $BKUP_SH" }

메인

exec >> $MHA_LOG exec 2>&1 에코 "시작하세요 lvs 가중치 변경. '날짜 '+%Y%m%d %T''" srv_weight_chk 에코 "END lvs 가중치 변경. '날짜 '+%Y%m%d %T''"

출구 0

chmod +x /usr/local/bin/mod_lvs_weight.sh

[/shell]
신고 이메일 발송 스크립트

[쉘]# vi /USR/로컬/빈/전송_report

#!/USR/bin/Perl

참고: 이 스크립트는 샘플 스크립트이며 완성되지 않았습니다. 환경에 맞게 스크립트를 수정하세요.

strict를 사용하세요; 경고를 사용하세요 FATAL => '모두';

Getopt::long;

#new_master_host와 new_slave_hosts는 회복 마스터가 내 ($dead_master_host, $new_master_host, $new_slave_hosts, $subject, $body 할 때만 설정됩니다). GetOptions('orig_master_host=s' => \$dead _master_host, 'new_master_host=s' => \$new_master_host, 'new_slave_hosts=s' => \$new_slave_hosts, 'subject=s' => \$subject, 'body=s' => \$body, );

여기서 하고 싶은 대로 해.

#my $vip = '/sbin/ip addr show eth0'; my $vip = '/usr/bin/ssh $new_master_host /sbin/ip addr show eth0'; 내 $datetime = '/bin/date +%Y%m%d_%H:%M:%S'; 내 $manager_cnf='/etc/app1.cnf'; 내 $manager_workdir='grep manager_workdir $manager_cnf|sed -e 's/[^=]=//g''; 내 $remote_workdir='grep remote_workdir $manager_cnf|sed -e 's/[^=]=//g''; 내 $sendmail = '/usr/sbin/sendmail'; # sendmailcommand 경로 내 $from = 'unyou-all@isao.net'; # 이메일 #my $to에서 발송 = 'komiyay@isao.co.jp'; # 이메일 주소 내 $to = 'unyou-all@isao.net'; # 이메일 주소 내 $cc = 'komi325_y@ezweb.ne.jp'; # CC 이메일 주소 #$subject = '테스트'; # 이메일 제목 #$msg = <"_TEXT_"; #="" メールの本文(ヒアドキュメントで変数に代入)="" #message="" #_text_="" #="" sendmail="" コマンド起動="" open(sdml,"|="" $sendmail="" -t="" -i")="" ||="" die="" 'sendmail="" error';="" #="" メールヘッダ出力="" print="" sdml="" "from:="" $from\n";="" print="" sdml="" "to:="" $to\n";="" print="" sdml="" "cc:="" $cc\n";="" print="" sdml="" "subject:="" $subject="" $datetime\n";="" print="" sdml="" "content-transfer-encoding:="" 7bit\n";="" print="" sdml="" "content-type:="" text/plain;charset="\"ISO-2022-JP\"\n\n";" #="" メール本文出力="" #print="" sdml="" "$msg";="" print="" sdml="" "$body";="" print="" sdml="" "\n";="" print="" sdml="" "ip="" addr="" show="" eth0:\n";="" print="" sdml="" "="" $vip";="" print="" sdml="" "\n";="" print="" sdml="" "="" manager_workdir:\n";="" print="" sdml="" /bin/ls="" -l="" $manager_workdir\n;="" print="" sdml="" "="" remote_workdir:\n";="" print="" sdml="" /bin/ls="" -l="" $remote_workdir\n;="" #="" sendmail="" コマンド閉じる="" close(sdml);="" exit="" 0;="" ------------------------------------------[/shell]="" ※tarからダウンロードしてきたものに追記。="" ※適宜、sendmailのセットアップとレポートが送付されるか動作確認する。="" ⑤="" 設定変更(ノード)="" ・sudo設定="" [shell]="" ##="" #="" visudo="" defaults="" requiretty="" ↓="" ##="" #defaults="" requiretty="" [/shell]="" ※ssh越しにsudoして以下のメッセージが出る場合の設定(master_ip_failoverスクリプトを利用する場合に必要)="" sudo:="" sorry,="" you="" must="" have="" a="" tty="" to="" run="" sudo="" ・mysql的な初期ユーザ設定(ノード側)="" rootでセグメント許可でgrantつけず(mysqlのユーザ名はrootでなくても大丈夫)="" [sql]="" #="" mysql="" -u="" root="" -p=""> . 모든 권한을 'root'@'192.168.100.%'로 부여 '****'로 식별; mysql.user에서 사용자, 호스트, 비밀번호를 선택; [/sql] ・복제 구축

마스터의 로그 파일과 위치를 확인하세요
주인님
[sql] 마스터 리셋; 마스터 상태 표시; [/sql] 로그 파일 이름과 위치를 확인하고 기록하세요.

슬레이브 서버에 마스터 정보를 지정하고 복제를 시작하세요
노예
[sql] 마스터 리셋; 마스터 상태 표시; 마스터 변경 MASTER → _HOST='마스터의 IP 주소', MASTER_USER='REPL', MASTER_PASSWORD='**', MASTER_LOG_FILE='mysql-bin.0000001', MASTER_LOG_POS=106; START slave; 슬레이브 상태 표시\\G 설정 전역 읽기_only=1; 'read_only' 같은 전역 변수 표시; [/sql] 기본 상태일 경우 마스터 재설정; 슬레이브 재설정; 해야 할 일은 위치를 일치시키는 것뿐입니다.
데이터가 있다면 마스터에 위치를 기록하고, mysqldump로 데이터를 가져오고 전송한 뒤, 데이터를 mysql에 입력하고 위치를 매칭한 후 슬레이브를 시작하세요.
Replicate_Ignore_DB와 같은 필터링 규칙은 공통이어야 합니다

・릴레이 로그 스위칭 설정
퍼지_relay_logs는 MHA가 도입될 때 노드에 릴레이 로그 세트가 발생하지 않도록 설정에 대한 보완 명령어입니다.
마스터가 전환될 때는 릴레이 로그가 마스터와의 차이를 보정하는 데 사용되므로 필요하다고 해서 삭제하지 마세요.
[shell]

mysql -u root -p'cat /path_to_file'

글로벌 릴레이_log_purge=0을 설정; '릴레이_log%'와 같은 글로벌 변수를 표시;

ls -l /var/lib/mysql/mysqld-relay-bin.*

/USR/bin/Perl /USR/bin/purge_relay_logs --user=root --password='cat /path_to_file' --disable_relay_log_purge >> /var/log/masterha/purge_relay_logs.log 2>&1

ls -l /var/lib/mysql/mysqld-relay-bin.*

꼬리 /var/log/masterha/purge_relay_logs.log

크론탭 -에

----------slave1---------- 30 2,4,6,10,14,16 * * * /usr/bin/perl /usr/bin/purge_relay_logs --user=root --password='cat /path_to_file' --disable_relay_log_purge >> /var/log/masterha/purge_relay_logs.log 2>&1 ----------slave2----------

30 3,5,9,11,15,17 * * * /usr/bin/perl /usr/bin/purge_relay_logs --user=root --password='cat /path_to_file' --disable_relay_log_purge >> /var/log/masterha/purge_relay_logs.log 2>&1

[/shell] *노예 간에 크론을 호출하는 것이 권장됩니다. (모든 노예가 동시에 정리를 시작하면_relay_logs 충돌 시 필요한 릴레이 로그 이벤트가 없을 수 있습니다.) )
*다른 집계 배치와 겹치지 않도록 주의하세요. (부하 기준)
릴레이 로그가 너무 많이 쌓여 문제를 일으킨다면, 매시간 설치해야 합니다.
*마스터를 반환하지 않는 연산의 경우, 마스터를 주석 종료 상태로 교차 시점에 등록하는 것이 좋습니다.
*ioDrive에 마운트되어 있고 /var/tmp에 하드링크할 수 없다면, 마운트할 디렉터리를 –workdir 옵션으로 지정해야 합니다.

purge_relay_logs 명령 옵션과 사양에 대한 자세한 정보는 여기를 참고하시기 바랍니다.

릴레이 로그 사양
http://dev.mysql.com/doc/refman/5.1/ja/slave-logs-relaylog.htmlhttp://open-groove.net/mysql/binlog-relay-log/

다음은 전환 테스트입니다.

・참고 URL
mha-for-mysqldenaMHA for MySQL: MySQL용 마스터 고가용성 관리자 및 도구들 MySQL-MHA 도입 MySQL-MHA를 자신의 환경에 적용할 때 고려할 사항MySQL-MHAT를 시도해 보세요 MySQL-MHAT를 이용해 자동 MySQL 장애 조치 시도 DeNA의 MySQL 운영과 NHN 테크놀로지 컨퍼런스에서 Amazon RDS를 비교합니다. mysql-mha를 추가해 보았습니다! 2부MHA, 무라쿠모 & 미atomd / 마스터_ip_failoverMHA와 HAProxy를 이용한 MySQL의 페일오버 복제 MHA + HAProxy로 MySQL 중복 사용하

</"_TEXT_";>

</"_TEXT_";>자

Related Articles