Следующая статья была написана Григом Георгиу в его блоге 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. Оставайтесь в курсе.