【スギデータベースSequoiaDB】【技術解析】DockerによるSequoiaDBクラスタの迅速な導入方法
11832 ワード
1)資源の独立、隔離
リソース分離はクラウドコンピューティングプラットフォームの最も基本的なニーズです.DockerはLinux namespace,cgroupによってハードウェアリソースとソフトウェアの実行環境を制限し,ホスト上の他のアプリケーションと隔離し,互いに影響を及ぼさないようにした.異なるアプリケーションまたはサービスは「コンテナ」(container)単位で「船」または「船」を積み下ろし、「コンテナ船」(containerを実行するホストまたはクラスタ)には、数千数万個の「コンテナ」が整列し、異なる会社、異なる種類の「貨物」(アプリケーションを実行するために必要なプログラム、コンポーネント、実行環境、依存)が独立している.
2)環境の一貫性
開発エンジニアがアプリケーション開発を完了するとbuildはdocker imageで、このimageに基づいてcontainerはコンテナのように作成されます.中には様々な「ばら積み貨物」(アプリケーションを実行するために必要なプログラム、コンポーネント、運行環境、依存)が梱包されています.このコンテナがどこにあるかにかかわらず、開発環境、テスト環境、生産環境、コンテナの中の「貨物」を確保することができます種類は個数と全く同じで、パッケージはテスト環境で欠落することはなく、環境変数は生産環境で構成を忘れることはなく、開発環境と生産環境は異なるバージョンのインストールに依存してアプリケーションの実行異常を招くことはありません.このような一貫性は、「出荷」(build docker image)時に「コンテナ」に密封されていることに起因し、各段階は、この完全で、分割合併を必要としない「コンテナ」を輸送する.
3)軽量化
従来の仮想化技術(VM)に比べて、dockerを使用したcpu、memory、disk IO、network IOでのパフォーマンス損失は同じレベル、さらに優れている.Containerの迅速な作成、起動、破棄は多くの称賛を受けている.
4)Build Once, Run Everywhere
この特性は多くの人を引きつけました「貨物」(応用)「自動車」「汽車」「汽船」(私有雲、公有雲などのサービス)間で交換を移転する場合、標準規格と積み下ろし方式に合致する「コンテナ」(docker container)を移転するだけで、時間と労力を要する人工的な「積み下ろし」を削減(オンライン、オフライン応用)は、莫大な時間と人件費の節約をもたらす.これにより、今後数人の運行維持人員だけが超大規模な積載ライン応用の容器クラスタを運行することが可能になり、60年代以降数人の機械オペレータが数時間以内に1万級コンテナ船を連装して取り外すことができるようになった.
コンテナ技術は現在もデータベース分野に広く応用されている.その「Build Once,Run Everywhere」の特性は、データベースのインストール構成に長年従事してきたDBAにとっても、インストール構成データベース環境は簡単に見えるが、常にうまくいかないため、データベース環境のインストールにかかる時間を大幅に短縮します.もちろん,コンテナ技術の他の利点もデータベースの使用によく応用されている.
SequoiaDBは優れた国産分布式NewSQLデータベースとして、ますます多くのユーザーに認められている.この文書では、Dockerを例に、Dockerfileを使用してSequoiaDBミラーを迅速に構築する方法と、コンテナを使用してSequoiaDBクラスタ供給用システムの迅速な構築と起動方法について重点的に説明します.
STEP 1:Dockerfileを作成します.内容は以下の通りです.簡単な命令を数行だけでいいです.
#This is the Dockerfile for Sequoiadb 2.8.4
REQUIRED FILES TO BUILD THIS IMAGE
(1) sequoiadb-2.8.4-linux_x86_64-enterprise-installer.run
(2) installSDB.sh
HOW TO BUILD THIS IMAGE
Put all downloaded files in the same directory as this Dockerfile
Run:$ sudo docker build -t sequoiadb:2.8.4 .
Pull base image
FROM ubuntu
Environment variables required for this build
ENV INSTALL_BIN_FILE="sequoiadb-2.8.4-linux_x86_64-enterprise-installer.run" \
INSTALL_SDB_SCRIPT="installSDB.sh" \
INSTALL_DIR="/opt/sequoiadb"
Copy binaries
ADD $INSTALL_BIN_FILE $INSTALL_SDB_SCRIPT $INSTALL_DIR/
Install SDB software binaries
RUN chmod 755 $INSTALL_DIR/$INSTALL_SDB_SCRIPT \
&& $INSTALL_DIR/$INSTALL_SDB_SCRIPT \
&& rm $INSTALL_DIR/$INSTALL_SDB_SCRIPT
そのうちinstallSDB.shスクリプトの内容は以下の通りです.
chmod 755 $INSTALL_DIR/$INSTALL_BIN_FILE
$INSTALL_DIR/$INSTALL_BIN_FILE --mode unattended
rm $INSTALL_DIR/$INSTALL_BIN_FILE
echo 'service sdbcm start' >> /root/.bashrc
なお、本例ではSequoiadbエンタープライズ版2.8を採用する.4、この例のメディア名を置き換えるには、巨杉公式サイトからコミュニティ版(tarパッケージを選択し、ダウンロードして解凍する)をダウンロードすることもできます.
巨杉官网下载地址:http://download.sequoiadb.com/cn/
STEP 2:ミラーの作成
rootユーザー実行:
docker build -t sequoiadb:2.8.4 .
一般ユーザーの場合はsudoを使用する必要があります.
sudo docker build -t sequoiadb:2.8.4 .
STEP 3:アリクラウドミラー倉庫への登録
docker login --username=xxx registry.cn-hangzhou.aliyuncs.com
このうちxxxはアリクラウドに登録したアカウントです.
STEP 4:ローカルsequoiadbミラーidの表示
docker images
STEP 5:ローカルミラーをマークしてアリクラウド倉庫に入れる
docker tag 04dc528f2a6f registry.cn-hangzhou.aliyuncs.com/508mars/sequoiadb:latest
そのうち04 dc 528 f 2 a 6 fは筆者のローカルsequoiadbミラーidであり、新しいタグフォーマットには一定の要求がある、registry.cn-hangzhou.aliyuncs.comはアリクラウド倉庫の住所で、508 marsは筆者のアリクラウドのユーザー名で、sequoiadbはミラー名で、latestはtagです.
STEP 6:sequoiadbミラーをミラーライブラリにコミットする
docker push registry.cn-hangzhou.aliyuncs.com/508mars/sequoiadb:latest
Dockerのネットワークのデフォルトはbridgeモードを採用し、bridgeモードを採用するコンテナは以下の特徴がある.
1)同一ホストの容器間は互いにpingし合うことができる
2)シンク本体と異なる容器間は互いにpingが異なる
しかし、SequoiaDBクラスタではすべてのノード間が相互接続可能であることが要求されるため、SequoiaDBを実行するコンテナが異なるホスト上を走っている場合、dockerのデフォルトのネットワークモードは明らかに適切ではありません.異なるホストコンテナ間の接続性の問題を解決する方法はいくつかありますが、ここではweave仮想ネットワークというソリューションのみを紹介します.weaveはDNSサーバの機能を同時に提供しているため、この機能により、コンテナを使用してSequoiaDBクラスタを配置する際に、各コンテナ内部の/etc/hostsを変更する必要がなくなり、自動化配置のステップが大幅に簡素化されます.
STEP 1:weaveネットワークのインストール
curl -s -L git.io/weave -o /usr/local/bin/weave
chmod a+x /usr/local/bin/weave
すべてのホストにインストールする必要があります.筆者はホストとして3台の仮想マシンを採用しました.sdb 1,sdb 2,sdb 3です.
STEP 2:weaveネットワークの起動
weave launch
最初の起動時にweaveミラーがダウンロードされます.
STEP 3:アリクラウド倉庫からsequoiadbミラーをダウンロードする
docker pull registry.cn-hangzhou.aliyuncs.com/508mars/sequoiadb
STEP 4:すべてのホストでdockerのマウントボリュームを作成する
cd /home/sdbadmin
mkdir -p data/disk1 data/disk2 data/disk3
mkdir -p conf/local
chmod -R 777 data
chmod -R 777 conf
マウントボリュームの場所はカスタマイズできますが、総じて、この例のdata/disk 1、data/disk 2、data/disk 3などの集合データを格納するための2つのマウントボリュームを作成する必要があります.この例のconf/localなどのノード構成情報を格納するためのクラスです.これにより、容器が誤って削除されても、誤って削除された容器の役割を果たすために新しい容器を起動することができます.
STEP 5:起動容器
sdb1:
weave stop
weave launch
eval $(weave env)
docker run -dit --name sdbserver1 -p 11810:11810 -v /home/sdbadmin/data:/data -v /home/sdbadmin/conf/local:/opt/sequoiadb/conf/local registry.cn-hangzhou.aliyuncs.com/508mars/sequoiadb
sdb2:
weave stop
weave launch 192.168.17.132
eval $(weave env)
docker run -dit --name sdbserver2 -p 11810:11810 -v /home/sdbadmin/data:/data -v /home/sdbadmin/conf/local:/opt/sequoiadb/conf/local registry.cn-hangzhou.aliyuncs.com/508mars/sequoiadb
sdb3:
weave stop
weave launch 192.168.17.132
eval $(weave env)
docker run -dit --name sdbserver3 -p 11810:11810 -v /home/sdbadmin/data:/data -v /home/sdbadmin/conf/local:/opt/sequoiadb/conf/local registry.cn-hangzhou.aliyuncs.com/508mars/sequoiadb
そのうち192.168.17.132はsdb 1のIPアドレスであり、11810は外部に露出したクラスタアクセスポートである.ホストがノード構成情報を格納するボリュームは、コンテナの/opt/sequoiadb/conf/localディレクトリにマウントする必要があります.テーブルデータを格納するボリュームは、ユーザーがカスタマイズしたディレクトリにマウントできますが、クラスタが作成されると変更できません.コンテナを起動するときはマシン名を指定する必要があります.クラスタの構築後、マシン名はSequoiaDBのシステムテーブルに保存され、ノードのマシン名がシステムテーブルと一致しないとクラスタに参加できないためです.Weaveを使用するシーンでは、-nameオプションを使用することをお勧めします.-hostnameを使用してマシン名を設定しないでください.後者はweaveがDNSサーバにマシン名を追加することを阻止し、weaveは–nameの値に基づいてマシン名を自動的に設定し、マシン名の後にweaveを追加する.localドメイン名、DNSサーバに追加されました.
STEP 6:SequoiaDBクラスタを作成したスクリプトをコンテナにコピーする
d
ocker cp create_cluster.js sdbserver1:/data
create_cluster.js :
var array_hosts = ["sdbserver1.weave.local", "sdbserver2.weave.local", "sdbserver3.weave.local"];
var array_dbroot = ["/data/disk1/sequoiadb/database","/data/disk2/sequoiadb/database","/data/disk3/sequoiadb/database"];
var port_sdbcm = "11790";
var port_temp_coord = "18888";
var cataloggroup = {gname:"SYSCatalogGroup", gport:"11820", ghosts:["sdbserver1.weave.local", "sdbserver2.weave.local", "sdbserver3.weave.local"]};
var array_coordgroups = [
{gname:"SYSCoord", gport:"11810", ghosts:["sdbserver1.weave.local", "sdbserver2.weave.local", "sdbserver3.weave.local"]}
];
var array_datagroups = [
{gname:"dg1", gport:"11830", ghosts:["sdbserver1.weave.local", "sdbserver2.weave.local", "sdbserver3.weave.local"], goptions:{transactionon:true}}
,{gname:"dg2", gport:"11840", ghosts:["sdbserver1.weave.local", "sdbserver2.weave.local", "sdbserver3.weave.local"], goptions:{transactionon:true}}
,{gname:"dg3", gport:"11850", ghosts:["sdbserver1.weave.local", "sdbserver2.weave.local", "sdbserver3.weave.local"], goptions:{transactionon:true}}
];
var array_domains = [
{dname:"allgroups", dgroups:["dg1", "dg2", "dg3"], doptions:{AutoSplit:true}}
];
println(" ");
var oma = new Oma(array_coordgroups[0].ghosts[0], port_sdbcm);
oma.createCoord(port_temp_coord, array_dbroot[0]+"/coord/"+port_temp_coord);
oma.startNode(port_temp_coord);
println(" :"+cataloggroup.ghosts[0]+" "+cataloggroup.gport+" "+array_dbroot[0]+"/cata/"+cataloggroup.gport);
var db = new Sdb(array_coordgroups[0].ghosts[0], port_temp_coord);
db.createCataRG(cataloggroup.ghosts[0], cataloggroup.gport, array_dbroot[0]+"/cata/"+cataloggroup.gport);
var cataRG = db.getRG("SYSCatalogGroup");
for (var i in cataloggroup.ghosts) {
if (i==0) {continue;}
println(" : "+cataloggroup.ghosts[i]+" "+cataloggroup.gport+" "+array_dbroot[0]+"/cata/"+cataloggroup.gport);
var catanode = cataRG.createNode(cataloggroup.ghosts[i], cataloggroup.gport, array_dbroot[0]+"/cata/"+cataloggroup.gport);
catanode.start();
}
println(" ");
var db = new Sdb(array_coordgroups[0].ghosts[0], port_temp_coord);
var coordRG = db.createCoordRG();
for (var i in array_coordgroups) {
for (var j in array_coordgroups[i].ghosts) {
println(" :"+array_coordgroups[i].ghosts[j]+" "+array_coordgroups[i].gport+" "+array_dbroot[0]+"/coord/"+array_coordgroups[i].gport);
coordRG.createNode(array_coordgroups[i].ghosts[j], array_coordgroups[i].gport, array_dbroot[0]+"/coord/"+array_coordgroups[i].gport);
}
}
coordRG.start();
println(" ")
var oma = new Oma(array_coordgroups[0].ghosts[0], port_sdbcm);
oma.removeCoord(port_temp_coord);
println(" ")
var db = new Sdb(array_coordgroups[0].ghosts[0], array_coordgroups[0].gport);
var k=0;
for (var i in array_datagroups) {
var dataRG = db.createRG(array_datagroups[i].gname);
for (var j in array_datagroups[i].ghosts) {
println(" :"+array_datagroups[i].gname+" "+array_datagroups[i].ghosts[j]+" "+array_datagroups[i].gport+" "+array_dbroot[k]+"/data/"+array_datagroups[i].gport+" "+array_datagroups[i].goptions)
dataRG.createNode(array_datagroups[i].ghosts[j], array_datagroups[i].gport, array_dbroot[k]+"/data/"+array_datagroups[i].gport, array_datagroups[i].goptions);
}
dataRG.start();
k++;
}
println(" ");
var db = new Sdb(array_coordgroups[0].ghosts[0], array_coordgroups[0].gport);
for (var i in array_domains) {
println(" :"+array_domains[i].dname+" "+array_domains[i].dgroups+" "+array_domains[i].doptions)
db.createDomain(array_domains[i].dname, array_domains[i].dgroups, array_domains[i].doptions );
}
STEP 7:SequoiaDBクラスタの作成
docker exec sdbserver1 su - sdbadmin -c “sdb -f/data/create_cluster.js”
これでSequoiaDBクラスタの作成と起動が完了し、後でコンテナを起動するとクラスタが自動的に起動します.
RUN mkdir -p /usr/src/things \
&& curl -SL http://example.com/big.tar.xz \
| tar -xJC /usr/src/things \
&& make -C /usr/src/things all