版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、编辑failover脚本:vim /usr/local/scripts/master_ip_failover #!/usr/bin/env perluse strict;use warnings FATAL => 'all'use Getopt:Long;my ( $command,$ssh_user,$orig_master_host,$orig_master_ip,$orig_master_port,$new_master_host,$new_master_ip,$new_master_port);my $vip = "192.168.56.111/24&q
2、uot;my $key = '0'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_maste
3、r_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();sub main print "nnIN SCRIPT TEST=$ss
4、h_stop_vip=$ssh_start_vip=nn" 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_cod
5、e; elsif ( $command eq "start" ) my $exit_code = 10; eval print "Enabling the VIP-$vip on the new master-$new_master_hostn" &start_vip(); $exit_code = 0; ; if ($) warn $; exit $exit_code; exit $exit_code; elsif ($command eq "status" ) print "Checking the Status
6、 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|
7、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=portn" 编辑online_change的脚本:cd /usr/local/scripts/ vim master_ip_online_change #!/usr/bin/env perluse strict;use warnings FATAL => 'all'use Geto
8、pt:Long;use MHA:DBHelper;use MHA:NodeUtil;use Time:HiRes qw( sleep gettimeofday tv_interval );use Data:Dumper;my $_tstart;my $_running_interval = 0.1;my $vip = "192.168.56.111"my $if = "eth0"my ( $command, $orig_master_is_new_slave, $orig_master_host, $orig_master_ip, $orig_maste
9、r_port, $orig_master_user, $orig_master_password,$orig_master_ssh_user, $new_master_host, $new_master_ip, $new_master_port, $new_master_user, $new_master_password,$new_master_ssh_user,);GetOptions( 'command=s' => $command, 'orig_master_is_new_slave' => $orig_master_is_new_slave
10、, 'orig_master_host=s' => $orig_master_host, 'orig_master_ip=s' => $orig_master_ip, 'orig_master_port=i' => $orig_master_port, 'orig_master_user=s' => $orig_master_user, 'orig_master_password=s' => $orig_master_password, 'orig_master_ssh_use
11、r=s' => $orig_master_ssh_user, '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
12、, 'new_master_ssh_user=s' => $new_master_ssh_user,);exit &main();sub drop_vip my $output = ssh -o ConnectTimeout=15 -o ConnectionAttempts=3 $orig_master_host /sbin/ip addr del $vip/32 dev $if;sub add_vip my $output = ssh -o ConnectTimeout=15 -o ConnectionAttempts=3 $new_master_host /s
13、bin/ip addr add $vip/32 dev $if;sub current_time_us my ( $sec, $microsec ) = gettimeofday(); my $curdate = localtime($sec); return $curdate . " " . sprintf( "%06d", $microsec );sub sleep_until my $elapsed = tv_interval($_tstart); if ( $_running_interval > $elapsed ) sleep( $_r
14、unning_interval - $elapsed ); sub get_threads_util my $dbh = shift; my $my_connection_id = shift; my $running_time_threshold = shift; my $type = shift; $running_time_threshold = 0 unless ($running_time_threshold); $type = 0 unless ($type); my threads; my $sth = $dbh->prepare("SHOW PROCESSLIS
15、T"); $sth->execute(); while ( my $ref = $sth->fetchrow_hashref() ) my $id = $ref->Id; my $user = $ref->User; my $host = $ref->Host; my $command = $ref->Command; my $state = $ref->State; my $query_time = $ref->Time; my $info = $ref->Info; $info = s/s*(.*?)s*$/$1/ if de
16、fined($info); next if ( $my_connection_id = $id ); next if ( defined($query_time) && $query_time < $running_time_threshold ); next if ( defined($command) && $command eq "Binlog Dump" ); next if ( defined($user) && $user eq "system user" ); next if ( def
17、ined($command) && $command eq "Sleep" && defined($query_time) && $query_time >= 1 ); if ( $type >= 1 ) next if ( defined($command) && $command eq "Sleep" ); next if ( defined($command) && $command eq "Connect" ); if ( $type
18、>= 2 ) next if ( defined($info) && $info = m/select/i ); next if ( defined($info) && $info = m/show/i ); push threads, $ref; return threads;sub main if ( $command eq "stop" ) # Gracefully killing connections on the current master # 1. Set read_only= 1 on the new master #
19、 2. DROP USER so that no app user can establish new connections # 3. Set read_only= 1 on the current master # 4. Kill current queries # * Any database access failure will result in script die. my $exit_code = 1; eval # Setting read_only=1 on the new master (to avoid accident) my $new_master_handler
20、= new MHA:DBHelper(); # args: hostname, port, user, password, raise_error(die_on_error)_ or_not $new_master_handler->connect( $new_master_ip, $new_master_port, $new_master_user, $new_master_password, 1 ); print current_time_us() . " Set read_only on the new master. " $new_master_handler
21、->enable_read_only(); if ( $new_master_handler->is_read_only() ) print "ok.n" else die "Failed!n" $new_master_handler->disconnect(); # Connecting to the orig master, die if any database error happens my $orig_master_handler = new MHA:DBHelper(); $orig_master_handler->
22、connect( $orig_master_ip, $orig_master_port, $orig_master_user, $orig_master_password, 1 ); # Drop application user so that nobody can connect. Disabling per-session binlog beforehand $orig_master_handler->disable_log_bin_local(); # print current_time_us() . " Drpping app user on the orig ma
23、ster.n" print current_time_us() . " drop vip $vip.n" #drop_app_user($orig_master_handler); &drop_vip(); # Waiting for N * 100 milliseconds so that current connections can exit my $time_until_read_only = 15; $_tstart = gettimeofday; my threads = get_threads_util( $orig_master_handl
24、er->dbh, $orig_master_handler->connection_id ); while ( $time_until_read_only > 0 && $#threads >= 0 ) if ( $time_until_read_only % 5 = 0 ) printf"%s Waiting all running %d threads are disconnected. (max %d milliseconds)n", current_time_us(), $#threads + 1, $time_until_r
25、ead_only * 100; if ( $#threads < 5 ) print Data:Dumper->new( $_ )->Indent(0)->Terse(1)->Dump . "n" foreach (threads); sleep_until(); $_tstart = gettimeofday; $time_until_read_only-; threads = get_threads_util( $orig_master_handler->dbh, $orig_master_handler->connection
26、_id ); # Setting read_only=1 on the current master so that nobody(except SUPER) can write print current_time_us() . " Set read_only=1 on the orig master. " $orig_master_handler->enable_read_only(); if ( $orig_master_handler->is_read_only() ) print "ok.n" else die "Fail
27、ed!n" # Waiting for M * 100 milliseconds so that current update queries can complete my $time_until_kill_threads = 5; threads = get_threads_util( $orig_master_handler->dbh, $orig_master_handler->connection_id ); while ( $time_until_kill_threads > 0 && $#threads >= 0 ) if ( $
28、time_until_kill_threads % 5 = 0 ) printf"%s Waiting all running %d queries are disconnected. (max %d milliseconds)n", current_time_us(), $#threads + 1, $time_until_kill_threads * 100; if ( $#threads < 5 ) print Data:Dumper->new( $_ )->Indent(0)->Terse(1)->Dump . "n"
29、; foreach (threads); sleep_until(); $_tstart = gettimeofday; $time_until_kill_threads-; threads = get_threads_util( $orig_master_handler->dbh, $orig_master_handler->connection_id ); # Terminating all threads print current_time_us() . " Killing all application threads.n" $orig_master_
30、handler->kill_threads(threads) if ( $#threads >= 0 ); print current_time_us() . " done.n" $orig_master_handler->enable_log_bin_local(); $orig_master_handler->disconnect(); # After finishing the script, MHA executes FLUSH TABLES WITH READ LOCK $exit_code = 0; ; if ($) warn "
31、;Got Error: $n" exit $exit_code; exit $exit_code; elsif ( $command eq "start" ) # Activating master ip on the new master # 1. Create app user with write privileges # 2. Moving backup script if needed # 3. Register new master's ip to the catalog database# We don't return error even though activating updatable accounts/ip failed so that we don't interrupt slaves' recovery.# If exit code is 0 or 10, MHA does not abort my $exit_code = 10; eval my $new_master_handler = new MHA:DBHelper(); # args: hostname, port, user, password, raise_error_or_not $new_master_hand
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 钛合金泵项目可行性研究报告-图文
- 钻井泥浆泵阀箱项目可行性研究报告申请报告
- 银川阀门项目可行性研究报告参考范文
- 闸阀工程安装方案范本大全
- 阅读的课题研究报告
- 防水行业分析研究报告
- 青岛航空项目可行性研究报告
- 高中生物教学备课教案基因工程与生物技术的伦理问题的实验设计
- 城市智慧公园物联网云系统解决方案
- 2020-2025年一级注册建筑师之建筑结构通关试题库(有答案)
- 江苏省镇江市2024-2025学年高一上学期期中考试历史试题(无答案)
- 人音版七年级音乐上册教案全册
- 基于人工智能的供应链物流优化合同
- 国开2024年秋《经济法学》计分作业1-4答案形考任务
- 电梯自检自查报告
- 20以内的加法口算练习题4000题 205
- (课件)医疗设备应用-植入式心电监测器Reveal LINQ讲课
- 2025高考语文步步高大一轮复习讲义教材文言文点线面答案精析
- 人教版(PEP)小学英语-(三四五六年级)-单词表(附注音标)
- JTS-201-2011水运工程施工通则
- MOOC 大学英语听说译-河南理工大学 中国大学慕课答案
评论
0/150
提交评论