提示信息

master_ip_failover脚本

峰子 已关注
  1. #!/usr/bin/env perl
  2. use strict;
  3. use warnings FATAL => 'all';
  4. use Getopt::Long;
  5. my (
  6. $command, $ssh_user, $orig_master_host, $orig_master_ip,
  7. $orig_master_port, $new_master_host, $new_master_ip, $new_master_port
  8. );
  9. my $vip = '192.168.80.100/24';
  10. my $key = '0';
  11. my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
  12. my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
  13. GetOptions(
  14. 'command=s' => \$command,
  15. 'ssh_user=s' => \$ssh_user,
  16. 'orig_master_host=s' => \$orig_master_host,
  17. 'orig_master_ip=s' => \$orig_master_ip,
  18. 'orig_master_port=i' => \$orig_master_port,
  19. 'new_master_host=s' => \$new_master_host,
  20. 'new_master_ip=s' => \$new_master_ip,
  21. 'new_master_port=i' => \$new_master_port,
  22. );
  23. exit &main();
  24. sub main {
  25. print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";
  26. if ( $command eq "stop" || $command eq "stopssh" ) {
  27. my $exit_code = 1;
  28. eval {
  29. print "Disabling the VIP on old master: $orig_master_host \n";
  30. &stop_vip();
  31. $exit_code = 0;
  32. };
  33. if ($@) {
  34. warn "Got Error: $@\n";
  35. exit $exit_code;
  36. }
  37. exit $exit_code;
  38. }
  39. elsif ( $command eq "start" ) {
  40. my $exit_code = 10;
  41. eval {
  42. print "Enabling the VIP - $vip on the new master - $new_master_host \n";
  43. &start_vip();
  44. $exit_code = 0;
  45. };
  46. if ($@) {
  47. warn $@;
  48. exit $exit_code;
  49. }
  50. exit $exit_code;
  51. }
  52. elsif ( $command eq "status" ) {
  53. print "Checking the Status of the script.. OK \n";
  54. exit 0;
  55. }
  56. else {
  57. &usage();
  58. exit 1;
  59. }
  60. }
  61. sub start_vip() {
  62. `ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
  63. }
  64. sub stop_vip() {
  65. return 0 unless ($ssh_user);
  66. `ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
  67. }
  68. sub usage {
  69. print
  70. "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";
  71. }
    遇到难题? "AI大模型GPT4.0、GPT" 是你的私人解答专家! 点击按钮去提问......
峰子 关注 已关注

最近一次登录:2019-10-10 14:28:58   

暂时还没有签名,请关注我或评论我的文章

任逍遥
10月18日

脚本结构非常清晰,适合用于MHA环境下的IP切换。

空城灬: @任逍遥

这种脚本在MHA环境下的确大大简化了故障转移的过程。例如,在写IP切换的部分,可以使用如下的伪代码来实现基本的逻辑:

#!/bin/bash

# 假设我们需要切换到新的主节点IP
OLD_IP="192.168.1.100"
NEW_IP="192.168.1.101"

# 切换IP的函数
failover_ip() {
    echo "正在切换主节点IP..."
    # 更新虚拟IP
    ifconfig eth0:0 $NEW_IP netmask 255.255.255.0 up
    # 停止旧IP
    ifconfig eth0:0 down $OLD_IP
    echo "IP切换完成,从 $OLD_IP 到 $NEW_IP"
}

# 调用切换函数
failover_ip

使用这个简单的函数,可以快速实现主节点IP的切换,当然,在实际应用中,需要确保你有充分的权限来执行这些命令。同时,也可以考虑增加异常处理和日志记录,以便于故障诊断。

对于想要深入了解IP切换的细节,建议参考 MHA官方文档 中的相关部分,里面提供了大量的示例和最佳实践。这样可以更深入地理解MHA环境中的最佳实现方式。

11月13日 回复 举报
安之若素
10月21日

建议在异常处理方面加强,尤其是因网络不稳定导致的脚本执行失败,可以考虑在eval块中增加重试逻辑。

薄菱映冬: @安之若素

在处理网络不稳定的情况时,引入重试机制确实是一个值得考虑的方案。这不仅可以提高脚本的鲁棒性,还可以减少因瞬时故障而造成的操作失败。可以参考以下方法,在 eval 块中增加简单的重试逻辑:

MAX_RETRIES=3
for ((i=0; i<MAX_RETRIES; i++)); do
    eval "your_command_here"
    if [ $? -eq 0 ]; then
        echo "Command succeeded!"
        break
    else
        echo "Attempt $((i+1)) failed. Retrying..."
        sleep 2 # 可根据需要调整等待时间
    fi
done

if [ $i -eq $MAX_RETRIES ]; then
    echo "All attempts failed. Exiting."
    exit 1
fi

这个示例展示了在执行命令时的重试机制,对每次失败的尝试进行记录,并在最终失败后进行适当处理。也可以考虑实现日志记录功能,以便于后续的故障排查。

在设计脚本时,特别是与网络相关的操作,考虑用户的网络环境是至关重要的。可以参考一些关于脚本健壮性设计的资料,例如 Bash Scripting Tutorial ,这将有助于增强脚本的整体可靠性和可维护性。

11月13日 回复 举报
你好色彩
10月25日

对于VIP的配置操作,可以考虑使用ip命令替代ifconfig,因为ifconfig在新系统中可能没有默认安装。

无言以对: @你好色彩

在处理VIP配置时,使用ip命令确实是个更为现代和推荐的方法。许多新的Linux发行版已经不再自带ifconfig,而ip命令提供了更强大的功能和灵活性。

例如,添加一个虚拟IP地址可以使用以下命令:

ip addr add 192.168.1.100/24 dev eth0

通过ip命令,我们可以轻松地查看现有的IP配置:

ip addr show

而删除一个IP,则可以使用:

ip addr del 192.168.1.100/24 dev eth0

同时,ip命令还支持更为复杂的路由和网络管理,建议了解更多相关信息。可以参考Linux的官方文档以获得更详细的指导:iproute2

总之,采用ip命令可以提高脚本的兼容性和可维护性,确保在不同的系统上都能顺利运行。

11月12日 回复 举报
放肆笑
10月29日

建议对代码中的硬编码字符串进行提取,放到配置文件中,以便于根据不同环境进行调整。

人生: @放肆笑

在处理脚本时,使用硬编码字符串确实可能带来维护上的困难,尤其是在不同的环境下运行时。如果将这些字符串提取到配置文件中,不仅可以提高代码的可读性,而且能更方便地进行环境适配。

例如,考虑以下代码片段中硬编码的IP地址:

MASTER_IP="192.168.1.100"

将其替换为读取配置文件的方式,可以这样做:

source /path/to/config.sh

MASTER_IP="$CONFIG_MASTER_IP"  # 在 config.sh 中定义 CONFIG_MASTER_IP 变量

配置文件 config.sh 的内容可以简单定义:

# config.sh
export CONFIG_MASTER_IP="192.168.1.100"

通过这种方式,您可以在不同环境中直接修改 config.sh,而不必每次都去修改脚本,引入了灵活性和可维护性。另外,也可以利用一些库,如 dotenv,以更方便地管理环境变量。

更多关于良好配置管理的建议,可以参考 12factor.net

11月14日 回复 举报
m800618127
11月02日

在使用ssh执行命令时,可以在命令中添加日志记录功能,以方便排查问题。示例:ssh $ssh_user",$orig_master_host " 'command && echo success' \"".

心不动: @m800618127

在进行 SSH 命令执行时,确实可以通过添加日志功能来更有效地追踪问题。可以考虑使用 logger 命令来将 SSH 输出记录到系统日志中,这样更方便集中管理和查看记录。以下是一个示例:

ssh $ssh_user@$orig_master_host 'your_command_here && logger "Command executed successfully on $orig_master_host" || logger "Command failed on $orig_master_host"'

使用logger命令可以将输出写入系统日志,这样每次执行都能追踪到成功与否,并且它不会干扰到标准输出。这对于排查 SSH 命令执行中的问题非常有帮助。

另外,可以借助 set -x 在 Bash 脚本中启用调试模式,这样可以详细记录执行的每一步,以及它们的输出。在 SSH 连接中使用时,可以这样做:

ssh $ssh_user@$orig_master_host 'set -x; your_command_here; set +x'

通过这种方式,不仅可以看到命令的执行顺序,还有助于定位错误。

更多 SSH 和日志记录的使用技巧,可以参考这篇文章:SSH Logging.

5天前 回复 举报
另一
11月10日

脚本对MHA环境中的主从切换处理比较得当,建议在后续版本中加入邮件或短信通知功能,以便在切换时实时告知相关人员。

席卷: @另一

对于提到的主从切换时的通知功能,确实是一个很实用的补充。在MHA环境中,保持相关人员的通知是非常重要的,以确保能够及时响应任何潜在问题。

可以考虑在脚本中集成一个简单的邮件发送功能,通过Python的smtplib库来实现。以下是一个基本的示例:

import smtplib
from email.mime.text import MIMEText

def send_notification(subject, body):
    sender = 'your_email@example.com'
    receivers = ['recipient@example.com']

    msg = MIMEText(body)
    msg['Subject'] = subject
    msg['From'] = sender
    msg['To'] = ', '.join(receivers)

    with smtplib.SMTP('smtp.example.com') as server:
        server.login('your_email@example.com', 'your_password')
        server.sendmail(sender, receivers, msg.as_string())

# 在切换主从后调用
send_notification('主从切换通知', '主节点已成功切换到新的从节点。')

此外,针对短信通知,也可以考虑使用一些API服务,比如Twilio,来实现更即时的通知。这种方法不仅提升了系统的可监控性,还能提高运维人员的反应速度。

了解更多关于邮件和短信发送的方法,可以参考 Python的smtplib文档,以及 Twilio的API文档。这样,随着主从切换的通知功能的加入,MHA环境的管理将更加高效。

11月10日 回复 举报
慢慢
11月17日

代码中的参数获取使用GetOptions方式处理得很好,有助于标准化脚本输入。

韦宇扬: @慢慢

对于参数处理的方式,确实可以通过 GetOptions 实现更为简洁和高效的代码。比如,在处理多个选项时,使用这种方式能够大大简化参数解析的代码,提高可读性。以下是一个简单的示例:

use Getopt::Long;

my $host;
my $port;
GetOptions(
    'host=s' => \$host,
    'port=i' => \$port,
) or die("Error in command line arguments\n");

print "Host: $host\n";
print "Port: $port\n";

这种结构让脚本对输入参数的处理变得直观,便于用户理解和使用。此外,还可以考虑使用 Pod::Usage 来提供帮助文档。例如:

use Pod::Usage;

pod2usage(-verbose => 2) if $help;

这样的做法使得脚本不仅功能完备,而且在使用时能够提供清楚的指导,增强用户体验。关于进一步的最佳实践,可以参考 Perl Getopt 文档,深入了解参数处理的更多可能性。

5天前 回复 举报
樱花男孩
11月27日

可以参考Perl模块的CPAN文档https://metacpan.org/来增强脚本的可维护性和功能扩展性。

肝: @樱花男孩

在考虑加强master_ip_failover脚本的可维护性与扩展性时,利用CPAN模块确实是一个极好的思路。可以考虑引入一些常用模块,比如Config::Tiny来处理配置文件,或是Log::Log4perl来增强日志记录功能。这样不仅可以保持代码的简洁性,还能提高调试的便利性。

例如,使用Config::Tiny可以轻松加载一个简单的配置文件:

use Config::Tiny;

my $config = Config::Tiny->read('config.ini');
my $master_ip = $config->{_}->{master_ip};

而通过Log::Log4perl来管理日志,可以帮助你追踪脚本的执行过程,便于后期分析:

use Log::Log4perl;

Log::Log4perl->init('log.conf');
my $logger = Log::Log4perl->get_logger('myapp');
$logger->info("Failover initiated for master IP: $master_ip");

此外,还可以参考Perl Best Practices来进一步提升代码质量与规范性。将这些实践融入到脚本中,可以有助于将来的维护与功能扩展。

11月09日 回复 举报
人品太次郎
12月08日

虽然现有的脚本功能已经可以满足基本要求,但建议考虑增加对多借口的VIP管理,确保网络冗余。

沸点123: @人品太次郎

在提到 VIP 管理时,增加多接口的支持确实是一个值得考虑的方向,这样可以显著提升系统的网络冗余性。值得一提的是,当使用 Linux 系统时,可以通过 keepalived 工具来实现多接口的 VIP 管理。以下是一个简单的配置示例:

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass YourPassword
    }
    virtual_ipaddress {
        192.168.1.100
    }
}

vrrp_instance VI_2 {
    state BACKUP
    interface eth1
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass YourPassword
    }
    virtual_ipaddress {
        192.168.2.100
    }
}

在这个示例中,keepalived 为两个接口配置了不同的 VIP。通过这种方式,如果主接口出现故障,流量可以自动切换到备用接口,从而提高可用性。可以参考 Keepalived 官方文档 获取更多详细信息与高级配置选项。这种方法的实施可以显著增强系统的稳定性和可靠性。

6天前 回复 举报
追梦小子
12月19日

若不想采用硬编码方式,可以在脚本初始化时进行参数的动态加载,从而提高脚本的灵活性。

三生石前: @追梦小子

在处理 master_ip_failover 脚本时,动态加载配置参数确实是一个值得考虑的方向。通过使用外部配置文件或环境变量,能够有效避免硬编码的问题,从而提高脚本的可维护性和灵活性。例如,可以通过一个 JSON 文件来管理 IP 地址信息,示例如下:

{
  "master_ip": "192.168.1.1",
  "backup_ip": "192.168.1.2"
}

然后在脚本中使用 Python 的 json 模块来读取这些配置:

import json

def load_config(file_path):
    with open(file_path, 'r') as config_file:
        return json.load(config_file)

config = load_config('config.json')
master_ip = config['master_ip']
backup_ip = config['backup_ip']

这样的方式不仅让 IP 配置更为直观,也方便在不修改脚本的情况下,轻松替换不同的服务器 IP 地址。建议查看 Python 文档中的文件操作示例 以获取更多信息。通过这种方法,能够实现更高效的运维管理和配置管理,也减少因硬编码带来的潜在风险。

5天前 回复 举报
×
免费图表工具,画流程图、架构图