OpenSearch/docs/plugins/cloud-azure.asciidoc

668 lines
18 KiB
Plaintext

[[cloud-azure]]
=== Azure Cloud Plugin
The Azure Cloud plugin uses the Azure API for unicast discovery, and adds
support for using Azure as a repository for
{ref}/modules-snapshots.html[Snapshot/Restore].
[[cloud-azure-install]]
[float]
==== Installation
This plugin can be installed using the plugin manager:
[source,sh]
----------------------------------------------------------------
sudo bin/plugin install cloud-azure
----------------------------------------------------------------
The plugin must be installed on every node in the cluster, and each node must
be restarted after installation.
[[cloud-azure-remove]]
[float]
==== Removal
The plugin can be removed with the following command:
[source,sh]
----------------------------------------------------------------
sudo bin/plugin remove cloud-azure
----------------------------------------------------------------
The node must be stopped before removing the plugin.
[[cloud-azure-discovery]]
==== Azure Virtual Machine Discovery
Azure VM discovery allows to use the azure APIs to perform automatic discovery (similar to multicast in non hostile
multicast environments). Here is a simple sample configuration:
[source,yaml]
----
cloud:
azure:
management:
subscription.id: XXX-XXX-XXX-XXX
cloud.service.name: es-demo-app
keystore:
path: /path/to/azurekeystore.pkcs12
password: WHATEVER
type: pkcs12
discovery:
type: azure
----
[[cloud-azure-discovery-short]]
===== How to start (short story)
* Create Azure instances
* Install Elasticsearch
* Install Azure plugin
* Modify `elasticsearch.yml` file
* Start Elasticsearch
[[cloud-azure-discovery-settings]]
===== Azure credential API settings
The following are a list of settings that can further control the credential API:
[horizontal]
`cloud.azure.management.keystore.path`::
/path/to/keystore
`cloud.azure.management.keystore.type`::
`pkcs12`, `jceks` or `jks`. Defaults to `pkcs12`.
`cloud.azure.management.keystore.password`::
your_password for the keystore
`cloud.azure.management.subscription.id`::
your_azure_subscription_id
`cloud.azure.management.cloud.service.name`::
your_azure_cloud_service_name
[[cloud-azure-discovery-settings-advanced]]
===== Advanced settings
The following are a list of settings that can further control the discovery:
`discovery.azure.host.type`::
Either `public_ip` or `private_ip` (default). Azure discovery will use the
one you set to ping other nodes.
`discovery.azure.endpoint.name`::
When using `public_ip` this setting is used to identify the endpoint name
used to forward requests to elasticsearch (aka transport port name).
Defaults to `elasticsearch`. In Azure management console, you could define
an endpoint `elasticsearch` forwarding for example requests on public IP
on port 8100 to the virtual machine on port 9300.
`discovery.azure.deployment.name`::
Deployment name if any. Defaults to the value set with
`cloud.azure.management.cloud.service.name`.
`discovery.azure.deployment.slot`::
Either `staging` or `production` (default).
For example:
[source,yaml]
----
discovery:
type: azure
azure:
host:
type: private_ip
endpoint:
name: elasticsearch
deployment:
name: your_azure_cloud_service_name
slot: production
----
[[cloud-azure-discovery-long]]
==== Setup process for Azure Discovery
We will expose here one strategy which is to hide our Elasticsearch cluster from outside.
With this strategy, only VMs behind the same virtual port can talk to each
other. That means that with this mode, you can use elasticsearch unicast
discovery to build a cluster, using the Azure API to retrieve information
about your nodes.
[[cloud-azure-discovery-long-prerequisites]]
===== Prerequisites
Before starting, you need to have:
* A http://www.windowsazure.com/[Windows Azure account]
* OpenSSL that isn't from MacPorts, specifically `OpenSSL 1.0.1f 6 Jan
2014` doesn't seem to create a valid keypair for ssh. FWIW,
`OpenSSL 1.0.1c 10 May 2012` on Ubuntu 12.04 LTS is known to work.
* SSH keys and certificate
+
--
You should follow http://azure.microsoft.com/en-us/documentation/articles/linux-use-ssh-key/[this guide] to learn
how to create or use existing SSH keys. If you have already did it, you can skip the following.
Here is a description on how to generate SSH keys using `openssl`:
[source,sh]
----
# You may want to use another dir than /tmp
cd /tmp
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout azure-private.key -out azure-certificate.pem
chmod 600 azure-private.key azure-certificate.pem
openssl x509 -outform der -in azure-certificate.pem -out azure-certificate.cer
----
Generate a keystore which will be used by the plugin to authenticate with a certificate
all Azure API calls.
[source,sh]
----
# Generate a keystore (azurekeystore.pkcs12)
# Transform private key to PEM format
openssl pkcs8 -topk8 -nocrypt -in azure-private.key -inform PEM -out azure-pk.pem -outform PEM
# Transform certificate to PEM format
openssl x509 -inform der -in azure-certificate.cer -out azure-cert.pem
cat azure-cert.pem azure-pk.pem > azure.pem.txt
# You MUST enter a password!
openssl pkcs12 -export -in azure.pem.txt -out azurekeystore.pkcs12 -name azure -noiter -nomaciter
----
Upload the `azure-certificate.cer` file both in the elasticsearch Cloud Service (under `Manage Certificates`),
and under `Settings -> Manage Certificates`.
IMPORTANT: When prompted for a password, you need to enter a non empty one.
See this http://www.windowsazure.com/en-us/manage/linux/how-to-guides/ssh-into-linux/[guide] for
more details about how to create keys for Azure.
Once done, you need to upload your certificate in Azure:
* Go to the https://account.windowsazure.com/[management console].
* Sign in using your account.
* Click on `Portal`.
* Go to Settings (bottom of the left list)
* On the bottom bar, click on `Upload` and upload your `azure-certificate.cer` file.
You may want to use
http://www.windowsazure.com/en-us/develop/nodejs/how-to-guides/command-line-tools/[Windows Azure Command-Line Tool]:
--
* Install https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager[NodeJS], for example using
homebrew on MacOS X:
+
[source,sh]
----
brew install node
----
* Install Azure tools
+
[source,sh]
----
sudo npm install azure-cli -g
----
* Download and import your azure settings:
+
[source,sh]
----
# This will open a browser and will download a .publishsettings file
azure account download
# Import this file (we have downloaded it to /tmp)
# Note, it will create needed files in ~/.azure. You can remove azure.publishsettings when done.
azure account import /tmp/azure.publishsettings
----
[[cloud-azure-discovery-long-instance]]
===== Creating your first instance
You need to have a storage account available. Check http://www.windowsazure.com/en-us/develop/net/how-to-guides/blob-storage/#create-account[Azure Blob Storage documentation]
for more information.
You will need to choose the operating system you want to run on. To get a list of official available images, run:
[source,sh]
----
azure vm image list
----
Let's say we are going to deploy an Ubuntu image on an extra small instance in West Europe:
[horizontal]
Azure cluster name::
`azure-elasticsearch-cluster`
Image::
`b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-13_10-amd64-server-20130808-alpha3-en-us-30GB`
VM Name::
`myesnode1`
VM Size::
`extrasmall`
Location::
`West Europe`
Login::
`elasticsearch`
Password::
`password1234!!`
Using command line:
[source,sh]
----
azure vm create azure-elasticsearch-cluster \
b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-13_10-amd64-server-20130808-alpha3-en-us-30GB \
--vm-name myesnode1 \
--location "West Europe" \
--vm-size extrasmall \
--ssh 22 \
--ssh-cert /tmp/azure-certificate.pem \
elasticsearch password1234\!\!
----
You should see something like:
[source,text]
----
info: Executing command vm create
+ Looking up image
+ Looking up cloud service
+ Creating cloud service
+ Retrieving storage accounts
+ Configuring certificate
+ Creating VM
info: vm create command OK
----
Now, your first instance is started.
[TIP]
.Working with SSH
===============================================
You need to give the private key and username each time you log on your instance:
[source,sh]
----
ssh -i ~/.ssh/azure-private.key elasticsearch@myescluster.cloudapp.net
----
But you can also define it once in `~/.ssh/config` file:
[source,text]
----
Host *.cloudapp.net
User elasticsearch
StrictHostKeyChecking no
UserKnownHostsFile=/dev/null
IdentityFile ~/.ssh/azure-private.key
----
===============================================
Next, you need to install Elasticsearch on your new instance. First, copy your
keystore to the instance, then connect to the instance using SSH:
[source,sh]
----
scp /tmp/azurekeystore.pkcs12 azure-elasticsearch-cluster.cloudapp.net:/home/elasticsearch
ssh azure-elasticsearch-cluster.cloudapp.net
----
Once connected, install Elasticsearch:
[source,sh]
----
# Install Latest Java version
# Read http://www.webupd8.org/2012/01/install-oracle-java-jdk-7-in-ubuntu-via.html for details
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java7-installer
# If you want to install OpenJDK instead
# sudo apt-get update
# sudo apt-get install openjdk-7-jre-headless
# Download Elasticsearch
curl -s https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-2.0.0.deb -o elasticsearch-2.0.0.deb
# Prepare Elasticsearch installation
sudo dpkg -i elasticsearch-2.0.0.deb
----
Check that elasticsearch is running:
[source,sh]
----
curl http://localhost:9200/
----
This command should give you a JSON result:
[source,javascript]
----
{
"status" : 200,
"name" : "Living Colossus",
"version" : {
"number" : "2.0.0",
"build_hash" : "a46900e9c72c0a623d71b54016357d5f94c8ea32",
"build_timestamp" : "2014-02-12T16:18:34Z",
"build_snapshot" : false,
"lucene_version" : "5.1"
},
"tagline" : "You Know, for Search"
}
----
[[cloud-azure-discovery-long-plugin]]
===== Install elasticsearch cloud azure plugin
[source,sh]
----
# Stop elasticsearch
sudo service elasticsearch stop
# Install the plugin
sudo /usr/share/elasticsearch/bin/plugin install elasticsearch/elasticsearch-cloud-azure/2.6.1
# Configure it
sudo vi /etc/elasticsearch/elasticsearch.yml
----
And add the following lines:
[source,yaml]
----
# If you don't remember your account id, you may get it with `azure account list`
cloud:
azure:
management:
subscription.id: your_azure_subscription_id
cloud.service.name: your_azure_cloud_service_name
keystore:
path: /home/elasticsearch/azurekeystore.pkcs12
password: your_password_for_keystore
discovery:
type: azure
# Recommended (warning: non durable disk)
# path.data: /mnt/resource/elasticsearch/data
----
Restart elasticsearch:
[source,sh]
----
sudo service elasticsearch start
----
If anything goes wrong, check your logs in `/var/log/elasticsearch`.
[[cloud-azure-discovery-scale]]
==== Scaling Out!
You need first to create an image of your previous machine.
Disconnect from your machine and run locally the following commands:
[source,sh]
----
# Shutdown the instance
azure vm shutdown myesnode1
# Create an image from this instance (it could take some minutes)
azure vm capture myesnode1 esnode-image --delete
# Note that the previous instance has been deleted (mandatory)
# So you need to create it again and BTW create other instances.
azure vm create azure-elasticsearch-cluster \
esnode-image \
--vm-name myesnode1 \
--location "West Europe" \
--vm-size extrasmall \
--ssh 22 \
--ssh-cert /tmp/azure-certificate.pem \
elasticsearch password1234\!\!
----
[TIP]
=========================================
It could happen that azure changes the endpoint public IP address.
DNS propagation could take some minutes before you can connect again using
name. You can get from azure the IP address if needed, using:
[source,sh]
----
# Look at Network `Endpoints 0 Vip`
azure vm show myesnode1
----
=========================================
Let's start more instances!
[source,sh]
----
for x in $(seq 2 10)
do
echo "Launching azure instance #$x..."
azure vm create azure-elasticsearch-cluster \
esnode-image \
--vm-name myesnode$x \
--vm-size extrasmall \
--ssh $((21 + $x)) \
--ssh-cert /tmp/azure-certificate.pem \
--connect \
elasticsearch password1234\!\!
done
----
If you want to remove your running instances:
[source,sh]
----
azure vm delete myesnode1
----
[[cloud-azure-repository]]
==== Azure Repository
To enable Azure repositories, you have first to set your azure storage settings in `elasticsearch.yml` file:
[source,yaml]
----
cloud:
azure:
storage:
account: your_azure_storage_account
key: your_azure_storage_key
----
For information, in previous version of the azure plugin, settings were:
[source,yaml]
----
cloud:
azure:
storage_account: your_azure_storage_account
storage_key: your_azure_storage_key
----
The Azure repository supports following settings:
`container`::
Container name. Defaults to `elasticsearch-snapshots`
`base_path`::
Specifies the path within container to repository data. Defaults to empty
(root directory).
`chunk_size`::
Big files can be broken down into chunks during snapshotting if needed.
The chunk size can be specified in bytes or by using size value notation,
i.e. `1g`, `10m`, `5k`. Defaults to `64m` (64m max)
`compress`::
When set to `true` metadata files are stored in compressed format. This
setting doesn't affect index files that are already compressed by default.
Defaults to `false`.
Some examples, using scripts:
[source,json]
----
# The simpliest one
PUT _snapshot/my_backup1
{
"type": "azure"
}
# With some settings
PUT _snapshot/my_backup2
{
"type": "azure",
"settings": {
"container": "backup_container",
"base_path": "backups",
"chunk_size": "32m",
"compress": true
}
}
----
// AUTOSENSE
Example using Java:
[source,java]
----
client.admin().cluster().preparePutRepository("my_backup3")
.setType("azure").setSettings(Settings.settingsBuilder()
.put(Storage.CONTAINER, "backup_container")
.put(Storage.CHUNK_SIZE, new ByteSizeValue(32, ByteSizeUnit.MB))
).get();
----
[[cloud-azure-repository-validation]]
===== Repository validation rules
According to the http://msdn.microsoft.com/en-us/library/dd135715.aspx[containers naming guide], a container name must
be a valid DNS name, conforming to the following naming rules:
* Container names must start with a letter or number, and can contain only letters, numbers, and the dash (-) character.
* Every dash (-) character must be immediately preceded and followed by a letter or number; consecutive dashes are not
permitted in container names.
* All letters in a container name must be lowercase.
* Container names must be from 3 through 63 characters long.
[[cloud-azure-testing]]
==== Testing Azure
Integrations tests in this plugin require working Azure configuration and therefore disabled by default.
To enable tests prepare a config file `elasticsearch.yml` with the following content:
[source,yaml]
----
cloud:
azure:
storage:
account: "YOUR-AZURE-STORAGE-NAME"
key: "YOUR-AZURE-STORAGE-KEY"
----
Replaces `account`, `key` with your settings. Please, note that the test will delete all snapshot/restore related
files in the specified bucket.
To run test:
[source,sh]
----
mvn -Dtests.azure=true -Dtests.config=/path/to/config/file/elasticsearch.yml clean test
----
[[cloud-azure-smb-workaround]]
==== Working around a bug in Windows SMB and Java on windows
When using a shared file system based on the SMB protocol (like Azure File Service) to store indices, the way Lucene
open index segment files is with a write only flag. This is the _correct_ way to open the files, as they will only be
used for writes and allows different FS implementations to optimize for it. Sadly, in windows with SMB, this disables
the cache manager, causing writes to be slow. This has been described in
https://issues.apache.org/jira/browse/LUCENE-6176[LUCENE-6176], but it affects each and every Java program out there!.
This need and must be fixed outside of ES and/or Lucene, either in windows or OpenJDK. For now, we are providing an
experimental support to open the files with read flag, but this should be considered experimental and the correct way
to fix it is in OpenJDK or Windows.
The Azure Cloud plugin provides two storage types optimized for SMB:
`smb_mmap_fs`::
a SMB specific implementation of the default
{ref}/index-modules-store.html#mmapfs[mmap fs]
`smb_simple_fs`::
a SMB specific implementation of the default
{ref}/index-modules-store.html#simplefs[simple fs]
To use one of these specific storage types, you need to install the Azure Cloud plugin and restart the node.
Then configure Elasticsearch to set the storage type you want.
This can be configured for all indices by adding this to the `elasticsearch.yml` file:
[source,yaml]
----
index.store.type: smb_simple_fs
----
Note that setting will be applied for newly created indices.
It can also be set on a per-index basis at index creation time:
[source,json]
----
PUT my_index
{
"settings": {
"index.store.type": "smb_mmap_fs"
}
}
----
// AUTOSENSE