Carpe Diem

備忘録

Go Module MirrorとChecksum Database

概要

Go 1.13から、goコマンドはデフォルトでGo Module MirrorとChecksum Databaseを使用してモジュールをダウンロード&認証するようになりました。

環境

  • go 1.14.1

Module Mirror (Module Proxy)

Module Mirrorは公開モジュールをキャッシュし、go modでのダウンロードを高速化するためのProxyです。
ProxyのURLはGOPROXYにセットされています。

$ go env GOPROXY
https://proxy.golang.org,direct
続きを読む

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

概要

christina04.hatenablog.com

前回の続きで今度はRedis Clusterを構築してスケール性などを検証してみます。

環境

  • Redis 5.0.7

Redis Clusterの特徴

Redis Clusterは以下の特徴を持ちます。

  • シャード毎にSlotを持ち、データ分散される(hash slot)
    • 全部で16,384 slotsある
    • ノードを追加して再シャードすることも可能(水平スケーリング)
  • Replicationを持つことで冗長構成にもできる
  • 通常ポートに+10000番したポートでCluster Busと呼ばれる接続がある
    • 死活監視などに
続きを読む

go generateでモックを生成する

背景

Clean Architecture に則ってレイヤ間をプラガブルにするためにインタフェースを使っていくと、テストのために各インタフェースのモックが欲しくなります。

そのモックを生成する際にgolang/mockを使用するわけですが、毎回

$ mockgen -source user.go -destination mock_user.go

とするのは手間です。また

  • たまにしか使わないので書式、オプションを覚えていない
  • モックの吐き出し先ルールがファイル、パッケージ、リポジトリによって異なり把握がしづらい

など運用が辛くなりがちです。

かと言って「じゃあレイヤまるごと対象にしよう」とシェルスクリプト

for file in $(ls ${SOME_LAYER_DIR} | grep -v "_test.go"); do    
    mockgen -source ${SOME_LAYER_DIR}/${file} -destination mock/${SOME_LAYER_DIR}/${file}   
done

とかすると、

  • あるファイルはインタフェースを含まないので、gomockを使うとimport packageだけの空ファイルができる
    • ↑のせいでビルドやテストがコケる
  • この問題を避けるためにgrep -v除外が増えていく

といったこれまた運用が辛くなりがちです。

今回はgo generateを活用してこの問題を解決します。

続きを読む

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

概要

Cassandraはワイドカラム型のKVSでデータモデル図もネット上には色々上がっていますが、実際にはTable Schemaもあって普通のRDBのような表に見えます。
またkeyも

  • primary key
  • row key
  • partition key
  • composite key
  • clustering key

とたくさん出てきてややこしいです。
しかしCassandraを有効に活用するにはこの辺をきちんと理解しておかないといけないので、整理して分かりやすくしようと思います。

環境

  • Cassandra 3.11.6

Cassandraのデータモデル図

Cassandraのデータモデル図は以下のようになっています。
1つの行(Row)に複数の列(Column)が入っており、このColumnは最大で20億個まで増やせます。

f:id:quoll00:20200316132624p:plain

ref: 4. The Cassandra Query Language - Cassandra: The Definitive Guide, 2nd Edition [Book]

続きを読む

Keepalivedを用いた冗長化

概要

  • デフォルトゲートウェイのように1つしかIPを設定できない箇所を冗長化したい
  • ロードバランサ、Proxyを冗長化したい
  • active/standby型でフェイルオーバーした時にクライアント側でIPの変更を意識したくない

といったケースでVIP(仮想IP)を用いることで解決するのがVRRPです。

今回はそのVRRPを実現できるkeepalivedを紹介します。

環境

VRRPとは

VRRP(Virtual Router Redundancy Protocol)とはその名の通りルータを冗長化させるために考えられたプロトコルです。
複数のルータを外部からは仮想的な1つのルータとして扱うことでルータの冗長構成を実現します。

VIPを振られていた機器が故障してもVRRPによって別の機器にVIPが振られ直すので、クライアントは引き続きアクセスでき高可用性を担保できます。

続きを読む

RedisのReplication

概要

Redisの冗長構成は

の3種類がありますが、そのうちのReplicationについて説明します。

環境

  • Redis 5.0.7

Replication

Replicationはmasterからデータをreplicaにコピーし、read系コマンドをreplicaから行うことでスケーラビリティを向上させる冗長構成です。

システム図

Replicationのシステム図は以下です。

f:id:quoll00:20200309172531p:plain

続きを読む