clickhouse-go v2.x で設定可能なすべてのオプションを説明します。コード例を含むガイドについては、設定 を参照してください。
バージョン注記
clickhouse-go v2.35.0 以降で追加されたオプションには、説明の横に (Since vX.Y.Z) と記されています。“Since” タグのないオプションは v2.0 以降すべてのサポート対象リリースで利用できます。オプションの設定方法
スコープが重複する場合は、より具体的なスコープが優先されます: バッチ > クエリ > 接続。
Settings については、クエリレベルのキーが接続レベルのキーとマージされ、競合した場合はクエリレベルのキーが優先されます。
Options 構造体を使用する場合:
接続オプション
プロトコルと接続
認証
タイムアウト
アイドル状態だった ClickHouse Cloud サービスは一時停止され、最初の受信接続で起動します。起動には通常数十秒かかり、その間は接続試行がブロックされます。
DialTimeout が起動時間より短いと、アイドル期間後の最初のクエリは実行されず、接続タイムアウトで失敗します。アイドル状態のサービスに最初に到達する可能性がある client では、DialTimeout を 1m〜2m に設定してください。その代償として、実際の障害時の失敗検出は遅くなります。つまり、エラーになるまで接続試行がタイムアウトいっぱいまでブロックされます。そのため、高めのタイムアウトは最初の接続だけに適用するか、個々のクエリでコンテキストのデッドラインを使ってエンドツーエンドのレイテンシを抑えることを推奨します。接続プール
database/sql のみ
ConnMaxIdleTime は標準の Go database/sql の接続プール設定です。clickhouse.Options 構造体や clickhouse.Open() からは利用できません。OpenDB() の後に設定してください。標準の database/sql プール設定
clickhouse.OpenDB() または sql.Open("clickhouse", dsn) を使用すると、返される *sql.DB では Go の標準的なプールメソッドを利用できます。OpenDB() は Options の最初の 3 つを自動で適用します。
ClickHouse API (clickhouse.Open)これらのメソッドは、
clickhouse.Open() が返す接続では使用できません。ClickHouse API は Options 構造体のフィールドを直接使い、内部で独自にプールを管理します。圧縮
プロトコルごとの圧縮方式サポート:
TLS
コード例については TLS を参照してください。
ロギング
バッファとメモリ
HTTP固有
HTTP の 2 層接続プールHTTP を使用する場合、接続プールは 2 つあります。
- 第 1 層 (アプリケーション) :
MaxIdleConns/MaxOpenConns—httpConnectオブジェクトを制御します - 第 2 層 (トランスポート) :
HttpMaxConnsPerHost— 基盤となる TCP 接続を制御します
HttpMaxConnsPerHost は無視されます。高度な接続
クライアント情報
ClickHouse サーバー設定
一般的な設定:
Context レベルのクエリオプション
clickhouse.Context() を使って設定します。
コンテキストのデッドラインの挙動コンテキストのデッドラインが > 1 秒の場合、
max_execution_time は自動的に seconds_remaining + 5 に設定されます。手動で設定した値は上書きされます。バッチオプション
PrepareBatch() に渡すオプションです。インポート: github.com/ClickHouse/clickhouse-go/v2/lib/driver.
早見表
接続プールのサイズ設定の推奨値
タイムアウトの推奨値
DSN パラメータ早見表
トラブルシューティング
接続プールの枯渇: “acquire conn timeout”
MaxOpenConns で許可されたすべての接続が使用中で、DialTimeout 内に空きが出ませんでした。
対処方法
次の手順を順番に試し、調整項目を変更する前に根本原因を切り分けてください。
- 接続を占有している長時間実行中のクエリがないか確認します:
SELECT query_id, elapsed FROM system.processes ORDER BY elapsed DESC。見つかった場合は、まずその低速なクエリへの対処を優先してください。 - 長時間存続するバッチ (
PrepareBatch()からSend()までが数分~数時間) を実行している場合は、WithReleaseConnection()を使用して、バッチを開いたままでも接続をプールに戻してください。 - 実際に観測された同時実行数に合わせて
MaxOpenConnsを増やします。 - バーストが想定され、接続取得の待ち時間が実際のボトルネックである場合にのみ、
DialTimeoutを増やします。
読み取りタイムアウトおよび接続リセットエラー
ReadTimeout を超過したか、サーバーまたはネットワークによって connection が切断されました。
対処法:
- 長時間実行されるクエリでは
ReadTimeoutを増やします - クエリごとの timeout 制御には context の deadline を使用します
- ClickHouse のサーバー側
max_execution_time制限を確認します
”Code: 516. 認証に失敗しました”
system.userstable で認証情報を確認する- DSN の password に含まれる特殊文字の URL エンコードに問題がないか確認する
- ユーザーに、指定した database へのアクセス権があることを確認する
TLS 証明書エラー
徐々に増えるメモリ使用量
- メモリが限られる環境では
FreeBufOnConnRelease: trueを設定する - アイドル接続を制限するために
MaxIdleConnsを減らす - 圧縮を使用している場合は
MaxCompressionBufferを減らす - 接続をより頻繁に入れ替えるために
ConnMaxLifetimeを短くする