SlideShare ist ein Scribd-Unternehmen logo
1 von 16
Downloaden Sie, um offline zu lesen
NII dodai-deploy2.0 project

DCK Server プロトタイプ

Ver1.0 2013/08/08
Etsuji Nakai
NII dodai-deploy2.0 project

前回までのアイデア

2
NII dodai-deploy2.0 project

コンポーネントスタックの整理
ユーザ
DCKを前提としたアプリケーション

DCKを容易に利用するためのツール

dckapp
DCKのAPIを呼び出す
ライブラリ

dcktool

libdck

libdck

Data Center Kernel本体

dck

dckemu

IaaS Infra

3

本来はIaaS基盤が提供するべきだが、
既存のIaaSでは未実装の機能を
代替として提供するモジュール

AWS / OpenStack / Eucalyputus /
Wakame VDCなどの既存の
IaaS基盤を前提とする
NII dodai-deploy2.0 project

dcinitとは?
 複数VM間で連携するサービスを自立分散的に起動する仕組み
 dckが提供するインフラ機能を利用して、VM間の連携を実現する
 ここでは、dcinitを実現するために必要なdckのインフラ機能を考える

4
NII dodai-deploy2.0 project

VM間の連携方法
 一般的な分類
– Fork
• 新しいVMを起動して、実行中コードの指定関数の実行を開始する
– Messaging
• pub/subモデルでイベント情報を交換する
– Shared memory
• 複数VM間で情報共有するWhite Board機能
• hostnameなどの基本情報をVM間で共有することができる
– Signal
• 指定VMのイベントハンドラを起動する
• Tomcatが追加されたらApacheに通知して負荷分散設定を変更する、など
の使い方ができる

5
NII dodai-deploy2.0 project

擬似コードイメージ
# dcinit web3tier start

fork apache
install apache

fork tomcat
install apache

fork postgresql
install apache

main {
global id = $$ # Uniq job ID
shmget(id)
shm_write(id, “controller:hostname”, $HOSTNAME)
fork apache
fork tomcat
fork postgresql
shm_read(id, “apache:ready”) # Blocking read
shm_read(id, “tomcat:ready”) # Blocking read
shm_read(id, “postgres:ready”) # Blocking read
while (1) {
fork tomcat if scaleout_is_required
}
}
apache {
install apache
shm_write(id, “apache:hostname”, $HOSTNAME)
shm_write(id, “apache:reday”, true)
event_loop
}
# signal handler to modify apache conf for new tomcat
add_tomcat {
tomcat_hosts=shm_read(id, “tomcat:hostlist”)
update_apache_config(tomcat_hosts)
}
tomcat {
install tomcat
shm_append(id, “tomcat:hostlist”, $HOSTNAME)
pgsql=shm_read(id, “pgsql:hostname”)
apache=shm_read(id, “apache:hostname”)
notify “add_tomcat” $apache
shm_write(id, “tomcat:ready”, true)
event_loop
}

6

postgres {
install postgres
shm_write(id, “postgres:hostname”, $HOSTNAME)
shm_write(id, “postgres:ready”, true)
event_loop
}
NII dodai-deploy2.0 project

プロトタイプ実装
DCK Server

7
NII dodai-deploy2.0 project

目的
 とにかく一度、p.6のような擬似コードが実際に実行できる環境を作ってみる。

8
NII dodai-deploy2.0 project

構成
管理用PC

VMインスタンス

REST API

REST API

DCKサーバ

9

OpenStack
NII dodai-deploy2.0 project

「User Data」「メタデータ」「UUID」について
 OpenStackでは、VM起動時にテキストの「User Data」を受け渡すことができま
す。特にスクリプトファイルを渡すと、ゲストOS起動後に自動実行されます。
– DCK Serverでは、「User Data」を利用して、VM連携処理の「ブートスト
ラップ」を実施しています。
 OpenStackでは、各VMに対して、「Key=Value」形式のメタデータを複数セッ
トすることができます。
– DCK Serverでは、VM間でメタデータを相互参照することで、VM間のメッ
セージ伝達を行います。
 OpenStackでは、起動中のVMにユニークなUUIDがアサインされます。
– DCK Serverでは、UUIDをVMの識別子(プロセスID)として使用します。

10
NII dodai-deploy2.0 project

DCK ServerがREST APIで提供する機能
 exec
– 新規VMを起動する。
• 親VMのUUID、OSイメージ、User Dataを指定する。
 fork
– 既存VMの「User Data」を再利用して、新規VMを起動する。
• forkされたVMは、メタデータに「forked=true」がセットされる。
 ps
– 起動中VMの情報を取得する
 ppid
– 指定VMの親VMのUUIDを取得する
 cpid
– 指定VMの子VMのUUID(複数)を取得する
 poke
– 指定VMに指定のメタデータをセットする
 peek
– 指定VMのメタデータを取得する
 delete
– 指定VM(および、子VM)を停止・削除する
11
NII dodai-deploy2.0 project

libdck.shについて
 DCK ServerのREST APIを簡便なコマンドで利用するためのライブラリ(シェルスクリプトの関数群)
– User Dataなどから次のようにインクルードして使用する。
– # curl -s http://<dckserver>:5000/dck/api/v1.0/libdck > /tmp/libdck.sh
– # . /tmp/libdck.sh
 exec
 fork

# dck-exec <親VM UUID> <新規VM名> <イメージID> <User Dataファイル>

 ps
 ppid

# dck-ps / # dck-ps <UUID>

 cpid
 poke

# dck-cpid <UUID>

 peek
 delete

# dck-peek <UUID> / # dck-peek <UUID> <key>

# dck-fork <親VM UUID> <新規VM名>
# dck-ppid <UUID>
# dck-poke <UUID> <key> <value>
# dck-delete <UUID>

 その他補助関数
– JSONから特定キーの値を取り出す
# json_elem <key> <JSON>

12
NII dodai-deploy2.0 project

forkを利用した簡単なUser Dataの例
#!/bin/bash
curl -s http://192.168.101.9:5000/dck/api/v1.0/libdck > /tmp/libdck.sh
. /tmp/libdck.sh
pid=$( json_elem "uuid" "$(curl -s http://169.254.169.254/openstack/latest/meta_data.json )" ) # 自分のUUID
forked=$(dck-peek $pid "forked")
# forkした子VMか判断するためのメタデータ
function child {
echo "I'm child" > /etc/motd
dck-poke $pid "child_setup" "true"
}

# 子VMの場合の処理
# 処理完了を自身のメタデータに記録

function parent {
# 親VMの場合の処理
for i in 1 2; do
result=$(dck-fork $pid "child$i")      
# 子VMをfork
cpids[i]=$(json_elem "pid" "$result")
done
for cpid in ${cpids[@]}; do
# 子VMの処理完了をループで待つ
while [[ ! $(dck-peek $cpid "child_setup") == "true" ]]; do
sleep 10
done
done
echo "I'm parent" > /etc/motd
}
# main
if [[ $forked == "true" ]]; then # 親VMと子VMで処理を分岐
child
else
parent
fi
exit

13
NII dodai-deploy2.0 project

Forkを利用したスケールアウトWebサーバの例 (1/2)
#!/bin/bash
curl -s http://192.168.101.9:5000/dck/api/v1.0/libdck > /tmp/libdck.sh
. /tmp/libdck.sh
pid=$( json_elem "uuid" 
"$(curl -s http://169.254.169.254/openstack/latest/meta_data.json )" )
forked=$(dck-peek $pid "forked")
function reload_lb {
webservers_bak=""
while [[ true ]]; do
# 自身のメタデータから子VMのIPを取得して、ロードバランサに登録
webservers=$(dck-peek $pid | awk -F ': ' '/^ +"web/ { print $2 }' | sed 's/[",]//g')
if [[ $webservers != $webservers_bak ]]; then
cat <<EOF > /etc/httpd/conf.d/proxy.conf
<IfModule proxy_module>
ProxyRequests Off
ProxyPass /balancer_test balancer://mycluster lbmethod=byrequests timeout=1
<Proxy balancer://mycluster>
BalancerMember http://127.0.0.1 loadfactor=1
EOF
for s in $webservers; do
echo "BalancerMember http://$s loadfactor=1" >> /etc/httpd/conf.d/proxy.conf
done
cat <<EOF >> /etc/httpd/conf.d/proxy.conf
</Proxy>
</IfModule>
EOF
このUser DataでVMを起動するとロードバラン
webservers_bak=$webservers
サーとなる。
systemctl reload httpd.service
fi
その後、このVMをforkすると、Webサーバー
sleep 10
done
になって、ロードバランス対象に登録される。
}

14
NII dodai-deploy2.0 project

Forkを利用したスケールアウトWebサーバの例 (2/2)
function prepare_httpd {
setenforce 0
yum install -y httpd
systemctl stop iptables
systemctl start httpd.service
hostname > /var/www/html/index.html
}
function parent {
prepare_httpd
reload_lb
}

# 親VMは、ロードバランサーとして動作
# 子VMを定期的にチェックして、新規の子VMをロードバランス先に登録

function child {
# 子VMは、Webサーバとして動作
prepare_httpd  
parent=$(dck-ppid $pid)
ip=$(dck-pip $pid)
dck-poke $parent "web-$ip" "$ip" # 親VMのメタデータの自身のIPアドレスを登録
}
# main
if [[ $forked == "true" ]]; then
child
else
parent
fi
exit

15
NII dodai-deploy2.0 project

Thank You!

Etsuji Nakai
Twitter @enakai00

Weitere ähnliche Inhalte

Was ist angesagt?

Aeolus Conductorによる複数環境へのデプロイ自動化
Aeolus Conductorによる複数環境へのデプロイ自動化Aeolus Conductorによる複数環境へのデプロイ自動化
Aeolus Conductorによる複数環境へのデプロイ自動化
Etsuji Nakai
 
"Docker is NOT Container." ~ Dockerとコンテナ技術、PaaSの関係を理解する
"Docker is NOT Container." ~ Dockerとコンテナ技術、PaaSの関係を理解する"Docker is NOT Container." ~ Dockerとコンテナ技術、PaaSの関係を理解する
"Docker is NOT Container." ~ Dockerとコンテナ技術、PaaSの関係を理解する
Etsuji Nakai
 
入門!Software Defined Network
入門!Software Defined Network入門!Software Defined Network
入門!Software Defined Network
Etsuji Nakai
 
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo2
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo2OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo2
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo2
Etsuji Nakai
 
RDOとPackstackのご紹介
RDOとPackstackのご紹介RDOとPackstackのご紹介
RDOとPackstackのご紹介
Etsuji Nakai
 
環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介
Etsuji Nakai
 

Was ist angesagt? (20)

Aeolus Conductorによる複数環境へのデプロイ自動化
Aeolus Conductorによる複数環境へのデプロイ自動化Aeolus Conductorによる複数環境へのデプロイ自動化
Aeolus Conductorによる複数環境へのデプロイ自動化
 
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニックRed Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック
 
"Docker is NOT Container." ~ Dockerとコンテナ技術、PaaSの関係を理解する
"Docker is NOT Container." ~ Dockerとコンテナ技術、PaaSの関係を理解する"Docker is NOT Container." ~ Dockerとコンテナ技術、PaaSの関係を理解する
"Docker is NOT Container." ~ Dockerとコンテナ技術、PaaSの関係を理解する
 
完全分散エッジ処理で実現するNeutron仮想ネットワーク
完全分散エッジ処理で実現するNeutron仮想ネットワーク完全分散エッジ処理で実現するNeutron仮想ネットワーク
完全分散エッジ処理で実現するNeutron仮想ネットワーク
 
ネットワークプログラマビリティ勉強会 これまでのおさらい
ネットワークプログラマビリティ勉強会 これまでのおさらいネットワークプログラマビリティ勉強会 これまでのおさらい
ネットワークプログラマビリティ勉強会 これまでのおさらい
 
Kubernetes雑にまとめてみた 2019年12月版
Kubernetes雑にまとめてみた 2019年12月版Kubernetes雑にまとめてみた 2019年12月版
Kubernetes雑にまとめてみた 2019年12月版
 
入門!Software Defined Network
入門!Software Defined Network入門!Software Defined Network
入門!Software Defined Network
 
DevOpsにおける組織に固有の事情を どのように整理するべきか
DevOpsにおける組織に固有の事情を どのように整理するべきかDevOpsにおける組織に固有の事情を どのように整理するべきか
DevOpsにおける組織に固有の事情を どのように整理するべきか
 
H26第1回 沖縄オープンラボラトリ・ハンズオンセミナー:OpenStack入門
H26第1回 沖縄オープンラボラトリ・ハンズオンセミナー:OpenStack入門H26第1回 沖縄オープンラボラトリ・ハンズオンセミナー:OpenStack入門
H26第1回 沖縄オープンラボラトリ・ハンズオンセミナー:OpenStack入門
 
Kubernetes超入門 with java
Kubernetes超入門 with javaKubernetes超入門 with java
Kubernetes超入門 with java
 
Dockerが抱えるネットワークの課題
Dockerが抱えるネットワークの課題Dockerが抱えるネットワークの課題
Dockerが抱えるネットワークの課題
 
RHEL7/CentOS7 NetworkManager徹底入門
RHEL7/CentOS7 NetworkManager徹底入門RHEL7/CentOS7 NetworkManager徹底入門
RHEL7/CentOS7 NetworkManager徹底入門
 
忙しい人の5分で分かるDocker 2017年春Ver
忙しい人の5分で分かるDocker 2017年春Ver忙しい人の5分で分かるDocker 2017年春Ver
忙しい人の5分で分かるDocker 2017年春Ver
 
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo2
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo2OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo2
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:ハンズオンNo2
 
Kubernetesのワーカーノードを自動修復するために必要だったこと
Kubernetesのワーカーノードを自動修復するために必要だったことKubernetesのワーカーノードを自動修復するために必要だったこと
Kubernetesのワーカーノードを自動修復するために必要だったこと
 
Kubernetesと閉域網
Kubernetesと閉域網Kubernetesと閉域網
Kubernetesと閉域網
 
OpenStackをさらに”使う”技術 - OpenStack&Docker活用テクニック
OpenStackをさらに”使う”技術 - OpenStack&Docker活用テクニックOpenStackをさらに”使う”技術 - OpenStack&Docker活用テクニック
OpenStackをさらに”使う”技術 - OpenStack&Docker活用テクニック
 
RDOとPackstackのご紹介
RDOとPackstackのご紹介RDOとPackstackのご紹介
RDOとPackstackのご紹介
 
環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介
 
Docker入門
Docker入門Docker入門
Docker入門
 

Ähnlich wie DCK Server プロトタイプ

Nodejuku01 ohtsu
Nodejuku01 ohtsuNodejuku01 ohtsu
Nodejuku01 ohtsu
Nanha Park
 
20150101勉強会 dokku alt
20150101勉強会 dokku alt20150101勉強会 dokku alt
20150101勉強会 dokku alt
Shugo Numano
 
20131211 Neutron Havana
20131211 Neutron Havana20131211 Neutron Havana
20131211 Neutron Havana
Akihiro Motoki
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14
Masahiro Nagano
 

Ähnlich wie DCK Server プロトタイプ (20)

2019年度 CaaS ワークショップ @ NTTコム
2019年度 CaaS ワークショップ @ NTTコム2019年度 CaaS ワークショップ @ NTTコム
2019年度 CaaS ワークショップ @ NTTコム
 
Embulk 20150411
Embulk 20150411Embulk 20150411
Embulk 20150411
 
Open Source x AI
Open Source x AIOpen Source x AI
Open Source x AI
 
Osc fukuoka xAI Meetup
Osc fukuoka xAI MeetupOsc fukuoka xAI Meetup
Osc fukuoka xAI Meetup
 
Docker Swarm モード にゅうもん
Docker Swarm モード にゅうもんDocker Swarm モード にゅうもん
Docker Swarm モード にゅうもん
 
AKS と ACI を組み合わせて使ってみた
AKS と ACI を組み合わせて使ってみたAKS と ACI を組み合わせて使ってみた
AKS と ACI を組み合わせて使ってみた
 
Fig
FigFig
Fig
 
Docker ComposeでMastodonが必要なものを梱包する話
Docker ComposeでMastodonが必要なものを梱包する話Docker ComposeでMastodonが必要なものを梱包する話
Docker ComposeでMastodonが必要なものを梱包する話
 
201312 scalr[oss] installation_idcf
201312 scalr[oss] installation_idcf201312 scalr[oss] installation_idcf
201312 scalr[oss] installation_idcf
 
SCALR OSS版のインストール手順のご紹介 20131204 01
SCALR OSS版のインストール手順のご紹介 20131204 01SCALR OSS版のインストール手順のご紹介 20131204 01
SCALR OSS版のインストール手順のご紹介 20131204 01
 
オトナのDocker入門
オトナのDocker入門オトナのDocker入門
オトナのDocker入門
 
Dockerクイックツアー
DockerクイックツアーDockerクイックツアー
Dockerクイックツアー
 
コマンドラインツールとしてのDocker
コマンドラインツールとしてのDockerコマンドラインツールとしてのDocker
コマンドラインツールとしてのDocker
 
これから始めるAzure Kubernetes Service入門
これから始めるAzure Kubernetes Service入門これから始めるAzure Kubernetes Service入門
これから始めるAzure Kubernetes Service入門
 
Nodejuku01 ohtsu
Nodejuku01 ohtsuNodejuku01 ohtsu
Nodejuku01 ohtsu
 
【BS7】GitHubをフル活用した開発
【BS7】GitHubをフル活用した開発【BS7】GitHubをフル活用した開発
【BS7】GitHubをフル活用した開発
 
20150101勉強会 dokku alt
20150101勉強会 dokku alt20150101勉強会 dokku alt
20150101勉強会 dokku alt
 
Docker実践入門
Docker実践入門Docker実践入門
Docker実践入門
 
20131211 Neutron Havana
20131211 Neutron Havana20131211 Neutron Havana
20131211 Neutron Havana
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14
 

Mehr von Etsuji Nakai

TensorFlowプログラミングと分類アルゴリズムの基礎
TensorFlowプログラミングと分類アルゴリズムの基礎TensorFlowプログラミングと分類アルゴリズムの基礎
TensorFlowプログラミングと分類アルゴリズムの基礎
Etsuji Nakai
 

Mehr von Etsuji Nakai (20)

PRML11.2-11.3
PRML11.2-11.3PRML11.2-11.3
PRML11.2-11.3
 
「ITエンジニアリングの本質」を考える
「ITエンジニアリングの本質」を考える「ITエンジニアリングの本質」を考える
「ITエンジニアリングの本質」を考える
 
Googleのインフラ技術に見る基盤標準化とDevOpsの真実
Googleのインフラ技術に見る基盤標準化とDevOpsの真実Googleのインフラ技術に見る基盤標準化とDevOpsの真実
Googleのインフラ技術に見る基盤標準化とDevOpsの真実
 
Introducton to Convolutional Nerural Network with TensorFlow
Introducton to Convolutional Nerural Network with TensorFlowIntroducton to Convolutional Nerural Network with TensorFlow
Introducton to Convolutional Nerural Network with TensorFlow
 
Googleにおける機械学習の活用とクラウドサービス
Googleにおける機械学習の活用とクラウドサービスGoogleにおける機械学習の活用とクラウドサービス
Googleにおける機械学習の活用とクラウドサービス
 
Spannerに関する技術メモ
Spannerに関する技術メモSpannerに関する技術メモ
Spannerに関する技術メモ
 
Googleのインフラ技術から考える理想のDevOps
Googleのインフラ技術から考える理想のDevOpsGoogleのインフラ技術から考える理想のDevOps
Googleのインフラ技術から考える理想のDevOps
 
A Brief History of My English Learning
A Brief History of My English LearningA Brief History of My English Learning
A Brief History of My English Learning
 
TensorFlowプログラミングと分類アルゴリズムの基礎
TensorFlowプログラミングと分類アルゴリズムの基礎TensorFlowプログラミングと分類アルゴリズムの基礎
TensorFlowプログラミングと分類アルゴリズムの基礎
 
TensorFlowによるニューラルネットワーク入門
TensorFlowによるニューラルネットワーク入門TensorFlowによるニューラルネットワーク入門
TensorFlowによるニューラルネットワーク入門
 
Using Kubernetes on Google Container Engine
Using Kubernetes on Google Container EngineUsing Kubernetes on Google Container Engine
Using Kubernetes on Google Container Engine
 
Lecture note on PRML 8.2
Lecture note on PRML 8.2Lecture note on PRML 8.2
Lecture note on PRML 8.2
 
Machine Learning Basics for Web Application Developers
Machine Learning Basics for Web Application DevelopersMachine Learning Basics for Web Application Developers
Machine Learning Basics for Web Application Developers
 
Your first TensorFlow programming with Jupyter
Your first TensorFlow programming with JupyterYour first TensorFlow programming with Jupyter
Your first TensorFlow programming with Jupyter
 
Deep Q-Network for beginners
Deep Q-Network for beginnersDeep Q-Network for beginners
Deep Q-Network for beginners
 
Life with jupyter
Life with jupyterLife with jupyter
Life with jupyter
 
TensorFlowで学ぶDQN
TensorFlowで学ぶDQNTensorFlowで学ぶDQN
TensorFlowで学ぶDQN
 
PRML7.2
PRML7.2PRML7.2
PRML7.2
 
インタークラウドを実現する技術 〜 デファクトスタンダードからの視点 〜
インタークラウドを実現する技術 〜 デファクトスタンダードからの視点 〜インタークラウドを実現する技術 〜 デファクトスタンダードからの視点 〜
インタークラウドを実現する技術 〜 デファクトスタンダードからの視点 〜
 
Exploring the Philosophy behind Docker/Kubernetes/OpenShift
Exploring the Philosophy behind Docker/Kubernetes/OpenShiftExploring the Philosophy behind Docker/Kubernetes/OpenShift
Exploring the Philosophy behind Docker/Kubernetes/OpenShift
 

Kürzlich hochgeladen

Kürzlich hochgeladen (12)

Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 

DCK Server プロトタイプ

  • 1. NII dodai-deploy2.0 project DCK Server プロトタイプ Ver1.0 2013/08/08 Etsuji Nakai
  • 3. NII dodai-deploy2.0 project コンポーネントスタックの整理 ユーザ DCKを前提としたアプリケーション DCKを容易に利用するためのツール dckapp DCKのAPIを呼び出す ライブラリ dcktool libdck libdck Data Center Kernel本体 dck dckemu IaaS Infra 3 本来はIaaS基盤が提供するべきだが、 既存のIaaSでは未実装の機能を 代替として提供するモジュール AWS / OpenStack / Eucalyputus / Wakame VDCなどの既存の IaaS基盤を前提とする
  • 4. NII dodai-deploy2.0 project dcinitとは?  複数VM間で連携するサービスを自立分散的に起動する仕組み  dckが提供するインフラ機能を利用して、VM間の連携を実現する  ここでは、dcinitを実現するために必要なdckのインフラ機能を考える 4
  • 5. NII dodai-deploy2.0 project VM間の連携方法  一般的な分類 – Fork • 新しいVMを起動して、実行中コードの指定関数の実行を開始する – Messaging • pub/subモデルでイベント情報を交換する – Shared memory • 複数VM間で情報共有するWhite Board機能 • hostnameなどの基本情報をVM間で共有することができる – Signal • 指定VMのイベントハンドラを起動する • Tomcatが追加されたらApacheに通知して負荷分散設定を変更する、など の使い方ができる 5
  • 6. NII dodai-deploy2.0 project 擬似コードイメージ # dcinit web3tier start fork apache install apache fork tomcat install apache fork postgresql install apache main { global id = $$ # Uniq job ID shmget(id) shm_write(id, “controller:hostname”, $HOSTNAME) fork apache fork tomcat fork postgresql shm_read(id, “apache:ready”) # Blocking read shm_read(id, “tomcat:ready”) # Blocking read shm_read(id, “postgres:ready”) # Blocking read while (1) { fork tomcat if scaleout_is_required } } apache { install apache shm_write(id, “apache:hostname”, $HOSTNAME) shm_write(id, “apache:reday”, true) event_loop } # signal handler to modify apache conf for new tomcat add_tomcat { tomcat_hosts=shm_read(id, “tomcat:hostlist”) update_apache_config(tomcat_hosts) } tomcat { install tomcat shm_append(id, “tomcat:hostlist”, $HOSTNAME) pgsql=shm_read(id, “pgsql:hostname”) apache=shm_read(id, “apache:hostname”) notify “add_tomcat” $apache shm_write(id, “tomcat:ready”, true) event_loop } 6 postgres { install postgres shm_write(id, “postgres:hostname”, $HOSTNAME) shm_write(id, “postgres:ready”, true) event_loop }
  • 8. NII dodai-deploy2.0 project 目的  とにかく一度、p.6のような擬似コードが実際に実行できる環境を作ってみる。 8
  • 10. NII dodai-deploy2.0 project 「User Data」「メタデータ」「UUID」について  OpenStackでは、VM起動時にテキストの「User Data」を受け渡すことができま す。特にスクリプトファイルを渡すと、ゲストOS起動後に自動実行されます。 – DCK Serverでは、「User Data」を利用して、VM連携処理の「ブートスト ラップ」を実施しています。  OpenStackでは、各VMに対して、「Key=Value」形式のメタデータを複数セッ トすることができます。 – DCK Serverでは、VM間でメタデータを相互参照することで、VM間のメッ セージ伝達を行います。  OpenStackでは、起動中のVMにユニークなUUIDがアサインされます。 – DCK Serverでは、UUIDをVMの識別子(プロセスID)として使用します。 10
  • 11. NII dodai-deploy2.0 project DCK ServerがREST APIで提供する機能  exec – 新規VMを起動する。 • 親VMのUUID、OSイメージ、User Dataを指定する。  fork – 既存VMの「User Data」を再利用して、新規VMを起動する。 • forkされたVMは、メタデータに「forked=true」がセットされる。  ps – 起動中VMの情報を取得する  ppid – 指定VMの親VMのUUIDを取得する  cpid – 指定VMの子VMのUUID(複数)を取得する  poke – 指定VMに指定のメタデータをセットする  peek – 指定VMのメタデータを取得する  delete – 指定VM(および、子VM)を停止・削除する 11
  • 12. NII dodai-deploy2.0 project libdck.shについて  DCK ServerのREST APIを簡便なコマンドで利用するためのライブラリ(シェルスクリプトの関数群) – User Dataなどから次のようにインクルードして使用する。 – # curl -s http://<dckserver>:5000/dck/api/v1.0/libdck > /tmp/libdck.sh – # . /tmp/libdck.sh  exec  fork # dck-exec <親VM UUID> <新規VM名> <イメージID> <User Dataファイル>  ps  ppid # dck-ps / # dck-ps <UUID>  cpid  poke # dck-cpid <UUID>  peek  delete # dck-peek <UUID> / # dck-peek <UUID> <key> # dck-fork <親VM UUID> <新規VM名> # dck-ppid <UUID> # dck-poke <UUID> <key> <value> # dck-delete <UUID>  その他補助関数 – JSONから特定キーの値を取り出す # json_elem <key> <JSON> 12
  • 13. NII dodai-deploy2.0 project forkを利用した簡単なUser Dataの例 #!/bin/bash curl -s http://192.168.101.9:5000/dck/api/v1.0/libdck > /tmp/libdck.sh . /tmp/libdck.sh pid=$( json_elem "uuid" "$(curl -s http://169.254.169.254/openstack/latest/meta_data.json )" ) # 自分のUUID forked=$(dck-peek $pid "forked") # forkした子VMか判断するためのメタデータ function child { echo "I'm child" > /etc/motd dck-poke $pid "child_setup" "true" } # 子VMの場合の処理 # 処理完了を自身のメタデータに記録 function parent { # 親VMの場合の処理 for i in 1 2; do result=$(dck-fork $pid "child$i")       # 子VMをfork cpids[i]=$(json_elem "pid" "$result") done for cpid in ${cpids[@]}; do # 子VMの処理完了をループで待つ while [[ ! $(dck-peek $cpid "child_setup") == "true" ]]; do sleep 10 done done echo "I'm parent" > /etc/motd } # main if [[ $forked == "true" ]]; then # 親VMと子VMで処理を分岐 child else parent fi exit 13
  • 14. NII dodai-deploy2.0 project Forkを利用したスケールアウトWebサーバの例 (1/2) #!/bin/bash curl -s http://192.168.101.9:5000/dck/api/v1.0/libdck > /tmp/libdck.sh . /tmp/libdck.sh pid=$( json_elem "uuid" "$(curl -s http://169.254.169.254/openstack/latest/meta_data.json )" ) forked=$(dck-peek $pid "forked") function reload_lb { webservers_bak="" while [[ true ]]; do # 自身のメタデータから子VMのIPを取得して、ロードバランサに登録 webservers=$(dck-peek $pid | awk -F ': ' '/^ +"web/ { print $2 }' | sed 's/[",]//g') if [[ $webservers != $webservers_bak ]]; then cat <<EOF > /etc/httpd/conf.d/proxy.conf <IfModule proxy_module> ProxyRequests Off ProxyPass /balancer_test balancer://mycluster lbmethod=byrequests timeout=1 <Proxy balancer://mycluster> BalancerMember http://127.0.0.1 loadfactor=1 EOF for s in $webservers; do echo "BalancerMember http://$s loadfactor=1" >> /etc/httpd/conf.d/proxy.conf done cat <<EOF >> /etc/httpd/conf.d/proxy.conf </Proxy> </IfModule> EOF このUser DataでVMを起動するとロードバラン webservers_bak=$webservers サーとなる。 systemctl reload httpd.service fi その後、このVMをforkすると、Webサーバー sleep 10 done になって、ロードバランス対象に登録される。 } 14
  • 15. NII dodai-deploy2.0 project Forkを利用したスケールアウトWebサーバの例 (2/2) function prepare_httpd { setenforce 0 yum install -y httpd systemctl stop iptables systemctl start httpd.service hostname > /var/www/html/index.html } function parent { prepare_httpd reload_lb } # 親VMは、ロードバランサーとして動作 # 子VMを定期的にチェックして、新規の子VMをロードバランス先に登録 function child { # 子VMは、Webサーバとして動作 prepare_httpd   parent=$(dck-ppid $pid) ip=$(dck-pip $pid) dck-poke $parent "web-$ip" "$ip" # 親VMのメタデータの自身のIPアドレスを登録 } # main if [[ $forked == "true" ]]; then child else parent fi exit 15
  • 16. NII dodai-deploy2.0 project Thank You! Etsuji Nakai Twitter @enakai00