Пропадающие образы

В конце 2012 года, Cybera (некоммерческая организация с мандатом на наблюдение за развитием киберинфраструктуры в Альберте, Канада) развернула модернизированное облако OpenStack для своего проекта DAIR (http://www.canarie.ca/en/dair-program/about). Через несколько дней работы один вычислительный узел завис. После перезагрузки узла, я проверил какие экземпляры были размещены на этом узле, чтобы я мог загрузить их от имени клиента. К счастью, там был только один экземпляр.

Команда nova reboot не работала, поэтому я воспользовался virsh, но она сразу же вернула с ошибку заявив, что не смогла найти диска поддержки (backing disk). В данном случае, диском поддержки являлся образ Glance, который копируется в /var/lib/nova/instances/_base при первом использовании образа. Почему не возможно его найти? Я проверил каталог и убедился, что он был на месте.

Я рассмотрел базу данных nova и увидел запись для данного экземпляра в таблице nova.instances. Образ, который использовал экземпляр соответствовал тому, о котором сообщал virsh, следовательно никакого не соответствия не существует.

Я проверил Glance и заметил, что этот образ был созданным пользователем моментальным снимком. По крайней мере, это была хорошая новость, что только этот один пользователь был затронут.

Наконец, я проверил StackTach и рассмотрел события пользователя. Это были создания и удаления нескольких моментальных снимков, скорее всего, экспериментальных. Хотя временные метки не совпадали, мой вывод состоял в том, что они запускали свой экземпляр, а затем удаляли снимок, и он был каким-то образом удален из /var/lib/nova/instances/_base.

Оказывается, причина того, что это вычислительный узел зависал, была в проблеме с аппаратурой. Мы удалили ее из облака DAIR и вызвали Dell для обслуживания. Dell приехал и начал работать. Так или иначе (или кривые руки), но другой вычислительный узел был вставлен и загружен. Отлично.

Когда этот узел полностью загрузится, я выполнил тот же сценарий, просмотра того, какие экземпляры были запущены, чтобы я мог включить их опять. В общей сложности было четыре экземпляра. Три загрузились, а один выдал сообщение об ошибке. Это была та же ошибка, что и прежде: не удалось найти диск поддержки. Серьезно, что ли?

Вновь оказалось, что образ был моментальным снимком. Три других экземпляра, которые запустились успешно, были стандартными образами облака. Была ли это проблема с образами? Это не имеет смысла.

Примечание об архитектуре DAIR: /var/lib/nova/instances является подключением совместно используемой NFS. Это означает, что все вычислительные узлы имеют к нему доступ, причем он включает в себя каталог _base. Другой централизованной областью является /var/log/rsyslog в контроллере облака. Этот каталог содержит все журналы OpenStack со всех вычислительных узлов. Я задался вопросом, существуют ли какие-либо записи для файла, о котором сообщает virsh:

dair-ua-c03/nova.log:Dec 19 12:10:59 dair-ua-c03
2012-12-19 12:10:59 INFO nova.virt.libvirt.imagecache
[-] Removing base file:
/var/lib/nova/instances/_base/7b4783508212f5d242cbf9ff56fb8d33b4ce6166_10
            

А-ага! Так OpenStack удалил его. Но почему?

В Essex была введена функция для периодической проверки и поиска того, существуют ли какие-либо не используемые файлы _base. Если бы они существовали, Nova бы удалила их. Эта идея звучит вполне невинно и имеет некоторые хорошие свойства. Но как эта функция в конечном итоге включилась? По умолчанию она была выключена в Essex. Как это и должно быть. В Folsom было decided to be turned on in Folsom (принято решение включить ее https://bugs.launchpad.net/nova/+bug/1029674). Я не могу не подчеркнуть, что:

Действия, которые удаляют что-то не должны быть включены по умолчанию.

В настоящее время дисковое пространство дешево. А восстановление данных нет.

Во-вторых, совместно используемый каталог /var/lib/nova/instances в случае DAIR способствовал проблеме. Так как все вычислительные узлы имеют доступ к этому каталогу, все вычислительные узлы периодически просматривают каталог _base. Если существует только один экземпляр, использующий образ, и единственный узел, на котором находится экземпляр, отключится на несколько минут, он не сможет пометить образ как все еще используемый. Таким образом, образ кажется не используемым и удаляется. Когда вычислительный узел возвращается во включенное состояние, экземпляр, размещенный на этом узле не в может запуститься.