お金をかけずにサーバーの勉強をしよう

Garnetインストール(Redis互換) 3

2024年3月24日

メニューへ戻る

Microsoft製 .NETベースの Redis互換キャッシュサーバーの Garnetを Ubuntu Serverにインストールします。

Garnetインストール(Redis互換) 1」では能書きをたれ、
Garnetインストール(Redis互換) 2」で C#のソースからビルドして Garnetの実行プログラムができました。

ここではクライアントの Lubuntu上にできあがった実行プログラムを Ubuntu Serverにデプロイしたいと思います。

しかしここで「はて?」となるのでした。
そもそも .NETのコンソールプログラムってどうやってデプロイすんの?と。

その辺を調べながら進めていきたいと思います。


1.とりあえず動作確認

先に以下の手順の「Deploy Garnet Server」の段落にある通り動作確認してみます。
Getting Started

これはビルドを行ったクライアントの Lubuntuでの作業になります。
カレントディレクトリはビルドを行った [~/work/garnet] になっています。

subro@Lubuntu2204:~/work/garnet$ cd main/GarnetServer

subro@Lubuntu2204:~/work/garnet/main/GarnetServer$ dotnet run -c Release -f net8.0
    _________
   /_||___||_\      Garnet 1.0.0 64 bit; standalone mode
   '. \   / .'      Port: 3278
     '.\ /.'        https://aka.ms/GetGarnet
       '.'

* Ready to accept connections

上手く動いているように見えます。

デフォルトで [3278/tcp] で待ち受けています。
もう一つターミナルを開いてアクセスしてみます。

Redisインストール」の「4.動作確認」で redis-cliコマンドを使って Redisにアクセスしていますが、Garnetが Redisのプロトコルに準拠しているなら同じことができるはず。

ものは試しでやってみます。

ポートが Redisのデフォルトの [6379/tcp] から変わってしまってますので -pオプションを使って [3278/tcp] を指定しています。

subro@Lubuntu2204:~/work/garnet$ redis-cli -p 3278 set mykey somevalue
OK

subro@Lubuntu2204:~$ redis-cli -p 3278 get mykey
"somevalue"

良さげです。

GarnetサーバープログラムはCtrl+Cで停止しました。


2.NETのプログラムの実行ファイル形式

ビルドした PCからサーバーに配置するにあたり、Javaの Spring Bootが作る FatJarファイルみたいにライブラリを含め必要なファイルが 1ファイルに纏めることはできるか、そうだと楽で良いんだけど、という視点で調べてみました。

Microsoft Learnにこのようなドキュメントがありました。
単一ファイルのデプロイ

読んでみると .NETでも 1つに纏めることはできて、以下 2つの形式があるようです。

フレームワークに依存するデプロイモデルデプロイ先に .NETがインストールされている前提
実行ファイルサイズ小
自己完結型アプリケーション.NETも全部込みにするのでデプロイ先に .NETが
インストールされてなくても良い
実行ファイルサイズ大

環境構築では、Ubuntu Serverに .NET8をインストールしましたから、フレームワークに依存するデプロイモデルでやってみようと思います。

しかしこの 2種はビルド時に指定するものと思いますが、どこでやるのかというと Garnetのプロジェクトファイル
[~/work/garnet/main/GarnetServer/GarnetServer.csproj] になります。

以下は GitHubからダウンロードしてきたそのまんまです。
(バックスラッシュは Windowsの「¥」を表しているんでしょう。)

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>net8.0;net7.0;net6.0</TargetFrameworks>
    <OutputType>Exe</OutputType>
    <Platforms>AnyCPU</Platforms>
    <LangVersion>latest</LangVersion>
    <ServerGarbageCollection>true</ServerGarbageCollection>
    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)' == 'Debug'">
    <DefineConstants>DEBUG</DefineConstants>
    <DebugType>full</DebugType>
    <OutputPath>bin\$(Platform)\Debug\</OutputPath>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)' == 'Release'">
    <DefineConstants></DefineConstants>
    <Optimize>true</Optimize>
    <OutputPath>bin\$(Platform)\Release\</OutputPath>
  </PropertyGroup>

  <ItemGroup>
        <None Include="..\..\test\testcerts\testcert.pfx" Link="testcert.pfx">
                <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </None>
  </ItemGroup>

  <ItemGroup>
        <ProjectReference Include="..\..\libs\server\Garnet.server.csproj" />
        <ProjectReference Include="..\..\libs\host\Garnet.host.csproj" />
        <ProjectReference Include="..\..\libs\storage\Tsavorite\cs\src\devices\AzureStorageDevice\Tsavorite.devices.AzureStorageDevice.csproj" />
  </ItemGroup>

  <ItemGroup>
    <None Update="garnet.conf">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
  </ItemGroup>

</Project>

ドキュメントによると、プロパティに [PublishSingleFile]変数を加え、この値を [true] にすれば良いようです。

ですので、上のファイルのうちこの箇所をこう変更してやれば良さげ。

  <PropertyGroup>
    <TargetFrameworks>net8.0;net7.0;net6.0</TargetFrameworks>
    <OutputType>Exe</OutputType>
    <Platforms>AnyCPU</Platforms>
    <LangVersion>latest</LangVersion>
    <ServerGarbageCollection>true</ServerGarbageCollection>
    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
    <PublishSingleFile>true</PublishSingleFile>
  </PropertyGroup>

これで単一ファイルになる模様。

更に、上に書いた 2種のうちどちらで作るかは、ビルド時にコマンドオプションで指定するようです。

●フレームワークに依存するデプロイモデルのほう

dotnet publish -r linux-x64 --self-contained false

●自己完結型アプリケーションのほう

dotnet publish -r linux-x64


上の方を実行してみます。
カレントディレクトリは [~/work/garnet/main/GarnetServer] になっていますのでご注意ください。

subro@Lubuntu2204:~/work/garnet/main/GarnetServer$ dotnet publish -r linux-x64 --self-contained false
MSBuild のバージョン 17.9.6+a4ecab324 (.NET)
  復元対象のプロジェクトを決定しています...
  /home/subro/work/garnet/libs/common/Garnet.common.csproj を復元しました (928 ms)。
  /home/subro/work/garnet/metrics/HdrHistogram/HdrHistogram.csproj を復元しました (928 ms)。
  /home/subro/work/garnet/libs/storage/Tsavorite/cs/src/devices/AzureStorageDevice/Tsavorite.devices.AzureStorageDevice.csproj を復元しました (84 ms)。
  /home/subro/work/garnet/libs/storage/Tsavorite/cs/src/core/Tsavorite.core.csproj を復元しました (26 ms)。
  /home/subro/work/garnet/libs/cluster/Garnet.cluster.csproj を復元しました (2.64 sec)。
  /home/subro/work/garnet/libs/server/Garnet.server.csproj を復元しました (3.72 sec)。
  /home/subro/work/garnet/main/GarnetServer/GarnetServer.csproj を復元しました (2.79 sec)。
  /home/subro/work/garnet/libs/host/Garnet.host.csproj を復元しました (3.74 sec)。
  /home/subro/work/garnet/libs/client/Garnet.client.csproj を復元しました (38 ms)。
/usr/share/dotnet/sdk/8.0.202/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.CrossTargeting.targets(31,5): error NETSDK1129: ターゲット フレームワークを指定しないと、'Publish' ターゲットはサポートされません。現在のプロジェクトは複数のフレームワークを対象としています。発行するには、 次のフレームワークのうち 1 つを指定する必要があります: net8.0, net7.0, net6.0 [/home/subro/work/garnet/main/GarnetServer/GarnetServer.csproj]

dotnet publishコマンド使用時は、.NETのバージョンを 1つに絞らないといけないようです。

[~/work/garnet/main/GarnetServer/GarnetServer.csproj]ファイルを見ると .NET8・7・6用を作るようになっています。

  <PropertyGroup>
    <TargetFrameworks>net8.0;net7.0;net6.0</TargetFrameworks>
    <OutputType>Exe</OutputType>
    <Platforms>AnyCPU</Platforms>
    <LangVersion>latest</LangVersion>
    <ServerGarbageCollection>true</ServerGarbageCollection>
    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
    <PublishSingleFile>true</PublishSingleFile>
  </PropertyGroup>

コマンドオプションで .NET8だけを指定して再度パブリッシュします。

subro@Lubuntu2204:~/work/garnet/main/GarnetServer$ dotnet publish -r linux-x64 --self-contained false --framework net8.0
MSBuild のバージョン 17.9.6+a4ecab324 (.NET)
  復元対象のプロジェクトを決定しています...
  /home/subro/work/garnet/main/GarnetServer/GarnetServer.csproj を復元しました (449 ms)。
  9 個中 8 個の復元対象のプロジェクトは最新です。
  HdrHistogram -> /home/subro/work/garnet/metrics/HdrHistogram/bin/AnyCPU/Release/net8.0/HdrHistogram.dll
  Tsavorite.core -> /home/subro/work/garnet/libs/storage/Tsavorite/cs/src/core/bin/AnyCPU/Release/net8.0/Tsavorite.core.dll
  Tsavorite.devices.AzureStorageDevice -> /home/subro/work/garnet/libs/storage/Tsavorite/cs/src/devices/AzureStorageDevice/bin/AnyCPU/Release/net8.0/Tsavorite.devices.AzureStorageDevice.dll
  Garnet.common -> /home/subro/work/garnet/libs/common/bin/AnyCPU/Release/net8.0/Garnet.common.dll
  Garnet.client -> /home/subro/work/garnet/libs/client/bin/AnyCPU/Release/net8.0/Garnet.client.dll
  Garnet.server -> /home/subro/work/garnet/libs/server/bin/AnyCPU/Release/net8.0/Garnet.server.dll
  Garnet.cluster -> /home/subro/work/garnet/libs/cluster/bin/AnyCPU/Release/net8.0/Garnet.cluster.dll
  GGarnet.host -> /home/subro/work/garnet/libs/host/bin/AnyCPU/Release/net8.0/Garnet.host.dll
  GarnetServer -> /home/subro/work/garnet/main/GarnetServer/bin/AnyCPU/Release/net8.0/linux-x64/GarnetServer.dll
  GarnetServer -> /home/subro/work/garnet/main/GarnetServer/bin/AnyCPU/Release/net8.0/linux-x64/publish/

できたようです。

コンソールに出てきたディレクトリ(黄色)な何だろう?と思ったら、これが linux-x64用のパブリッシュ時のデフォルトの出力先のようです。

どうやらこのディレクトリを Ubuntu Serverに持っていけば良い模様。

どんなファイルがあるのか見てみます。

subro@Lubuntu2204:~/work/garnet/main/GarnetServer$ cd /home/subro/work/garnet/main/GarnetServer/bin/AnyCPU/Release/net8.0/linux-x64/publish

subro@Lubuntu2204:~/work/garnet/main/GarnetServer/bin/AnyCPU/Release/net8.0/linux-x64/publish$ ls -l
total 9828
-rw-rw-r-- 1 subro subro   43028  3月 22 21:30 Garnet.client.pdb
-rw-rw-r-- 1 subro subro  100836  3月 22 21:30 Garnet.client.xml
-rw-rw-r-- 1 subro subro   78684  3月 22 21:30 Garnet.cluster.pdb
-rw-rw-r-- 1 subro subro   93172  3月 22 21:30 Garnet.cluster.xml
-rw-rw-r-- 1 subro subro   37668  3月 22 21:29 Garnet.common.pdb
-rw-rw-r-- 1 subro subro   84076  3月 22 21:29 Garnet.common.xml
-rw-rw-r-- 1 subro subro   33180  3月 22 21:30 Garnet.host.pdb
-rw-rw-r-- 1 subro subro   35781  3月 22 21:30 Garnet.host.xml
-rw-rw-r-- 1 subro subro  200228  3月 22 21:30 Garnet.server.pdb
-rw-rw-r-- 1 subro subro  473454  3月 22 21:30 Garnet.server.xml
-rwxr-xr-x 1 subro subro 7710286  3月 24 08:00 GarnetServer
-rw-rw-r-- 1 subro subro   17544  3月 24 08:00 GarnetServer.pdb
-rw-rw-r-- 1 subro subro   11590  3月 24 08:00 GarnetServer.xml
-rw-rw-r-- 1 subro subro   20148  3月 22 21:30 HdrHistogram.pdb
-rw-rw-r-- 1 subro subro   65138  3月 22 21:30 HdrHistogram.xml
-rw-rw-r-- 1 subro subro  210808  3月 22 21:30 Tsavorite.core.pdb
-rw-rw-r-- 1 subro subro  747349  3月 22 21:30 Tsavorite.core.xml
-rw-rw-r-- 1 subro subro   25532  3月 22 21:30 Tsavorite.devices.AzureStorageDevice.pdb
-rw-rw-r-- 1 subro subro   21001  3月 22 21:30 Tsavorite.devices.AzureStorageDevice.xml
-rw-rw-r-- 1 subro subro    1549  3月 22 21:20 garnet.conf
drwxrwxr-x 4 subro subro    4096  3月 24 07:59 runtimes
-rw-rw-r-- 1 subro subro     974  3月 22 21:20 testcert.pfx

subro@Lubuntu2204:~/work/garnet/main/GarnetServer/bin/AnyCPU/Release/net8.0/linux-x64/publish$ tree
.
├── Garnet.client.pdb
├── Garnet.client.xml
├── Garnet.cluster.pdb
├── Garnet.cluster.xml
├── Garnet.common.pdb
├── Garnet.common.xml
├── Garnet.host.pdb
├── Garnet.host.xml
├── Garnet.server.pdb
├── Garnet.server.xml
├── GarnetServer
├── GarnetServer.pdb
├── GarnetServer.xml
├── HdrHistogram.pdb
├── HdrHistogram.xml
├── Tsavorite.core.pdb
├── Tsavorite.core.xml
├── Tsavorite.devices.AzureStorageDevice.pdb
├── Tsavorite.devices.AzureStorageDevice.xml
├── garnet.conf
├── runtimes
│   ├── linux-x64
│   │   └── native
│   │       └── libnative_device.so
│   └── win-x64
│       └── native
│           ├── native_device.dll
│           └── native_device.pdb
└── testcert.pfx

5 directories, 24 files

う〜ん、ドキュメントを読む限り「フレームワークに依存するデプロイモデル」は DLLの形になっていて、クロスプラットフォーム(Linux & Win)で動かせる認識なんですが、DLLはないんですね。

DLLは [GarnetServer]ファイルに纏められていると思いますけど、何だかんだでファイルが随分あります。

tarコマンドで 1つに纏めてから、Ubuntu Serverに持っていきましょう。

tarコマンドで纏めます。
カレントディレクトリを一つ上(親)に移してから作業しています。

subro@Lubuntu2204:~/work/garnet/main/GarnetServer/bin/AnyCPU/Release/net8.0/linux-x64/publish$ cd ..

subro@Lubuntu2204:~/work/garnet/main/GarnetServer/bin/AnyCPU/Release/net8.0/linux-x64$ tar -czvf garnet.tgz publish
publish/
publish/Garnet.common.pdb
publish/HdrHistogram.pdb
publish/Tsavorite.core.pdb
publish/Garnet.client.pdb
publish/Garnet.server.xml
publish/Garnet.client.xml
publish/GarnetServer
publish/Garnet.host.xml
publish/Tsavorite.devices.AzureStorageDevice.pdb
publish/Garnet.server.pdb
publish/runtimes/
publish/runtimes/linux-x64/
publish/runtimes/linux-x64/native/
publish/runtimes/linux-x64/native/libnative_device.so
publish/runtimes/win-x64/
publish/runtimes/win-x64/native/
publish/runtimes/win-x64/native/native_device.dll
publish/runtimes/win-x64/native/native_device.pdb
publish/garnet.conf
publish/Garnet.cluster.pdb
publish/testcert.pfx
publish/Garnet.host.pdb
publish/HdrHistogram.xml
publish/Garnet.cluster.xml
publish/GarnetServer.xml
publish/Tsavorite.devices.AzureStorageDevice.xml
publish/GarnetServer.pdb
publish/Tsavorite.core.xml
publish/Garnet.common.xml

subro@Lubuntu2204:~/work/garnet/main/GarnetServer/bin/AnyCPU/Release/net8.0/linux-x64$ ls -l *.tgz
-rw-rw-r-- 1 subro subro 4131230  3月 24 09:30 garnet.tgz

[garnet.tgz]ファイルができました。

scpコマンドで Ubuntu Serverの [subro]ユーザーのホームディレクトリ以下にある [work]ディレクトリに持っていきます。

subro@Lubuntu2204:~/work/garnet/main/GarnetServer/bin/AnyCPU/Release/net8.0/linux-x64$ scp garnet.tgz subro@UbuntuServer2204-1:~/work
garnet.tgz                                         100% 4034KB  72.6MB/s   00:00

コピーできました。


3.Ubuntu Serverへ Garnetをデプロイ

次は Ubuntu Serverでの作業です。
sshログインしました。

先程 scpコマンドで Lubuntuからコピーしてきたファイルを確認します。

subro@UbuntuServer2204-1:~/work$ ls -l garnet.tgz
-rw-rw-r-- 1 subro subro 4131230  3月 24 09:48 garnet.tgz

ありました。

tarコマンドで解凍&展開します。

subro@UbuntuServer2204-1:~/work$ tar -xzvf garnet.tgz
publish/
publish/Garnet.common.pdb
publish/HdrHistogram.pdb
publish/Tsavorite.core.pdb
publish/Garnet.client.pdb
publish/Garnet.server.xml
publish/Garnet.client.xml
publish/GarnetServer
publish/Garnet.host.xml
publish/Tsavorite.devices.AzureStorageDevice.pdb
publish/Garnet.server.pdb
publish/runtimes/
publish/runtimes/linux-x64/
publish/runtimes/linux-x64/native/
publish/runtimes/linux-x64/native/libnative_device.so
publish/runtimes/win-x64/
publish/runtimes/win-x64/native/
publish/runtimes/win-x64/native/native_device.dll
publish/runtimes/win-x64/native/native_device.pdb
publish/garnet.conf
publish/Garnet.cluster.pdb
publish/testcert.pfx
publish/Garnet.host.pdb
publish/HdrHistogram.xml
publish/Garnet.cluster.xml
publish/GarnetServer.xml
publish/Tsavorite.devices.AzureStorageDevice.xml
publish/GarnetServer.pdb
publish/Tsavorite.core.xml
publish/Garnet.common.xml

展開できました。

※ファイル・ディレクトリのオーナー・グループは、[subro]ユーザー・グループが Lubuntuと同じ IDになっているのでここでは変えませんが、本気の環境を作るなら Garnet専用に「garnet」ユーザーやグループを作って運用するほうが良い気がします。

[publish]ディレクトリに移って、Garnetを実行します。

subro@UbuntuServer2204-1:~/work$ cd publish

subro@UbuntuServer2204-1:~/work/publish$ ./GarnetServer
    _________
   /_||___||_\      Garnet 1.0.0 64 bit; standalone mode
   '. \   / .'      Port: 3278
     '.\ /.'        https://aka.ms/GetGarnet
       '.'

* Ready to accept connections

ちゃんと動きました。

クライントの Lubuntuから redis-cliコマンドでアクセスしてみます。
-hオプションでホストを指定できます。
([UbuntuServer2204-1] は [/etc/hosts] で名前解決できるようにしています)

subro@Lubuntu2204:~$  redis-cli -h UbuntuServer2204-1 -p 3278 set mykey somevalue
OK

subro@Lubuntu2204:~$ redis-cli -h UbuntuServer2204-1 -p 3278 get mykey
"somevalue"

\(^o^)/

本当に Ubuntu Serverに入れた .NET8を使っているのか?と思い、apt removeコマンドで .NET関係のパッケージを全部消して、dotnetコマンドも無くなった状態で再度実行してみたらエラーになりましたんで、「フレームワークに依存するデプロイモデル」でビルドされたものなんだろうということが想定されます。

subro@UbuntuServer2204-1:~/work/publish$ /GarnetServer
You must install .NET to run this application.

App: /home/subro/work/publish/GarnetServer
Architecture: x64
App host version: 8.0.3
.NET location: Not found

Learn more:
https://aka.ms/dotnet/app-launch-failed

Download the .NET runtime:
https://aka.ms/dotnet-core-applaunch?missing_runtime=true&arch=x64&rid=linux-x64&os=ubuntu.22.04&apphost_version=8.0.3

良いんじゃないでしょうか。


4.おまけ:自己完結型アプリケーションも作ってみる

せっかく Ubuntu Serverから .NET8を抜きましたし、.NET含め全部入りという「自己完結型アプリケーション」も作ってみます。

クライアントの Lubuntuでの作業です。
パブリッシュします。

subro@Lubuntu2204:~/work/garnet/main/GarnetServer$ dotnet publish -r linux-x64 --framework net8.0
MSBuild のバージョン 17.9.6+a4ecab324 (.NET)
  復元対象のプロジェクトを決定しています...
  復元対象のすべてのプロジェクトは最新です。
  HdrHistogram -> /home/subro/work/garnet/metrics/HdrHistogram/bin/AnyCPU/Release/net8.0/HdrHistogram.dll
  Garnet.common -> /home/subro/work/garnet/libs/common/bin/AnyCPU/Release/net8.0/Garnet.common.dll
  Tsavorite.core -> /home/subro/work/garnet/libs/storage/Tsavorite/cs/src/core/bin/AnyCPU/Release/net8.0/Tsavorite.core.dll
  Garnet.client -> /home/subro/work/garnet/libs/client/bin/AnyCPU/Release/net8.0/Garnet.client.dll
  Tsavorite.devices.AzureStorageDevice -> /home/subro/work/garnet/libs/storage/Tsavorite/cs/src/devices/AzureStorageDevice/bin/AnyCPU/Release/net8.0/Tsavorite.devices.AzureStorageDevice.dll
  Garnet.server -> /home/subro/work/garnet/libs/server/bin/AnyCPU/Release/net8.0/Garnet.server.dll
  Garnet.cluster -> /home/subro/work/garnet/libs/cluster/bin/AnyCPU/Release/net8.0/Garnet.cluster.dll
  Garnet.host -> /home/subro/work/garnet/libs/host/bin/AnyCPU/Release/net8.0/Garnet.host.dll
  GarnetServer -> /home/subro/work/garnet/main/GarnetServer/bin/AnyCPU/Release/net8.0/linux-x64/GarnetServer.dll
  GarnetServer -> /home/subro/work/garnet/main/GarnetServer/bin/AnyCPU/Release/net8.0/linux-x64/publish/

パブリッシュできました。
どんなファイルができているか見てみます。

subro@Lubuntu2204:~/work/garnet/main/GarnetServer$ ls -l /home/subro/work/garnet/main/GarnetServer/bin/AnyCPU/Release/net8.0/linux-x64/publish
total 74976
-rw-rw-r-- 1 subro subro    43028  3月 22 21:30 Garnet.client.pdb
-rw-rw-r-- 1 subro subro   100836  3月 22 21:30 Garnet.client.xml
-rw-rw-r-- 1 subro subro    78684  3月 22 21:30 Garnet.cluster.pdb
-rw-rw-r-- 1 subro subro    93172  3月 22 21:30 Garnet.cluster.xml
-rw-rw-r-- 1 subro subro    37668  3月 22 21:29 Garnet.common.pdb
-rw-rw-r-- 1 subro subro    84076  3月 22 21:29 Garnet.common.xml
-rw-rw-r-- 1 subro subro    33180  3月 22 21:30 Garnet.host.pdb
-rw-rw-r-- 1 subro subro    35781  3月 22 21:30 Garnet.host.xml
-rw-rw-r-- 1 subro subro   200228  3月 22 21:30 Garnet.server.pdb
-rw-rw-r-- 1 subro subro   473454  3月 22 21:30 Garnet.server.xml
-rwxr-xr-x 1 subro subro 74422945  3月 24 16:05 GarnetServer
-rw-rw-r-- 1 subro subro    17544  3月 24 08:00 GarnetServer.pdb
-rw-rw-r-- 1 subro subro    11590  3月 24 08:00 GarnetServer.xml
-rw-rw-r-- 1 subro subro    20148  3月 22 21:30 HdrHistogram.pdb
-rw-rw-r-- 1 subro subro    65138  3月 22 21:30 HdrHistogram.xml
-rw-rw-r-- 1 subro subro   210808  3月 22 21:30 Tsavorite.core.pdb
-rw-rw-r-- 1 subro subro   747349  3月 22 21:30 Tsavorite.core.xml
-rw-rw-r-- 1 subro subro    25532  3月 22 21:30 Tsavorite.devices.AzureStorageDevice.pdb
-rw-rw-r-- 1 subro subro    21001  3月 22 21:30 Tsavorite.devices.AzureStorageDevice.xml
-rw-rw-r-- 1 subro subro     1549  3月 22 21:20 garnet.conf
drwxrwxr-x 4 subro subro     4096  3月 24 07:59 runtimes
-rw-rw-r-- 1 subro subro      974  3月 22 21:20 testcert.pfx

[GarnetServer]ファイルのサイズに注目です。
さっきは [7,710,286] 今度は [74,422,945]と 10倍くらいに大きくなりました。

このファイルだけ Ubuntu Serverに持ってきました。
ここから Ubuntu serverでの作業になります。

[~/work]ディレクトリに置いたので、上で使った [~/work/publish]ディレクトリとは無関係になってるはずです。

subro@UbuntuServer2204-1:~/work$ ls -l GarnetServer
-rwxr-xr-x 1 subro subro 74422945  3月 24 16:15 GarnetServer

実行してみます。

subro@UbuntuServer2204-1:~/work$ ./GarnetServer
    _________
   /_||___||_\      Garnet 1.0.0 64 bit; standalone mode
   '. \   / .'      Port: 3278
     '.\ /.'        https://aka.ms/GetGarnet
       '.'

* Ready to accept connections

単品ファイルで動いております。

クライアントの Lubuntuからテストしましょう。

subro@Lubuntu2204:~$  redis-cli -h UbuntuServer2204-1 -p 3278 set mykey somevalue
OK

subro@Lubuntu2204:~$ redis-cli -h UbuntuServer2204-1 -p 3278 get mykey
"somevalue"

\(^o^)/


==========
途中から Garnetのインストールより .NETのコンソールアプリのデプロイが主眼になってしまった気もしますが、どうにかやり遂げられました。

本当は Garnetを使って「は、速ぇっ?!」ってやるのが期待される結果なんでしょうけど、所詮サーバーもクライアントも 1つの PC上に構築している貧乏環境ゆえ…

しかし、今回の実験は .NETのデプロイの良いお勉強になりました。


その後オフィシャルのドキュメントを読み進めるに、Garnetは Redisの完全互換を目指しているわけではないとありました。

あくまで Redisからの移行をスムースにするために Redisユーザー用の口も作っている、そんなノリなんですかね。

このシリーズを書いている途中に、Redisのライセンスのニュースが入ってきたあたり、Redisのゴタゴタはマイクロソフトは知ってて、Azure Redis for Cacheの代替サービスにするつもりなのかも知れません。

メジャーリリースと言っても、まだ 1.0.0ですし、ドキュメントには今後の開発予定も一杯書いてありましたから、どんどん機能拡充していく計画のようです。

今後 Dragonflyとの闘いがどうなるかに注目ですね。