現在、Dockerは、コンテナーを使用してアプリケーションを作成、デプロイ、実行するための最も一般的なツールです。これにより、ライブラリやその他の依存関係など、必要なすべての部分を含むアプリケーションをパッケージ化し、すべてを1つのパッケージとして出荷できます。これは仮想マシンと見なすことができますが、Dockerを使用すると、仮想オペレーティングシステム全体を作成する代わりに、アプリケーションが実行されているシステムと同じLinuxカーネルを使用できるようになり、アプリケーションはまだ実行されていないものとともに出荷される必要があります。ホストコンピューター。これにより、パフォーマンスが大幅に向上し、アプリケーションのサイズが小さくなります。
Dockerイメージの場合、事前定義されたOSバージョンが付属しており、パッケージはイメージの作成者が決定した方法でインストールされます。別のOSを使用したい場合や、別の方法でパッケージをインストールしたい場合があります。このような場合は、クリーンなOS Dockerイメージを使用して、ソフトウェアを最初からインストールする必要があります。
レプリケーションはデータベース環境の一般的な機能であるため、TimescaleDB Dockerイメージをデプロイした後、レプリケーションセットアップを構成する場合は、Dockerファイルまたはスクリプトを使用して、コンテナーから手動で行う必要があります。 Dockerの知識がない場合、このタスクは複雑になる可能性があります。
このブログでは、TimescaleDB Docker Imageを使用してDocker経由でTimescaleDBをデプロイする方法を説明し、次にCentOSDockerImageとClusterControlを使用して最初からインストールする方法を説明します。
Dockerイメージを使用してTimescaleDBをデプロイする方法
まず、DockerHubで利用可能なDockerイメージを使用してTimescaleDBをデプロイする方法を見てみましょう。
$ docker search timescaledb
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
timescale/timescaledb An open-source time-series database optimize… 52
最初の結果を取得します。したがって、この画像をプルする必要があります:
$ docker pull timescale/timescaledb
そして、ローカルポートをデータベースポートからコンテナにマッピングするノードコンテナを実行します。
$ docker run -d --name timescaledb1 -p 7551:5432 timescale/timescaledb
$ docker run -d --name timescaledb2 -p 7552:5432 timescale/timescaledb
これらのコマンドを実行した後、次のDocker環境を作成する必要があります:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6d3bfc75fe39 timescale/timescaledb "docker-entrypoint.s…" 15 minutes ago Up 15 minutes 0.0.0.0:7552->5432/tcp timescaledb2
748d5167041f timescale/timescaledb "docker-entrypoint.s…" 16 minutes ago Up 16 minutes 0.0.0.0:7551->5432/tcp timescaledb1
これで、次のコマンドを使用して各ノードにアクセスできます。
$ docker exec -ti [db-container] bash
$ su postgres
$ psql
psql (9.6.13)
Type "help" for help.
postgres=#
ご覧のとおり、このDockerイメージにはデフォルトでTimescaleDB 9.6バージョンが含まれており、AlpineLinuxv3.9にインストールされています。タグを変更することで、別のTimescaleDBバージョンを使用できます:
$ docker pull timescale/timescaledb:latest-pg11
次に、データベースユーザーを作成したり、要件に応じて構成を変更したり、ノード間のレプリケーションを手動で構成したりできます。
ClusterControlを使用してTimescaleDBをデプロイする方法
それでは、CentOS Docker Image(centos)とClusterControl Docker Image(severalnines / clustercontrol)を使用して、DockerでTimescaleDBをデプロイする方法を見てみましょう。
まず、最新バージョンを使用してClusterControl Dockerコンテナをデプロイするため、severenines /clustercontrolDockerイメージをプルする必要があります。
$ docker pull severalnines/clustercontrol
次に、ClusterControlコンテナを実行し、ポート5000を公開してアクセスします。
$ docker run -d --name clustercontrol -p 5000:80 severalnines/clustercontrol
これで、http:// [Docker_Host]:5000 /clustercontrolでClusterControlUIを開き、デフォルトの管理者ユーザーとパスワードを作成できます。
CentOSオフィシャルDockerイメージにはSSHサービスが付属していないため、SSHサービスをインストールし、SSHキーを使用してパスワードなしでClusterControlノードからの接続を許可します。
$ docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 5378 [OK]
そこで、CentOSの公式Dockerイメージを取得します。
$ docker pull centos
次に、ClusterControlにリンクされた2つのノードコンテナtimescale1とtimescale2を実行し、ローカルポートをマップしてデータベースに接続します(オプション)。
$ docker run -dt --privileged --name timescale1 -p 8551:5432 --link clustercontrol:clustercontrol centos /usr/sbin/init
$ docker run -dt --privileged --name timescale2 -p 8552:5432 --link clustercontrol:clustercontrol centos /usr/sbin/init
SSHサービスをインストールして構成する必要があるため、コンテナー内のサービスを管理できるように、特権パラメーターと/ usr / sbin/initパラメーターを使用してコンテナーを実行する必要があります。
これらのコマンドを実行した後、次のDocker環境を作成する必要があります:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
230686d8126e centos "/usr/sbin/init" 4 seconds ago Up 3 seconds 0.0.0.0:8552->5432/tcp timescale2
c0e7b245f7fe centos "/usr/sbin/init" 23 seconds ago Up 22 seconds 0.0.0.0:8551->5432/tcp timescale1
7eadb6bb72fb severalnines/clustercontrol "/entrypoint.sh" 2 weeks ago Up About an hour (healthy) 22/tcp, 443/tcp, 3306/tcp, 9500-9501/tcp, 9510-9511/tcp, 9999/tcp, 0.0.0.0:5000->80/tcp clustercontrol
次のコマンドで各ノードにアクセスできます:
$ docker exec -ti [db-container] bash
前述したように、SSHサービスをインストールする必要があるので、SSHサービスをインストールし、ルートアクセスを許可し、各データベースコンテナのルートパスワードを設定します。
$ docker exec -ti [db-container] yum update -y
$ docker exec -ti [db-container] yum install -y openssh-server openssh-clients
$ docker exec -it [db-container] sed -i 's|^#PermitRootLogin.*|PermitRootLogin yes|g' /etc/ssh/sshd_config
$ docker exec -it [db-container] systemctl start sshd
$ docker exec -it [db-container] passwd
最後のステップは、すべてのデータベースコンテナにパスワードなしのSSHを設定することです。このためには、各データベースノードのIPアドレスを知る必要があります。それを知るために、ノードごとに次のコマンドを実行できます。
$ docker inspect [db-container] |grep IPAddress
"IPAddress": "172.17.0.5",
次に、ClusterControlコンテナのインタラクティブコンソールに接続します。
$ docker exec -it clustercontrol bash
そして、SSHキーをすべてのデータベースコンテナにコピーします:
$ ssh-copy-id 172.17.0.5
これでサーバーノードが稼働しているので、データベースクラスターをデプロイする必要があります。簡単に作成するために、ClusterControlを使用します。
ClusterControlからデプロイを実行するには、http:// [Docker_Host]:5000 /clustercontrolでClusterControlUIを開き、[デプロイ]オプションを選択して、表示される指示に従います。
TimescaleDBを選択するときは、SSHでサーバーに接続するためのユーザー、キー、またはパスワードとポートを指定する必要があります。また、新しいクラスターの名前と、ClusterControlに対応するソフトウェアと構成をインストールさせる場合も必要です。
SSHアクセス情報を設定した後、データベースユーザー、バージョン、およびdatadir(オプション)を定義する必要があります。使用するリポジトリを指定することもできます。
次のステップでは、作成するクラスターにサーバーを追加する必要があります。
ここでは、以前に各コンテナから取得したIPアドレスを使用する必要があります。
最後のステップで、レプリケーションを同期にするか非同期にするかを選択できます。
ClusterControlアクティビティモニターから新しいクラスターの作成ステータスを監視できます。
タスクが完了すると、ClusterControlのメイン画面にクラスターが表示されます。
スタンバイノードをさらに追加する場合は、[クラスターアクション]メニューのClusterControlUIから追加できることに注意してください。
同様に、TimescaleDBクラスターをDockerで実行していて、ClusterControlでクラスターを管理して、監視、バックアップ、自動フェイルオーバーなど、このシステムのすべての機能を使用できるようにする場合は、データベースコンテナと同じDockerネットワーク内のClusterControlコンテナ。唯一の要件は、ターゲットコンテナにSSH関連のパッケージ(openssh-server、openssh-clients)がインストールされていることを確認することです。次に、ClusterControlからデータベースコンテナへのパスワードなしのSSHを許可します。完了したら、「既存のサーバー/クラスターのインポート」機能を使用すると、クラスターがClusterControlにインポートされます。
コンテナの実行で発生する可能性のある問題の1つは、IPアドレスまたはホスト名の割り当てです。 Kubernetesのようなオーケストレーションツールがない場合、ノードを停止して新しいコンテナを作成してから再開すると、IPアドレスまたはホスト名が異なる可能性があります。古いノードには異なるIPアドレスがあり、ClusterControlは、すべてのノードが専用のIPアドレスまたはホスト名を持つ環境で実行されていると想定しているため、IPアドレスを変更した後、クラスターをClusterControlに再インポートする必要があります。この問題には多くの回避策があります。このリンクを確認して、StatefulSetでKubernetesを使用するか、オーケストレーションツールなしでコンテナを実行するためにこのリンクを確認してください。
結論
ご覧のとおり、レプリケーションまたはフェイルオーバー環境を構成したくない場合や、OSバージョンまたはデータベースパッケージのインストールに変更を加えたくない場合は、Dockerを使用したTimescaleDBのデプロイは簡単です。
>ClusterControlを使用すると、好みのOSイメージを使用してDockerでTimescaleDBクラスターをインポートまたはデプロイできるだけでなく、バックアップや自動フェイルオーバー/リカバリなどの監視および管理タスクを自動化できます。