新到一家公司,收到部署keepalived的任务。本以为很简单,结果平台是aws,一路踩坑终于部好了。aws部署keepalived的案例网上很少。仅有的几篇写得很粗,而且也有很多坑。特记录部署过程。
公司系统很简单,接口、服务也很少,无非是想实现故障转移的功能。其实无需部署keepalived就可以实现,刚开始找不到方向,试想了很多架构方案。但在aws都无法实现。最终找到了一个较可行性的方案:
基本思路为:弹性ip(带公网ip地址)---选择性绑定AB两台服务器的弹性网络接口来实现故障转移。
准备工作:
1、新建VPC
2、在VPC下新建一个子网
3、在VPC下的子网中新建两台EC2(不带公网IP)
4、其它网关和安全组等不作详解。aws上有详细的解说和教程。
安装keepalived:
1、先将弹性ip绑定在主服务器A上面(私有地址为10.0.0.6自己配置),并下载证书文件,通过ssh远程连接。
用户名为ec2-user 选择下载的证书登陆。
2、yum安装keepalived
yum install -y keepalived
3、备服务器也是同上安装keepalived
4、修改登陆方式为用户密码登陆
设置root密码 sudo passwd root
切换到root用户 su
修改ssh配置
sed -ri 's/^#?(PasswordAuthentication)\s+(yes|no)/\1 yes/' /etc/ssh/sshd_config
sed -ri 's/^#?(PermitRootLogin)\s+(yes|no)/\1 yes/' /etc/ssh/sshd_config
sed -ri 's/^/#/;s/sleep 10"\s+/&\n/' /root/.ssh/authorized_keys
重启ssh服务 service sshd restart
安装aws工具
由于此思路是通过keepalived判断服务的可用性,再由aws的命令自动修改弹性ip来实现故障转移,所以还必须安装aws命令工具。
yum install jp awscli
进入AWs控制台/服务/IAM中去创建一个账号,然后创建一个系统管理员的组,把这个账号加入到组中,这个过程中会得到Access Key ID和Secret Access Key。在服务器上运行aws configure进行注册
填入Access Key ID和Secret Access Key(其中Access Key ID是用于集群查Secret Access Key的一个key,而Secret Access Key用作客户端数据的加密和服务端数据的解密)
region是指你服务器所在的区域,比如ap-northeast-2。最后一个参数json
配置keepalived
1、AWS中VRRP协议的组播被禁止,所以需修改为单播:配置文件同下
unicast_src_ip 10.0.0.6 #本机ip
unicast_peer { #单播对像ip
10.0.0.7
}
主服务器配置文件:/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
script_user root #设置脚本运行账户为root! 不然后面会报错WARNING - default user #'keepalived_script' for script execution does not exist - please create
enable_script_security #设置脚本可运行性
router_id LVS_MASTER
}
vrrp_instance VI_1 {
state MASTER #设置服务器状态为主服务器
interface eth0 #网卡
virtual_router_id 51 #vrrp id 主备必须相同
priority 100 #权重
advert_int 1
unicast_src_ip 10.0.0.6 #本机ip
unicast_peer { #单播对像ip
10.0.0.7
}
authentication { #服务器间的认证
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #vip ip
10.0.0.8
}
notify_master /etc/keepalived/scripts/add_eip.sh #当此服务器状态变为MASTER时运行的脚本
notify_backup /etc/keepalived/scripts/del_eip.sh #当此服务器状态变为BACKUP时运行的脚本
}
2、在/etc/keepalived/下新建scripts mkdir /etc/keepalived/scripts
3、授权 chmod -R 711 /etc/keepalived/scripts 注:此处为重点不能设为777,系统会认为不安全,从而不运行脚本
4、新建add_eip.sh脚本 (作用:分离弹性ip,并将弹性ip绑定到自身网口上)内容:
#/bin/bash
EIP=13.*.*.201 #弹性ip地址(公网ip)
INSTANCE_ID=i-0b2d************* #此服务器(EC2)的实例的id
aws ec2 disassociate-address --public-ip $EIP
aws ec2 associate-address --public-ip $EIP --instance-id $INSTANCE_ID
授权 chmod +x ./add_eip.sh chmod -R 711 add_eip.sh
5、新建del_eip.sh脚本 (作用和上面类似,可以不要)
内容:
#/bin/bash
EIP=13.*.*.201 #弹性ip地址(公网ip)
INSTANCE_ID=i-0b2d************* #备服务器(EC2)的实例的id
aws ec2 disassociate-address --public-ip $EIP
aws ec2 associate-address --public-ip $EIP --instance-id $INSTANCE_ID
备服务器配置
! Configuration File for keepalivedglobal_defs {
script_user root #设置脚本运行账户为root! 不然后面会报错WARNING - default user #'keepalived_script' for script execution does not exist - please create
enable_script_security #设置脚本可运行性
router_id LVS_SLAVE
}
vrrp_instance VI_1 {
state BACKUP #设置服务器状态为备服务器
interface eth0 #网卡
virtual_router_id 51 #vrrp id 主备必须相同
priority 100 #权重
advert_int 1
unicast_src_ip 10.0.0.7 #本机ip
unicast_peer { #单播对像ip
10.0.0.6
}
authentication { #服务器间的认证
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #vip ip
10.0.0.8
}
notify_master /etc/keepalived/scripts/add_eip.sh #当此服务器状态变为MASTER时运行的脚本
notify_backup /etc/keepalived/scripts/del_eip.sh #当此服务器状态变为BACKUP时运行的脚本
}
脚本和主服务器反调一下。
测试
当keepalived状备变为master时。。执行脚本add_eip.sh。切换弹性ip到本服务器。实现故障转移。