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

#vmware #shared-memory #virtualization #esxi

#vmware #общая память #виртуализация #esxi

Вопрос:

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

Ответ №1:

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

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

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

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

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

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

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

Поэтому вам нужно будет проверить vmci_sockets.заголовок h и создайте структуры и функции Python ctypes, чтобы отразить те, которые вы использовали бы из 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")
  

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

 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 оставлен в качестве упражнения для читателя, но это должно помочь вам начать. Получайте удовольствие!

Ответ №2:

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