توثّق هذه الصفحة جميع الخيارات القابلة للإعداد في clickhouse-go v2.x. للاطلاع على دليل يتضمن أمثلة شيفرة، راجع الإعدادات.
كيفية تعيين الخيارات
تتوفر الخيارات على ثلاثة مستويات:
| النطاق | كيفية التعيين | مدة الاستخدام |
|---|---|---|
| الاتصال | clickhouse.Options struct أو سلسلة DSN |
جميع الاستعلامات على الاتصال |
| الاستعلام | clickhouse.Context() مع دوال WithXxx |
تنفيذ استعلام واحد |
| الدفعة | دوال الخيارات في PrepareBatch() |
عملية دفعة واحدة |
عند تداخل المستويات، تكون الأولوية للمستوى الأكثر تحديدًا: الدفعة > الاستعلام > الاتصال. بالنسبة إلى Settings، تُدمج المفاتيح على مستوى الاستعلام مع المفاتيح على مستوى الاتصال، وتُحسم الأفضلية لمستوى الاستعلام عند التعارض.
عبر struct Options:
conn, err := clickhouse.Open(&clickhouse.Options{
Addr: []string{"localhost:9000"},
Auth: clickhouse.Auth{Database: "default", Username: "default", Password: ""},
DialTimeout: 10 * time.Second,
Compression: &clickhouse.Compression{Method: clickhouse.CompressionLZ4},
})باستخدام سلسلة DSN:
db, err := sql.Open("clickhouse", "clickhouse://user:pass@localhost:9000/default?dial_timeout=10s&compress=lz4")عبر Connector (database/sql مع Options struct):
db := sql.OpenDB(clickhouse.Connector(&clickhouse.Options{
Addr: []string{"localhost:9000"},
Auth: clickhouse.Auth{Database: "default", Username: "default"},
DialTimeout: 10 * time.Second,
}))
// Set database/sql-only pool settings after creation
db.SetConnMaxIdleTime(5 * time.Minute)عبر السياق (لكل استعلام):
ctx := clickhouse.Context(context.Background(),
clickhouse.WithQueryID("my-query-123"),
clickhouse.WithSettings(clickhouse.Settings{"max_execution_time": 60}),
)
rows, err := conn.Query(ctx, "SELECT ...")خيارات الاتصال
البروتوكول والاتصال
| الخيار | النوع | الافتراضي | معامل DSN | الوصف | أفضل الممارسات | عند سوء الإعداد |
|---|---|---|---|---|---|---|
Protocol |
Protocol (int) |
Native |
Scheme: clickhouse://=Native, http://=HTTP |
بروتوكول الاتصال: Native (0) لـ TCP، وHTTP (1) لـ HTTP |
استخدم Native للحصول على أداء أفضل بنحو ~30%. واستخدم HTTP لدعم الـ proxy، وتجاوز firewall (المنفذ 80/443)، أو الضغط المتاح عبر HTTP فقط (gzip/br). راجع TCP vs HTTP. |
استخدام scheme الخاص بـ HTTP مع منفذ Native (9000): رفض الاتصال. حظر Native بواسطة firewall: حالات timeout. |
Addr |
[]string |
["localhost:9000"] (Native) ["localhost:8123"] (HTTP) |
hosts مفصولة بفواصل في URL | قائمة بعناوين "host:port" للاتصال وfailover |
حدّد عدة عناوين في بيئات production لتحقيق التوافر العالي. المنافذ الصحيحة: 9000 (Native)، و8123 (HTTP)، و9440 (Native+TLS)، و8443 (HTTP+TLS). | عنوان واحد: لا يوجد failover. منفذ خاطئ: "connection refused". قيمة فارغة/nil: يُستخدم localhost افتراضيًا، ما يؤدي إلى الفشل في عمليات النشر الموزعة. |
ConnOpenStrategy |
ConnOpenStrategy (uint8) |
ConnOpenInOrder (0) |
connection_open_strategy (in_order, round_robin, random) |
استراتيجية لاختيار server من Addr. InOrder (0)=failover، وRoundRobin (1)=موازنة حمل، وRandom (2)=عشوائي. |
استخدم InOrder لنمط active-standby. واستخدم RoundRobin لنمط active-active/K8s. واستخدم Random لتجنّب اندفاع الطلبات الجماعي. |
عند استخدام InOrder مع active-active: يتلقى server الأول كل الحمل، وتبقى البقية idle. تحاول جميع الاستراتيجيات كل الخوادم عند الفشل – ويؤثر ذلك فقط على الخادم الذي تتم تجربته أولًا. |
المصادقة
| الخيار | النوع | الافتراضي | DSN param | الوصف | أفضل الممارسات | عند سوء الإعداد |
|---|---|---|---|---|---|---|
Auth.Username |
string |
"default" |
username or URL user portion |
اسم المستخدم لمصادقة ClickHouse | لا تستخدم default مطلقًا في بيئة الإنتاج. أنشئ مستخدمين مخصصين بأقل الأذونات اللازمة. |
اسم مستخدم غير صحيح: "Code: 516. DB::Exception: Authentication failed". سلسلة فارغة: يُستخدم "default" بصمت. |
Auth.Password |
string |
"" |
password or URL password portion |
كلمة المرور لمصادقة ClickHouse | استخدم متغيرات البيئة أو مديري الأسرار في بيئة الإنتاج. شفّر الأحرف الخاصة في DSN بترميز URL. | كلمة مرور غير صحيحة: "Code: 516. DB::Exception: Authentication failed". إذا لم تُرمَّز الأحرف الخاصة بترميز URL: أخطاء parsing. |
Auth.Database |
string |
"" (server default) |
database or URL path (/mydb) |
قاعدة البيانات الافتراضية للاتصال | حدّدها دائمًا بشكل صريح. استخدم قواعد بيانات مخصصة لكل تطبيق في بيئة الإنتاج. | غير موجودة: "Code: 81. DB::Exception: Database xyz doesn't exist". إذا تُركت فارغة في إعداد متعدد المستأجرين: تُنفَّذ الاستعلامات على قاعدة بيانات خاطئة. |
GetJWT |
func(ctx) (string, error) |
nil |
(programmatic only) | دالة callback تُرجع JWT لمصادقة ClickHouse Cloud. يمكن تجاوزها لكل استعلام باستخدام WithJWT(token). (منذ v2.35.0) |
نفّذ تخزينًا مؤقتًا/تحديثًا للرمز المميز — إذ تُستدعى لكل اتصال/طلب. | رمز مميز منتهي الصلاحية: أخطاء مصادقة. callback حاجب: timeout. تكون لـ JWT أولوية على المستخدم/كلمة المرور. ويتطلب TLS — ومن دونه يعود إلى المستخدم/كلمة المرور بصمت. |
GetJWT: func(ctx context.Context) (string, error) {
return getTokenFromVault(ctx)
}المهلات الزمنية
| الخيار | النوع | القيمة الافتراضية | DSN param | الوصف | أفضل الممارسات | عند سوء الإعداد |
|---|---|---|---|---|---|---|
DialTimeout |
time.Duration |
30s |
dial_timeout |
الحد الأقصى للوقت المسموح لإنشاء اتصال جديد. ويتحكم أيضًا في مدة انتظار الحصول على اتصال من المجمّع عند بلوغ MaxOpenConns. |
من 5 إلى 10 ثوانٍ على LAN، ومن 15 إلى 30 ثانية على WAN/Cloud، ومن 1 إلى 2 دقيقة عند الاتصال بخدمة ClickHouse Cloud كانت في حالة خمول. لا تضبطه مطلقًا على أقل من ثانية واحدة. | إذا كان قصيرًا جدًا: قد يظهر "clickhouse: acquire conn timeout" أثناء الازدحام، أو يفشل الاتصال قبل أن تنتهي خدمة Cloud الخاملة من الاستيقاظ. وإذا كان طويلًا جدًا (> 60s): قد يبدو التطبيق معلّقًا أثناء الانقطاعات. |
ReadTimeout |
time.Duration |
5m (300s) |
read_timeout |
الحد الأقصى لانتظار استجابة من الخادم لكل استدعاء قراءة. يُطبَّق على كل block، وليس على الاستعلام بالكامل. تكون الأولوية لـ context deadline. | من 10 إلى 30 ثانية للاستعلامات التفاعلية القصيرة؛ ومن 5 إلى 30 دقيقة للاستعلامات التحليلية الطويلة. | إذا كان قصيرًا جدًا: قد يظهر "i/o timeout" أو "read: connection reset by peer" في منتصف الاستعلام؛ بينما يواصل الخادم التنفيذ. وإذا كان طويلًا جدًا: فلن تُكتشف الاتصالات الميتة. |
مجمع الاتصالات
| الخيار | النوع | الافتراضي | معامل DSN | واجهة برمجة تطبيقات | الوصف | أفضل الممارسات | عند سوء الإعداد |
|---|---|---|---|---|---|---|---|
MaxIdleConns |
int |
5 |
max_idle_conns |
كلاهما | الحد الأقصى للاتصالات الخاملة (غير المستخدمة ولكنها ما تزال مفتوحة) في المجمع | 50-80% من عدد الاستعلامات المتزامنة المتوقع. منخفض: 2-5، متوسط: 10-20، مرتفع: 20-50. | منخفض جدًا: كثرة إنشاء الاتصالات وإغلاقها، وارتفاع زمن الوصول. مرتفع جدًا: هدر في الذاكرة. ويُحدّ تلقائيًا بقيمة MaxOpenConns. |
MaxOpenConns |
int |
MaxIdleConns + 5 (الافتراضي: 10) |
max_open_conns |
كلاهما | الحد الأقصى لإجمالي الاتصالات (الخاملة + النشطة) | منخفض: 10-20، متوسط: 20-50، مرتفع: 50-100. الصيغة: الاستعلامات المتزامنة + الارتفاعات المفاجئة + مخزن مؤقت. راقب: SELECT * FROM system.metrics WHERE metric='TCPConnection'. |
منخفض جدًا: "clickhouse: acquire conn timeout". مرتفع جدًا: "Too many connections" على الخادم، وتجاوز حدود واصفات الملفات (FD). القيمة الافتراضية لـ max_connections في ClickHouse هي: 1024 (مشتركة). |
ConnMaxLifetime |
time.Duration |
1h |
conn_max_lifetime |
كلاهما | الحد الأقصى لمدة إعادة استخدام الاتصال. ويُفحص عند إرجاعه إلى المجمع. | من 1 إلى 5 ساعات للبيئات المستقرة. من 5 إلى 15 دقيقة لعمليات النشر المتدرّج/K8s. لا تجعله غير محدود أبدًا. | قصير جدًا (< 1m): كثرة إنشاء الاتصالات وإغلاقها، وارتفاع زمن الوصول. طويل جدًا/غير محدود: اتصالات قديمة، وعدم التقاط تغييرات DNS، وعدم إعادة توزيع حركة المرور. |
ConnMaxIdleTime |
time.Duration |
0 (لا شيء) |
— | database/sql فقط |
الحد الأقصى للوقت الذي يمكن أن يظل فيه الاتصال خاملًا قبل إغلاقه. غير متاح في Options struct – اضبطه عبر db.SetConnMaxIdleTime(). |
من 5 إلى 10 دقائق لـ K8s/أحمال العمل المتقطعة لتحرير الاتصالات الخاملة بعد ارتفاعات حركة المرور. | إذا لم يتم ضبطه: تستمر الاتصالات الخاملة حتى ConnMaxLifetime. قصير جدًا (< 30s): يُعاد إنشاء الاتصالات أثناء فترات الخمول المعتادة. |
راجع تجميع الاتصالات للحصول على تفاصيل الاستخدام.
إعدادات مجمّع database/sql القياسية
عند استخدام clickhouse.OpenDB() أو sql.Open("clickhouse", dsn)، فإن الكائن *sql.DB المُعاد يدعم طرق المجمّع القياسية في Go. يطبّق OpenDB() تلقائيًا أول ثلاثٍ منها من Options:
| الطريقة | المكافئ في Options |
ملاحظات |
|---|---|---|
db.SetMaxIdleConns(n) |
MaxIdleConns |
يُطبَّق تلقائيًا بواسطة OpenDB() |
db.SetMaxOpenConns(n) |
MaxOpenConns |
يُطبَّق تلقائيًا بواسطة OpenDB() |
db.SetConnMaxLifetime(d) |
ConnMaxLifetime |
يُطبَّق تلقائيًا بواسطة OpenDB() |
db.SetConnMaxIdleTime(d) |
لا يوجد | يجب تعيينه يدويًا بعد الإنشاء |
الضغط
| Option | النوع | الافتراضي | معامل DSN | الوصف | أفضل الممارسات | عند سوء الإعداد |
|---|---|---|---|---|---|---|
Compression.Method |
CompressionMethod (byte) |
None | compress (lz4, zstd, lz4hc, gzip, deflate, br, or true for LZ4) |
خوارزمية الضغط المستخدمة في نقل البيانات. راجع مصفوفة دعم البروتوكولات أدناه. | LAN: None أو LZ4. WAN: ZSTD أو LZ4. عند محدودية CPU: LZ4. لأقصى ضغط: ZSTD (Native) أو Brotli (HTTP). تخطَّه لعمليات الإدراج الأصغر من < 1 MB. | GZIP/Brotli على Native: فشل في المصافحة. LZ4HC على HTTP: خطأ أو fallback صامت. بدون ضغط على الشبكات البطيئة: تصبح عمليات الإدراج أبطأ بمقدار 10-100x. |
Compression.Level |
int |
3 |
compress_level |
مستوى خاص بالخوارزمية. GZIP/Deflate: من -2 إلى 9. Brotli: من 0 إلى 11. LZ4/ZSTD: يتم تجاهله. | GZIP متوازن: 3-6. Brotli متوازن: 4-6. | مستويات مرتفعة جدًا: استهلاك CPU كبير جدًا مقابل فائدة محدودة. قيمة غير صفرية لـ LZ4/ZSTD: يتم تجاهلها بصمت. تحديد المستوى بدون تمكين الضغط: بلا تأثير. |
MaxCompressionBuffer |
int (bytes) |
10485760 (10 MiB) |
max_compression_buffer |
الحد الأقصى لحجم مخزن الضغط المؤقت قبل التفريغ. لكل connection مخزنها المؤقت الخاص. | القيمة الافتراضية 10 MiB مناسبة. 20-50 MiB للصفوف العريضة. إجمالي الذاكرة = المخزن المؤقت × MaxOpenConns. |
صغير جدًا (< 1 MiB): عمليات تفريغ متكررة وكفاءة ضعيفة. كبير جدًا (> 100 MiB): OOM عند وجود عدد كبير من الاتصالات. |
دعم طريقة الضغط حسب البروتوكول:
| Method | Native | HTTP |
|---|---|---|
CompressionLZ4 |
نعم | نعم |
CompressionLZ4HC |
نعم | لا |
CompressionZSTD |
نعم | نعم |
CompressionGZIP |
لا | نعم |
CompressionDeflate |
لا | نعم |
CompressionBrotli |
لا | نعم |
TLS
| الخيار | النوع | الافتراضي | معامل DSN | الوصف | أفضل الممارسات | عند الإعداد الخاطئ |
|---|---|---|---|---|---|---|
TLS |
*tls.Config |
nil (نص غير مشفّر) |
secure=true, skip_verify=true |
إعداد TLS/SSL. تؤدي القيمة غير nil إلى تفعيل TLS. المنافذ: Native 9000/9440، وHTTP 8123/8443. |
فعِّله دائمًا في بيئة production وفي ClickHouse Cloud (إلزامي). استخدم InsecureSkipVerify: false في بيئة production. أضف شهادات CA مخصّصة عبر RootCAs. |
منفذ غير صحيح: "connection reset by peer". استخدام skip_verify=true في بيئة production: يعرّضك لهجمات MITM. شهادة منتهية الصلاحية: "x509: certificate has expired". اسم مضيف غير صحيح: "x509: certificate is valid for X, not Y". CA غير موثوقة: "x509: certificate signed by unknown authority". عند استخدام HTTP DSN مع secure=true: استخدم المخطط https:// بدلًا من ذلك. |
راجع TLS للاطلاع على أمثلة الشيفرة.
تسجيل الأحداث
| الخيار | النوع | الافتراضي | DSN param | الوصف | أفضل الممارسات | عند سوء الإعداد |
|---|---|---|---|---|---|---|
Logger |
*slog.Logger |
nil (من دون تسجيل) |
— | مُسجِّل منظَّم عبر log/slog في Go. الأولوية: Debug+Debugf > Logger > no-op. (منذ v2.43.0) |
استخدم slog مع معالج JSON في بيئة الإنتاج. أضف سياق التطبيق باستخدام logger.With(...). |
— |
Debug (مهمل) |
bool |
false |
debug |
مفتاح تبديل Debug قديم. استخدم Logger بدلًا منه. يكتب السجلات إلى stdout ما لم يتم تعيين Debugf. |
— | عند تفعيله في بيئة الإنتاج: عبء إضافي على الأداء، سجلات تفصيلية، وبيانات حساسة في المخرجات. |
Debugf (مهمل) |
func(string, ...any) |
nil |
— | دالة مخصّصة لسجلّات التصحيح. استخدم Logger بدلًا منها. تتطلب Debug: true. |
— | — |
logger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelInfo}))
conn, err := clickhouse.Open(&clickhouse.Options{
Logger: logger,
// ...
})راجع التسجيل للاطلاع على أمثلة كاملة.
المخازن المؤقتة والذاكرة
| الخيار | النوع | الافتراضي | معامل DSN | لكل استعلام | الوصف | أفضل الممارسات | عند سوء الإعداد |
|---|---|---|---|---|---|---|---|
BlockBufferSize |
uint8 |
2 |
block_buffer_size |
نعم (WithBlockBufferSize) |
الكتل بعد فك ترميزها التي تُخزَّن مؤقتًا عند قراءة النتائج. يتيح القراءة وفك الترميز بالتوازي. | القيمة الافتراضية 2 مناسبة. استخدم 5-10 للنتائج المتدفقة الكبيرة. الذاكرة = المخزن المؤقت × حجم الكتلة × عدد الاستعلامات المتزامنة. | صغير جدًا (1): يعيق قارئ الكتل، ويزيد زمن الاستجابة. كبير جدًا (> 50): استهلاك مرتفع للذاكرة، مع فائدة متناقصة. |
FreeBufOnConnRelease |
bool |
false |
— | لا | حرّر المخزن المؤقت لذاكرة الاتصال بعد كل استعلام بدلًا من إعادة استخدامه. | استخدم false لمعدلات الاستعلام المرتفعة. واستخدم true في الحاويات محدودة الذاكرة أو للدفعات الكبيرة غير المتكررة. |
false + ذاكرة محدودة: تتراكم المخازن المؤقتة (الذاكرة = المخزن المؤقت × الاتصالات الخاملة). true + معدل مرتفع: ضغط على GC، وزيادة في CPU. |
خاص بـ HTTP
| الخيار | النوع | الافتراضي | DSN param | الوصف | أفضل الممارسات | عند سوء الإعداد |
|---|---|---|---|---|---|---|
HttpHeaders |
map[string]string |
nil |
— | ترويسات HTTP إضافية مع كل طلب | استخدمه للتتبّع (X-Request-ID) وترويسات وكيل المصادقة. وأبقِه في الحد الأدنى. |
تجاوز الترويسات الداخلية (Content-Type, Authorization): سلوك غير متوقع. |
HttpUrlPath |
string |
"" |
http_path |
مسار URL يُضاف إلى الطلبات. وتُضاف / في البداية تلقائيًا. |
استخدمه عند العمل خلف خادم وكيل عكسي مع توجيه قائم على المسار. | مسار غير صحيح: HTTP 404 من الوكيل/LB. |
HttpMaxConnsPerHost |
int |
0 (غير محدود) |
— | اتصالات TCP لكل مضيف على مستوى طبقة النقل (http.Transport.MaxConnsPerHost). |
اتركه على 0 في معظم التطبيقات. ولا تضبطه إلا إذا كانت لدى الخادم حدود صارمة للاتصالات. | قيمة منخفضة جدًا (مثل 10 مع MaxOpenConns=50): اختناق في طبقة النقل، واستعلامات بطيئة رغم انخفاض حمل الخادم. |
HTTPProxyURL |
*url.URL |
nil (يستخدم متغيرات البيئة) |
http_proxy (مرمّز بصيغة URL) |
وكيل HTTP لتوجيه الطلبات | اضبطه صراحةً إذا كان الوكيل مطلوبًا. ويتجاوز متغيرات البيئة HTTP_PROXY/HTTPS_PROXY. |
عنوان غير صحيح: "dial tcp: lookup proxy: no such host". إذا كان الوكيل يتطلب مصادقة: HTTP 407. |
TransportFunc |
func(*http.Transport) (http.RoundTripper, error) |
nil |
— | مُنشئ نقل HTTP مخصّص. يتلقى النقل الافتراضي لالتفافه. (منذ v2.41.0) | استخدمه مع برمجية وسيطة لـ observability. لا تستبدل Proxy أو DialContext أو TLSClientConfig. |
إرجاع nil: panic. استبدال حقول client: يتم تجاهل TLS/الوكيل بصمت. RoundTripper حاجب: deadlocks. |
TransportFunc: func(t *http.Transport) (http.RoundTripper, error) {
return &loggingRoundTripper{transport: t}, nil
}الاتصال المتقدم
| الخيار | النوع | الافتراضي | معامل DSN | الوصف | أفضل الممارسات | عند سوء الإعداد |
|---|---|---|---|---|---|---|
DialContext |
func(ctx, addr) (net.Conn, error) |
nil (dialer قياسي) |
— | دالة dial مخصصة لاتصالات TCP. تعمل مع كلٍّ من Native وHTTP. | اتركها nil في 99% من الحالات. استخدمها لمقابس Unix، وبروكسي SOCKS، وDNS مخصص. |
عدم مراعاة السياق: تعليق وتسرب للموارد. عند ضبط TLS: يجب أن يتولى الـdialer المخصص معالجة TLS بنفسه. net.Conn غير صالح: انهيار. |
DialStrategy |
func(ctx, connID, options, dial) (DialResult, error) |
DefaultDialStrategy |
— | استراتيجية مخصصة لاختيار الخادم والاتصال. تتجاوز ConnOpenStrategy. |
استخدم الإعداد الافتراضي في 99.9% من الحالات. خصصها فقط للتوجيه المراعي للموقع الجغرافي، والاختيار الموزون، وفحوصات الحالة الصحية. | عدم تجربة جميع الخوادم: يؤدي إلى فشل رغم توفر خوادم سليمة. العمليات المكلفة داخله: تعرقل الحصول على اتصال من الـpool عند كل اتصال. |
معلومات العميل
| Option | Type | Default | DSN param | Per-query | Description | Best practice | When misconfigured |
|---|---|---|---|---|---|---|---|
ClientInfo |
ClientInfo struct |
تلقائي: إصدار clickhouse-go + بيئة تشغيل Go |
client_info_product=myapp/1.0 |
نعم (WithClientInfo، مع الإضافة) |
معلومات تعريف التطبيق المُرسلة إلى ClickHouse. تحتوي على Products ([]struct{Name,Version}) وComment ([]string). وتظهر في system.query_log. |
احرص دائمًا على تعيين اسم التطبيق + الإصدار. لتتبّع مصدر الاستعلامات: SELECT client_name FROM system.query_log WHERE client_name LIKE '%myapp%' |
عند عدم تعيينها: لا يمكن تحديد الخدمة التي أرسلت الاستعلامات في البيئات متعددة الخدمات. |
ClientInfo: clickhouse.ClientInfo{
Products: []struct{ Name, Version string }{
{Name: "my-service", Version: "1.0.0"},
},
}
// Appears as: clickhouse-go/2.x my-service/1.0.0 (lv:go/1.23; os:linux)إعدادات خادم ClickHouse
| الخيار | النوع | الافتراضي | معامل DSN | لكل استعلام | الوصف | أفضل الممارسات | عند سوء الإعداد |
|---|---|---|---|---|---|---|---|
Settings |
map[string]any |
nil |
أي معلمة غير معروفة (مثل ?max_execution_time=60) |
نعم (WithSettings، وتكون الأولوية للسياق عند التعارض) |
إعدادات خادم ClickHouse التي تُطبَّق على كل استعلام. تحويل DSN: "true"→1، و"false"→0، والقيم الرقمية→int. |
اضبط الحدود الشائعة على مستوى الاتصال، وخصّصها لكل استعلام عبر السياق. | الأخطاء الإملائية: تُتجاهل بصمت أو تتسبب في خطأ حسب الإصدار. الأنواع غير الصحيحة: "Cannot parse string 'abc' as Int64". max_execution_time=0 + no deadline: تستمر الاستعلامات إلى الأبد. |
CustomSetting |
CustomSetting{Value string} |
— | — | نعم (عبر WithSettings) |
يضع علامة على الإعداد باعتباره "مخصصًا" (غير مهم) لبروتوكول Native. لن ينتج عنه خطأ إذا لم يتعرّف عليه الخادم. ويتعامل HTTP مع جميع الإعدادات على أنها مخصصة افتراضيًا. | استخدمه مع الإعدادات Experimental أو الخاصة بإصدارات محددة. | إذا وُسِمت الإعدادات المهمة على أنها مخصصة، فقد تُتجاهل بصمت إذا كانت غير مدعومة. |
إعدادات شائعة:
| Setting | Type | Description |
|---|---|---|
max_execution_time |
int | مهلة الاستعلام بالثواني |
max_memory_usage |
int | حد الذاكرة لكل استعلام (بالبايت) |
max_block_size |
int | حجم block للمعالجة |
readonly |
int | 1 = للقراءة فقط، 2 = للقراءة فقط + تغيير الإعدادات |
Settings: clickhouse.Settings{
"max_execution_time": 60, // important -- errors if unknown
"my_custom_setting": clickhouse.CustomSetting{Value: "value"}, // custom -- ignored if unknown
}خيارات الاستعلام على مستوى Context
يمكن ضبطها لكل استعلام باستخدام clickhouse.Context():
ctx := clickhouse.Context(context.Background(),
clickhouse.WithQueryID("my-query"),
clickhouse.WithSettings(clickhouse.Settings{"max_execution_time": 60}),
)| الخيار | النوع | القيمة الافتراضية | البروتوكول | الوصف | أفضل الممارسات | عند سوء التهيئة |
|---|---|---|---|---|---|---|
WithQueryID |
string |
يُولَّد تلقائيًا | كلاهما | معرّف مخصّص للاستعلام. يظهر في system.query_log وsystem.processes. |
استخدم UUIDs. يفيد في KILL QUERY WHERE query_id='...'. |
معرّفات مكررة: تُسبّب التباسًا في system.query_log. |
WithQuotaKey |
string |
"" |
كلاهما | مفتاح Quota لفرض حدود الموارد في البيئات متعددة المستأجرين. يتطلب إعداد Quota على الخادم. | استخدمه لفرض حدود لكل عميل أو لكل مستخدم. | لم يُعَدّ QUOTA: يُتجاهَل بصمت. |
WithJWT |
string |
"" |
HTTPS فقط | تجاوز JWT على مستوى كل استعلام في ClickHouse Cloud. (منذ الإصدار v2.35.0) | يُستخدم للمصادقة لكل طلب في الوكلاء متعددي المستأجرين. | من دون TLS: تُهمَل، ويُعاد الاعتماد على مصادقة الاتصال. منتهي الصلاحية: "Token has expired". |
WithSettings |
Settings |
يرث إعدادات connection | كلاهما | إعدادات الخادم لكل query. تُدمج مع إعدادات الاتصال؛ وعند التعارض، تكون الأولوية للسياق. | اضبط max_execution_time أو max_rows_to_read لكل نوع استعلام. |
مثل Settings على مستوى الاتصال. |
WithParameters |
المعاملات (map[string]string) |
nil |
كلاهما | قيم الاستعلام ذي المعلمات من جهة الخادم. صياغة الاستعلام: {param_name:Type}. |
استخدمه بدلًا من دمج السلاسل النصية لتفادي حقن SQL. | المعلَمة المفقودة: "Substitution {param_name:Type} isn't set". النوع غير الصحيح: "Cannot parse string 'abc' as UInt64". |
WithAsync |
bool (wait) |
متزامن | كلاهما | وضع insert غير المتزامن. يضبط async_insert=1. تؤدي wait=true إلى إضافة wait_for_async_insert=1. يتطلب ClickHouse 21.11+. (منذ v2.41.0؛ ويحل محل WithStdAsync الأقدم.) |
استخدمه لعمليات الإدراج عالية الإنتاجية. | wait=false: قد تظهر الأخطاء بشكل غير متزامن – تحقّق من system.asynchronous_insert_log. مع SELECT: يُتجاهل. في الخوادم القديمة: "Unknown setting async_insert". |
WithLogs |
func(*Log) |
nil |
للبروتوكول الأصلي فقط | استدعاء عكسي لإدخالات سجل الخادم أثناء تنفيذ الاستعلام. | احرص على أن يكون سريعًا – لأنه يحظر التنفيذ. استخدم goroutines للمعالجة الثقيلة. | مع HTTP: لا يُستدعى مطلقًا من دون أي تنبيه. |
WithProgress |
func(*Progress) |
nil |
Native فقط | تحديثات تقدّم الاستعلام (الصفوف/البايتات التي تمت معالجتها). | اجعله سريعًا – فهو يعرقل التنفيذ. | مع HTTP: لا يُستدعى مطلقًا من دون أي تنبيه. |
WithProfileInfo |
func(*ProfileInfo) |
nil |
لبروتوكول Native فقط | دالة رد نداء لإحصاءات تنفيذ الاستعلام. | احرص على أن تكون سريعة – فهي تعيق التنفيذ. | مع HTTP: لا تُستدعى مطلقًا من دون أي تنبيه. |
WithProfileEvents |
func([]ProfileEvent) |
nil |
لبروتوكول Native فقط | دالة ردّ نداء لعدادات الأداء. | أبقِه سريعًا – لأنه يحجب التنفيذ. | مع HTTP: لا يُستدعى مطلقًا من دون أي تنبيه. |
WithoutProfileEvents |
— | يتم إرسال الأحداث | البروتوكول الأصلي فقط | تعطيل أحداث profile. تحسين الأداء للخوادم ≥ 25.11. (منذ v2.44.0) | استخدمه عندما لا تحتاج إلى أحداث profile. | على الخوادم الأقدم: يظهر خطأ بسبب إعداد غير معروف. |
WithExternalTable |
...*ext.Table |
nil |
كلاهما | إرفاق جداول بحث مؤقتة بالاستعلام. تُنقَل البيانات مع كل استعلام. | أبقِ حجم الجداول أقل من 10 MB. البروتوكول الأصلي أكثر كفاءة من HTTP (متعدد الأجزاء). | الجداول الكبيرة: حمل شبكي إضافي لكل استعلام. |
WithUserLocation |
*time.Location |
المنطقة الزمنية للخادم | كلاهما | تجاوز المنطقة الزمنية المستخدمة في تحليل DateTime. | اضبطه صراحةً عند اختلاف المنطقة الزمنية بين العميل والخادم. | منطقة زمنية غير صحيحة: قد تنحرف قيم DateTime بصمت بعدة ساعات، مع احتمال تلف البيانات. |
WithColumnNamesAndTypes |
[]ColumnNameAndType |
nil (ينفّذ DESCRIBE) |
لـ HTTP فقط | تجنّب طلب DESCRIBE TABLE الإضافي في عمليات insert عبر HTTP من خلال توفير معلومات الأعمدة مسبقًا. (منذ v2.37.0) |
استخدمه عندما يكون المخطط معروفًا ومستقرًا. | أنواع غير صحيحة: "Cannot convert String to UInt64". انجراف المخطط بعد الترحيل: معلومات قديمة. |
WithBlockBufferSize |
uint8 |
على مستوى الاتصال (2) | كلاهما | تجاوز قيمة BlockBufferSize المحددة على مستوى الاتصال لاستعلام واحد. |
زِد القيمة عند التعامل مع مجموعات نتائج كبيرة في استعلامات محددة. | — |
WithClientInfo |
ClientInfo |
على مستوى الاتصال | كلاهما | ألحِق معلومات عميل إضافية باستعلام واحد. لا يستبدل المعلومات الحالية، بل يُلحقها. (منذ v2.42.0) | أضِف سياقًا خاصًا بكل طلب (مثل اسم نقطة النهاية). | — |
WithSpan |
trace.SpanContext |
فارغ | الأصلي فقط | سياق span في OpenTelemetry للتتبّع الموزّع. | راجع OpenTelemetry. | — |
ctx := clickhouse.Context(ctx,
clickhouse.WithQueryID("query-123"),
clickhouse.WithParameters(clickhouse.Parameters{
"user_id": "12345",
}),
clickhouse.WithProgress(func(p *clickhouse.Progress) {
log.Printf("Progress: %d rows, %d bytes", p.Rows, p.Bytes)
}),
)
rows, err := conn.Query(ctx, "SELECT * FROM users WHERE id = {user_id:String}")خيارات Batch
تُمرَّر إلى PrepareBatch(). الاستيراد: github.com/ClickHouse/clickhouse-go/v2/lib/driver.
| الخيار | القيمة الافتراضية | الوصف | أفضل الممارسات | عند سوء الإعداد |
|---|---|---|---|---|
WithReleaseConnection |
يُحتفَظ بالاتصال حتى Send() |
يحرّر الاتصال إلى المجمّع مباشرةً بعد PrepareBatch(). ويُعاد الحصول عليه عند Send()/Flush(). |
استخدمه مع دفعات طويلة العمر (دقائق/ساعات) لمنع استنزاف المجمّع. | عدم استخدامه مع الدفعات الطويلة: "acquire conn timeout" إذا كان هناك عدد كبير من الاتصالات النشطة. |
WithCloseOnFlush |
يبقى Batch مفتوحًا | يُغلِق Batch تلقائيًا عند استدعاء Flush(). |
استخدمه مع الدفعات أحادية الاستخدام. ويوفّر عليك استدعاء `Close()`` صراحةً. | استخدامه مع عدة استدعاءات Flush(): يؤدي التفريغ الأول إلى إغلاق Batch، وتفشل العمليات اللاحقة. |
batch, err := conn.PrepareBatch(ctx, "INSERT INTO table",
driver.WithReleaseConnection(),
driver.WithCloseOnFlush(),
)جداول للرجوع السريع
توصيات تحديد حجم مجمع الاتصالات
| نوع التطبيق | MaxIdleConns | MaxOpenConns | ConnMaxLifetime |
|---|---|---|---|
| تطبيق ويب منخفض الحركة | 5 | 10 | 1h |
| واجهة برمجة تطبيقات متوسطة الحركة | 20 | 50 | 30m |
| خدمة عالية الحركة | 50 | 100 | 15m |
| مهام دفعية في الخلفية | 10 | 20 | 2h |
| عملية نشر على Kubernetes | 10 | 20 | 10m |
| بدون خادم (Lambda) | 1 | 5 | 5m |
توصيات timeout
| البيئة | DialTimeout | ReadTimeout |
|---|---|---|
| محلي / LAN | 5s | 30s |
| Cloud، نفس المنطقة | 10s | 2m |
| Cloud، عبر منطقة أخرى | 30s | 5m |
| عبء عمل OLAP | 10s | 30m |
| فوري / OLTP | 5s | 10s |
مرجع سريع لمعلمات DSN
| معامل DSN | حقل الخيارات | مثال |
|---|---|---|
username |
Auth.Username |
?username=admin |
password |
Auth.Password |
?password=secret |
database |
Auth.Database |
?database=mydb أو /mydb في المسار |
dial_timeout |
DialTimeout |
?dial_timeout=10s |
read_timeout |
ReadTimeout |
?read_timeout=5m |
max_open_conns |
MaxOpenConns |
?max_open_conns=50 |
max_idle_conns |
MaxIdleConns |
?max_idle_conns=20 |
conn_max_lifetime |
ConnMaxLifetime |
?conn_max_lifetime=30m |
connection_open_strategy |
ConnOpenStrategy |
?connection_open_strategy=round_robin |
block_buffer_size |
BlockBufferSize |
?block_buffer_size=10 |
compress |
Compression.Method |
?compress=lz4 |
compress_level |
Compression.Level |
?compress_level=6 |
max_compression_buffer |
MaxCompressionBuffer |
?max_compression_buffer=20971520 |
secure |
TLS |
?secure=true |
skip_verify |
TLS.InsecureSkipVerify |
?skip_verify=true |
debug |
Debug |
?debug=true |
client_info_product |
ClientInfo.Products |
?client_info_product=myapp/1.0 |
http_proxy |
HTTPProxyURL |
?http_proxy=http%3A%2F%2Fproxy%3A8080 |
http_path |
HttpUrlPath |
?http_path=/clickhouse |
| (أي معلمة أخرى) | Settings[key] |
?max_execution_time=60 |
استكشاف الأخطاء وإصلاحها
استُنفِد مجمع الاتصالات: "acquire conn timeout"
السبب: استُنفِد مجمع الاتصالات — فجميع اتصالات MaxOpenConns قيد الاستخدام، ولم تصبح أيٌّ منها متاحة خلال المهلة DialTimeout.
الحل
جرّب الخطوات التالية بالترتيب، وشخِّص السبب الجذري قبل ضبط الإعدادات:
- تحقّق من وجود استعلامات طويلة التشغيل تحتفظ بالاتصالات:
SELECT query_id, elapsed FROM system.processes ORDER BY elapsed DESC. إذا وُجدت، فابدأ بمعالجة الاستعلامات البطيئة أولًا. - إذا كنت تشغّل دفعات طويلة العمر (دقائق/ساعات بين
PrepareBatch()وSend())، فاستخدمWithReleaseConnection()لإعادة الاتصال إلى مجمع الاتصالات مع بقاء الدفعة مفتوحة. - زِد
MaxOpenConnsليتوافق مع مستوى التزامن المرصود. - زِد
DialTimeoutفقط إذا كانت الاندفاعات المفاجئة في الحمل متوقعة، وكان انتظار الحصول على اتصال هو عنق الزجاجة الفعلي.
أخطاء مهلة القراءة وإعادة تعيين الاتصال
السبب: تم تجاوز ReadTimeout أثناء انتظار استجابة من الخادم، أو أُغلِق الاتصال من جهة الخادم أو الشبكة.
الحل:
- زِد قيمة
ReadTimeoutللاستعلامات طويلة التنفيذ - استخدم
context deadlinesللتحكم في المهلة لكل استعلام - تحقّق من حدود
max_execution_timeعلى جهة خادم ClickHouse
"Code: 516. Authentication failed"
السبب: اسم المستخدم أو كلمة المرور غير صحيحَين، أو أن المستخدم غير موجود.
الحل:
- تحقّق من بيانات الاعتماد في جدول
system.users - تحقّق من عدم وجود مشكلات في ترميز URL للأحرف الخاصة في كلمات مرور DSN
- تأكّد من أن المستخدم لديه حق الوصول إلى قاعدة البيانات المحددة
أخطاء شهادة TLS
| الخطأ | السبب | الحل |
|---|---|---|
x509: certificate has expired |
انتهت صلاحية شهادة الخادم | جدِّد شهادة الخادم |
x509: certificate is valid for X, not Y |
عدم تطابق اسم المضيف | استخدم اسم المضيف الصحيح أو أضِفه إلى SANs |
x509: certificate signed by unknown authority |
جهة إصدار الشهادات (CA) غير موثوقة | أضِف CA إلى tls.Config.RootCAs |
connection reset by peer |
عدم تطابق TLS/المنفذ | استخدم المنفذ 9440 (Native) أو 8443 (HTTP) مع TLS |
الزيادة التدريجية في استهلاك الذاكرة
السبب: تراكم مخازن مؤقتة كبيرة لاتصالات غير النشطة.
الحل:
- اضبط
FreeBufOnConnRelease: trueفي البيئات محدودة الذاكرة - قلّل
MaxIdleConnsللحد من الاتصالات غير النشطة - قلّل
MaxCompressionBufferإذا كنت تستخدم الضغط - خفّض
ConnMaxLifetimeلتجديد الاتصالات بوتيرة أكثر تكرارًا