0
0

More than 1 year has passed since last update.

VMware GemFireでホスト間でデータ共有する

Posted at

VMware GemFire(旧VMware Tanzu GemFire)を触って、インストールからホスト間でのデータ共有までを確認した際のメモ。
内容としてはVMware GemFire in 15 Minutes or Lessをざっくり試したものになる。

VMware GemFireとは

VMware GemFireとは分散型インメモリKey-Value StoreでApache GEODEの元となった製品である。
日本ではあまり知名度がない気がするが、10年以上の歴史がある製品で、用途としてはキャッシュ、セッション管理、データストア、地理的に分散したミッションクリティカルなワークロドなどで利用でき、以下の特徴を持っている。

  • インメモリデータの格納により、データアクセスのレイテンシを大幅に低減
  • 分散型アーキテクチャにより、スケーラビリティと可用性を向上
  • 強力なデータ管理機能を備えており、データの整合性と可用性を保証
  • 様々なプログラミング言語とフレームワークをサポート

整合性と可用性についてはこちらの記事にも説明があるので参考にすると良さそう。
また、KVSながらSQLに似たOQLというクエリ言語をサポートしている。

GemFireのコンポーネント

基本的な構成は以下となる。
(参照元:How Server Discovery Works
1694169112952.png

コンポーネントの役割は以下。

  • Server:データ領域となるインメモリストレージを提供するサーバ。ホストではなくインスタンスであり、1ホスト上で複数起動させることも可能。
  • Locator:GemFireのプロセスで、新しい接続メンバーに実行中のメンバーがどこにいるかを知らせ、サーバーを使用するためのロードバランシングを提供する
  • Client:SpringやGem FireNative Clientからキャッシュにアクセスするクライアント

また、Server間ではRegionという概念が存在し、メンバー間でシャーディングされ、水平方向にスケールできる。

GemFireのインストール

インストール手順を見ると、GemFireのインストールは2種類用意されている。

  • tarファイルを展開してのインストール
  • OVAを使ったインストール

OVAを使ったインストールはリンクが誤っているようで、VMware Marketplaceになっているが、こちらで公開されているイメージは9.15.7と最新版ではない。
最新版はVMware Tanzu Networkから入手できる。
ただし、OVA版に関してはアップグレードの際に結局tarによるインストールが必要になり、OSのインストールの手間が省ける程度のメリットしか感じられないため、ここではtarでインストールする。

要件

プラットフォーム要件はこちらに記載がある。
Linuxであれば、Kernelのバージョンが4.18以上であれば問題なく、ディストリビューションに関する指定もない。
ホストマシンの要件はこちらによると以下となる。

  • JDKが以下のいずれか
    • 8u361以上
    • 11.0.18以上 ※推奨
    • 17.0.6以上
  • NTPにより時刻同期済み
  • TCP SYN Cookieの無効化(/etc/sysctl.confnet.ipv4.tcp_syncookies = 0を書く)

JDK17についてはいくつか注意点がある。
TCP SYN Cookieを使ってシステムを保護している場合は、GemFireのサーバの前段にFWを置くなどして別手段で保護する必要がある。

GemFireのインストール

OS側の事前設定

前提であるTCP SYN Cookieを無効化する。

sudo sysctl -w net.ipv4.tcp_syncookies=0 | sudo tee -a /etc/sysctl.conf

Ubuntuの場合、時刻同期も実施する。

sudo apt install chrony -y
sudo systemctl restart chrony

JDK11もインストールし、パスを通す。

  • Ubuntuの場合
sudo apt install openjdk-11-jdk -y
echo 'export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64' >> ~/.bashrc
echo 'export PATH=$PATH:$JAVA_HOME/bin' >> ~/.bashrc
. ~/.bashrc
sudo yum install java-11-openjdk -y

インストール

VMware Tanzu Networkにログインし、VMware GemFire(vmware-gemfire-10.0.1.tgz)をダウンロードする。

ダウンロードしたファイルを展開し、パスを通す。

export INSTALL_DIR=/opt/vmware
sudo mkdir -p $INSTALL_DIR
sudo tar xvzf vmware-gemfire-*.tgz -C $INSTALL_DIR
echo "export PATH=\$PATH:$INSTALL_DIR/vmware-gemfire-10.0.1/bin" >> ~/.bashrc
. ~/.bashrc

gfshを実行し、正常に動作することを確認する。

$ gfsh version
10.0.1

GemFireの基本動作

Locatorの起動

インストール確認時に実行したgfsh(発音:ジーフィッシュ)はGemFireの管理用コマンドラインであり、GemFireの各種操作はこのコマンドから実施する。
gfshを使ってLocatorを起動する。

workディレクトリを作成し、移動する(ここにログ等が保存される)

mkdir my_gemfire
cd my_gemfire

gfshを起動する

$ gfsh
    _________________________     __
   / _____/ ______/ ______/ /____/ /
  / /  __/ /___  /_____  / _____  /
 / /__/ / ____/  _____/ / /    / /
/______/_/      /______/_/    /_/    10.0.1

Monitor and Manage VMware GemFire
gfsh>

locatorをlocator1という名前で起動する

start locator --name=locator1

問題なければ以下のようなメッセージが出る。

Locator in /home/ubuntu/my_gemfire/locator1 on wdc-10-220-157-229.nimbus.eng.vmware.com[10334] as locator1 is currently online.
Process ID: 2357070
Uptime: 29 seconds
Geode Version: 10.0.1
Java Version: 11.0.20.1
Log File: /home/ubuntu/my_gemfire/locator1/locator1.log
JVM Arguments: --add-exports=java.management/com.sun.jmx.remote.security=ALL-UNNAMED --add-exports=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED -Dgemfire.enable-cluster-configuration=true -Dgemfire.load-cluster-configuration-from-dir=false -Dgemfire.launcher.registerSignalHandlers=true -Djava.awt.headless=true -Dsun.rmi.dgc.server.gcInterval=9223372036854775806
Class-Path: /opt/vmware/vmware-gemfire-10.0.1/lib/gemfire-bootstrap-10.0.1.jar

Successfully connected to: JMX Manager [host=wdc-10-220-157-229.nimbus.eng.vmware.com, port=1099]

なお、自環境では原因不明だが、途中から以下のエラーが出るようになった。

Exception in thread "main" com.vmware.gemfire.deployment.modules.internal.LauncherException: java.lang.RuntimeException: An IO error occurred while starting a Locator in /home/imurata/gem_cluster/locator1 on wdc-10-220-157-229.nimbus.eng.vmware.com[10334]: Network is unreachable; port (10334) is not available on localhost.

この場合、--bind-addressを使ってlocalhostではなく自環境のIPを指すと動くようになった。

start locator --name locator1 --bind-address 10.220.157.229

また、使用するPortがデフォルトで10334のため、もし被る場合はこちらも--portで別Portを指定する必要がある。

Pulseの起動(省略可)

PulseはGemFireを監視するためのグラフィカルなダッシュボードを提供するWebアプリケーションである。
ホスト側でブラウザが起動できる必要があり、Xを入れていないLinuxにsshした環境で公式手順に従って起動しようとした際、以下のエラーが出た。

gfsh>start pulse
Running desktop applications is not supported on Linux.

ただ、これはブラウザでhttp://localhost:7070/pulseをopenしようとしただけで、start pulseを実行しなくてもstart locatorの時点で内部的にはPulseが起動しているため、デスクトップから別途ブラウザでhttp://<Locatorを立ち上げたホスト>:7070/pulseにアクセスするとアクセスできる。
ユーザ名admin、パスワードadminでログインすると以下のような画面が表示され、Locatorが緑の四角で表示される。
1694246702069.png

RHELの場合、ブラウザでアクセス出来ない場合はFirewallのデフォルト設定で許可されていない可能性が高いので、firewallに穴を開けるなり、systemctl stop firewalldなりで許可するようにすること。
なお、アクセスポートを変更したい場合はLocatorの起動時に--http-service-port=9999のようにPort番号を指定すると良い。

Serverの起動

再掲となるが、GemFireのアーキテクチャは以下となる。
1694169112952.png
この図の中のServerに当たる部分を起動する。
Locatorを起動していたホストで、gfshから以下を実行する。(--server-portは省略可能で、省略した場合は40404を利用する)

start server --name=server1 --server-port=40411

また、こちらも以下のようなエラーが出ることがある。

Exception in thread "main" com.vmware.gemfire.deployment.modules.internal.LauncherException: java.lang.RuntimeException: An IO error occurred while starting a Server in /home/imurata/gem_cluster/server1 on wdc-10-220-157-229.nimbus.eng.vmware.com[40411]: Network is unreachable; port (40411) is not available on localhost.

この場合は--server-bind-addressで自身のIPを指定すると自環境の場合は解決した。

start server --name=server1 --server-port=40411 --server-bind-address=10.220.157.229

起動後、Pulseで緑の四角をクリックすると、LocatorとServerが存在していることが確認できる。
1694247253459.png

リージョンの作成

次にリージョンをregionAという名前で作成する。なお、--typeで指定しているのはリージョンの種類でこちらに詳細説明がある。
今回はレプリケーションを組みつつディスクに保存して永続性を持たせるREPLICATE_PERSISTENTを指定している。

create region --name=regionA --type=REPLICATE_PERSISTENT

作成後、describeを使ってregionAの詳細を確認する。

describe region --name regionA

ここでは以下のようにserver1がメンバーであることが分かる。

Name            : regionA
Data Policy     : persistent replicate
Hosting Members : server1

Non-Default Attributes Shared By Hosting Members

 Type  |    Name     | Value
------ | ----------- | --------------------
Region | data-policy | PERSISTENT_REPLICATE
       | size        | 0
       | scope       | distributed-ack

特定のServerのみ含めたい場合は、Region作成時に--groupでGroup指定し、かつServer作成時にも--groupを指定すると絞る事ができる。

データの格納

ここでは以下のデータを格納する。

key value
1 one
2 two

データの格納はputで行う。

put --region=regionA --key="1" --value="one"
put --region=regionA --key="2" --value="two"

格納出来たらクエリを発行してデータを取得してみる。

query --query="select * from /regionA"

実行すると以下の結果が得られる。

Result : true
Limit  : 100
Rows   : 2

Result
------
two
one

gfshを終了して、再度データにアクセスすると、REPLICATE_PERSISTENTでリージョンを作成していたため、データにアクセスすること出来る。
なお、Pulseの方からもクエリを発行してデータを取得することが出来る。
1694997446548.png

別ホストとのデータ共有

先程作ったデータはUbuntu上に作っていたが、ここに別ホスト(RHEL)から先程putしたデータを読み取ったり、逆にUbuntuからRHEL上のデータが読めるかを確認する。
構成としては以下のような感じ。
1695017370706.png

RHELでGemFireをインストールし、gfshを起動してconnectコマンドで以下のようにLocatorへ接続する。

connect --locator=10.220.157.229[10334]

クエリを発行すると、データが取得できることが分かる。

gfsh>query --query="select * from /regionA"
Result : true
Limit  : 100
Rows   : 2

Result
------
two
one

メンバーも取得できる。

gfsh>list members
Member Count : 2

  Name   | Id
-------- | -----------------------------------------------------------------
server1  | wdc-10-220-157-229(server1:15127)<v1>:47702
locator1 | 10.220.157.229(locator1:9018:locator)<ec><v0>:58640 [Coordinator]

RHEL側でServerを立てる。

start server --name rhel1

すると、RHEL側、Ubuntu側双方で即座に認識される。

gfsh>list members
list members
Member Count : 3

  Name   | Id
-------- | -----------------------------------------------------------------
server1  | wdc-10-220-157-229(server1:15127)<v1>:47702
locator1 | 10.220.157.229(locator1:9018:locator)<ec><v0>:58640 [Coordinator]
rhel1    | wdc-10-215-65-35(rhel1:10868)<v2>:60444

RHEL側でデータを格納してみる。

put --region=regionA --key="foo" --value="bar"
put --region=regionA --key="hoge" --value="fuga"

Ubuntu側で確認する。

gfsh>query --query="select * from /regionA"
Result : true
Limit  : 100
Rows   : 4

Result
------
two
fuga
one
bar

無事RHEL側のデータが読み取れた。
なお、RHEL側でshutdownをするとUbuntu側のServerも含めて停止するため注意。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0