「エンジニアリング組織論への招待」を読んだ
7月に転職して規模の大きいチームで働くことになった。 今まではスタートアップなどほとんど一人や数人で開発することが多く、 チームでの開発を行った経験が少ないため、勉強のためにエンジニアリング組織論への招待という本を読んでみた。
感想
- 不確実性というテーマで一貫してかかれておりわかりやすかった。
- いままでは考えようとしてもなにから考えればよいのかがわからなかったが、不確実性というキーワードを起点にできるようになった。
- 一つのテーマを深く掘り下げるというよりも、さまざまなテーマについて触れているので、組織におけるさまざまな問題にフィットしそう。
- 個人、1:1の関係、チーム、組織とさまざまな規模での話題について取り上げているので、困ったときはとりあえず問題の規模に応じてその部分を見ておけば良い。
- 概念的な話だけでなく、具体的な実例が豊富ですぐにでも使ってみることができそう。
ElastiCacheRedisのCloudFormationで混乱したところを整理した
祝!はてなブログhttps化!🎉httpsになったのでブログを書いていこうと思います!
CloudFormationでElastiCache Redisクラスターを構築した時に混乱したことを整理してみました。長くなってしまったのでまとめだけ見れば問題ないと思います。
はじめに
CloudFormationでリソースを作成する場合、構築したいメインのリソースを中心にドキュメントを読んでいけば、関連するそれ以外の必要なリソースもわかるので、まずは中心となるリソースを見つけるのがおすすめです。
たとえば、Auroraの場合だとAWS::RDS::DBCluster
というのがあるのでこれのプロパティに必要なリソースを定義していけば良いというのがわかります。
ElastiCacheの場合もDBなのでAuroraの設定に近い構成になると踏んでいました。Clusterっぽいリソースがあってそこに色々追加していく感じです。実際、AWS::ElastiCache::CacheCluster
というリソースがあったのでこれを使えば良いんだろうと考えました。
AWS::ElastiCache::CacheCluster
以下がCacheClusterの設定例です。
CacheCluster: Type: AWS::ElastiCache::CacheCluster Properties: AutoMinorVersionUpgrade: true Engine: redis EngineVersion: !Ref EngineVersion CacheNodeType: !Ref CacheNodeType CacheParameterGroupName: !Ref CacheParameterGroup CacheSubnetGroupName: !Ref CacheSubnetGroup Port: !Ref Port SnapshotRetentionLimit: !Ref SnapshotRetentionLimit NumCacheNodes: !Ref NumCacheNodes VpcSecurityGroupIds: - !GetAtt CacheSecurityGroup.GroupId
これだけを見ると何も難しいところはなさそうです。CacheNodeType
のノードがNumCacheNodes
数だけ立ち上がるように見えますね。しかしながら、これを実行してクラスターを構築しようとするとNumCacheNodes should be 1 if engine is redis
というエラーが出てStackの構築に失敗します。
原因は、エラーメッセージにあるとおりNumCacheNodesに1以外を設定したためです。NumCacheNodesという名前と直感的に反しますが、これは公式ドキュメントに書いてありました。
Redis 用 ElastiCache クラスターは、同じ役割を持つ 1 つまたは複数の Redis 用 ElastiCache ノードのコレクションです。プライマリノードはプライマリクラスター内に作成され、リードレプリカノードはリードレプリカクラスター内に作成されます。現在、1 つのクラスターは 1 つのノードのみを持つことができます。
つまり、現状1つのクラスターには1つのノードしか存在できないようです。
それではどうやってCloudFormationでElastiCacheのRedisクラスターを構築するかというと
AWS::ElastiCache::ReplicationGroup
テンプレートを使用します。
AWS::ElastiCache::ReplicationGroup
以下がAWS::ElastiCache::ReplicationGroup
の実装例です。
CacheReplicationGroup: Type: AWS::ElastiCache::ReplicationGroup Properties: AutomaticFailoverEnabled: true CacheNodeType: !Ref CacheNodeType CacheParameterGroupName: !Ref CacheParameterGroup CacheSubnetGroupName: !Ref CacheSubnetGroup Engine: redis EngineVersion: !Ref EngineVersion NodeGroupConfiguration: - ReplicaCount: 1 NumNodeGroups: 1 NumCacheClusters: 2 Port: !Ref Port ReplicasPerNodeGroup: !Ref NumCacheNodes SecurityGroupIds: - !GetAtt CacheSecurityGroup.GroupId SnapshotRetentionLimit: !Ref SnapshotRetentionLimit
大体はなんとなくわかる気がするのですが、この中の4つのプロパティの違いがわからなくて混乱しました。以下はそのプロパティ名とAWS Documentの説明です。
- NumNodeGroups
- この Redis (clustered mode enabled) レプリケーショングループのノードグループ (シャード) の数。Redis (clustered mode disabled) では、このプロパティを省略します。
- NumCacheClusters
- ReplicasPerNodeGroup
- 各ノードグループ(シャード)のレプリカノードの数
- NodeGroupConfiguration: ReplicaCount:
- ノードグループのリードレプリカノードの数
全部似たような説明で違いがよくわからなかったので、調べて見ました。
NumNodeGroups
NumNodeGroups
はRedis (clustered mode enabled) レプリケーショングループのノードグループ (シャード) の数を指定します。
クラスタモードが有効なRedisのレプリケーショングループの場合、一つのレプリケーショングループには複数のノードを集めたノードクラスタ(シャードを)含んでいるのでその数を指定するための項目のようです。 クラスタモードを無効にしてRedisで動作させたい場合はこのプロパティを省略します。
Redis用ElastiCacheに出てくる概念はこちらの記事が参考になりました。 ElastiCache + Redis に出てくる概念と、クラスタモードごとの違い
NumCacheClusters
NumCacheClusters
はレプリケーショングループのキャッシュクラスターの数です。
クラスタモードが無効の場合に設定します。
複数のシャードを指定(クラスタモード有効に)すると、このプロパティは無視されます。代わりに、ReplicasPerNodeGroup プロパティを使用するようです。
このプロパティと他の3つのプロパティは同時に指定することはできず、 指定してしまうと以下のようなエラーが出力されて構築に失敗します。
Property NumCacheCluster cannot be defined along with Properties NumNodeGroups, ReplicasPerNodeGroup or NodeGroupConfiguration
ReplicasPerNodeGroup
各ノードグループ(シャード)のレプリカノードの数です。
こちらはNodeGroupConfiguration
と同時には指定できません。
指定してしまうと以下のエラーが出ます。
Cannot specify both replicasPerNodeGroup and replicaCount.
NodeGroupConfiguration: ReplicaCount
NodeGroupConfiguration
はノードグループの設定を指定するプロパティです。
レプリカ数だけでなく、アベイラビリティゾーンなどの設定も行えます。
ReplicaCount
を指定することでノードグループのリードレプリカノード数を決めることができます。
このプロパティはクラスタモードが無効・有効どちらの場合でも使用できまが、
クラスタモードが有効(複数シャード)の場合は、シャード数分指定する必要があります。
NumNodeGroups: 2 NodeGroupConfiguration: - ReplicaCount: 1 - ReplicaCount: 2
まとめ
AWS::ElastiCache::CacheCluster
はひとつのノードだけ構築する際に使用するAWS::ElastiCache::ReplicationGroup
は複数のノードのクラスタを構築する際に使用する
参考
今週勉強したことまとめ(2017/12/11 ~ 2017/12/17)
Docker
AWS
EC2
SpotInstance
SpotFleet
- スポットインスタンスの集合
- 価格を超えた場合には自動で入札し直してスポットインスタンスを起動する
- 簡単に安定してスポットインスタンスの台数を維持することが可能
- 配置戦略
- 「最低限稼働してほしい」インスタンスはdiversified戦略のSpotFleetで起動し、それ以外はlowest戦略のSpotFleetで起動する
lowestとdiversifedで上限価格の差をつける
- ECSでSpotFleetを使う
- Amazon ECS 対応 AMI
AutoScaling
CloudFront
DynamoDB
ExpressionAttributeNames: { "#k": "key", "#i": "item", "#is": "items" }
ECS
- ecs-deploy
- How it works
- EC2コンテナサービスでは、タスク定義には、便利なアプリケーション(データベース、Webフロントエンド、メンテナンス/ cronなど)を一緒に提供するコンテナのグループ間の関係が指定されています。
- タスク定義は、そのグループ内のコンテナを実際に実行するための一種のテンプレートとして機能します。
- コンテナの結果のグループは、タスクと呼ばれます
- Dockerがネットワークを実装する方法のため、一般に、コンテナインスタンス(クラスタインフラストラクチャを提供する仮想マシン)ごとにタスク定義ごとに1つのタスクしか実行できません。
- タスク定義は自動的にバージョン管理されます---タスク定義の実際の名前は、姓とバージョン番号の2つの部分で構成されます。
- タスクは広範なアプリケーションの完全に自己完結型の「ワーカーユニット」であるはずなので、Amazonは別の構成エンティティであるサービスを使用して、いつでも実行されているタスクの数を管理します。
- タスクは単にタスク定義のインスタンス化であるため、サービスはタスク定義の指定されたリビジョンとそこから実行すべきタスクの数との間のバインディングに過ぎません。
- 好都合なことに、Amazonは、このバインディングを更新して、実行中のタスクの数を変更したり、作成されたタスク定義を変更したりすることができます。
- 前者の場合、サービスは、数量を仕様に合わせるためにタスクを構築または終了することによって応答します。
ただし、後者の場合は、Blue/Greenデプロイメントを行います。つまり、以前のタスクを強制終了する前に、新しいタスクが起動され、使用準備ができていることを確認します。
したがって、新しいバージョンのアプリケーションを展開するために必要なのは、そのタスクを実行しているサービスを新しいバージョンのタスク定義を指すように更新することだけです。
- ecs-deployはpython awsユーティリティを使ってこれを行います。
- ecs-deployは
- 2番目のステップではより多くの説明が得られます。
- タスク定義は複数のコンテナを定義する可能性があるため、新しいリビジョンを作成するためには何を変更する必要がありますか?
- 経験的に、驚くべき答えは何もない。
- Amazonでは、タスク定義の新しいバージョンと同じバージョンを作成することができますが、サービスでは依然として同じタスクの青緑の展開が行われます。
- それにもかかわらず、システムはドッカーを使用するため、アプリケーションの改善がコンテナイメージに組み込まれ、リポジトリ(公開または非公開)にプッシュされ、ECSで使用するためにプルダウンされるという前提があります。
- したがって、このスクリプトは指定されたイメージパラメータを変更キーとして使用して、コンテナのイメージで使用されるタグを変更します。
- 指定されたパラメータと同じリポジトリ名を持つイメージを検索し、そのタグを指定されたパラメータのものに更新します。
- この結果、タスク定義で同じイメージを使用するように複数のコンテナを定義すると、異なるタグを最初に使用するように設定しても、それらのすべてが指定されたタグに更新されます。しかし、これはまれなユースケースと考えられています。
- How it works
Kubernetes
service mesh
- 現実世界のマイクロサービス:サービスに陰りが見え始め、いよいよ本気になるとき
What’s a service mesh? And why do I need one?
- サービスメッシュとはサービス間の通信を安全で速くそして信頼できるものにするための専用のインフラレイヤ
- クラウドネイティブアプリケーションを構築しているならきっとサービスメッシュが必要でしょう
- ここ数年、サービスメッシュはクラウドネイティブスタックに欠かせないコンポーネントとして現れた
- PayPal, Lyft, Ticketmaster, そして Credit karmaのようなはいトラフィックな企業はプロダクションのアプリケーションにサービスメッシュを導入した
- そして今年1月クラウドネイティブアプリケーションのためのOSSのサービスメッシュであるLinkerdはCloud Native Computing Foundationの公式ぷろじぇくとになった
- この記事では、サービスメッシュを定義し、ここ10年間のアプリケーションアーキテクチャの変遷を追います
- サービスメッシュはAPIゲートウェイ、エッジプロキシ、およびエンタープライズサービスバスの関連しているが概念とは区別されます。
- 最後に、サービスメッシュがどこに向かうのかを説明し、クラウドネイティブの採用とともに、このコンセプトがどのように進化するのかを説明します
- WHAT IS A SERVICE MESH
- サービス間の通信をハンドリングする専用のインフラレイヤ
- これは、最新のクラウドネイティブアプリケーションを構成する複雑なサービストポロジを使用して、リクエストを確実に配信する役割を担います
- 実際には、サービスメッシュは、通常アプリケーションを認識する必要がなく、アプリケーションコードと一緒に展開される軽量ネットワークプロキシの配列として実装されます。 (しかし、このアイディアにはさまざまなバリエーションがあります。)
- 別の層としてのサービスメッシュの概念は、クラウドネイティブアプリケーションの登場に結びついています。
- クラウドネイティブモデルでは、1つのアプリケーションが何百ものサービスで構成されている場合があります。
- 各サービスには数千のインスタンスが存在する可能性があります。
- これらの各インスタンスは、Kubernetesのようなオーケストレーターによって動的にスケジュールされるため、常に変化する状態にある可能性があります。
- この世界のサービス通信は信じられないほど複雑なだけでなく、ランタイム動作の普及した基本的な部分です。
- エンドツーエンドのパフォーマンスと信頼性を確保するには、それを管理することが不可欠です。
- IS THE SERVICE MESH A NETWORKING MODEL?
- サービスメッシュはTCP/IP層の上の抽象レイヤーに位置するネットワークモデルです
- 基礎となるL3/L4ネットワークが存在し、ポイントツーポイントでバイトを配信できることを前提としています
- (また、このネットワークは環境の他のすべての側面と同様に信頼性が低く、サービスメッシュもネットワーク障害を処理できる必要があると仮定します。)
- いくつかの点で、サービスメッシュはTCP/IPに似ています。
- TCPスタックがネットワークエンドポイント間で確実にバイトを配信する仕組みを抽象化するように、サービスメッシュはサービス間で確実に要求を配信する仕組みを抽象化します。
- TCPのように、サービスメッシュは実際のペイロードやエンコード方法については気にしません。
- アプリケーションは高レベルの目標(「AからBに何かを送信する」)を持ち、TCPのようなサービスメッシュの仕事は、途中の失敗を処理しながらこの目標を達成することです。
- TCPとは異なり、サービスメッシュは、「動作させる」 以外に重要な目標を持っています。
- アプリケーションランタイムに可視性と制御を導入するための、アプリケーション全体にわたる統一されたポイントを提供します
- サービスメッシュの明白な目標は、目に見えない暗黙のインフラ領域から、エコシステムのファーストクラスメンバーの役割(サービスを監視、制御できる)にサービス間通信を移動させることです
- WHAT DOES A SERVICE MESH ACTUALLY DO?
- クラウドネイティブアプリケーションで確実にリクエストを配信することは、非常に複雑になります
- Linkerdのようなサービスメッシュはこの複雑さを以下のような強力な手法で管理します
- サーキットブレーカー
- latency-aware load balancing
- 最終的に一貫した(「アドバイザリ」)サービスディスカばり
- リトライ
- デッドライン
- これらの機能はすべて連携して動作しなければならず、これらの機能とそれらが動作する複雑な環境とのインタラクションは非常に微妙なものになります
- 例えば、Linkerdを介してサービスにリクエストがあった場合、非常にシンプルなイベントのタイムラインは次のようになります
- これらの機能は、個別のレジリエンスとアプリケーション全体のレジリエンスを提供することを目的としていることに注意することが重要です
- 大規模分散システムは、どのように構築されているかに関わらず、一つの明確な特性を持っています
- システム全体の致命的な障害に拡大するための小さなローカライズされた障害の多くの小さな障害が存在する
- サービスメッシュは、負荷を分散し、基盤となるシステムが限界に近づいたときに高速に処理しないことによってこれらのエスカレーションに対して保護するように設計する必要があります
Isito
Conduit
Minikube
- https://github.com/kubernetes/minikube
- ローカルでKubernetesを簡単に実行できるようにするためのツール
- MinikubeはKubernetesを試してみたり、日常的に開発しようと思っているユーザーのために、ラップトップ上のVM内で単一ノードのKubernetesクラスタを実行する
Kubernetes
Prometheus
Spring
- @Validと@Validatedの違い
- Spring MVCのControllerの引数のCommandに対して検証を行う場合は、本来はSpringの「@Validated」を使用する
- http://d.hatena.ne.jp/tatsu-no-toshigo/20131006/1381031027
Java
- JavaVMのメモリ管理に関するまとめ(Java8版)
- jcmdを試す
- OptionalはSerializableではないのでフィールドでは使えない
- OptionalがSerializableではない話と使い方まとめ
- インスタンスフィールドにOptionalは使わない
- プライベートスコープではnullを使う
- getterにはOptionalを使う
- setterやコンストラクタではOptionalを使わない
- メソッドの戻り値にはOptionalを使う
- OptionalがSerializableではない話と使い方まとめ
- visualvm
- OutOfMemoryError の調べ方
- FindBugs
- CheckerFramework
- logback
今週勉強したことまとめ(2017/12/04 ~ 2017/12/10)
今週はECSの使い方を手を動かしながら学んだ。 細かいドキュメントは読み込めていないので今後読んでいく必要があるが、 最終的にCircleCIでDockerイメージをビルドしECRにpush後、ecs-deployコマンドで開発環境にデプロイするという流れを自動化するまでできた。 作成したリソースを消す際にALB周りでつまったところがあったので、リソース削除時は最新の注意を払う。 今後まとめる際はリンクだけ貼るのではなく、少なくとも中身を一行ぐらいで説明するようにする。
AWS
- AWS 管理コンソールのヘッダーをリージョン別で色分けする Stylish を作った
- AWSのリージョンごとにコンソールの色を分けることができるのでミスがなくなって便利
ECS
ECS CLI
- ローカル開発環境からのクラスター及びタスクの作成、更新、モニタリングを簡素化する高レベルなコマンド
- DockerComposeファイルがサポートされている
- インストール
- MacOSの場合
sudo curl -o /usr/local/bin/ecs-cli https://s3.amazonaws.com/amazon-ecs-cli/ecs-cli-darwin-amd64-latest sudo chmod +x /usr/local/bin/ecs-cli ecs-cli --version
- MacOSの場合
- 設定
ecs-cli configure --region us-west-2 --access-key $AWS_ACCESS_KEY_ID --secret-key $AWS_SECRET_ACCESS_KEY --cluster ecs-cli-demo
ecs-deploy
- ecs-deploy
- シェルスクリプトで書かれたシンプルなECSのデプロイツール
-t
でタイムアウト時間を伸ばさないと大抵エラーになるのでCIを使っている場合は注意
サービス定義時に紐づけるロードバランサを間違えるとインスタンスがひとつもないターゲットグループをさしてしまうので注意
- サービスを削除したい場合は以下の三段階の手順が必要
- ECS運用のノウハウ
- マイクロサービス化設計入門 - AWS Dev Day Tokyo 2017
ALB
- ヘルスチェックを設定しないと503
- 同じセキュリティグループに関連付けられたインスタンスが相互に通信できるようにするには、そのためのルールを明示的に追加する必要がある
- 送信元IPにセキュリティグループのidを指定する
- パスベースのルーティングを変更したい場合は
- EC2 > ロードバランサ > リスナーtab > ルールの表示/編集を押すと管理画面が表示される
- まちがってターゲットグループをロードバランサに紐づけてしまった場合はここからパスごとにターゲットグループの紐づけを解除しなければ、ターゲットグループそのものを削除できない
Aurora
- パラメータグループ
Docker
bitrise
- アプリのビルド専用のCIサービス
- 50$/月でビルドし放題
SideCI
- コードレビューを自動でしてくれるCIサービス
SonarQube
- 静的コード解析ツール
- https://www.sonarqube.org/
- SonarQubeで始める静的コード解析
SpringBoot
- ログ設定
- Actuator
- アプリケーションのモニタリングや管理を簡単に行えるツール
- 公式ドキュメント
- Spring Boot Actuatorを使ってヘルスチェックする
- SpringのDBコネクションの共有方法(DBトランザクション)を理解する
@JdbcTest
- Jdbcのテストのためのアノテーション
- @RunWith(SpringRunner.class)と組み合わせて使用する
- Jdbcテストに関係するコンフィギュレーションを有効にする
- デフォルトでは@JdbcTestは組み込みのインメモリDBを使用する
@AutoConfigureTestDatabase
によってこの設定は上書きできる- ローカルにDBを立ててテストしたい場合などはこちらを使用する
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
でアプリケーションのデフォルト設定のDBを使用する- JavaDoc
Play framework
MySQL
- MySQLの文字コード事情
- charset
- collation
- 文字の照合規則・照合順序
- utf8mb4_general_ci
- utf8mb4のデフォルトのcollation
- ASCII大文字小文字を区別しない
- 絵文字を区別しない
- utf8mb4_bin
- 全文字を区別する
- utf8mb4_unicode_ ci
- ASCII大文字小文字を区別しない
- 絵文字を区別しない
- ひらがな、かたかな、濁点有無、全角、半角を区別しない
- MySQL Connector/Jプロパティリスト
- 現在接続しているスレッド数を表示する
show status like 'Threads_connected';
- Max_used_connections これまでに記録された同時接続数の最大値
- Threads_connected 現在開いている接続の数
- Threads_created 接続を処理するために生成されたスレッド数
- Threads_running スリープ状態になっていないスレッド数
Java
- 文字列分割
String.substring
- The Tomcat JDBC Connection Pool
英語
can be used when
- ~の場合に使用できる
今週勉強したことまとめ(2017/11/27 ~ 2017/12/03)
今週はAWS re:Inventが開催され様々な新サービスが発表された。 サービス数が多すぎて全部を追うことができていないが、 今回特に気になったのはコンテナ周りのサービスで Managed KubernetesのEKSとFargeteという二つのサービスが発表された。 アプリケーションの実行環境の選択肢が増え、より自社のサービスに適した構成を構築できるようになったが、 AWSのサービスを組み合わせて適切なインフラを設計する難易度がどんどん上がっている気がする。 今後は機械学習で最適なアーキテクチャを提案するサービスが出てきてくるのではないだろうか。 そのほかに今週は、あまりにも忘れていることが多いので システムプログラミング周りやネットワーク周りの基礎を勉強し直し始めた。
AWS
-
- Java
- java8インストール方法
- alternativesでjava8を選択する
$ sudo yum -y install java-1.8.0-openjdk-devel tomcat8 $ sudo alternatives --config java
- alternativesでjava8を選択する
- java8インストール方法
- Java
re:Invent
まとめ
【レポート】あらゆる層でのキャッシュ利用を検討せよ!各層でのキャッシュ利用戦略まとめ #reinvent #ATC303
- 以下の4層でキャッシュを利用した高速化手法を紹介
- Edge
- CloudFrontを利用してラストマイルのレイテンシを高速化
- マルチリージョンでアプリケーションを構築する場合はリージョン間でリソースの同期を取らなければならない
- CloudFrontを前段にしておけば、アプリケーションを1リージョンでマルチリージョン対応はCloudFrontでできるので無駄が省ける
- Lambda Edge
- コンテンツのカスタマイズや認証、A/Bテストに使用する
- CloudFrontを利用してラストマイルのレイテンシを高速化
- Web Tier
- 全ての静的コンテンツのキャッシュ
- ログアウトユーザのキャッシュ有効か
- アクセス頻度の高いコンテンツのキャッシュ検討
- キャッシュヒット率、ミス率のモニタリング
- TTLを賢く選択
- アプリケーションデプロイを妨げない
- Applicaiton Tier
- Database
- ネガティブキャッシュも利用する
- 検索対象が存在しなかった結果をキャッシュとして保持する
- キャッシュの自動更新方法にLambdaの利用を検討する
- ネガティブキャッシュも利用する
- Edge
- 以下の4層でキャッシュを利用した高速化手法を紹介
Amazon GuardDuty
- Amazon GuardDuty – 継続したセキュリティ監視と脅威の検知
- 継続的なセキュリティのモニタリングおよび分析サービス、AWS環境に対する潜在的な脅威を検出する
- VPCフローログ・CloudTrailのイベントログ・DNSログを利用して予期しない活動や、悪意のある行為を検知することができる
- AWS Fargateの紹介 – インフラストラクチャの管理不要でコンテナを起動
- In The Works – Amazon Aurora Serverless
CloudFront
- キャッシュinvalidationは月々100パスまで無料
- /*などのワイルドカードも1パスとしてカウントされる
- AWS S3上の静的コンテンツをCircleCIでdeploy時にCloudFrontのキャッシュを削除する
Aurora
- DBクラスターが作成される
- DBクラスターは以下の二つから構成される
- エンドポイント
- 信頼性
- ストレージの自動修繕
- ディスクボリュームの障害を自動的に検出し、すぐにそのセグメントを修繕する
- 修復時に他のボリュームないのデータを使用して、修復されるデータが最新であるようにする
- キャッシュのウォームアップ
- データベースがシャットダウン後に起動した場合バッファプールキャッシュをウォームアップする
- メモリ内のページキャッシュに保存された既知のクエリのページをバッファプールに事前ロードする
- ウォームアップをしなくて良いのでパフォーマンスが向上する
- ページキャッシュはデータベースとは別のプロセスで管理される
- このため、データベースに障害が発生した場合でもページキャッシュはメモリの残り、バッファプールはデータベース起動時に最新の状態にウォームアップされる
- クラッシュ回復
- クラッシュから瞬時に回復する
- ストレージの自動修繕
- クラスターの作成
- [Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
コンテナ
- CNI
- Container Network Interface
- Container内のNetwork Interfaceを構成するためのプラグインを開発するための仕様とライブラリなどから構成されている
- マルチホストでのDocker Container間通信 第3回: Kubernetesのネットワーク(CNI, kube-proxy, kube-dns)
- Container Network Interface
システムプログラム
- http://www.coins.tsukuba.ac.jp/~syspro/2017/
- http://www.coins.tsukuba.ac.jp/~yas/
- OSとは
- OSはハードウェアの違いを隠蔽し、ユーザがプログラムを実行するための使いやすい環境を提供する
- ハードウェアを抽象化した概念を提供することで、いろいろなコンピュータで共通に使用できる実行環境を提供する
- OSが提供する抽象概念
- (ハードウェア機能) -> (抽象概念)
- プロセッサ、メモリ -> プロセス
- ストレージ -> ファイル、ディレクトリ
- コンピュータ間の通信 -> プロセス間通信
- 割り込み -> シグナル
- コンピュータ共有時の保護 -> アクセス制御
- API
- シェル
- CLIを通して、ユーザからのコマンドを受け付け、解釈・実行し、その結果を出力する機能を提供するプログラム
- コマンドの入出力をファイルや別のコマンドにするリダイレクションやパイプという機能を提供する
- 比較的単純な機能を持つ複数のコマンドを組み合わせて複雑な機能を実現することが可能
- コマンド
- ユーザがコンピュータに与える命令
- UNIXはシェルから利用できる非常に多くのコマンドを提供している
- コマンドはシェルとは別のプログラムの場合もあるし、シェルに組み込まれている場合もある
- システムコール
- OSカーネルの機能を直接呼び出すためのインタフェース
- できるだけシンプルになるように設計されている
- ライブラリ・ミドルウェア
- プログラムの部品となる関数の集合
- システムコールもライブラリもCプログラムから呼び出す場合はどちらも関数呼び出しの形態で使用できるため同じに見える
- UNIXカーネル
- ライブラリ関数とシステムコールの違い
- プロセス
- プログラムを実行中のもの
- 一つのプログラムを複数実行することができる
- プログラムは、CPUが実行できる機械語命令とそれにより処理されるデータの集合がファイルに格納されたもの
- プロセスは実行中の情報
- manコマンド
man -k キーワード
でキーワードに関連するコマンドを表示してくれる
Redis
Network
- CIDR
- アドレスクラスの概念を気にしないことで、IPアドレスの割り当てや経路選択などの自由度をあげる仕組み
- IP空間を分割する仕組みの一つ
- アドレスクラスだとBとCの間で大きさが違いすぎて非効率
- ブロックの大きさを柔軟に変更できる
- /16で65536のホスト
Spring Boot
Spring Boot外部設定
- Spring Bootの外部設定値の扱い方を理解する
- 設定一覧
- SpringBootの設定は環境変数・ファイル等によって指定できる
- 設定が反映される順番はきまっているが、先に反映された設定は上書きされない
-Dspring.profiles.active=
で設定ファイルを選択できる
ロック待ち
MySQL
- private subnetないのDBに接続して操作したい場合、Sequel Proで踏み台サーバ経由でアクセスできる
- SQLモード
- MySQLでサポートされるSQL構文、および実行されるデータ妥当性チェックの種類を定義する
- FAQ
- SQLモードのリスト
- 一番厳しめの設定
TRADITIONAL,NO_AUTO_VALUE_ON_ZERO,ONLY_FULL_GROUP_BY
- ルーク!MySQLではkamipo TRADITIONALを使え!
- IFNULL(expr1, expr2)
- expr1がNULL出ない場合、IFNULL()はexpir1を返し、それ以外の場合はexpr2を返す
- expr2もNULLの場合はNULLを返す
キーボード
- Barroco
- Fn + Aでレイヤー切り替え
英語
- presumably
- おそらく
- density
- 密度
- At the moment
- 現時点では
- comes at a cost
- 高くつく
- コストが必要となる
- Elastic
- 伸縮自在の
That being the case
- それなら、だとすれば、そういうことなら
- pure play
- ~を専業とする
その他
年金
- 厚生年金(国民年金)控除証明書はハガキで送られてくる
- 年末調整で使用するため捨てないこと
- 控除証明書を紛失した場合は年金事務所で再発行できる
- 転職などで途中で支払いが途切れている場合は控除証明書を発行できない
- 厚生年金(国民年金)控除証明書はハガキで送られてくる
Heptio
- Kubernetesを専業とする起業
Entrepreneur in Residence
- 客員企業制度
- 起業家が特定の企業に入社し、その企業で起業準備をする
今週勉強したことまとめ(2017/11/11 ~ 2017/11/26)
勉強したことについてメモしたものを一週間ごとにまとめてみることにした。 ブログのネタになりそうなものがあれば、ここから記事にまとめるところまでいけると良い。 初回は2週間分になってしまっている。まとめ方が難しい。
Java
Arrays.asList
は固定長のリストを生成するのでaddやremoveできないnew ArrayList<>(Arrays.asList())
を使う
- lombokで
@Data
をつけるときは@Builder
の後につけないとGetterやSetterが正しく作成されずエラーになる - synchronizedブロック
- 他のスレッドから割り込まれないようにブロックする
- KeyStore
- 公開鍵や証明書のためのリポジトリ
- Java Development Kitは、フォルダ
jre/lib/security/cacerts
にCAキーストアを保持する
- keytool
Spring Framework
- ErrorControllerインタフェースは
@Controller
がエラーのレンダリングに使用されていることを示すためのマーカーインタフェース- 主にセキュアにする必要のないエラーパスを知るために使用される
- SpringBootはデフォルトで全てのエラーをハンドルする
/error
にマッピングする- /errorをハンドリングするコントローラを実装すればそこでエラーレスポンスをいじれる
server.error.whitelabel.enabled=false
を設定することでデフォルトのエラーページを非表示にできる@ResponseStatus
は返すべきステータスコードと理由とともにメソッドや例外をマークするSpringBoot Actuator
- アプリのモニタリングや管理機能を提供するSpringBootのサブプロジェクト
- NamedJdbcTemplate
CQRS
- コマンドクエリ責務分離
- 質問することで答えを変えてはいけない
- 全ての基本操作がコマンドかクエリになる
- コマンドはシステムの状態を変更する
- クエリは状態を変更せず報告する
Editor
editorconfig
- さまざまなエディタ上でコーディングスタイルを統一できるツール
- .editorconfigファイルを作成しておけば各エディタのプラグインでコーディングスタイルが統一できる
- 行末の空白は EditorConfig で始末しましょう
- さまざまなエディタ上でコーディングスタイルを統一できるツール
-
analyze -> inspect code
で問題のある箇所を全て発見できる
mysql
show variables like '%time_zone%';
でtimezoneを確認できる- 事前にデータ投入をした MySQL Docker イメージを作る場合は /docker-entrypoint-initdb.d を活用すると便利
Redis
- Redisの戦略
Test
- unit test
- テストの定義「ある条件下においてソフトウェアの振る舞いを記録し、その記録が期待される結果となることを検証するプロセス」
- テストケース -> ひとつのテスト項目のこと
英語
- via: ~することで
- with: 使用して
DNS
AWS
ECS
- Amazon Elastic Container Service
- Amazon EC2 インスタンスのクラスタ全体にDocker対応アプリケーションを簡単にデプロイし管理できる
- ECS
- ECS運用のノウハウ
ECR(EC2 Container Registory)
- AWSが提供するDockerレジストリサービス
- レジストリがイメージリポジトリとイメージを管理する
Error response from daemon: Get https://.dkr.ecr.ap-northeast-1.amazonaws.com/v2/: proxyconnect tcp: dial tcp : getsockopt: connection refused
が出たらDocker再起動でなおった
AWS Shield Advanced
Docker
docker build
コマンドはDockerfile
とコンテクストによってイメージを構築するコンテクスト
tag
- 同じタグをつけると新しいimageにつけ変わる
ネットワーク機能
- Docker ネットワーク機能の概要
- ユーザが自分自身でネットワークを定義し、コンテナを接続できる
docker network ls
でネットワークのリストを表示- デフォルトで以下の三つのネットワークが生成される
- brigdge
- null
- host
docker run --network=<NETWORK>
でコンテナがどのネットワークに接続するかを指定できる- このオプションを指定しない限りデフォルトのbridgeに接続される
docker-compose
- depends_onとlinkの違い
- v2では違いはない、v1ではdepends_onはコンテナの作成順序と依存関係を解決するのに対して linkはそれに加えてエイリアス名を使用してコンテナにアクセスできるようになる
- depends_onとlinkの違い
Circle CI
- localで実行するにはcircleci CLIツールをインストールする
curl -o /usr/local/bin/circleci https://circle-downloads.s3.amazonaws.com/releases/build_agent_wrapper/circleci; and chmod +x /usr/local/bin/circleci
- シンタックスチェック
circleci config validate -c .circleci/config.yml
- ビルド
circleci build
- CircleCI 2.0 Beta における Docker イメージのビルド
bash
- bashのpipefailで確実にスクリプトを止める
- bashに-e(エラーがあったら止める)をつけてもパイプラインの左側のコマンドにエラーがあったときに処理が止まらない
set -o pipefail
を指定しておくと止まる
fish shell
- && はfishでは
; and
と書く
Code coverage
- Codecov
- カバレッジ可視化ツール
- jacoco
- Java(Maven) + Docker + CircleCI + CodecovなCI環境にしたメモ
Mac
ip
コマンドをインストールする方法brew install iproute2mac
KarabinerElementsで外部キーボード接続時に内部キーボード無効化
- Devices > Disable the buildin....
iPhone
Network
ブリッジ
- レイヤー2で異なるネットワーク間を通信できるようにする装置
NIC(ネットワークインタフェースカード)
- eth0, eth1, eth2...という順番で名前がつく
- lo0
- gif0(generic tunnel interface)
- stf0(6to4 tunnel interface)
- p2p0
- AirDropのインタフェース
- awdl0
- utun0
- Back to My Mac(どこでもMy Mac)用のインタフェース?
MTU
- ネットワークにおいて1回の転送(1フレーム)で送信できるデータの最大値を示す伝送単位
高速化
その他
- C10K問題
- 「C10K問題」(クライアント1万台問題)とは、ハードウェアの性能上は問題がなくても、あまりにもクライアントの数が多くなるとサーバがパンクする問題のこと
- TheC10kProblem
Spring Boot開発時に見ると良い記事まとめ
Spring Boot開発時に参考になるドキュメントのまとめです。
general
- 公式
- SPRING INITIALIZR
- Spring Bootのはじめの雛形を作る
トランザクションマネージャ
Bean
Docker
Lombok
- setter/getterを作ってくれるやつ
- builderパターンをやってくれる
日付
ログ
- Javaのログ出力: 道具と考え方
- SLF4J+Logbackが無難
Gradle
Config
Controller
- Spring MVC(+Spring Boot)上でのリクエスト共通処理の実装方法を理解する
- Spring Boot解説第18回(基本編:Controllerとは)
Spring Boot解説第19回(基本編:Controllerとは その2 ~@ResponseBodyと@ModelAttribute~)
パラメータ受取
@RestController
- @RestControllerでは View に遷移せず、メソッドの戻り値がそのままレスポンスのコンテンツになる
@RequestParam
@RequestMapping
- クライアントからのリクエストに対してメソッドやハンドラをマッピングする
- クラスとメソッドどちらにも使用でき、クラスに対して使用した場合は設定された値は親パスになる
@ModelAttribute
- 引数に対するアノテーション
- メソッドの引数にアノテーションを記述することで様々な値を受け取れる
@PathVariable
- パスパラメータを受けとる
@RequestHeader
- リクエストヘッダを受け取る
- required属性で必須か否かを指定する
- デフォルトでtrueになっている
@CookieValue
- クッキーの値を受けとる