違いを表にまとめておく。
レイヤー | OSIモデル | アドレス | 通信単位 | 接続対象 |
L2 | データリンク層 | MACアドレス | フレーム | LAN内の端末 |
L3 | ネットワーク層 | IPアドレス | パケット | LAN同士 |
レイヤー | OSIモデル | アドレス | 通信単位 | 接続対象 |
L2 | データリンク層 | MACアドレス | フレーム | LAN内の端末 |
L3 | ネットワーク層 | IPアドレス | パケット | LAN同士 |
$ cat test.json { "userid": "610KZ4G0CBTI419Y", "timestamp": 1509290846000, "pageid": "test-page-001", "browser": "chrome", "country":"japan" } $ curl -H 'Content-Type:application/json' -d @test.json xxx.xxx.xxx.xxx/pv
$ kubectl --namespace=backend logs -f access-tracker-backend-xxxxxxxx received request for URL: /pv success: {"userid":"610KZ4G0CBTI419Y","timestamp":1509290846000,"pageid":"test-page-001","browser":"chrome","country":"japan"}
gcloud beta pubsub subscriptions pull test --auto-ack --max-messages 1000 │ {"userid":"610KZ4G0CBTI419Y","timestamp":1509290846000,"pageid":"test-page-001","browser":"chrome","country":"japan"} │ 165859404777865 │ │
$ cd server $ docker build -t test . $ docker run --rm -p 8080:8080 test
$ curl localhost:8080/status $ curl -H 'Content-Type:application/json' -d '{"userid": "610KZ4G0CBTI419Y", "timestamp": 1509130332, "url": "kenjih.com", "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"}' localhost:8080/pv
received request for URL: /status
received request for URL: /pv userid: 610KZ4G0CBTI419Y timestamp: 1509130332 url: kenjih.com userAgent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36
$ python sample.py
シグナル | キーボードから | コマンドラインから |
SIGINT | ctrl + c | kill -INT プロセス番号 |
SIGTSTP | ctrl + z | kill -TSTP プロセス番号 |
SIGTERM | - | kill プロセス番号 |
SIGKILL | - | kill -KILL プロセス番号 |
$ pgrep -f "python sample.py"
コンポーネント | 説明 |
アプリケーションサーバ | アプリケーションサーバが一つしかないと、クリティカルなエラーが発生したときにユーザがシステムを利用できなくなってしまう。よってサーバをレプリケーションしておくことでSPOFにならないようにする必要がある。 |
ディスクストレージ | ディスクストレージが故障するとデータの読み書きができなくなり、システム全体が利用不可になってしまう可能性がある。よってRAIDなどの冗長構成を取る必要がある。 |
ネットワークスイッチ | ネットワークスイッチが故障と、ネットワーク内のサーバ間の疎通ができなくなってしまう。よって冗長なスイッチとネットワーク構成によって、SPOFを解決する必要がある。 |
import numpy as np from collections import Counter np.random.seed(1234) N = 1000 # test data size M = 30 # train data size test_data = np.random.randint(6, size=N) train_data = np.random.randint(6, size=M) p = Counter(test_data) # test distribution q = Counter(train_data) # proposed distribution exponent = 0 for i in range(6): exponent -= p[i] / N * np.log2(q[i] / M) print (2 ** exponent)