Carpe Diem

備忘録

CPU CFS Quotaを制限している場合の適切なGOMAXPROCS

概要 christina04.hatenablog.com 以前上の記事でGOMAXPROCSはCPU数程度が適切に動くという話をしました。 これはこれで正しいのですが、一方でdockerのようにcgroupsでCPU Quotaを制限するケースではこれに当てはまらなくなります。 Kubernetesでいうと Kub…

PrometheusがStatsDより優れているところ

概要 新しい技術というのは既存の技術にある課題を解決するために生まれてきます。 入門 監視 ―モダンなモニタリングのためのデザインパターン作者:Mike Julian発売日: 2019/01/17メディア: 単行本(ソフトカバー) はStatsD&Graphiteを中心に説明されてお…

Go Module MirrorとChecksum Database

Go

概要 Go 1.13から、goコマンドはデフォルトでGo Module MirrorとChecksum Databaseを使用してモジュールをダウンロード&認証するようになりました。 環境 go 1.14.1 Module Mirror (Module Proxy) Module Mirrorは公開モジュールをキャッシュし、go modでの…

Redis Clusterを冗長構成で構築

概要 前回はマスターのみでRedis Clusterを構築しました。 christina04.hatenablog.com 今回は冗長構成で構築し、可用性を確認します。 環境 Redis 5.0.7

Redis Clusterの構築と水平スケーリング

概要 christina04.hatenablog.com 前回の続きで今度はRedis Clusterを構築してスケール性などを検証してみます。 環境 Redis 5.0.7 Redis Clusterの特徴 Redis Clusterは以下の特徴を持ちます。 シャード毎にSlotを持ち、データ分散される(hash slot) 全部…

go generateでモックを生成する

Go

背景 Clean Architecture に則ってレイヤ間をプラガブルにするためにインタフェースを使っていくと、テストのために各インタフェースのモックが欲しくなります。 そのモックを生成する際にgolang/mockを使用するわけですが、毎回 $ mockgen -source user.go …

Cassandraのデータモデルを理解する

概要 Cassandraはワイドカラム型のKVSでデータモデル図もネット上には色々上がっていますが、実際にはTable Schemaもあって普通のRDBのような表に見えます。 またkeyも primary key row key partition key composite key clustering key とたくさん出てきて…

Keepalivedを用いた冗長化

概要 デフォルトゲートウェイのように1つしかIPを設定できない箇所を冗長化したい ロードバランサ、Proxyを冗長化したい active/standby型でフェイルオーバーした時にクライアント側でIPの変更を意識したくない といったケースでVIP(仮想IP)を用いること…

RedisのReplication

概要 Redisの冗長構成は Replication Cluster Sentinel の3種類がありますが、そのうちのReplicationについて説明します。 環境 Redis 5.0.7 Replication Replicationはmasterからデータをreplicaにコピーし、read系コマンドをreplicaから行うことでスケー…

Prometheus でカスタムコレクタを用意する

概要 以前↓の独自メトリクスを作る方法を紹介しました。 christina04.hatenablog.com これはdirect instrumentation(直接計装)というやり方で、アプリケーションサーバ自体がstatsを持ちprometheusにデータを渡すやり方です。 今回はそうではなく別プロセ…

AWKの基本的な使い方

awk

概要 AWKは文字列の検索、抽出、変換などができるプログラミング言語です。 Unix、Linuxは基本的にテキストをプロトコルとしています。AWKを扱えるとそのプロトコルをより柔軟に扱えることになります。 前提知識 あらかじめ知っておくべき知識を書いていきま…

cgroupsでリソース制限

概要 cgroups (control groups)は、プロセスグループのリソース(CPU、メモリ、ディスクI/O、ネットワークなど)を制限、考慮、分離するLinuxカーネル機能です。 これを使ってプロセスのリソース制限を行ってみます。 環境 Ubuntu 18.04.3 cgroupsの構成 cgr…

Macのsudoでパスワード入力でなくTouch IDを使う

概要 MacにはTouch IDがあり、インストールなど様々なところでこれまでパスワード入力が必要だった箇所がTouch IDによる指紋認証が使えるようになっています。 その中でターミナルでのsudoのパスワード入力もTouch IDに替えることができるので対応します。 …

PAM (Pluggable Authentication Modules)

概要 LinuxにはPAMという認証システムとアプリケーションを分離するための仕組みが用意されています。 ref: https://docs.oracle.com/cd/E19253-01/819-0396/ch3pam-01/index.html プラガブルという名前の通り、モジュールによって認証方法を簡単に切り替え…

gRPCのヘルスチェック

概要 gRPCサーバのヘルスチェック方法として HTTPサーバを別途立ち上げてHTTPでチェック tcpでポートがopenしたかチェック といった方法がありますが、前者はgRPCサーバなのにHTTPサーバを用意しないといけなかったり、後者はtcpのopenは実際にServe開始した…

iptablesの仕組みを図解

概要 ネットワーク周りでたまに触るiptablesですが、たまになせいで度々忘れてググり直すことが多いので理解しやすいよう図を作ってみました。 iptablesの仕組みを図解 iptablesの構成図 iptablesは以下のように iptables -> Tables -> Chains -> Rules とい…

Network Namespaceから外部ネットワークへアクセスする

概要 前回の christina04.hatenablog.com の続きで、今回はネットワーク名前空間から外部ネットワークへアクセスできるようにします。 環境 Ubuntu 18.04 以下の状態からスタートします。

Network NamespaceにBridge経由でアクセスする

概要 前回 christina04.hatenablog.com でネットワーク名前空間の機能に触れてみました。 今回はブリッジを挟んでアクセスするネットワーク環境を構築してみます。 環境 Ubuntu 18.04

ip netnsコマンドで学ぶNetwork Namespace

概要 Linuxには名前空間(Namespace)というカーネルの機能が提供されています。 これは1つのプロセスが1つのリソースセットを参照し、別のプロセスが異なるリソースセットを参照するようにカーネルリソースを分割する機能です。 その中の1つであるネット…

gRPCでのLoad Balancing

背景 gRPCでは主に Proxy Model Balancing-aware Client External Load Balancing Service といったLBアプローチがあります。 それぞれの特徴や実装方法を調べてみました。 Load Balancingアプローチ こちらで定義されてます。 grpc/load-balancing.md at ma…

gRPCでのClient-Side LB実装の変遷

概要 gRPCでのバランシングをClient-Sideで直接実装する方法の紹介です。 gRPCはPolyglot(様々な言語で扱う)を意識しているので、gRPC自体の仕様が策定→各言語がそれに則って実装となります。 なので「元々はこういう実装だったけど、他の言語と統一してこ…

go modulesでコマンドラインツールのバージョン管理をする

Go

概要 goはModulesでリポジトリのライブラリのバージョン管理を行えます。 ただコマンドラインツールに関してはgo getしてgo.modに追加されても、goファイルで扱っているわけではないのでgo mod tidyすると消えてしまいます。 しかしながら「この機能は最新の…

GoのDIツールwireで知っておくと良いこと

Go DI

概要 christina04.hatenablog.com こういった設計のようにレイヤ間の依存関係を抽象化していると、DIの初期化処理が段々冗長になっていきます。 google/wireはそういったDIの初期化を自動的にやってくれるコード生成ツールです。 今回はwireを使う上で知って…

vim-goからvim-lspへ移行しました

概要 vim-goからvim-lspへ移行する時に問題になってたところを全部mattnさんが解決してくださってたのでようやく完全移行したという話です。 環境 vim 8.2 go 1.13.5 これまでの課題 vim-goの問題点 2014年からgoを触っていましたが当時はvim-go一択で、しか…

MacでのGithubリポジトリのcloneを自動化

背景 パソコンを新調した時に大変なのが ツールやアプリのインストール Githubのリポジトリのclone です。 前者に関してはhomebrewが提供しているbrew bundleである程度対応できます。 後者でghqはdump, restore的な機能ってあるのかな?と思って探したのが…

check digitを使った誤り検出

概要 クレジットカード・シリアルナンバーなど、長くなるほど入力ミスはしやすくなります。 そんな時に毎回DBに問い合わせて正しい値かをチェックするのではなくアルゴリズムによって正しいものかどうかチェックする仕組みがcheck digit(チェックディジット…

inodeから見たmvやcpの動き

背景 実行中のファイルに対してcpで上書きする場合だとText file busyで置き換えられず、mvだと何も聞かれず置き換えられる理由を深掘ってみました。 データ構造 mvやcpの動きを確認する前に必要な前提知識を説明します。 プロセスとinodeとの関係 プロセス…

リダイレクトの仕組みを深掘る

背景 $ コマンド > outfile 2>&1 と $ コマンド 2>&1 > outfile は結果が異なります。 前者は標準出力、標準エラーともにoutfileに出力されるのに対し、後者は標準出力はoutfileに、標準エラーはターミナルに出力されます。 この違いを理解するためにUnixの…

cgoを使わないGoのクロスコンパイル時に -installsuffix cgo が不要になってた

概要 以前Docker multi stage buildなどビルド環境と実行環境が異なる(クロスコンパイル)時に、単純にGOOSやGOARCHをセットするだけではなく $ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \ go build -a -installsuffix cgo -o main main.go のように CGO_ENA…

OpenAPI で REST API のスキーマ作成

背景 今やWebだけでなく、iOS、Android、TV、カーナビといった多数のクライアントでAPIを利用する時代です。 各クライアントでBFFを置く設計もありますが、開発コストや運用コストを考えて同一のAPIサーバを用意し利用することも多いと思われます。 加えてサ…