উত্পাদন ব্যবহারের জন্য মঙ্গোডিবি জাভা ড্রাইভার মঙ্গোঅ্যাপশনগুলি কীভাবে কনফিগার করবেন?


100

আমি মঙ্গোডিবি জাভা ড্রাইভারের জন্য মঙ্গোঅ্যাপশনগুলি কনফিগার করার জন্য সর্বোত্তম অনুশীলনগুলির সন্ধানে ওয়েবে অনুসন্ধান করছি এবং আমি এপিআই ব্যতীত অন্য কোথাও আসিনি। আমি "com.mongodb.DBPortPool ma SemaphoresOut: db সংযোগ পেতে semaphores এর বাইরে" ত্রুটি এবং সংযোগ / গুণক বৃদ্ধি করে আমি এই সমস্যাটি সমাধান করতে সক্ষম হয়ে এই অনুসন্ধানটি শুরু হয়েছিল। উত্পাদনের জন্য এই বিকল্পগুলি কনফিগার করার জন্য আমি লিঙ্কগুলি বা আপনার সেরা অনুশীলনের সন্ধান করছি।

২.৪ ড্রাইভারের বিকল্পগুলির মধ্যে রয়েছে: http://api.mongodb.org/java/2.4/com/mongodb/MongoOptions.html

  • autoConnectRetry
  • connectionsPerHost
  • connectTimeout
  • maxWaitTime
  • socketTimeout
  • threadsAllowedToBlockForConnectionMultiplier

নতুন ড্রাইভারগুলির আরও বিকল্প রয়েছে এবং আমি তাদের সম্পর্কে শুনে আগ্রহী হব।

উত্তর:


160

২.৯-এ আপডেট হয়েছে:

  • অটো সংযোগের জন্য সহজভাবে ড্রাইভারটি অপ্রত্যাশিত সংযোগ বিচ্ছিন্ন হওয়ার পরে স্বয়ংক্রিয়ভাবে সার্ভারের সাথে পুনরায় সংযোগ করার চেষ্টা করবে। উত্পাদন পরিবেশে আপনি সাধারণত এই সেটটি সত্য হতে চান।

  • connectionsPerHost শারীরিক সংযোগের পরিমাণ একটি একক মোঙ্গো উদাহরণস্বরূপ (এটা এর Singleton যাতে আপনি সাধারণত অ্যাপ্লিকেশন প্রতি এক আছে) একটি mongod / mongos প্রক্রিয়া স্থাপন করতে পারেন আছে। লেখার সময় জাভা ড্রাইভার এই সংযোগের পরিমাণটি শেষ পর্যন্ত প্রতিষ্ঠিত করবে এমনকি প্রকৃত ক্যোয়ারী থ্রুটপুট কম থাকলেও (ক্রমে কথায় আপনি মঙ্গোস্ট্যাট বৃদ্ধিতে "সংযোগ" পরিসংখ্যান দেখতে পাবেন যতক্ষণ না এটি অ্যাপ্লিকেশন সার্ভারে এই সংখ্যাটি হিট করে)।

    বেশিরভাগ ক্ষেত্রে এটি 100 এর চেয়ে বেশি সেট করার দরকার নেই তবে এই সেটিংটি "পরীক্ষা করে দেখুন" জিনিসগুলির মধ্যে একটি। মনে রাখবেন যে আপনাকে আপনার সার্ভারের সংযোগের পরিমাণের পরিমাণ অতিক্রম করতে না পারার বিষয়টি নিশ্চিত করতে হবে enough

    db.serverStatus().connections.available

    উত্পাদনে আমাদের বর্তমানে এটি 40 এ রয়েছে।

  • কানেক্টটাইমআউট । নাম অনুসারে সংযোগের চেষ্টাটি বাতিল হওয়ার আগে ড্রাইভারটি অপেক্ষা করতে থাকবে মিলিসেকেন্ডের সংখ্যা। বাস্তবের প্রত্যাশিত সুযোগ না থাকলে দীর্ঘ কিছু (15-30 সেকেন্ড) এর টাইমআউট সেট করুন অন্যথায় সফল সংযোগের প্রচেষ্টা হিসাবে এটিই হবে। সাধারণত যদি কোনও সংযোগের প্রচেষ্টা কয়েক সেকেন্ডের চেয়ে বেশি সময় নেয় তবে আপনার নেটওয়ার্ক অবকাঠামো উচ্চতর আউটপুট দিতে সক্ষম নয়।

  • maxWaitTime । সংখ্যার এমএসের সংখ্যা একটি থ্রেড সংযোগ পুলে সংযোগ উপলব্ধ হওয়ার জন্য অপেক্ষা করবে এবং যদি সময় মতো এটি না ঘটে তবে একটি ব্যতিক্রম উত্থাপন করে। ডিফল্ট রাখুন।

  • সকেটটাইমআউট । স্ট্যান্ডার্ড সকেট টাইমআউট মান। 60 সেকেন্ড (60000) এ সেট করুন।

  • থ্রেডসঅ্যালয়েডডো ব্লকফোর্স কানেকশন মাল্টিপ্লায়ার । সংযোগগুলির জন্য গুণক পর্ব হস্ট যা পুলটি বর্তমানে অবসন্ন হলে সংযোগগুলি উপলভ্য হওয়ার জন্য অপেক্ষা করার মঞ্জুরিপ্রাপ্ত থ্রেডের সংখ্যা বোঝায়। এই সেটিংটিই "com.mongodb.DBPortPool ma SemaphoresOut: db সংযোগ পেতে semaphores আউট" ব্যতিক্রম ঘটায়। এই থ্রেড সারিটি থ্রেডলয়েডডব্লকফোর্ডকনেকশন মাল্টিপ্লায়ার মান ছাড়িয়ে গেলে এই ব্যতিক্রমটি ছুঁড়ে ফেলা হবে। উদাহরণস্বরূপ, যদি সংযোগগুলি পার্হোস্টটি 10 ​​হয় এবং এই মানটি 5 পর্যন্ত 50 থ্রেডগুলি উল্লিখিত ব্যতিক্রম ছোঁড়ার আগেই ব্লক করতে পারে।

    আপনি যদি থ্রুপুটতে বড় শিখর আশা করেন যা বৃহত্তর সারিগুলি সাময়িকভাবে এই মানটিকে বাড়িয়ে তুলতে পারে। ঠিক সেই কারণে আমাদের মুহূর্তে এটি 1500 এ রয়েছে। যদি আপনার ক্যোয়ারী লোডটি ধারাবাহিকভাবে সার্ভারকে আউটপস করে তবে আপনার ঠিক সেই অনুযায়ী আপনার হার্ডওয়্যার / স্কেলিংয়ের পরিস্থিতির উন্নতি করা উচিত।

  • পঠনপরিচয়(আপডেট, ২.৮+) ডিফল্ট পড়ার পছন্দটি নির্ধারণ করতে ব্যবহৃত হয় এবং "স্লেভওক" প্রতিস্থাপন করে। ক্লাস কারখানার একটি পদ্ধতির মাধ্যমে একটি রিডপ্রিফারেন্স সেট আপ করুন Set সর্বাধিক সাধারণ সেটিংসের একটি সম্পূর্ণ বিবরণ এই পোস্টের শেষে পাওয়া যাবে

  • W(আপডেট, ২.6+) এই মানটি লেখার "সুরক্ষা" নির্ধারণ করে। যখন এই মান -1 হয় তখন নেটওয়ার্ক বা ডাটাবেস ত্রুটি নির্বিশেষে লেখার কোনও ত্রুটি জানানো হবে না। WritConcern.NONE এর জন্য উপযুক্ত পূর্বনির্ধারিত WritConcern। ডাব্লু যদি 0 হয় তবে নেটওয়ার্ক ত্রুটিগুলি লিখনকে ব্যর্থ করবে তবে মঙ্গো ত্রুটিগুলি করবে না will এটিকে সাধারণত "ফায়ার এন্ড ভুলে" লেখার হিসাবে উল্লেখ করা হয় এবং যখন ধারাবাহিকতা এবং স্থায়িত্বের চেয়ে কর্মক্ষমতা বেশি গুরুত্বপূর্ণ তখন ব্যবহার করা উচিত। এই মোডের জন্য WritConcern.NORMAL ব্যবহার করুন।

    আপনি যদি ডাব্লু 1 বা উচ্চতর সেট করেন তবে লেখাটি নিরাপদ হিসাবে বিবেচিত হবে। নিরাপদ লেখাগুলি লেখার সম্পাদন করে সার্ভারের কাছে অনুরোধ করে অনুসরণ করে লিখনটি সফল হয়েছে কিনা তা নিশ্চিত করার জন্য বা ত্রুটির মানটি পুনরুদ্ধার করে তা নিশ্চিত না করে (অন্য কথায়, এটি আপনার লেখার পরে getLastError () কমান্ড প্রেরণ করে)। মনে রাখবেন যে এই getLastError () কমান্ডটি শেষ না হওয়া পর্যন্ত সংযোগটি সংরক্ষিত রয়েছে। এর ফলে এবং অতিরিক্ত কমান্ডের ফলস্বরূপ থ্রুটপুটটি ডাব্লু <= 0 দিয়ে লেখার চেয়ে লক্ষণীয়ভাবে কম হয়ে যাবে ঠিক 1 মুনগোডিবি'র গ্যারান্টি দিয়ে আপনি যে বার্তায় এই চিঠিটি প্রেরণ করেছেন তাতে লেখাটি সফল (বা যাচাই করে ব্যর্থ হয়েছে) গ্যারান্টি দেয়।

    প্রতিলিপি সেটগুলির ক্ষেত্রে আপনি উচ্চতর মান ব্যবহার করতে পারেন ডব্লিউ WHCh মংগাডিবিকে কমপক্ষে "ডাব্লু" রেপ্লিকা সেটটির সদস্যদের পাঠানোর আগে (বা আরও সঠিকভাবে, আপনার লেখার অনুলিপি "" ডাব্লু "সদস্যদের জন্য অপেক্ষা করতে বলুন )। আপনি "সংখ্যাগরিষ্ঠ" স্ট্রিংয়ে ডাব্লু সেট করতে পারেন যা মঙ্গোডিবিকে সংখ্যাটি প্রতিলিপি সেট সদস্যদের (WritConcern.MAJORITY) র সম্পাদনা করতে বলে perform আপনার কাঁচা পারফরম্যান্স (-1 বা 0) বা প্রতিলিপিযুক্ত লেখাগুলি (> 1) না লাগলে আপনার সাধারণত 1 এ সেট করা উচিত। 1 এর চেয়ে বেশি মানগুলি লেখার মাধ্যমে আউটপুটগুলিতে যথেষ্ট প্রভাব ফেলে।

  • fsync । স্থায়িত্ব বিকল্প যা সক্ষম করার সময় প্রতিটি লেখার পরে মঙ্গোকে ডিস্কে ফ্লাশ করতে বাধ্য করে। আমার কোনও লেখার ব্যাকলগ সম্পর্কিত কোনও স্থায়িত্বের সমস্যা ছিল না তাই এটি আমাদের প্রোডাক্টটিতে মিথ্যা (ডিফল্ট) নিয়ে থাকে।

  • j * (NEW 2.7+) *। বুলিয়ান যে সত্য সেট করা হলে মোঙ্গোডিবিকে ফিরে আসার আগে একটি সফল জার্নালিং গ্রুপের প্রতিশ্রুতিবদ্ধ হওয়ার জন্য অপেক্ষা করতে বাধ্য করে। আপনি যদি জার্নালিং সক্ষম করে থাকেন তবে আপনি এটি অতিরিক্ত স্থায়িত্বের জন্য সক্ষম করতে পারেন। কী জার্নালিং আপনাকে পায় তা দেখার জন্য http://www.mongodb.org/display/DOCS/ জার্নালিং দেখুন (এবং এই কারণে আপনি এই পতাকাটি সক্ষম করতে চাইতে পারেন)।

রিডপ্রিফারেন্স রিডপ্রিফারেন্স ক্লাসটি যদি আপনি প্রতিলিপি সেটগুলি নিয়ে কাজ করে থাকেন তবে মঙ্গোদ উদাহরণস্বরূপ কোয়েরিগুলি কী রূপান্তরিত হবে তা কনফিগার করতে দেয়। নিম্নলিখিত বিকল্পগুলি উপলব্ধ:

  • রিডপ্রিফারেন্স.প্রাইমারি () : সমস্ত পাঠ কেবল রিসেট প্রাথমিক সদস্যের কাছে যায়। ধারাবাহিক (সর্বাধিক লিখিত) ডেটা ফেরত পেতে যদি আপনার সমস্ত প্রশ্নের প্রয়োজন হয় তবে এটি ব্যবহার করুন। এটি ডিফল্ট।

  • ReadPreferences.primaryPreferred () : সমস্ত পঠন সম্ভব হলে রিসেট প্রাথমিক সদস্যের কাছে যান তবে প্রাথমিক নোড না থাকলে মাধ্যমিক সদস্যদের জিজ্ঞাসা করতে পারেন। যেমন প্রাথমিক অনুপলব্ধ হয়ে ওঠে তবে পাঠাগুলি অবশেষে সামঞ্জস্য হয়ে ওঠে, তবে কেবল প্রাথমিকটি অনুপলব্ধ থাকে।

  • রিডপ্রিফারেন্স.সেকেন্ডারি () : সমস্ত পঠন মাধ্যমিক রিসেট সদস্যদের কাছে যায় এবং প্রাথমিক সদস্যটি কেবল লেখার জন্য ব্যবহৃত হয়। আপনি যদি অবশেষে ধারাবাহিক পাঠ নিয়ে বেঁচে থাকতে পারেন তবেই এটি ব্যবহার করুন। অতিরিক্ত রিসেট সদস্যদের পঠন পারফরম্যান্স স্কেল করতে ব্যবহার করা যেতে পারে যদিও রিপসেট সদস্যদের (ভোটদান) সদস্যের পরিমাণের সীমাবদ্ধতা রয়েছে।

  • রিডপ্রিফারেন্স.সেকেন্ডারিপ্রিফার্ডড () : সমস্ত পঠন তাদের কোনও উপলব্ধ থাকলে সেকেন্ডারি রিপসেট সদস্যদের কাছে যান। প্রাথমিক সদস্যটি কেবলমাত্র লেখকের জন্য ব্যবহৃত হয় যদি না সমস্ত মাধ্যমিক সদস্য অনুপলব্ধ হয়। পড়ার জন্য প্রাথমিক সদস্যের ফ্যালব্যাক ব্যতীত এটি রিডপ্রিফারেন্স.সেকেন্ডারি () এর সমান।

  • রিডপ্রিফারেন্স.নেস্ট () : পাঠগুলি ডাটাবেস ক্লায়েন্টের কাছে উপলব্ধ নিকটতম রিসেট সদস্যের কাছে যায়। অবশেষে ধারাবাহিক পাঠ্য গ্রহণযোগ্য হলে কেবল ব্যবহার করুন। নিকটতম সদস্য হলেন ক্লায়েন্ট এবং বিভিন্ন রিসেট সদস্যদের মধ্যে সর্বনিম্ন বিলম্বিত সদস্য। যেহেতু ব্যস্ত সদস্যদের শেষ পর্যন্ত উচ্চতর বিলম্ব হবে তবে এটি স্বয়ংক্রিয়ভাবে পড়ার ভার ভারসাম্যপূর্ণ হওয়া উচিত যদিও আমার অভিজ্ঞতায় মাধ্যমিক (পছন্দের) মনে হয় সদস্যের বিলম্বগুলি তুলনামূলকভাবে সামঞ্জস্যপূর্ণ হলে এটি আরও ভাল করতে পারে।

দ্রষ্টব্য: উপরের সমস্তগুলিতে একই পদ্ধতির ট্যাগ সক্ষম সংস্করণ রয়েছে যা পরিবর্তে TaggableReadPreferences উদাহরণগুলি প্রদান করে। প্রতিলিপি সেট ট্যাগগুলির একটি সম্পূর্ণ বিবরণ এখানে পাওয়া যাবে: প্রতিলিপি সেট ট্যাগস


6
সকেটটাইমআউট এবং সংঘটিমআউটটিকে ডিফল্ট হিসাবে (অনন্ত) সংযুক্ত করা কি বিপজ্জনক নয়? যদি কোনও কারণে কোনও সংযোগ স্থগিত হয়ে যায় তবে আপনার অ্যাপ (বা কমপক্ষে সেই থ্রেড) চিরতরে আটকে যাবে। এগুলি খুব খুব উচ্চ হিসাবে সেট করা উচিত নয় (সংযোগের জন্য 30 সেকেন্ডের মতো, সকেটের জন্য 2 মিনিট)?
ইদ্রিস মোখতারজাদা

ইদ্রিস, খুব সত্য। আমার পোস্টে আমি ভুল করে ধরে ধরেছিলাম মঙ্গোঅপশনগুলিতে আমাদের খেলাপি রয়েছে। আমাদের মঙ্গো ওআরএম স্তরটি যথাক্রমে 15 সেকেন্ড এবং 1 মিনিটে রয়েছে এবং লেখার সময় আমি ধরে নিয়েছিলাম এগুলি ডিফল্ট ছিল। অসীম সময়সীমা অবশ্যই খারাপ ধারণা। শীর্ষস্থানীয়দের জন্য ধন্যবাদ, আমি পোস্টে এটি স্থির করেছি
রেমন ভ্যান ভিলেট

"স্লেভক" বিকল্পটি এখন অবহিত করা হয়েছে, আপনি যদি এর সমতুল্য সত্য হতে চান তবে করুন: mongoOptions.readPreferences = ReadPreferences.secondaryPreferred ();
গুব্যাট্রন

উত্তম উত্তর তবে আপনার থ্রেডগুলির সংজ্ঞাএলয়েডডব্লকফোর্ডকনেকশন মাল্টিপ্লায়ার ভুল (কীওয়ার্ড গুণক)। দস্তাবেজ অনুসারে: "সংযোগগুলির জন্য গুণক পর্বহোস্ট # থ্রেডগুলির জন্য ব্লক করতে পারে যা সংযোগপর্বটি 10 ​​হয়, এবং থ্রেডসঅ্যালয়েডডো ব্লকফোর্ডকনেকশন মাল্টিপ্লায়ার 5 হয়, তারপরে 50 টি থ্রেড এর চেয়ে বেশি অবরুদ্ধ করতে পারে এবং একটি ব্যতিক্রম ছুঁড়ে দেওয়া হবে"
টাইলার জেল

3
বেশ জনপ্রিয় উত্তর বলে মনে হচ্ছে। সাম্প্রতিক ড্রাইভারের পরিবর্তনগুলি
প্রতিবিম্বিত
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.