Инициализация виртуальных машин с помощью API-интерфейсов vSphere

Использование API-интерфейсов inflate и eagerzero для манипулирования виртуальными дисками

В виртуализированной облачной среде VMware вы можете инициализировать шаблоны образов разного типа согласно своим конкретным требованиям. Среда VMware предоставляет несколько способов инициализации для удовлетворения разнообразных потребностей. В данной статье рассматривается два таких способа, а именно inflate и eagerzero. В статье описывается, как использовать эти способы для манипулирования размером виртуального диска и ресурсов хранения в среде VMware.

Бхану П. Толети, системный инженер и архитектор, IBM China

Бханупракаш Толети (Bhanuprakash Tholeti) в течение последних восьми лет работает в индустрии программного обеспечения над различными технологиями и продуктами, такими как приложения для карманных компьютеров, Web-приложения, потоковое видео, а также с Tivoli Workload Scheduler, WebSphere Data Interchange, Tivoli Service Automation Manager и Tivoli Provisioning Manager. Являясь членом группы IBM SmartCloud Enterprise, он приобрел богатый опыт в области облачных инфраструктур и гипервизоров.



Соуджания Чакраварти, системный инженер, IBM

Author photoСоуджания Чакраварти (K. Sowjanya Chakravarthi) работает в IBM уже более шести лет с различными продуктами. В настоящее время он занимается портированием продукта Tivoli Provisioning Manager в среду z/Linux, разработкой подключаемого модуля Go Symphony и разработкой с использованием SCEplus.



21.01.2014

Расширение возможностей выделения ресурсов с помощью SmartCloud Virtual Storage Center

В данной статье подробно описываются способы выделения ресурсов хранения для виртуальных машин в среде vSphere с виртуальными ОС и гипервизором VMware. Возможности выделения облачных ресурсов хранения можно расширить за счет сочетания функциональности VMware vSphere с функциональностью продукта IBM SmartCloud Virtual Storage Center, который обеспечивает эффективную виртуализацию и управление гетерогенными системами хранения, а также упрощает миграцию на динамичную облачную архитектуру и преобразование существующего хранилища в среду IBM Smarter Storage.

Выделение ресурсов хранения по принципу Thin provisioning позволяет автоматизировать процессы выделения и тем самым упростить управление пространством хранения. Кроме того, выделение ресурсов по этому принципу обладает свойством самооптимизации: данные автоматически перемещаются на соответствующий уровень хранения — наиболее активные данные попадают на уровень с самым быстрым доступом, а менее активные данные перемещаются на менее высокий уровень. Аналитические средства и показатели производительности (на постоянной основе) помогают принимать решения относительно наилучшего уровня для хранения конкретных данных.

Дополнительная информация о совместном использовании SmartCloud Virtual Storage Center и VMware содержится в следующих документах.

Thin provisioning — это способ выделения ресурсов виртуальных машин, широко применяемый по причине своей высокой скорости. Однако такое выделение ресурсов имеет недостаток — оно может породить явление под названием overcommitting (выделение несуществующего пространства в используемом хранилище данных). Чтобы преодолеть этот недостаток, необходимо применить процедуру inflate (расширение) к дискам, ассоциированным с соответствующей виртуальной машиной. Эта методика описывается в данной статье.

Один из подходов к преодолению проблемы overcommitting — метод Thick provisioning, однако в этом случае положительный результат достигается за счет безопасности данных. Чтобы обеспечить безопасность данных виртуальных машин, инициализированных по принципу Thick provisioning, ассоциированный с соответствующей виртуальной машиной диск можно подвергнуть процедуре eagerzero (заполнение нулями в момент создания).

В статье излагаются технические подробности применения процедуры inflate к диску, ассоциированному с виртуальной машиной, которая была инициализирована по принципу Thin provisioning, и применения процедуры eagerzero к дискам, ассоциированным с виртуальной машиной, которая была инициализирована по принципу Thick provisioning. Прежде чем переходить к детальному рассмотрению этих способов, необходимо понять, как осуществляется выделение ресурсов виртуальной машины в среде VMware vSphere.

VMware vSphere поддерживает три типа инициализации виртуальных машин.

  • Thick provision lazy zeroed. При инициализации этого типа виртуальный диск создается в формате Thick (формат по умолчанию). Пространство, требуемое для виртуального диска, выделяется в момент создания этого виртуального диска. Данные, оставшиеся на физическом устройстве, не стираются в момент создания диска, однако обнуляются по требованию при первой записи данных виртуальной машиной.
  • Thick provision eager zeroed. При инициализации этого типа виртуальный диск в формате Thick поддерживает функции кластеризации, такие как устойчивость к ошибкам. Пространство, требуемое для виртуального диска, выделяется при его создании. В отличие от плоского формата, данные, оставшиеся на физическом устройстве, обнуляются в момент создания виртуального диска. Для создания дисков в этом формате может потребоваться гораздо больше времени, чем в случае использования других форматов.
  • Thin provision. Используйте этот формат для экономии пространства хранения. При инициализации этого типа объем выделяемого виртуальному диску пространства хранилища данных определяется значением, которое администратор задал в качестве размера диска.

Примечание относительно overcommitting

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

Для каждого способа инициализации требуется свой тип дисков. Администратор может выбрать из следующих опций, поддерживаемых VMware.

  • Thick. При инициализации виртуальной машины блоки файлов не обнуляются. Инициализация виртуальной машины происходит быстро.
  • Zeroedthick.Блоки файлов обнуляются по требованию при первой записи на виртуальный диск. Инициализация виртуальной машины происходит быстро.
  • Thin. Блоки файлов выделяются по требованию при первой записи в блок (при создании диска каждый блок имеет нулевой размер). После инициализации администратор должен применить к диску процедуру inflate. Инициализация виртуальной машины происходит быстро.
  • Eagerzeroed thick. Блоки файлов обнуляются при создании виртуального диска для виртуальной машины. Инициализация виртуальной машины занимает много времени.

Метод inflate

Процедура inflate просто обнуляет весь неиспользуемый диск типа Thin, а также расширяет выделенные размеры. Среда VMware vSphere предоставляет API-интерфейс, который можно использовать для обнуления всего диска.

Шаг 1. Ассоциирование хранилища данных с виртуальной машиной

Чтобы ассоциировать хранилище данных со своей виртуальной машиной, выполните следующую команду:

Object datastoreObject = this.getSingleProperty("datastore", vmMor); 
// get the datastore property associated with virtual machine object

Примечание: Вы можете использовать собственные методы, такие как показанный выше метод getSingelProperty, с целью извлечения из vSphere свойств для ссылок на любой специфицированный объект, управление которым осуществляет vSphere.

Чтобы получить все хранилища данных, ассоциированные с какой-либо виртуальной машиной в определенном центре обработки данных, выполните следующую команду:

ArrayOfManagedObjectReference datastoreMorArray = 
    (ArrayOfManagedObjectReference) datastoreOb-ject;

После ассоциирования всех хранилищ данных необходимо найти специфицированные VMDK-файлы (Virtual Machine Disk) с целью применения процедуры inflate к дискам для этой виртуальной машины. Поскольку эти VMDK-файлы могут быть рассеяны по хранилищам данных, необходимо во всех хранилищах данных выполнить поиск по имени этой виртуальной машины и извлечь абсолютный (полный) маршрут к этим файлам.

Шаг 2. Получение маршрута к VMDK-файлам

Для нахождения маршрута к VMDK-файлам, ассоциированным с нужной виртуальной машиной, воспользуйтесь методом searchDatastoreSubFolders_Task. Чтобы провести поиск во всех хранилищах данных, полученных на шаге 1, необходим браузер хранилищ данных, ассоциированный с хост-платформой. Процедура поиска показана в листинге 1.

Листинг 1. Поиск маршрута к VMDK-файлам в хранилищах данных
VirtualMachineRuntimeInfo vmRunInfo = 
    (VirtualMachineRuntimeInfo) this.getSingleProperty("runtime", vmMor);
ManagedObjectReference hostMor = vmRunInfo.getHost();
ManagedObjectReference datastoreBrowserMor = 
    (ManagedObjectReference) this.getSingleProperty("datastoreBrowser", hostMor);
path = new ArrayList<String>();
for (int i = 0; i < datastoreMor.length; i++) {
String dsName = (String) this.getSingleProperty("name",datastoreMor[i]);
HostDatastoreBrowserSearchSpec hostDatastoreBrowserSearchSpec = 
    new HostDatastoreBrows-erSearchSpec();
hostDatastoreBrowserSearchSpec.setMatchPattern(new String[] { vmName + ".vmdk" });
    // vmName here refers to the name of the virtual disk for that virtual machine 
    in the hypervisor
	ManagedObjectReference taskMor = 
	this.vimPort.searchDatastoreSubFolders_Task(datastoreBrowserMor,"[" + 
	dsName + "]",hostDatastoreBrowserSearchSpec);
	if (taskMor != null) {
		taskResult = "queued";
		while ((!taskResult.equals("success")) && 
		    (!taskResult.equals("error"))) {
			try {
				TaskInfo taskInfo = 
				    (TaskInfo) this.getSingleProperty("info", task-Mor);
				System.out.println("state:"	+ 
				    taskInfo.getState().getValue());
				taskResult = taskInfo.getState().getValue();
				Thread.sleep(5000L);
			} catch (InterruptedException localInterruptedException) {
				throw localInterruptedException;
			}
			if (taskResult.equals("error")) {
				return "FAILED";
			}
			if (taskResult.equals("success")) {
				TaskInfo taskInfo = 
				    (TaskInfo) this.getSingleProperty("info",taskMor);
				ArrayOfHostDatastoreBrowserSearchResults res = 
				    (ArrayOfHost-DatastoreBrowserSearchResults) 
				    taskInfo.getResult();
				HostDatastoreBrowserSearchResults[] resArray = 
				    res.getHostDatastoreBrowserSearchResults();
				for (int j = 0; j < resArray.length; j++) {
					System.out.println("folderpath:"+
					    resArray[j].getFolderPath());
					for (int k = 
					    0; k < resArray[j].getFile().length; k++) {
						System.out.println("filePath:"+ 
						    resAr-ray[j].getFile()[k].getPath());
						String tempstr = 
						    resArray[j].getFolderPath()	
						    + resAr-ray[j].getFile()[k].getPath();
						path.add(tempstr);
					}//end for
				}//end for
			}//end if
		}//end while

	}//endif
}//end for

После получения всех маршрутов к VMDK-файлам, ассоциированным с виртуальной машиной, примените процедуру inflate к каждому диску с помощью API-интерфейса inflate среды vSphere (см. шаг 3).

Шаг 3. Применение процедуры inflate к VMDK-файлам

Теперь примените процедуру inflate к VMDK-файлам, для чего передайте маршрут, найденный на шаге 2, в метод inflateVirtualDisk_Task (см. листинг 2).

Листинг 2. Применение процедуры inflate к VMDK-файлам
for (int i = 0; i < path.size(); i++) {
System.out.println("this.vimPort.inflateVirtualDisk_Task("+ 
    this.virtualDiskManagerMor + "," + path.get(i) + ","+ dataCenterMor + ");");
ManagedObjectReference taskMor = 
    this.vimPort.inflateVirtualDisk_Task(this.virtualDiskManagerMor,(String) 
    path.get(i), dataCenterMor);
	if (taskMor != null) {
		taskResult = "queued";
		while ((!taskResult.equals("success"))&& (!taskResult.equals("error"))) {
			try {
				System.out.println("task type:" + taskMor.getType());
				TaskInfo taskInfo = 
				    (TaskInfo) this.getSingleProperty("info",taskMor);
				System.out.println("state:" + 
				    taskInfo.getState().getValue());
				taskResult = taskInfo.getState().getValue();
				Thread.sleep(5000L);
			} catch (InterruptedException localInterruptedException) {
				throw localInterruptedException;
			}
			if (taskResult.equals("error")) {
				TaskInfo taskInfo = 
				    (TaskInfo) this.getSingleProperty("info",taskMor);
				System.out.println("error in inflateVirtualDisk_Task:" + 
				    taskInfo.getError().getLocalizedMessage());
				return “failed”;
			}
			if (taskResult.equals("success")) {
				return "SUCCESS";
			}
		}//end while
	}//end if
}//end for

Способ eagerzero

Применение способа Eagerzero к диску типа Thick обнуляет все неиспользуемое пространство, выделенное для виртуальной машины. Среда VMware vSphere предоставляет API-интерфейс, который можно использовать с этой целью. Выполните шаг 1 и шаг 2 из раздела Способ inflate для извлечения маршрутов к VMDK-файлам в хранилищах данных, ассоциированных с соответствующей виртуальной машиной. Затем вызовите API-интерфейс eagerzero среды vSphere с целью обнуления всего диска типа Thick (см. листинг 3).

Листинг 3. Вызов API-интерфейса eagerzero с целью обнуления диска
for (int i = 0; i < path.size(); i++) {
System.out.println("this.vimPort.inflateVirtualDisk_Task("+ 
    this.virtualDiskManagerMor + "," + path.get(i) + ","+ 
    dataCenterMor + ");");
ManagedObjectReference taskMor = this.vimPort. eagerZeroVirtualDisk_Task 
    (this.virtualDiskManagerMor,(String) path.get(i), dataCenterMor);
	if (taskMor != null) {
		taskResult = "queued";
		while ((!taskResult.equals("success"))&& 
		    (!taskResult.equals("error"))) {
			try {
				System.out.println("task type:" + taskMor.getType());
				TaskInfo taskInfo = 
				   (TaskInfo) this.getSingleProperty("info",taskMor);
				System.out.println("state:" + 
				    taskInfo.getState().getValue());
				taskResult = taskInfo.getState().getValue();
				Thread.sleep(5000L);
			} catch (InterruptedException localInterruptedException) {
				throw localInterruptedException;
			}
			if (taskResult.equals("error")) {
				TaskInfo taskInfo = 
				   (TaskInfo) this.getSingleProperty("info",taskMor);
				System.out.println("error in inflateVirtualDisk_Task:" + 
				    taskInfo.getError().getLocalizedMessage());
				return “failed”;
			}
			if (taskResult.equals("success")) {
				return "SUCCESS";
			}
		}//end while
	}//end if
}//end for

Заключение

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

Ресурсы

Научиться

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Облачные вычисления
ArticleID=960845
ArticleTitle=Инициализация виртуальных машин с помощью API-интерфейсов vSphere
publish-date=01212014