【スギデータベースSequoiaDB】【技術解析】DockerによるSequoiaDBクラスタの迅速な導入方法

11832 ワード

  • バックグラウンド
  • DockerとRocketに代表されるコンテナテクノロジーは、企業とユーザーが分散アプリケーションを作成、公開、実行する方法を変え、今後5年間でクラウドコンピューティング業界に価値をもたらすようになりました.魅力的なのは
    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クラスタ供給用システムの迅速な構築と起動方法について重点的に説明します.
  • 構築SequoiaDBミラー
  • dockerのインストール方法やミラーウェアハウスの構成は本稿の重点ではなく、ネット上には多くの関連技術記事があります.ここで指摘しなければならないのは、Dockerの公式倉庫にミラーをアップロードする速度がお世辞を言う勇気がないため、アリクラウドミラー倉庫を採用していることです.アリクラウドミラーウェアハウスの登録と使用方法については、記事(http://www.jb51.net/article/123101.htm).
    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
  • コンテナによるSequoiaDBクラスタ
  • の起動
    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クラスタの作成と起動が完了し、後でコンテナを起動するとクラスタが自動的に起動します.
  • 結論
  • SequoiaDBはコンテナ技術を利用してクラスタの迅速な導入を実現し、初心者のインストール導入の難しさを大幅に簡素化した.また、現在作成されているミラーリングは少し大きいため、ADDまたはCOPYコマンドを使用してインストールメディアをDockerコンテナにコピーすると新しいミラーイメージ1が生成され、最終的に生成されたミラーイメージ2ではインストールメディアが削除されますが、イメージ1の上にあります.したがって、image 2のサイズにはインストールメディアが含まれています.ADDコピーtarパッケージ(ADDは自動的に解凍する)を採用するか、以下のような方法を採用することが望ましい.
    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