完全自动化部署mysql主主同步并设置keepalive并设置高可用

脚本中,将expect命令的关键字(比如“password:”、“mysql>”等)作为匹配模式,如果匹配到对应的模式,则自动发送相应的响应文本。这样就可以在执行期间不需要任何输入了。同时,使用exp_continue命令可以让脚本继续等待下一个匹配模式的出现,从而实现自动化操作

#!/usr/bin/expect

# 定义两个CentOS服务器的IP、用户名和密码
set server1_ip [lindex $argv 0]
set server1_user [lindex $argv 1]
set server1_pass [lindex $argv 2]
set server2_ip [lindex $argv 3]
set server2_user [lindex $argv 4]
set server2_pass [lindex $argv 5]

# 在第一台服务器上安装MySQL
spawn ssh $server1_user@$server1_ip "yum install -y mariadb-server"
expect {
    "*(yes/no)?" {send "yes\r";exp_continue}
    "assword:" {send "$server1_pass\r";exp_continue}
}

# 启动MySQL服务并设置开机启动
spawn ssh $server1_user@$server1_ip "systemctl start mariadb && systemctl enable mariadb"
expect {
    "assword:" {send "$server1_pass\r";exp_continue}
}

# 在第二台服务器上安装MySQL
spawn ssh $server2_user@$server2_ip "yum install -y mariadb-server"
expect {
    "*(yes/no)?" {send "yes\r";exp_continue}
    "assword:" {send "$server2_pass\r";exp_continue}
}

# 启动MySQL服务并设置开机启动
spawn ssh $server2_user@$server2_ip "systemctl start mariadb && systemctl enable mariadb"
expect {
    "assword:" {send "$server2_pass\r";exp_continue}
}

# 在第一台服务器上创建用于主主同步的用户、数据库和表
spawn ssh $server1_user@$server1_ip "mysql -u root -e 'CREATE USER \"repl\"@\"$server2_ip\" IDENTIFIED BY \"password\";GRANT REPLICATION SLAVE ON *.* TO \"repl\"@\"$server2_ip\";CREATE DATABASE repl_db;USE repl_db;CREATE TABLE test (id INT(11) NOT NULL AUTO_INCREMENT, data VARCHAR(255), PRIMARY KEY (id)) ENGINE=InnoDB'"
expect {
    "assword:" {send "$server1_pass\r";exp_continue}
    "mysql>" {}
}

# 在第二台服务器上创建用于主主同步的用户、数据库和表
spawn ssh $server2_user@$server2_ip "mysql -u root -e 'CREATE USER \"repl\"@\"$server1_ip\" IDENTIFIED BY \"password\";GRANT REPLICATION SLAVE ON *.* TO \"repl\"@\"$server1_ip\";CREATE DATABASE repl_db;USE repl_db;CREATE TABLE test (id INT(11) NOT NULL AUTO_INCREMENT, data VARCHAR(255), PRIMARY KEY (id)) ENGINE=InnoDB'"
expect {
    "assword:" {send "$server2_pass\r";exp_continue}
    "mysql>" {}
}

# 在第一台服务器上配置主控制节点的my.cnf文件
spawn ssh $server1_user@$server1_ip "cp /etc/my.cnf /etc/my.cnf.bak;echo '[mysqld]' > /etc/my.cnf;echo 'server-id=1' >> /etc/my.cnf;echo 'log-bin=mysql-bin' >> /etc/my.cnf;echo 'binlog-do-db=repl_db' >> /etc/my.cnf;echo 'relay-log=mysqld-relay-bin' >> /etc/my.cnf;echo 'relay-log-index=mysqld-relay-bin.index' >> /etc/my.cnf;echo 'auto_increment_offset=1' >> /etc/my.cnf;echo 'auto_increment_increment=2' >> /etc/my.cnf;systemctl restart mariadb"
expect {
    "assword:" {send "$server1_pass\r";exp_continue}
}

# 在第二台服务器上配置从控制节点的my.cnf文件
spawn ssh $server2_user@$server2_ip "cp /etc/my.cnf /etc/my.cnf.bak;echo '[mysqld]' > /etc/my.cnf;echo 'server-id=2' >> /etc/my.cnf;echo 'log-bin=mysql-bin' >> /etc/my.cnf;echo 'binlog-do-db=repl_db' >> /etc/my.cnf;echo 'relay-log=mysqld-relay-bin' >> /etc/my.cnf;echo 'relay-log-index=mysqld-relay-bin.index' >> /etc/my.cnf;echo 'auto_increment_offset=2' >> /etc/my.cnf;echo 'auto_increment_increment=2' >> /etc/my.cnf;systemctl restart mariadb"
expect {
    "assword:" {send "$server2_pass\r";exp_continue}
}

# 在第一台服务器上获取二进制日志文件名及位置
spawn ssh $server1_user@$server1_ip "mysql -u root -e 'FLUSH TABLES WITH READ LOCK;SHOW MASTER STATUS'"
expect {
    "assword:" {send "$server1_pass\r";exp_continue}
    "*************************** 1. row ***************************" {}
}
set output $expect_out(buffer)
regexp {mysql-bin.*\d+} $output bin_file
regexp {\d+} $output bin_pos

# 在第二台服务器上从第一台服务器拷贝二进制日志文件
spawn ssh $server2_user@$server2_ip "mysql -u root -e 'STOP SLAVE';rsync -avz --delete $server1_user@$server1_ip:/var/lib/mysql/$bin_file /var/lib/mysql/;mysql -u root -e 'CHANGE MASTER TO MASTER_HOST=\"$server1_ip\", MASTER_USER=\"repl\", MASTER_PASSWORD=\"password\", MASTER_LOG_FILE=\"$bin_file\", MASTER_LOG_POS=$bin_pos;START SLAVE'"
expect {
    "assword:" {send "$server2_pass\r";exp_continue}
}

# 在第一台服务器上从第二台服务器拷贝二进制日志文件
spawn ssh $server1_user@$server1_ip "mysql -u root -e 'STOP SLAVE';rsync -avz --delete $server2_user@$server2_ip:/var/lib/mysql/mysql-bin.* /var/lib/mysql/;mysql -u root -e 'CHANGE MASTER TO MASTER_HOST=\"$server2_ip\", MASTER_USER=\"repl\", MASTER_PASSWORD=\"password\", MASTER_AUTO_POSITION=1;START SLAVE'"
expect {
    "assword:" {send "$server1_pass\r";exp_continue}
}

# 解锁第一台服务器上的数据库表
spawn ssh $server1_user@$server1_ip "mysql -u root -e 'UNLOCK TABLES'"
expect {
    "assword:" {send "$server1_pass\r"}
}

# 提示操作完成
puts "MySQL主主同步配置完成!"

Keepalived服务部分

#!/usr/bin/expect

# 定义两个CentOS服务器的IP、用户名和密码
set server1_ip [lindex $argv 0]
set server1_user [lindex $argv 1]
set server1_pass [lindex $argv 2]
set server2_ip [lindex $argv 3]
set server2_user [lindex $argv 4]
set server2_pass [lindex $argv 5]

# 安装keepalived服务
spawn ssh $server1_user@$server1_ip "yum install -y keepalived"
expect {
  "*yes/no*" {send "yes\r";exp_continue}
  "*assword:*" {send "$server1_pass\r";exp_continue}
}

spawn ssh $server2_user@$server2_ip "yum install -y keepalived"
expect {
  "*yes/no*" {send "yes\r";exp_continue}
  "*assword:*" {send "$server2_pass\r";exp_continue}
}

# 配置keepalived主节点
spawn ssh $server1_user@$server1_ip "cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak;
echo '! Configuration File for keepalived' > /etc/keepalived/keepalived.conf;
echo 'global_defs {' >> /etc/keepalived/keepalived.conf;
echo '    router_id LVS_DEVEL' >> /etc/keepalived/keepalived.conf;
echo '}' >> /etc/keepalived/keepalived.conf;
echo '' >> /etc/keepalived/keepalived.conf;
echo 'vrrp_instance VI_1 {' >> /etc/keepalived/keepalived.conf;
echo '    state MASTER' >> /etc/keepalived/keepalived.conf;
echo '    interface eth0' >> /etc/keepalived/keepalived.conf;
echo '    virtual_router_id 51' >> /etc/keepalived/keepalived.conf;
echo '    priority 100' >> /etc/keepalived/keepalived.conf;
echo '    advert_int 1' >> /etc/keepalived/keepalived.conf;
echo '    authentication {' >> /etc/keepalived/keepalived.conf;
echo '        auth_type PASS' >> /etc/keepalived/keepalived.conf;
echo '        auth_pass 123456' >> /etc/keepalived/keepalived.conf;
echo '    }' >> /etc/keepalived/keepalived.conf;
echo '    virtual_ipaddress {' >> /etc/keepalived/keepalived.conf;
echo '        192.168.0.100' >> /etc/keepalived/keepalived.conf;
echo '    }' >> /etc/keepalived/keepalived.conf;
echo '}' >> /etc/keepalived/keepalived.conf"
expect {
  "*assword:*" {send "$server1_pass\r";exp_continue}
}

# 配置keepalived备节点
spawn ssh $server2_user@$server2_ip "cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak;
echo '! Configuration File for keepalived' > /etc/keepalived/keepalived.conf;
echo 'global_defs {' >> /etc/keepalived/keepalived.conf;
echo '    router_id LVS_DEVEL' >> /etc/keepalived/keepalived.conf;
echo '}' >> /etc/keepalived/keepalived.conf;
echo '' >> /etc/keepalived/keepalived.conf;
echo 'vrrp_instance VI_1 {' >> /etc/keepalived/keepalived.conf;
echo '    state BACKUP' >> /etc/keepalived/keepalived.conf;
echo '    interface eth0' >> /etc/keepalived/keepalived.conf;
echo '    virtual_router_id 51' >> /etc/keepalived/keepalived.conf;
echo '    priority 90' >> /etc/keepalived/keepalived.conf;
echo '    advert_int 1' >> /etc/keepalived/keepalived.conf;
echo '    authentication {' >> /etc/keepalived/keepalived.conf;
echo '        auth_type PASS' >> /etc/keepalived/keepalived.conf;
echo '        auth_pass 123456' >> /etc/keepalived/keepalived.conf;
echo '    }' >> /etc/keepalived/keepalived.conf;
echo '    virtual_ipaddress {' >> /etc/keepalived/keepalived.conf;
echo '        192.168.0.100' >> /etc/keepalived/keepalived.conf;
echo '    }' >> /etc/keepalived/keepalived.conf;
echo '}' >> /etc/keepalived/keepalived.conf"
expect {
  "*assword:*" {send "$server2_pass\r";exp_continue}
}

# 启动keepalived服务并设置开机启动
spawn ssh $server1_user@$server1_ip "systemctl start keepalived && systemctl enable keepalived"
expect {
  "*assword:*" {send "$server1_pass\r";exp_continue}
}

spawn ssh $server2_user@$server2_ip "systemctl start keepalived && systemctl enable keepalived"
expect {
  "*assword:*" {send "$server2_pass\r";exp_continue}
}

# 执行完毕,退出
exit

请注意脚本中的变量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
nginx高可用可以通过结合keepalive来实现。首先,需要安装keepalive。可以使用以下命令进行安装: ``` yum install -y popt-devel cd /usr/local/src tar zxvf keepalived-1.2.2.tar.gz cd keepalived-1.2.2 ./configure --prefix=/ make make install ``` 接下来,需要创建一个检查nginx状态的脚本。可以使用以下命令创建一个名为check_nginx.sh的脚本文件: ``` vi /root/check_nginx.sh ``` 在脚本中,可以使用以下代码来检查nginx的运行状态: ``` if [ "$(ps -ef | grep "nginx:master process" | grep -v grep)" == "" ] then service nginx start else echo "nginx is running" fi ``` 通过keepalive和该脚本,可以实现在nginx关闭时自动启动nginx,保证nginx的高可用性。这样即使nginx出现问题,keepalive会自动启动nginx,确保服务的连续性和可用性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [nginx+keepalive实现高可用负载均衡](https://blog.csdn.net/YABIGNSHI/article/details/52038332)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [keepalived+nginx高可用](https://download.csdn.net/download/weixin_38548421/14057272)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值