togatttiのエンジニアメモ

過度な期待はしないでください.

Elasticsearchのデータをバックアップして、別ノードにリストアする

Elasticsearchを運用していて、あるノードのデータをバックアップして、それを別のノードにリストアする方法を探した。

以前は、elasticsearch-knapsackやesclientといった方法があったらしい。

ただ、Elasticsearch自体の機能に、バックアップ、リストアの機能が備わっている。

技術の進歩って早いね!!

はじめに

  • 192.168.0.2
    • データ移動元ノード
  • 192.168.0.3
    • データ移動先ノード、インストール後の状態で用意。

共に、Ubuntu 16.04.1 LTS、 Elasticsearch 2.4.1で構築している。

データのバックアップ

バックアップは、Snapshotを使う。作業は、移動元ノードで行う。

www.elastic.co

バックアップディレクトリ作成

# mkdir -p /var/elasticsearch/backups
# chown -R elasticsearch:elasticsearch /var/elasticsearch

リポジトリ作成

# curl -XPUT -uadmin:admin 'http://192.168.0.2:9200/_snapshot/backup1' -d '{
  "type": "fs",
  "settings": {
    "location" : "/var/elasticsearch/backups/backup1",
    "compress": true
  }
}'

設定ファイル編集

# diff -u  /etc/elasticsearch/elasticsearch.yml.20161109/etc/elasticsearch/elasticsearch.yml
(snip)
+path.repo: ["/var/elasticsearch/backups"]
(snip)

Elasticsearchを再起動

# systemctl restart elasticsearch

Snapshot取得

# curl -XPUT 'http://192.168.0.2:9200/_snapshot/backup1/backup-2016.11.09?wait_for_completion=true' -d '{
"indices": "*",
"ignore_unavailable": true,
"include_global_state": false
}'
# curl -XGET -uadmin:admin 'http://192.168.0.2:9200/_snapshot/backup1/backup-2016.11.09?pretty'
{
  "snapshots" : [ {
    "snapshot" : "backup-2016.11.09",
    "version_id" : 2040199,
    "version" : "2.4.1",
    "indices" : [ (snip) ],
    "state" : "SUCCESS",
    "start_time" : "2016-11-09T01:47:12.035Z",
    "start_time_in_millis" : 1478656032035,
    "end_time" : "2016-11-09T01:52:47.587Z",
    "end_time_in_millis" : 1478656367587,
    "duration_in_millis" : 335552,
    "failures" : [ ],
    "shards" : {
      "total" : 717,
      "failed" : 0,
      "successful" : 717
    }
  } ]
}

stateが"SUCCESS"になっていることを確認する。

# ls -l /var/elasticsearch/backups/backup1/
total 32
-rw-r--r--   1 elasticsearch elasticsearch    59 11月  9 10:52 index
drwxr-xr-x 147 elasticsearch elasticsearch 12288 11月  9 10:46 indices
-rw-r--r--   1 elasticsearch elasticsearch   103 11月  9 10:45 meta-snapshot-2016.11.09.dat
-rw-r--r--   1 elasticsearch elasticsearch  2133 11月  9 10:46 snap-snapshot-2016.11.09.dat

バックアップディレクトリに、データが作られていることを確認する。

バックアップデータを移動先ノードに転送

# scp -pr /var/elasticsearch 192.168.0.3:/var/

データのリストア

以下、移動先ノードで行う。

所有権、グループ権変更

# chown -R elasticsearch:elasticsearch /var/elasticsearch

リポジトリ作成

# curl -XPUT 'http://192.168.0.3:9200/_snapshot/backup1' -d '{
  "type": "fs",
  "settings": {
    "location" : "/var/elasticsearch/backups/backup1",
    "compress": true
  }
}'

設定ファイル編集

# diff -u  /etc/elasticsearch/elasticsearch.yml.20161109 /etc/elasticsearch/elasticsearch.yml
(snip)
+path.repo: ["/var/elasticsearch/backups"]
(snip)

Elasticsearchを再起動

# systemctl restart elasticsearch

リストア

# curl -XPOST 'http://192.168.0.3:9200/_snapshot/backup1/backup-2016.11.09/_restore' -d '{
"indices": "*",
"ignore_unavailable": true,
"include_global_state": false
}'

参考

Elasticsearchのバックアップとリストア - Qiita

IPアドレスから、都道府県庁の緯度、経度を取得するスクリプト

Kibana4のグラフ描写で、緯度、経度が必要だったので取得するスクリプトを書いた。

書いたスクリプトはこれ。

IPアドレスから、緯度、経度を取得するスクリプト · GitHub

準備

$ gem install geoip
$ wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
$ gzip -d GeoLiteCity.dat.gz
$ wget -O ip_to_lat_lon.rb https://gist.githubusercontent.com/kentatogashi/dcfac7362b847aba9b11998e33e9e3b3/raw/f60384745ac88b290004356f8c8eb91df534e5ef/ip_to_lat_lon.rb

使い方

IPアドレスは、はてなを使ってみる。

$ dig www.hatena.ne.jp +short
59.106.194.19
$ ruby ip_to_lat_lon.rb 59.106.194.19
59.106.194.19 -> 27:大阪府 (135.52, 34.686)

参考

https://gist.github.com/kentatogashi/dcfac7362b847aba9b11998e33e9e3b3

都道府県庁の経度緯度

koshigoeb.hateblo.jp

GitLab8.6.1にアップグレードで出たエラーの対処

運用しているGitLab (8.0.2)のバージョンが古かったので、 8.6.1にアップグレードしたところ、エラーが出たのでメモを残す。

環境

  • OS
  • GitLab
    • アップデート前 8.0.2
    • アップデート後 8.6.1

インストールは、

gitlab/gitlab-ce - Packages - packages.gitlab.com | packagecloud

から、Communication Editionのdebパッケージをダウンロードして、dpkg コマンドを実行していた。

# cd /tmp
# wget -O gitlab-ce_8.0.2-ce.0_amd64.deb https://packages.gitlab.com/gitlab/gitlab-ce/packages/ubuntu/trusty/gitlab-ce_8.0.2-ce.0_amd64.deb/download
# dpkg -i gitlab-ce_8.0.2-ce.0_amd64.deb

GitLab8.6.1にアップグレードで、500エラー

production.logを見ると、pg_trgm が足りないよと怒られていた。

GitLab ver 8.6.* からは、pg_trgmというpostgresqlの拡張モジュールの設定が必要なので、

入れてあげればよい。

$ sudo su gitlab-psql
$ /opt/gitlab/embedded/bin/psql --port 5432 -h /var/opt/gitlab/postgresql -d gitlabhq_production
psql (9.2.10)
Type "help" for help.
gitlabhq_production=# create extension pg_trgm with schema pg_catalog;
CREATE EXTENSION
gitlabhq_production=# \q

念のため、GitLabの設定読み込みと再起動

$ sudo gitlab-ctl reconfigure
$ sudo gitlab-ctl restart

sedで、範囲指定してから、文字列置換を使う

sedで、範囲指定してから、文字列置換する方法を備忘録として残しておく。

例えば、以下のようなファイルがあるとする。

$ cat sample_http.conf
<VirtualHost example.com:80>
  User www
  Group www
  Port 80
  SSLDisable
  ServerAdmin admin@example.com
  ServerName example.com
</VirtualHost>

<VirtualHost example.com:443>
  User www
  Group www
  Port 443
  SSLEnable
  ServerAdmin admin@example.com
  ServerName example.com
</VirtualHost>

そして、ServerAdminをそれぞれ、

に変更したい。

これをsedで、行うためには、こうする。

$ sed -i.bak -e '/<VirtualHost .*:80>/,/<\/VirtualHost>$/s|admin|http-admin|' sample_httpd.conf
$ sed -i.bak -e '/<VirtualHost .*:443>/,/<\/VirtualHost>$/s|admin|http-admin|' sample_httpd.conf

実行すると思い通りの挙動になる。

<VirtualHost example.com:80>
  User www
  Group www
  Port 80
  SSLDisable
  ServerAdmin http-admin@example.com
  ServerName example.com
</VirtualHost>

<VirtualHost example.com:443>
  User www
  Group www
  Port 443
  SSLEnable
  ServerAdmin https-admin@example.com
  ServerName example.com
</VirtualHost>

公式風に書くと、

sed -e '/範囲指定開始文字列/,/範囲指定終了文字列/s|置換前文字列|置換後文字列|' ファイル

実際に実行したコマンドを簡単に見てみると、

$ sed -i.bak -e '/<VirtualHost .*:80>/,/<\/VirtualHost>$/s|admin|http-admin|' sample_httpd.conf

について、/<VirtualHost .*:80>/,/<\/VirtualHost>$/ で、

作業の範囲が、80番のVirtualHostディレクティブ内の内容であることを明示している。

続けて、置換の構文を s|admin|http-admin| 指定している。

Docker Machine にコマンドを追加する

MacOSで使う、 Docker Machine に、gcc、makeコマンド等を入れる方法を調べたので残す。

docker machineで、使われているOSは、TinyCoreLinuxというものらしい。

TinyCoreLinuxでは、tce-loadを使いパッケージをダウンロード、インストールすることができる。

例えば、gccの場合、以下のように使う。

$ docker-machine ssh dev
$ tce-load -wi gcc.tcz
Downloading: gcc.tcz
Connecting to repo.tinycorelinux.net (89.22.99.37:80)
gcc.tcz               93% |*******************************************    | 23681k  0:00:24 ETgcc.tcz               99% 25431k  0:00:00 ETA
gcc.tcz: OK
$ which gcc
/usr/local/bin/gcc

尚、入れられるパッケージは、以下のリストから探す。

TCZ Repository - Tiny Core Linux

gcc, make, cmake等はある。

参考

stackoverflow.com