Я новичок в CentOS / Linux / HAProxy / Keepalived, поэтому за последние несколько дней мне пришлось многому научиться!
У меня есть 2 сервера CentOS 6.5 в Amazon AWS, работающие на собственных экземплярах EC2 Micro. У меня также настроен 1 эластичный IP-адрес. На каждом экземпляре установлено следующее:
Я установил и настроил HAProxy на обоих экземплярах. В целях тестирования я установил Apache для обслуживания базовой страницы index.html, чтобы я мог проверить, выполняет ли HAProxy задачу LB и циклический перебор работает нормально.
Я пытаюсь достичь, используя Keepalived для мониторинга процесса haproxy на LB1 (с назначенным EIP), если он выходит из строя или останавливается по какой-то причине, он вызывает скрипт, который использует инструменты API AWS EC2 для переназначения эластичного IP-адреса для второй Loadbalancer возьмет на себя управление ..
Я погуглил и просмотрел документацию, чтобы создать сценарий, который достигнет этого, однако, когда я тестирую его и служба HAProxy останавливается, он не запускает сценарий ..
LB1 - Содержание keepalived.conf
vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 2
weight 2
}
vrrp_instance VI_1 {
interface eth0
state MASTER
virtual_router_id 51
priority 101
vrrp_unicast_bind 10.xx.xx.01 # The IP of the host this file is stored on
vrrp_unicast_peer 10.xx.xx.23 # The IP of the other host
advert_int 1
track_script {
chk_haproxy
}
notify_fault /etc/keepalived/vrrp.sh
}
Вывод из ведения журнала
Jun 18 12:03:11 ip-10-xx-xx-xx Keepalived_vrrp[25199]: Opening file '/etc/keepalived/keepalived.conf'.
Jun 18 12:03:11 ip-10-xx-xx-xx Keepalived_vrrp[25199]: Configuration is using : 60618 Bytes
Jun 18 12:03:11 ip-10-xx-xx-xx Keepalived_vrrp[25199]: Using LinkWatch kernel netlink reflector...
Jun 18 12:03:11 ip-10-xx-xx-xx Keepalived_vrrp[25199]: VRRP sockpool: [ifindex(2), proto(112), fd(10,11)]
Jun 18 12:03:11 ip-10-xx-xx-xx Keepalived_vrrp[25199]: VRRP_Script(chk_haproxy) succeeded
Jun 18 12:03:12 ip-10-xx-xx-xx Keepalived_vrrp[25199]: VRRP_Instance(VI_1) Transition to MASTER STATE
Jun 18 12:03:13 ip-10-xx-xx-xx Keepalived_vrrp[25199]: VRRP_Instance(VI_1) Entering MASTER STATE
Jun 18 12:03:19 ip-10-xx-xx-xx Keepalived_vrrp[25199]: VRRP_Script(chk_haproxy) failed
Мое первое впечатление, что он обнаружил сбой службы haproxy, но, похоже, не выполняет скрипт vrrp.sh. (содержание ниже)
#vrrp.sh
#!/bin/bash
cd $EC2_BASE/tools/bin
#DisAssociate EIP from this instance.
./ec2-disassociate-address 54.xx.xx.xx
#Mapping EIP to secondary server
./ec2-associate-address 54.xx.xx.xx -i [instance-id]
Если я запускаю сценарий vrrp.sh сам по себе на сервере, он выполняет команды и успешно переназначает EIP. Только не тогда, когда он вызывается из скрипта keepalived.conf.
Любые идеи!? Целый день чешу в затылке а ноутбук вот-вот вылетит в окно ..
В notify_fault
скрипт вызывается, когда keepalived
переходит в состояние неисправности.
Вы хотите настроить свой скрипт, используя
notify_master /etc/keepalived/vrrp.sh
Сначала, чтобы определить, выполняется сценарий или нет, я бы добавил следующую строку прямо под #!/bin/bash
.
echo "----------vrrp.sh running ------" >> /var/log/messages
или что-то еще, что вы хотите ... Просто для того, чтобы зарегистрировать тот факт, что приложение увидело переход "состояния" от резервного к главному или что-то еще и фактически выполнило сценарий, как задумано.
Вы также можете поместить его в конец скрипта, суть в том, чтобы просто убедиться, что скрипт был вызван.
Протестируйте еще раз, а затем cat /var/log/messages
, и найдите свое эхо ... вы должны его увидеть, если вы этого не сделаете, это может быть любое количество вещей, разрешений, запущенная учетная запись пользователя, обеспечение исполняемого файла сценария и так далее ... вероятно, на основе Ваш первоначальный комментарий. Я подозреваю, что он просто выполняет не то, что вы ожидаете.
Итак, если вы видите свое эхо, как я ожидаю, тогда я бы посмотрел на конфигурацию вашей среды, что вы могли бы сделать, просто для тестирования, это экспортировать ваш JAVA_HOME вместе с вашими переменными EC2 в скрипт ... добавить их после только что добавленную строку эха. Очевидно, это только для целей тестирования, и как только вы убедитесь, что все работает должным образом, вам следует удалить это из сценария и соответствующим образом настроить среду. Мое последнее предложение - изменить вашу команду ... Вы можете разъединить и связать EIP с помощью одной команды.
Итак, теперь ваш сценарий будет выглядеть примерно так:
#!/bin/bash
#vrrp.sh
echo "----------vrrp.sh running ------" >> /var/log/messages
cd /usr/local/ec2/ec2-api-tools-1.7.5.1/bin/
export JAVA_HOME="/usr/lib/jvm/jre-1.8.0-openjdk-1.8.0.65-0.b17.el6_7.x86_64/"
export EC2_BASE="/usr/local/ec2/ec2-api-tools-1.7.5.1/"
export EC2_URL=https://ec2.us-east-1.amazonaws.com
export AWS_ACCESS_KEY=AKIA3ROU5M3FQIQH4BNL
export AWS_SECRET_KEY=InBiqtOCfaJhCb3u3jE6gpmkW5shgjP8N++/7Huv
#Those are obviously not my access/secret keys, just providing an example
./ec2-associate-address -a eipalloc-s234523 -i i-023ksdfj --allow-reassociation
Заключительное примечание:
Убедитесь, что учетная запись пользователя IAM, с которой вы аутентифицируетесь, имеет необходимую политику учетной записи пользователя IAM ... ниже приведен пример политики, вам нужно будет перейти к политикам, чтобы создать ее, а затем после создания просто дошло до пользователей и конкретную учетную запись пользователя IAM, с которой вы аутентифицируетесь, и прикрепите только что созданную политику, если вы не используете учетную запись FULL ACCESS, и в этом случае я бы не рекомендовал этого. и настроить учетную запись пользователя IAM с политикой, изложенной ниже:
arn: aws: iam :: 107890181863: policy / MOVE-EIP или что-то еще.
{
"Version": "2015-1-1",
"Statement": [
{
"Action": [
"ec2:AssociateAddress",
"ec2:DescribeAddresses",
"ec2:AllocateAddress",
"ec2:DisassociateAddress"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
Не могли бы вы вставить файлы backup.conf и slave.conf?
Также вам следует проверить эти две статьи:
http://www.trk7.com/blog/keepalived-instance-not-entering-failed-state/ или http://comments.gmane.org/gmane.linux.keepalived.devel/4102 ?