Статьи

Углубленное обсуждение API Joyent Cloud

Следующая статья была написана Григом Георгиу в его блоге 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, получил файл
Использование инструментов Joyent CloudAPI

На этом этапе я смог использовать различные команды ‘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
API
Joyent 
Cloud Analytics позволяет вам определять метрики, которые вы хотите запрашивать на ваших машинах в облаке Joyent. Эти метрики также отображаются на инструментальной панели веб-интерфейса по мере их определения, что приятно. Пока таких метрик не так много, но я надеюсь, что их число увеличится.

Joyent использует специальную номенклатуру для API Analytics.
Вот некоторые определения, дословно из их документации (CA означает Cloud Analytics):
Метрики  любое количество , которое может быть инструментальным с помощью CA. Например:

  • Операции дискового ввода-вывода
  • Выполнение потоков ядра
  • 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. Оставайтесь в курсе.