VMWare ESXi в базе данных памяти, совместно используемой виртуальными машинами на одном лезвии

вероятно, глупый вопрос (извините!), но в VMWare ESXi есть ли способ разделить память между виртуальными машинами на одном и том же лезвии, чтобы две виртуальные машины могли выполнять межпроцессное взаимодействие через блок общей памяти, а не с помощью обмена сообщениями? Я знаю, что могу совместно использовать память между виртуальными машинами, но меня интересует именно межпроцессное взаимодействие. Цель состоит в том, чтобы две виртуальные машины могли очень быстро получить доступ к базе данных в памяти, но (в отличие от решения для размещенной ОС), если виртуальная машина вышла из строя, другая виртуальная машина все еще может продолжать работать.


person Matt Banham    schedule 05.10.2016    source источник


Ответы (2)


Согласно документации API vSockets, в нем говорится:

«Исходная библиотека VMCI была выпущена как экспериментальный интерфейс на языке C с Workstation 6.0. VMCI включала API для дейтаграмм и API для общей памяти. Оба интерфейса больше не поддерживаются в Workstation 6.5».

Итак, теперь вы можете использовать только сокеты vmci SOCK_DGRAM или SOCK_STREAM. Они ведут себя так же, как сокеты tcp/ip, и в сети есть много информации о том, как писать код, который их использует, вам просто нужен заголовок vmci_sockets.h и вперед.

Вы обнаружите, что гостевая сторона связи vsocket проста, однако вам нужно написать какой-то сервер для запуска на хосте ESXi для размещения вашей БД, и это сложная часть. Если вы включите ssh на ESXi и понюхаете, вы обнаружите удивительно похожую на unix систему с устройством /dev/vsock, которое вы можете запросить, чтобы получить семейство протоколов vsocket (это может быть другим для ваших гостей, вам нужно позвонить ioctl). К сожалению (и я пробовал это), простая компиляция 64-битного статически связанного бинарного файла Linux не даст вам ничего, кроме segfault, поскольку ОС ESXi недостаточно похожа на Linux.

Существует SDK, который вы можете попробовать использовать для создания программ, однако он не для слабонервных, некоторые люди потратили буквально дни, просто пытаясь его скомпилировать, поэтому вы можете попробовать этот маршрут, если хотите, но я не рекомендую его. Google для «цепочки инструментов VMWare ESXi».

Однако, если вы ищете более быстрый способ запустить свой собственный сервер на ESXi и готовы использовать Python, вы обнаружите, что и 5.5, и 6.0 поставляются с довольно современным Python (Python 2.7.9 на ESXi). v6.0). VMWare бесполезно удалила файлы библиотеки .py, оставив только файлы .pyc, поэтому вы не можете легко увидеть, отличается ли она от стандартной версии, но она, безусловно, достаточно функциональна, чтобы запустить базовый сервер сокетов.

Модуль сокетов Python не понимает семейство сокетов vmci, поэтому вам нужно будет использовать ctypes, чтобы обойти его, вызывая функции сокетов библиотеки c напрямую. Вы можете создать сокет, используя чистый python, даже вызвать listen(), но, например. bind() неявно предполагает, что вы имеете дело со структурами sockaddr_in.

Поэтому вам нужно будет проверить заголовок vmci_sockets.h и придумать структуры и функции ctypes Python, чтобы отразить те, которые вы использовали бы из C, например:

class sockaddr_vm(Structure):
    _fields_ = [("svm_family", c_ushort),
                ("svm_reserved1", c_ushort),
                ("svm_port", c_uint),
                ("svm_cid", c_uint),
                ("svm_zero", c_uint),
               ]

Затем это можно передать в вызовы libc bind/recvfrom/sendto, к которым вы можете получить доступ с помощью:

libc = cdll.LoadLibrary("libc.so.6")

И затем вы можете привязаться к своему сокету, минуя модуль сокета Python, т.е.

addr = sockaddr_vm()
addr.svm_family = af     # address family obtained from ioctl
addr.svm_reserved1 = 0
addr.svm_cid = VMADDR_CID_ANY    # 0xffffffff
addr.svm_port = port
addr.svm_zero = 0

# s is the socket, created with python socket.socket()
out = libc.bind(s.fileno(), pointer(addr), sizeof(addr))

Одно из предостережений Python на ESXi заключается в том, что вы, кажется, ограничены в памяти, с которой можете играть: я попытался выделить 16 МБ буфера, и Python отказался предоставить его мне с ошибкой памяти, однако это не было проблемой для меня. делал в то время, поэтому я не пытался найти способ обойти это. Я подозреваю, что есть настройка, которая может это исправить.

Запуск вашего скрипта во время загрузки ESXi остается в качестве упражнения для читателя, но это должно помочь вам начать работу. Веселиться!

person Keeely    schedule 15.11.2016

VMCI — это то, что вам нужно. К сожалению, VMCI устарел между виртуальными машинами из vSphere 6 и выше.

person zXi    schedule 09.10.2016