Следующая статья была написана Григом Георгиу в его блоге Agile Testing .
Вот некоторые заметки, которые я сделал, выполняя некоторые первоначальные эксперименты с предоставлением машин в Joyent Cloud. Я использовал их CloudAPI напрямую, хотя в будущем я также хочу попробовать драйвер libcloud Joyent. Обещание Joyent Cloud «SmartMachines» состоит в том, что они действительно являются зонами Solaris, работающими на хосте SmartOS, и это дает вам большую производительность (особенно производительность ввода-вывода), чем обычные виртуальные машины, такие как те, которые предлагаются большинством поставщиков облачных решений. Мне еще предстоит полностью проверить это повышение производительности, но оно следующее в моем списке TODO.
Устанавливая инструменты Joyent CloudAPI, я сделал следующее на сервере Ubuntu 10.04:
- Установил node.js — я скачал его в формате tar.gz с http://nodejs.org/dist/v0.6.19/node-v0.6.19.tar.gz, затем запустил обычный файл ‘./configure; делать; сделать установку
- установил пакет узла Joyent SmartDC, выполнив команду «npm install smartdc -g»
- создал новую пару ключей SSH RSA: id_rsa_joyentapi (закрытый ключ) и id_rsa_joyentapi.pub (открытый ключ)
- запустил утилиту sdc-setup , указав на регион US-EAST-1:
# sdc-setup https://us-east-1.api.joyentcloud.com Username (login): (root) myjoyentusername Password: The following keys exist in SmartDataCenter: [1] grig Would you like to use an existing key? (yes) no SSH public key: (/root/.ssh/id_rsa.pub) /root/.ssh/id_rsa_joyentapi.pub If you set these environment variables, your life will be easier: export SDC_CLI_URL=https://us-east-1.api.joyentcloud.com export SDC_CLI_ACCOUNT=myjoyentusername export SDC_CLI_KEY_ID=id_rsa_joyentapi export SDC_CLI_IDENTITY=/root/.ssh/id_rsa_joyentapi
- добавил рекомендуемые переменные среды (выше) в .bash_profile, получил файл
На этом этапе я смог использовать различные команды ‘sdc’, включенные в набор инструментов Joyent CloudAPI. Например, чтобы перечислить доступные центры обработки данных Joyent, я использовал
sdc-listdatacenters :
# sdc-listdatacenters
{
"us-east-1": "https://us-east-1.api.joyentcloud.com",
"us-west-1": "https://us-west-1.api.joyentcloud.com",
"us-sw-1": "https://us-sw-1.api.joyentcloud.com"
}
Чтобы перечислить доступные образы операционной системы, доступные для инициализации, я использовал
наборы sdc-listdatase (ниже приведен только отрывок из его вывода):
# sdc-listdatasets
[
{
"id": "988c2f4e-4314-11e1-8dc3-2bc6d58f4be2",
"urn": "sdc:sdc:centos-5.7:1.2.1",
"name": "centos-5.7",
"os": "linux",
"type": "virtualmachine",
"description": "Centos 5.7 VM 1.2.1",
"default": false,
"requirements": {},
"version": "1.2.1",
"created": "2012-02-14T05:53:49+00:00"
},
{
"id": "e4cd7b9e-4330-11e1-81cf-3bb50a972bda",
"urn": "sdc:sdc:centos-6:1.0.1",
"name": "centos-6",
"os": "linux",
"type": "virtualmachine",
"description": "Centos 6 VM 1.0.1",
"default": false,
"requirements": {},
"version": "1.0.1",
"created": "2012-02-15T20:04:18+00:00"
},
{
"id": "a9380908-ea0e-11e0-aeee-4ba794c83c33",
"urn": "sdc:sdc:percona:1.0.7",
"name": "percona",
"os": "smartos",
"type": "smartmachine",
"description": "Percona SmartMachine",
"default": false,
"requirements": {},
"version": "1.0.7",
"created": "2012-02-13T19:24:17+00:00"
},
etc
Чтобы перечислить доступные размеры машин, доступные для предоставления, я использовал
sdc-listpackages (опять же, это всего лишь отрывок из его вывода):
# sdc-listpackages
[
{
"name": "Large 16GB",
"memory": 16384,
"disk": 491520,
"vcpus": 3,
"swap": 32768,Cloud Analytics API
"default": false
},
{
"name": "XL 32GB",
"memory": 32768,
"disk": 778240,
"vcpus": 4,
"swap": 65536,
"default": false
},
{
"name": "XXL 48GB",
"memory": 49152,
"disk": 1048576,
"vcpus": 8,
"swap": 98304,
"default": false
},
{
"name": "Small 1GB",
"memory": 1024,
"disk": 30720,
"vcpus": 1,
"swap": 2048,
"default": true
},
etc
Чтобы подготовить машину, вы используете
sdc-createmachine и передаете ей поле ‘urn’ набора данных (ОС), который вы
хотите, и имя пакета для размера, который вы хотите. Пример:
# sdc-createmachine --dataset sdc:sdc:percona:1.3.9 --package "Large 16GB"
{
"id": "7ccc739e-c323-497a-88df-898dc358ea40",
"name": "a0e7314",
"type": "smartmachine",
"state": "provisioning",
"dataset": "sdc:sdc:percona:1.3.9",
"ips": [
"A.B.C.D",
"X.Y.Z.W"
],
"memory": 16384,
"disk": 491520,
"metadata": {
"credentials": {
"root": "",
"admin": "",
"mysql": ""
}
},
"created": "2012-06-07T17:55:29+00:00",
"updated": "2012-06-07T17:55:30+00:00"
}
Приведенная выше команда предоставляет Joyent SmartMachine, работающий с дистрибутивом Percona MySQL «большого» размера, с 16 ГБ ОЗУ. Обратите внимание, что выходные данные команды содержат внешний IP-адрес подготовленного компьютера (ABCD), а также его внутренний IP-адрес (XYZW). Вывод также содержит пароли для учетных записей root, admin и mysql в поле метаданных.
Вот еще один пример для подготовки компьютера под управлением Ubuntu 10.04 в «небольшом» размере (1 ГБ ОЗУ). Вы также можете указать имя компьютера, когда вы предоставляете его:
# sdc-createmachine --dataset sdc:sdc:ubuntu-10.04:1.0.1 --package "Small 1GB" --name ggtest
{
"id": "dc856044-7895-4a52-bfee-35b404061920",
"name": "ggtest",
"type": "virtualmachine",
"state": "provisioning",
"dataset": "sdc:sdc:ubuntu-10.04:1.0.1",
"ips": [
"A1.B1.C1.D1",
"X1.Y1.Z1.W1"
],
"memory": 1024,
"disk": 30720,
"metadata": {
"root_authorized_keys": ""
},
"created": "2012-06-07T19:28:19+00:00",
"updated": "2012-06-07T19:28:19+00:00"
}
Для машины с Ubuntu поле ‘metadata’ содержит список авторизованных ключей ssh (который я удалил из моего примера выше). Также обратите внимание, что машина Ubuntu относится к типу «виртуальная машина» (то есть обычный виртуальный экземпляр KVM), в отличие от машины Percona Smart Machine, которая относится к типу «интеллектуальная машина» и фактически является зоной Solaris в физическом хосте SmartOS.
Чтобы вывести список предоставленных вам машин, вы используете
sdc-listmachines :
# sdc-listmachines
[
{
"id": "36b50e4c-88d2-4588-a974-11195fac000b",
"name": "db01",
"type": "smartmachine",
"state": "running",
"dataset": "sdc:sdc:percona:1.3.9",
"ips": [
"A.B.C.D",
"X.Y.Z.W"
],
"memory": 16384,
"disk": 491520,
"metadata": {},
"created": "2012-06-04T18:03:18+00:00",
"updated": "2012-06-07T00:39:20+00:00"
},
{
"id": "dc856044-7895-4a52-bfee-35b404061920",
"name": "ggtest",
"type": "virtualmachine",
"state": "running",
"dataset": "sdc:sdc:ubuntu-10.04:1.0.1",
"ips": [
"A1.B1.C1.D1",
"X1.Y1.Z1.W1"
],
"memory": 1024,
"disk": 30720,
"metadata": {
"root_authorized_keys": ""
},
"created": "2012-06-07T19:30:29+00:00",
"updated": "2012-06-07T19:30:38+00:00"
},
]
Обратите внимание, что сразу после инициализации машины ее состояние (как указано в поле «state» в выводе sdc-listmachines) будет «
инициализироваться ». Состояние изменится на «
работает » после завершения процесса инициализации. На этом этапе вы сможете подключиться к компьютеру с помощью закрытого ключа, который вы создали при установке инструментов CloudAPI.
Чтобы завершить работу компьютера, сначала необходимо остановить его с помощью
sdc-stopmachine , а затем удалить его с помощью
sdc-deletemachine . Оба эти инструмента принимают идентификатор машины в качестве параметра. Если вы попытаетесь удалить машину, не остановив ее сначала, или не дождавшись достаточного времени, чтобы машина перешла в состояние «
остановлено », вы получите сообщение, аналогичное
Запрошенному переходу, не приемлемо из-за текущего состояния ресурса.
По моему мнению, облачный API для предоставления экземпляров / машин полезен только в том случае, если он предлагает механизм начальной загрузки для запуска пользовательских сценариев при первом запуске. Это позволило бы интегрироваться с инструментами управления конфигурацией, такими как Chef или Puppet. К счастью, Joyent CloudAPI поддерживает эту загрузку через
API-интерфейс метаданных .
Для быстрого примера настраиваемого действия начальной загрузки я изменил имя хоста компьютера с Ubuntu, а также добавил его в / etc / hostname. Это игрушечный пример. В реальной ситуации вместо этого вы должны загрузить сценарий с одного из ваших серверов и запустить его, чтобы установить все необходимые исходные пакеты, затем настроить компьютер как клиент Chef или Puppet и т. Д. В любом случае вы вам нужно прописать команды, необходимые компьютеру для запуска во время начальной загрузки. Вы делаете это, определяя переменную метаданных user-script:
# sdc-createmachine --dataset sdc:sdc:ubuntu-10.04:1.0.1 --package "Small 1GB" --name ggtest2 --metadata user-script='hostname ggtest2; echo ggtest2 > /etc/hostname'
{
"id": "379c0cad-35bf-462a-b680-fc091c74061f",
"name": "ggtest2",
"type": "virtualmachine",
"state": "provisioning",
"dataset": "sdc:sdc:ubuntu-10.04:1.0.1",
"ips": [
"A2.B2.C2.D2",
"X2.Y2.Z2.W2"
],
"memory": 1024,
"disk": 30720,
"metadata": {
"user-script": "hostname ggtest2; echo ggtest2 > /etc/hostname",
"root_authorized_keys": ""
},
"created": "2012-06-08T23:17:44+00:00",
"updated": "2012-06-08T23:17:44+00:00"
}
Обратите внимание, что поле метаданных теперь содержит указанную мной переменную пользовательского сценария.
Joyent
Cloud Analytics позволяет вам определять метрики, которые вы хотите запрашивать на ваших машинах в облаке Joyent. Эти метрики также отображаются на инструментальной панели веб-интерфейса по мере их определения, что приятно. Пока таких метрик не так много, но я надеюсь, что их число увеличится.
Joyent использует специальную номенклатуру для API Analytics. Вот некоторые определения, дословно из их документации (CA означает Cloud Analytics):
- Операции дискового ввода-вывода
- Выполнение потоков ядра
- TCP-соединения установлены
- MySQL запросы
- Операции с HTTP сервером
- Средняя загрузка системы
Когда вы действительно хотите собрать данные для метрики, вы создаете
инструментарий . Инструментарий определяет:
- какую метрику собирать
- необязательный предикат, основанный на полях метрики (например, собирать данные только от определенных хостов или данные для определенных операций)
- необязательная декомпозиция на основе полей метрики (например, разбивка результатов по имени хоста сервера)
- как часто собирать данные (например, каждую секунду, каждый час и т. д.)
- сколько данных хранить (например, 10 минут, 6 месяцев и т. д.)
- другие параметры конфигурации
Чтобы начать работу с этим API, сначала нужно посмотреть, какие аналитические / метрики доступны. Вы делаете это, вызывая
sdc-descriptionanalytics (далее — просто фрагмент вывода):
# sdc-describeanalytics
"metrics": [
{
"module": "cpu",
"stat": "thread_samples",
"label": "thread samples",
"interval": "interval",
"fields": [
"zonename",
"pid",
"execname",
"psargs",
"ppid",
"pexecname",
"ppsargs",
"subsecond"
],
"unit": "samples"
},
{
"module": "cpu",
"stat": "thread_executions",
"label": "thread executions",
"interval": "interval",
"fields": [
"zonename",
"pid",
"execname",
"psargs",
"ppid",
"pexecname",
"ppsargs",
"leavereason",
"runtime",
"subsecond"
],
etc
Вы можете создавать инструментарий либо через веб-интерфейс (перейдите на вкладку Analytics), либо через API командной строки.
Вот пример создания инструментария для логических операций файловой системы через
API sdc-createinstrumentation :
# sdc-createinstrumentation -m fs -s logical_ops
{
"module": "fs",
"stat": "logical_ops",
"predicate": {},
"decomposition": [],
"value-dimension": 1,
"value-arity": "scalar",
"enabled": true,
"retention-time": 600,
"idle-max": 3600,
"transformations": {},
"nsources": 0,
"granularity": 1,
"persist-data": false,
"crtime": 1340228876662,
"value-scope": "interval",
"id": "17",
"uris": [
{
"uri": "/myjoyentusername/analytics/instrumentations/17/value/raw",
"name": "value_raw"
}
]
}
Чтобы вывести список инструментов, которые вы создали, вы используете sdc-listinstrumentations :
# sdc-listinstrumentations
[
{
"module": "fs",
"stat": "logical_ops",
"predicate": {},
"decomposition": [],
"value-dimension": 1,
"value-arity": "scalar",
"enabled": true,
"retention-time": 600,
"idle-max": 3600,
"transformations": {},
"nsources": 2,/
"granularity": 1,
"persist-data": false,
"crtime": 1340228876662,
"value-scope": "interval",
"id": "17",
"uris": [
{
"uri": "/myjoyentusername/analytics/instrumentations/17/value/raw",
"name": "value_raw"
}
]
}
]
Чтобы получить фактические метрики, захваченные данным инструментарием, вызовите
sdc-getinstrumentation и передайте ему идентификатор инструментария:
# sdc-getinstrumentation -v 17 { "value": 1248, "transformations": {}, "start_time": 1340229361, "duration": 1, "end_time": 1340229362, "nsources": 2, "minreporting": 2, "requested_start_time": 1340229361, "requested_duration": 1, "requested_end_time": 1340229362 }
Вы можете увидеть, как это может быть легко интегрировано с такими как Graphite, чтобы хранить историческую информацию об этих метриках.
Вы можете углубиться в конкретную метрику, разложив ее по разным полям, таким как имя приложения. Например, чтобы увидеть логическую операцию файловой системы по имени приложения, вы должны вызвать:
# sdc-createinstrumentation -m fs -s logical_ops --decomposition execname
{
"module": "fs",
"stat": "logical_ops",
"predicate": {},
"decomposition": [
"execname"
],
"value-dimension": 2,
"value-arity": "discrete-decomposition",
"enabled": true,
"retention-time": 600,
"idle-max": 3600,
"transformations": {},
"nsources": 0,
"granularity": 1,
"persist-data": false,
"crtime": 1340231734049,
"value-scope": "interval",
"id": "18",
"uris": [
{
"uri": "/myjoyentusername/analytics/instrumentations/18/value/raw",
"name": "value_raw"
}
]
}
Теперь, если вы получите значение для этого инструментария, вы увидите несколько значений в выводе, одно значение для приложения, которое выполняет логические операции файловой системы:
# sdc-getinstrumentation -v 18
{
"value": {
"grep": 4,
"ksh93": 5,
"cron": 7,
"gawk": 15,
"svc.startd": 2,
"mysqld": 163,
"nscd": 27,
"top": 159
},
"transformations": {},
"start_time": 1340231762,
"duration": 1,
"end_time": 1340231763,
"nsources": 2,
"minreporting": 2,
"requested_start_time": 1340231762,
"requested_duration": 1,
"requested_end_time": 1340231763
}
Другой полезный метод заключается в выделении метрик, относящихся к конкретному хосту (или «zonename» на языке Joyent). Для этого вам нужно указать предикат, который будет фильтровать только хост с определенным идентификатором (вы можете увидеть идентификатор хоста при вызове sdc-listmachines). Вот пример, который фиксирует время ожидания процессора для Percona SmartMachine, которое я подготовил ранее:
# sdc-createinstrumentation -m cpu -s waittime -p '{"eq": ["zonename","36b50e4c-88d2-4588-a974-11195fac000b"]}'
{
"module": "cpu",
"stat": "waittime",
"predicate": {
"eq": [
"zonename",
"36b50e4c-88d2-4588-a974-11195fac000b"
]
},
"decomposition": [],
"value-dimension": 1,
"value-arity": "scalar",
"enabled": true,
"retention-time": 600,
"idle-max": 3600,
"transformations": {},
"nsources": 0,
"granularity": 1,
"persist-data": false,
"crtime": 1340232271092,
"value-scope": "interval",
"id": "19",
"uris": [
{
"uri": "/myjoyentusername/analytics/instrumentations/19/value/raw",
"name": "value_raw"
}
]
}
Вы можете комбинировать декомпозицию с предикатами. Например, вот как создать инструментарий для времени использования процессора, разложенного по режиму процессора (пользователь, ядро):
# sdc-createinstrumentation -m cpu -s usage -n cpumode -p '{"eq": ["zonename","36b50e4c-88d2-4588-a974-11195fac000b"]}' { "module": "cpu", "stat": "usage", "predicate": { "eq": [ "zonename", "36b50e4c-88d2-4588-a974-11195fac000b" ] }, "decomposition": [ "cpumode" ], "value-dimension": 2, "value-arity": "discrete-decomposition", "enabled": true, "retention-time": 600, "idle-max": 3600, "transformations": {}, "nsources": 0, "granularity": 1, "persist-data": false, "crtime": 1340232361944, "value-scope": "point", "id": "20", "uris": [ { "uri": "/myjoyentusername/analytics/instrumentations/20/value/raw", "name": "value_raw" } ] }
Теперь, когда вы получаете значения для этого инструментария, вы можете видеть их разделенными режимом CPU:
# sdc-getinstrumentation -v 20 { "value": { "kernel": 24, "user": 28 }, "transformations": {}, "start_time": 1340232390, "duration": 1, "end_time": 1340232391, "nsources": 2, "minreporting": 2, "requested_start_time": 1340232390, "requested_duration": 1, "requested_end_time": 1340232391 }
Наконец, вот специфичные для MySQL инструменты, которые вы можете создать на машине с MySQL, такой как Percona SmartMachine. Этот для захвата запросов MySQL:
# sdc-createinstrumentation -m mysql -s queries -p '{"eq": ["zonename","36b50e4c-88d2-4588-a974-11195fac000b"]}' { "module": "mysql", "stat": "queries", "predicate": { "eq": [ "zonename", "36b50e4c-88d2-4588-a974-11195fac000b" ] }, "decomposition": [], "value-dimension": 1, "value-arity": "scalar", "enabled": true, "retention-time": 600, "idle-max": 3600, "transformations": {}, "nsources": 0, "granularity": 1, "persist-data": false, "crtime": 1340232562361, "value-scope": "interval", "id": "22", "uris": [ { "uri": "/myjoyentusername/analytics/instrumentations/22/value/raw", "name": "value_raw" } ] }
В целом, я обнаружил, что Joyent Cloud API и связанный с ним Google Analytics API довольно прост в использовании, как только я преодолел некоторые нюансы номенклатуры. Я также хочу отметить, что поддержка, которую я получил от Joyent, была очень, очень хорошей. Ответы на вопросы, касающиеся некоторых из обсуждаемых здесь тем, были даны быстро и хорошо. Следующим моим шагом будет измерение производительности MySQL на SmartMachine по сравнению с экземпляром аналогичного размера, работающим в облаке Amazon EC2. Оставайтесь в курсе.