الانتقال إلى المحتوى الرئيسي
توثّق هذه الصفحة جميع الخيارات القابلة للإعداد في clickhouse-go v2.x. للاطلاع على دليل يتضمن أمثلة شيفرة، راجع الإعدادات.
تعليقات توضيحية للإصدارتُميَّز الخيارات التي أُضيفت في clickhouse-go v2.35.0 أو الإصدارات الأحدث بوسم (منذ vX.Y.Z) بجانب وصفها. أما الخيارات التي لا تتضمن وسم “منذ”، فهي متاحة منذ v2.0 وموجودة في جميع الإصدارات المدعومة.

كيفية تعيين الخيارات

تتوفر الخيارات على ثلاثة مستويات:
النطاقكيفية التعيينمدة الاستخدام
الاتصال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الوصفأفضل الممارساتعند سوء الإعداد
ProtocolProtocol (int)NativeScheme: 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 افتراضيًا، ما يؤدي إلى الفشل في عمليات النشر الموزعة.
ConnOpenStrategyConnOpenStrategy (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.Usernamestring"default"username or URL user portionاسم المستخدم لمصادقة ClickHouseلا تستخدم default مطلقًا في بيئة الإنتاج. أنشئ مستخدمين مخصصين بأقل الأذونات اللازمة.اسم مستخدم غير صحيح: "Code: 516. DB::Exception: Authentication failed". سلسلة فارغة: يُستخدم "default" بصمت.
Auth.Passwordstring""password or URL password portionكلمة المرور لمصادقة ClickHouseاستخدم متغيرات البيئة أو مديري الأسرار في بيئة الإنتاج. شفّر الأحرف الخاصة في DSN بترميز URL.كلمة مرور غير صحيحة: "Code: 516. DB::Exception: Authentication failed". إذا لم تُرمَّز الأحرف الخاصة بترميز URL: أخطاء parsing.
Auth.Databasestring"" (server default)database or URL path (/mydb)قاعدة البيانات الافتراضية للاتصالحدّدها دائمًا بشكل صريح. استخدم قواعد بيانات مخصصة لكل تطبيق في بيئة الإنتاج.غير موجودة: "Code: 81. DB::Exception: Database xyz doesn't exist". إذا تُركت فارغة في إعداد متعدد المستأجرين: تُنفَّذ الاستعلامات على قاعدة بيانات خاطئة.
GetJWTfunc(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الوصفأفضل الممارساتعند سوء الإعداد
DialTimeouttime.Duration30sdial_timeoutالحد الأقصى للوقت المسموح لإنشاء اتصال جديد. ويتحكم أيضًا في مدة انتظار الحصول على اتصال من المجمّع عند بلوغ MaxOpenConns.من 5 إلى 10 ثوانٍ على LAN، ومن 15 إلى 30 ثانية على WAN/Cloud، ومن 1 إلى 2 دقيقة عند الاتصال بخدمة ClickHouse Cloud كانت في حالة خمول. لا تضبطه مطلقًا على أقل من ثانية واحدة.إذا كان قصيرًا جدًا: قد يظهر "clickhouse: acquire conn timeout" أثناء الازدحام، أو يفشل الاتصال قبل أن تنتهي خدمة Cloud الخاملة من الاستيقاظ. وإذا كان طويلًا جدًا (> 60s): قد يبدو التطبيق معلّقًا أثناء الانقطاعات.
ReadTimeouttime.Duration5m (300s)read_timeoutالحد الأقصى لانتظار استجابة من الخادم لكل استدعاء قراءة. يُطبَّق على كل block، وليس على الاستعلام بالكامل. تكون الأولوية لـ context deadline.من 10 إلى 30 ثانية للاستعلامات التفاعلية القصيرة؛ ومن 5 إلى 30 دقيقة للاستعلامات التحليلية الطويلة.إذا كان قصيرًا جدًا: قد يظهر "i/o timeout" أو "read: connection reset by peer" في منتصف الاستعلام؛ بينما يواصل الخادم التنفيذ. وإذا كان طويلًا جدًا: فلن تُكتشف الاتصالات الميتة.
تُوضَع خدمة ClickHouse Cloud التي ظلت خاملة في حالة إيقاف مؤقت، ثم تستيقظ عند أول اتصال وارد. تستغرق عملية الاستيقاظ عادةً بضع عشرات من الثواني، وخلال هذه الفترة يظل طلب الاتصال معلّقًا. إذا كانت قيمة DialTimeout أقل من مدة الاستيقاظ، فسيفشل أول استعلام بعد فترة الخمول بسبب dial timeout بدلًا من أن يُنفَّذ.اضبط DialTimeout على 1m2m للعملاء الذين قد يكونون أول من يصل إلى خدمة خاملة. والمقابل هو بطء اكتشاف الفشل عند حدوث انقطاع فعلي — إذ يظل طلب الاتصال معلّقًا حتى تنقضي المهلة بالكامل قبل ظهور الخطأ — لذا يُفضَّل قصر المهلة الأعلى على الاتصال الأول، أو استخدام context deadlines على الاستعلامات الفردية لتحديد latency من البداية إلى النهاية.

مجمع الاتصالات

الخيارالنوعالافتراضيمعامل DSNواجهة برمجة تطبيقاتالوصفأفضل الممارساتعند سوء الإعداد
MaxIdleConnsint5max_idle_connsكلاهماالحد الأقصى للاتصالات الخاملة (غير المستخدمة ولكنها ما تزال مفتوحة) في المجمع50-80% من عدد الاستعلامات المتزامنة المتوقع. منخفض: 2-5، متوسط: 10-20، مرتفع: 20-50.منخفض جدًا: كثرة إنشاء الاتصالات وإغلاقها، وارتفاع زمن الوصول. مرتفع جدًا: هدر في الذاكرة. ويُحدّ تلقائيًا بقيمة MaxOpenConns.
MaxOpenConnsintMaxIdleConns + 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 (مشتركة).
ConnMaxLifetimetime.Duration1hconn_max_lifetimeكلاهماالحد الأقصى لمدة إعادة استخدام الاتصال. ويُفحص عند إرجاعه إلى المجمع.من 1 إلى 5 ساعات للبيئات المستقرة. من 5 إلى 15 دقيقة لعمليات النشر المتدرّج/K8s. لا تجعله غير محدود أبدًا.قصير جدًا (< 1m): كثرة إنشاء الاتصالات وإغلاقها، وارتفاع زمن الوصول. طويل جدًا/غير محدود: اتصالات قديمة، وعدم التقاط تغييرات DNS، وعدم إعادة توزيع حركة المرور.
ConnMaxIdleTimetime.Duration0 (لا شيء)database/sql فقطالحد الأقصى للوقت الذي يمكن أن يظل فيه الاتصال خاملًا قبل إغلاقه. غير متاح في Options struct — اضبطه عبر db.SetConnMaxIdleTime().من 5 إلى 10 دقائق لـ K8s/أحمال العمل المتقطعة لتحرير الاتصالات الخاملة بعد ارتفاعات حركة المرور.إذا لم يتم ضبطه: تستمر الاتصالات الخاملة حتى ConnMaxLifetime. قصير جدًا (< 30s): يُعاد إنشاء الاتصالات أثناء فترات الخمول المعتادة.
database/sql فقطConnMaxIdleTime هو إعداد قياسي لمجمع database/sql في Go. ولا يتوفر في clickhouse.Options struct أو عبر clickhouse.Open(). اضبطه بعد OpenDB():
db := clickhouse.OpenDB(&clickhouse.Options{...})
db.SetConnMaxIdleTime(5 * time.Minute)
راجع تجميع الاتصالات للحصول على تفاصيل الاستخدام.

إعدادات مجمّع 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)لا يوجديجب تعيينه يدويًا بعد الإنشاء
ClickHouse API (clickhouse.Open)هذه الطرق غير متاحة على الاتصال المُعاد من clickhouse.Open(). تدير ClickHouse API مجمّعها الداخلي باستخدام حقول structOptions مباشرةً.

الضغط

Optionالنوعالافتراضيمعامل DSNالوصفأفضل الممارساتعند سوء الإعداد
Compression.MethodCompressionMethod (byte)Nonecompress (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.Levelint3compress_levelمستوى خاص بالخوارزمية. GZIP/Deflate: من -2 إلى 9. Brotli: من 0 إلى 11. ‏LZ4/ZSTD: يتم تجاهله.GZIP متوازن: 3-6. Brotli متوازن: 4-6.مستويات مرتفعة جدًا: استهلاك CPU كبير جدًا مقابل فائدة محدودة. قيمة غير صفرية لـ LZ4/ZSTD: يتم تجاهلها بصمت. تحديد المستوى بدون تمكين الضغط: بلا تأثير.
MaxCompressionBufferint (bytes)10485760 (10 MiB)max_compression_bufferالحد الأقصى لحجم مخزن الضغط المؤقت قبل التفريغ. لكل connection مخزنها المؤقت الخاص.القيمة الافتراضية 10 MiB مناسبة. 20-50 MiB للصفوف العريضة. إجمالي الذاكرة = المخزن المؤقت × MaxOpenConns.صغير جدًا (< 1 MiB): عمليات تفريغ متكررة وكفاءة ضعيفة. كبير جدًا (> 100 MiB): ‏OOM عند وجود عدد كبير من الاتصالات.
دعم طريقة الضغط حسب البروتوكول:
MethodNativeHTTP
CompressionLZ4نعمنعم
CompressionLZ4HCنعملا
CompressionZSTDنعمنعم
CompressionGZIPلانعم
CompressionDeflateلانعم
CompressionBrotliلانعم

TLS

الخيارالنوعالافتراضيمعامل DSNالوصفأفضل الممارساتعند الإعداد الخاطئ
TLS*tls.Confignil (نص غير مشفّر)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.Loggernil (من دون تسجيل)مُسجِّل منظَّم عبر log/slog في Go. الأولوية: Debug+Debugf > Logger > no-op. (منذ v2.43.0)استخدم slog مع معالج JSON في بيئة الإنتاج. أضف سياق التطبيق باستخدام logger.With(...).
Debug (مهمل)boolfalsedebugمفتاح تبديل 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لكل استعلامالوصفأفضل الممارساتعند سوء الإعداد
BlockBufferSizeuint82block_buffer_sizeنعم (WithBlockBufferSize)الكتل بعد فك ترميزها التي تُخزَّن مؤقتًا عند قراءة النتائج. يتيح القراءة وفك الترميز بالتوازي.القيمة الافتراضية 2 مناسبة. استخدم 5-10 للنتائج المتدفقة الكبيرة. الذاكرة = المخزن المؤقت × حجم الكتلة × عدد الاستعلامات المتزامنة.صغير جدًا (1): يعيق قارئ الكتل، ويزيد زمن الاستجابة. كبير جدًا (> 50): استهلاك مرتفع للذاكرة، مع فائدة متناقصة.
FreeBufOnConnReleaseboolfalseلاحرّر المخزن المؤقت لذاكرة الاتصال بعد كل استعلام بدلًا من إعادة استخدامه.استخدم false لمعدلات الاستعلام المرتفعة. واستخدم true في الحاويات محدودة الذاكرة أو للدفعات الكبيرة غير المتكررة.false + ذاكرة محدودة: تتراكم المخازن المؤقتة (الذاكرة = المخزن المؤقت × الاتصالات الخاملة). true + معدل مرتفع: ضغط على GC، وزيادة في CPU.

خاص بـ HTTP

يُتجاهَل بصمت عند استخدام Nativeلا تؤثر هذه الخيارات إلا في Protocol: clickhouse.HTTP. وعند استخدام البروتوكول Native، تُتجاهَل بصمت من دون إصدار أي خطأ أو تحذير.
الخيارالنوعالافتراضيDSN paramالوصفأفضل الممارساتعند سوء الإعداد
HttpHeadersmap[string]stringnilترويسات HTTP إضافية مع كل طلباستخدمه للتتبّع (X-Request-ID) وترويسات وكيل المصادقة. وأبقِه في الحد الأدنى.تجاوز الترويسات الداخلية (Content-Type, Authorization): سلوك غير متوقع.
HttpUrlPathstring""http_pathمسار URL يُضاف إلى الطلبات. وتُضاف / في البداية تلقائيًا.استخدمه عند العمل خلف خادم وكيل عكسي مع توجيه قائم على المسار.مسار غير صحيح: HTTP 404 من الوكيل/LB.
HttpMaxConnsPerHostint0 (غير محدود)اتصالات TCP لكل مضيف على مستوى طبقة النقل (http.Transport.MaxConnsPerHost).اتركه على 0 في معظم التطبيقات. ولا تضبطه إلا إذا كانت لدى الخادم حدود صارمة للاتصالات.قيمة منخفضة جدًا (مثل 10 مع MaxOpenConns=50): اختناق في طبقة النقل، واستعلامات بطيئة رغم انخفاض حمل الخادم.
HTTPProxyURL*url.URLnil (يستخدم متغيرات البيئة)http_proxy (مرمّز بصيغة URL)وكيل HTTP لتوجيه الطلباتاضبطه صراحةً إذا كان الوكيل مطلوبًا. ويتجاوز متغيرات البيئة HTTP_PROXY/HTTPS_PROXY.عنوان غير صحيح: "dial tcp: lookup proxy: no such host". إذا كان الوكيل يتطلب مصادقة: HTTP 407.
TransportFuncfunc(*http.Transport) (http.RoundTripper, error)nilمُنشئ نقل HTTP مخصّص. يتلقى النقل الافتراضي لالتفافه. (منذ v2.41.0)استخدمه مع برمجية وسيطة لـ observability. لا تستبدل Proxy أو DialContext أو TLSClientConfig.إرجاع nil: panic. استبدال حقول client: يتم تجاهل TLS/الوكيل بصمت. RoundTripper حاجب: deadlocks.
تجميع اتصالات HTTP على طبقتينعند استخدام HTTP، توجد مجموعتا اتصالات:
  • الطبقة 1 (التطبيق): MaxIdleConns / MaxOpenConns — تتحكم في كائنات httpConnect
  • الطبقة 2 (النقل): HttpMaxConnsPerHost — تتحكم في اتصالات TCP الأساسية
يملك البروتوكول Native تعيينًا بسيطًا بنسبة 1:1، ويتجاهل HttpMaxConnsPerHost.
TransportFunc: func(t *http.Transport) (http.RoundTripper, error) {
    return &loggingRoundTripper{transport: t}, nil
}

الاتصال المتقدم

الخيارالنوعالافتراضيمعامل DSNالوصفأفضل الممارساتعند سوء الإعداد
DialContextfunc(ctx, addr) (net.Conn, error)nil (dialer قياسي)دالة dial مخصصة لاتصالات TCP. تعمل مع كلٍّ من Native وHTTP.اتركها nil في 99% من الحالات. استخدمها لمقابس Unix، وبروكسي SOCKS، وDNS مخصص.عدم مراعاة السياق: تعليق وتسرب للموارد. عند ضبط TLS: يجب أن يتولى الـdialer المخصص معالجة TLS بنفسه. net.Conn غير صالح: انهيار.
DialStrategyfunc(ctx, connID, options, dial) (DialResult, error)DefaultDialStrategyاستراتيجية مخصصة لاختيار الخادم والاتصال. تتجاوز ConnOpenStrategy.استخدم الإعداد الافتراضي في 99.9% من الحالات. خصصها فقط للتوجيه المراعي للموقع الجغرافي، والاختيار الموزون، وفحوصات الحالة الصحية.عدم تجربة جميع الخوادم: يؤدي إلى فشل رغم توفر خوادم سليمة. العمليات المكلفة داخله: تعرقل الحصول على اتصال من الـpool عند كل اتصال.

معلومات العميل

OptionTypeDefaultDSN paramPer-queryDescriptionBest practiceWhen misconfigured
ClientInfoClientInfo structتلقائي: إصدار clickhouse-go + بيئة تشغيل Goclient_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لكل استعلامالوصفأفضل الممارساتعند سوء الإعداد
Settingsmap[string]anynilأي معلمة غير معروفة (مثل ?max_execution_time=60)نعم (WithSettings، وتكون الأولوية للسياق عند التعارض)إعدادات خادم ClickHouse التي تُطبَّق على كل استعلام. تحويل DSN: "true"1، و"false"0، والقيم الرقمية→int.اضبط الحدود الشائعة على مستوى الاتصال، وخصّصها لكل استعلام عبر السياق.الأخطاء الإملائية: تُتجاهل بصمت أو تتسبب في خطأ حسب الإصدار. الأنواع غير الصحيحة: "Cannot parse string 'abc' as Int64". max_execution_time=0 + no deadline: تستمر الاستعلامات إلى الأبد.
CustomSettingCustomSetting{Value string}نعم (عبر WithSettings)يضع علامة على الإعداد باعتباره “مخصصًا” (غير مهم) لبروتوكول Native. لن ينتج عنه خطأ إذا لم يتعرّف عليه الخادم. ويتعامل HTTP مع جميع الإعدادات على أنها مخصصة افتراضيًا.استخدمه مع الإعدادات Experimental أو الخاصة بإصدارات محددة.إذا وُسِمت الإعدادات المهمة على أنها مخصصة، فقد تُتجاهل بصمت إذا كانت غير مدعومة.
إعدادات شائعة:
SettingTypeDescription
max_execution_timeintمهلة الاستعلام بالثواني
max_memory_usageintحد الذاكرة لكل استعلام (بالبايت)
max_block_sizeintحجم block للمعالجة
readonlyint1 = للقراءة فقط، 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}),
)
سلوك المهلة المرتبطة بالسياقإذا كانت للسياق مهلة نهائية > 1s، فسيُضبط max_execution_time تلقائيًا على seconds_remaining + 5. ويحلّ هذا محل أي قيمة مُعيّنة يدويًا.
الخيارالنوعالقيمة الافتراضيةالبروتوكولالوصفأفضل الممارساتعند سوء التهيئة
WithQueryIDstringيُولَّد تلقائيًاكلاهمامعرّف مخصّص للاستعلام. يظهر في system.query_log وsystem.processes.استخدم UUIDs. يفيد في KILL QUERY WHERE query_id='...'.معرّفات مكررة: تُسبّب التباسًا في system.query_log.
WithQuotaKeystring""كلاهمامفتاح Quota لفرض حدود الموارد في البيئات متعددة المستأجرين. يتطلب إعداد Quota على الخادم.استخدمه لفرض حدود لكل عميل أو لكل مستخدم.لم يُعَدّ QUOTA: يُتجاهَل بصمت.
WithJWTstring""HTTPS فقطتجاوز JWT على مستوى كل استعلام في ClickHouse Cloud. (منذ الإصدار v2.35.0)يُستخدم للمصادقة لكل طلب في الوكلاء متعددي المستأجرين.من دون TLS: تُهمَل، ويُعاد الاعتماد على مصادقة الاتصال. منتهي الصلاحية: "Token has expired".
WithSettingsSettingsيرث إعدادات 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".
WithAsyncbool (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".
WithLogsfunc(*Log)nilللبروتوكول الأصلي فقطاستدعاء عكسي لإدخالات سجل الخادم أثناء تنفيذ الاستعلام.احرص على أن يكون سريعًا — لأنه يحظر التنفيذ. استخدم goroutines للمعالجة الثقيلة.مع HTTP: لا يُستدعى مطلقًا من دون أي تنبيه.
WithProgressfunc(*Progress)nilNative فقطتحديثات تقدّم الاستعلام (الصفوف/البايتات التي تمت معالجتها).اجعله سريعًا — فهو يعرقل التنفيذ.مع HTTP: لا يُستدعى مطلقًا من دون أي تنبيه.
WithProfileInfofunc(*ProfileInfo)nilلبروتوكول Native فقطدالة رد نداء لإحصاءات تنفيذ الاستعلام.احرص على أن تكون سريعة — فهي تعيق التنفيذ.مع HTTP: لا تُستدعى مطلقًا من دون أي تنبيه.
WithProfileEventsfunc([]ProfileEvent)nilلبروتوكول Native فقطدالة ردّ نداء لعدادات الأداء.أبقِه سريعًا — لأنه يحجب التنفيذ.مع HTTP: لا يُستدعى مطلقًا من دون أي تنبيه.
WithoutProfileEventsيتم إرسال الأحداثالبروتوكول الأصلي فقطتعطيل أحداث profile. تحسين الأداء للخوادم ≥ 25.11. (منذ v2.44.0)استخدمه عندما لا تحتاج إلى أحداث profile.على الخوادم الأقدم: يظهر خطأ بسبب إعداد غير معروف.
WithExternalTable...*ext.Tablenilكلاهماإرفاق جداول بحث مؤقتة بالاستعلام. تُنقَل البيانات مع كل استعلام.أبقِ حجم الجداول أقل من 10 MB. البروتوكول الأصلي أكثر كفاءة من HTTP (متعدد الأجزاء).الجداول الكبيرة: حمل شبكي إضافي لكل استعلام.
WithUserLocation*time.Locationالمنطقة الزمنية للخادمكلاهماتجاوز المنطقة الزمنية المستخدمة في تحليل DateTime.اضبطه صراحةً عند اختلاف المنطقة الزمنية بين العميل والخادم.منطقة زمنية غير صحيحة: قد تنحرف قيم DateTime بصمت بعدة ساعات، مع احتمال تلف البيانات.
WithColumnNamesAndTypes[]ColumnNameAndTypenil (ينفّذ DESCRIBE)لـ HTTP فقطتجنّب طلب DESCRIBE TABLE الإضافي في عمليات insert عبر HTTP من خلال توفير معلومات الأعمدة مسبقًا. (منذ v2.37.0)استخدمه عندما يكون المخطط معروفًا ومستقرًا.أنواع غير صحيحة: "Cannot convert String to UInt64". انجراف المخطط بعد الترحيل: معلومات قديمة.
WithBlockBufferSizeuint8على مستوى الاتصال (2)كلاهماتجاوز قيمة BlockBufferSize المحددة على مستوى الاتصال لاستعلام واحد.زِد القيمة عند التعامل مع مجموعات نتائج كبيرة في استعلامات محددة.
WithClientInfoClientInfoعلى مستوى الاتصالكلاهماألحِق معلومات عميل إضافية باستعلام واحد. لا يستبدل المعلومات الحالية، بل يُلحقها. (منذ v2.42.0)أضِف سياقًا خاصًا بكل طلب (مثل اسم نقطة النهاية).
WithSpantrace.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(),
)

جداول للرجوع السريع

توصيات تحديد حجم مجمع الاتصالات

نوع التطبيقMaxIdleConnsMaxOpenConnsConnMaxLifetime
تطبيق ويب منخفض الحركة5101h
واجهة برمجة تطبيقات متوسطة الحركة205030m
خدمة عالية الحركة5010015m
مهام دفعية في الخلفية10202h
عملية نشر على Kubernetes102010m
بدون خادم (Lambda)155m

توصيات timeout

البيئةDialTimeoutReadTimeout
محلي / LAN5s30s
Cloud، نفس المنطقة10s2m
Cloud، عبر منطقة أخرى30s5m
عبء عمل OLAP10s30m
فوري / OLTP5s10s

مرجع سريع لمعلمات DSN

معامل DSNحقل الخياراتمثال
usernameAuth.Username?username=admin
passwordAuth.Password?password=secret
databaseAuth.Database?database=mydb أو /mydb في المسار
dial_timeoutDialTimeout?dial_timeout=10s
read_timeoutReadTimeout?read_timeout=5m
max_open_connsMaxOpenConns?max_open_conns=50
max_idle_connsMaxIdleConns?max_idle_conns=20
conn_max_lifetimeConnMaxLifetime?conn_max_lifetime=30m
connection_open_strategyConnOpenStrategy?connection_open_strategy=round_robin
block_buffer_sizeBlockBufferSize?block_buffer_size=10
compressCompression.Method?compress=lz4
compress_levelCompression.Level?compress_level=6
max_compression_bufferMaxCompressionBuffer?max_compression_buffer=20971520
secureTLS?secure=true
skip_verifyTLS.InsecureSkipVerify?skip_verify=true
debugDebug?debug=true
client_info_productClientInfo.Products?client_info_product=myapp/1.0
http_proxyHTTPProxyURL?http_proxy=http%3A%2F%2Fproxy%3A8080
http_pathHttpUrlPath?http_path=/clickhouse
(أي معلمة أخرى)Settings[key]?max_execution_time=60

استكشاف الأخطاء وإصلاحها

استُنفِد مجمع الاتصالات: “acquire conn timeout”

السبب: استُنفِد مجمع الاتصالات — فجميع اتصالات MaxOpenConns قيد الاستخدام، ولم تصبح أيٌّ منها متاحة خلال المهلة DialTimeout. الحل جرّب الخطوات التالية بالترتيب، وشخِّص السبب الجذري قبل ضبط الإعدادات:
  1. تحقّق من وجود استعلامات طويلة التشغيل تحتفظ بالاتصالات: SELECT query_id, elapsed FROM system.processes ORDER BY elapsed DESC. إذا وُجدت، فابدأ بمعالجة الاستعلامات البطيئة أولًا.
  2. إذا كنت تشغّل دفعات طويلة العمر (دقائق/ساعات بين PrepareBatch() وSend())، فاستخدم WithReleaseConnection() لإعادة الاتصال إلى مجمع الاتصالات مع بقاء الدفعة مفتوحة.
  3. زِد MaxOpenConns ليتوافق مع مستوى التزامن المرصود.
  4. زِد 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 لتجديد الاتصالات بوتيرة أكثر تكرارًا
آخر تعديل في ٢٩ يونيو ٢٠٢٦