100+ জিবি টেবিলগুলিতে নিয়মিত মাল্টি-ওয়েতে যোগ দিতে মাইএসকিউএল ব্যবহার করবেন?


11

পটভূমি :
আমি একটি ওয়েব অ্যাপ্লিকেশন তৈরি করেছি যা আমি যুক্তিসঙ্গতভাবে ভাল স্কেল করতে সক্ষম হতে চাই। আমি জানি আমি গুগল বা টুইটার নই, তবে আমার অ্যাপ্লিকেশনটিতে প্রতিটি ব্যবহারকারীর জন্য যথেষ্ট পরিমাণে ডেটা ব্যবহার করা হয় এবং এর ফলে যথেষ্ট উচ্চ ডেটা প্রয়োজনীয়তা থাকে। আমি পরে সবকিছু পুনর্নির্মাণ না করে যুক্তিসঙ্গতভাবে স্কেল করতে প্রস্তুত হতে চাই।

আমি নিজেকে একটি সফ্টওয়্যার বিকাশকারী হিসাবে বিবেচনা করি, ডাটাবেস বিশেষজ্ঞ নয়। এজন্য আমি এখানে পোস্ট করছি। আশা করি অনেক বেশি ডাটাবেস দক্ষতার সাথে কেউ আমাকে পরামর্শ দিতে পারেন।

তুলনামূলকভাবে বিপুল সংখ্যক ব্যবহারকারীর সাথে, তবে ফেসবুক সংখ্যার মতো কিছুই নয়, আমি এমন একটি ডিবি রাখার প্রত্যাশা করি যা দেখতে এটির মতো দেখায়:

একটি "বড় টেবিল":

  • 250 মিলিয়ন রেকর্ড
  • 20 কলাম
  • প্রায় 100 জিবি ডেটা
  • একটি সূচক বিগিন্ট (20) বিদেশী কী রয়েছে
  • একটি ইনডেক্সযুক্ত বারচর (500) স্ট্রিং_আইডি কলাম রয়েছে
  • এর কোন (11) "মান" কলাম রয়েছে

অন্যান্য 4 টেবিল:

  • এক মিলিয়ন রেকর্ড
  • প্রতিটি প্রায় 2 - 4 জিবি ডেটা
  • এই টেবিলগুলির প্রত্যেকের 4 - 8 কলাম রয়েছে
  • একটি কলামটি তারিখের তারিখ_ক্রিয়েট করা হয়
  • একটি কলামটি হ'ল ভারচার (500) স্ট্রিং_আইডি কলাম
  • এই টেবিলগুলির প্রতিটি থেকে একটি বা দুটি কলাম একটি যোগদানের জন্য নির্বাচিত হবে

এগুলির মধ্যে একটি সারণী গড় সংরক্ষণের জন্য ব্যবহৃত হয় - এর স্কিমাটি হ'ল বিগিন্ট (20) আইডি, বর্ণচর (20) স্ট্রিং_আইডি, তারিখের তারিখ_সৃজন, ভাসমান গড়_মূল্য

আমি কী করতে চাই - দুটি তুলনামূলকভাবে ব্যয়বহুল প্রশ্ন:

  1. নতুন গড় মান গণনা করুন:

    • একটি বিদেশী কী ব্যবহার করে, বড় টেবিল থেকে কয়েক মিলিয়ন আলাদা আলাদা রেকর্ড নির্বাচন করুন।
    • স্ট্রিং_আইডি দ্বারা গোষ্ঠী করে একটি নতুন গড় গণনা করুন।
    • গড় সারণিতে ফলাফল সন্নিবেশ করান।
    • বর্তমানে নির্মিত হিসাবে, এই ক্যোয়ারিতে দুটি যোগ দেয়।
  2. পরিবেশন করা ব্যবহারকারীদের জন্য অ-সাধারণীকরণযোগ্য, কেবল পঠনযোগ্য রেকর্ডগুলি তৈরি করুন:

    • বড় টেবিল থেকে 1,000-40,000 রেকর্ড থেকে যে কোনও জায়গা বেছে নিতে বিদেশী কী ব্যবহার করুন।
    • স্ট্রিং আইডি কলাম সহ নতুন রেকর্ডে অন্য চারটি সারণীর প্রত্যেকটির সাথে যোগ দিন।
    • একটি ডি-নর্মালাইজ টেবিলের মধ্যে ফলাফলগুলি সন্নিবেশ করান।
    • এই রেকর্ডগুলি ব্যবহারকারীদের তথ্য প্রদর্শনের জন্য সম্মুখ-প্রান্তে ব্যবহারের জন্য।
    • বর্তমানে নির্মিত হিসাবে, এই ক্যোয়ারিতে চারটি যোগ যোগ হয়।

আমি এই ব্যয়বহুল প্রশ্নের প্রতিটি ব্যাচের ব্যাক-এন্ড ডাটাবেসে চালানোর পরিকল্পনা করেছি যা এর ফলাফলগুলি রিয়েল-টাইম ফ্রন্ট-এন্ড ডিবি সার্ভারে ঠেলে দেবে যা ব্যবহারকারীদের অনুরোধগুলি পরিচালনা করে। এই প্রশ্নগুলি নিয়মিত বিরতিতে চালানো হবে। আমি কতবার সিদ্ধান্ত নিই না। গড় ক্যোয়ারী সম্ভবত প্রতিদিন একবার করা যেতে পারে। ডি-নরমালাইজ ক্যোয়ারীটি আরও ঘন ঘন হওয়া প্রয়োজন - সম্ভবত প্রতি কয়েক মিনিটে।

এই সমস্ত প্রশ্নের প্রত্যেকটি বর্তমানে "বিগ টেবিল" -এ 100 কে রেকর্ডযুক্ত একটি ডেটাসেট সহ খুব নিম্ন-প্রান্তের মেশিনে মাইএসকিউএলে কয়েক সেকেন্ডে চলে। আমি আমার স্কেল করার ক্ষমতা এবং স্কেলিংয়ের ব্যয় উভয় সম্পর্কেই উদ্বিগ্ন।

প্রশ্নসমূহ :

  1. এই পদ্ধতির শব্দটি কি মনে হচ্ছে না? এটি একটি বৃহত-চিত্রের দৃষ্টিকোণ থেকে স্পষ্টতই কিছু ভুল আছে?
  2. কোনও আরডিবিএমএস কি সঠিক সরঞ্জাম, বা হাডোপ পরিবারের কোনও কিছুর মতো অন্যান্য "বিগ ডেটা" সমাধানগুলি আমার দিকে তাকানো উচিত? আমার প্রবণতাটি আরডিবিএমএস ব্যবহার করা কারণ ডেটাটি কাঠামোযুক্ত এবং সম্পর্কিত মডেলটির সাথে দুর্দান্তভাবে ফিট করে। যদিও একটি নির্দিষ্ট সময়ে, এটি আমার বোঝার বিষয় যে আমি আর আরডিবিএমএস আর ব্যবহার করতে পারব না। এটা কি সত্যি? এই সুইচ কখন প্রয়োজন হবে?
  3. এটা কি কাজ করবে? এই প্রশ্নগুলি কি যুক্তিসঙ্গত সময়ে চালানো যেতে পারে? আমি ক্যোয়ারী # 1 এর জন্য সম্ভবত কয়েক ঘন্টা অপেক্ষা করতে পারি, তবে ক্যোয়ারী # 2 কয়েক মিনিটের মধ্যে শেষ করা উচিত।
  4. একটি হার্ডওয়্যার দৃষ্টিকোণ থেকে আমার কী বিবেচনা করা উচিত? আমার র‌্যাম এবং সিপিইউ বাধা কী হতে পারে? আমি ধরে নিই র‌্যামের সূচীগুলি রাখা গুরুত্বপূর্ণ। আমার অন্য কিছু বিবেচনা করা উচিত?
  5. এক পর্যায়ে আমাকে সম্ভবত আমার ডেটা বিভাজন করতে হবে এবং একাধিক সার্ভার ব্যবহার করতে হবে। আমার ব্যবহারের ক্ষেত্রে কি মনে হচ্ছে এটি ইতিমধ্যে সেই বিভাগে রয়েছে, বা আমি কিছুক্ষণের জন্য একটি একক মেশিনকে উল্লম্বভাবে স্কেল করতে সক্ষম হব? এটি কি 10x ডেটা দিয়ে কাজ করবে? 100x?

এই এক সম্পূর্ণরূপে উত্তর কঠিন। সম্ভবত আপনি মাইএসকিউএল ক্যোয়ারী পারফরম্যান্স বৈশিষ্ট্যগুলি সম্পর্কে সাধারণভাবে গবেষণা করা ভাল তাই আপনি কী আশা করতে পারেন তা জানেন; একটি জিনিস যা আপনি সর্বদা অবশ্যই করতে পারেন তা হ'ল সার্ভারে 20 টি ডিস্ক রাখুন যাতে আপনি 3 জিবি / সেগুলি পড়তে পারেন। তবে আমি মনে করি আপনি সম্পূর্ণ সফ্টওয়্যার উত্তরের পরে রয়েছেন।
usr ডিরেক্টরির

উত্তর:


4

আপনি কি আরও ডেটা পাইলিং এবং বেঞ্চমার্ক করার চেষ্টা করেছেন? 100 কে সারি অসম্পূর্ণ। 250M বা 500M এর মতো চেষ্টা করুন যেমন আপনি আশা করছেন যে আপনাকে পরিচালনা করতে হবে এবং কোথায় বাধা রয়েছে।

আপনি যদি সীমাবদ্ধতার দিকে মনোযোগ দিন এবং চেষ্টা করুন এবং সিস্টেমের শক্তি নিয়ে কাজ করেন তবে একটি আরডিবিএমএস অনেক কিছু করতে পারে। এগুলি কিছু কিছু ক্ষেত্রে ব্যতিক্রমী ভাল এবং অন্যের পক্ষে ভয়ানক, সুতরাং এটি সঠিক কিনা তা নিশ্চিত হওয়ার জন্য আপনাকে পরীক্ষা করাতে হবে।

কিছু ব্যাচের প্রক্রিয়াজাতকরণের কাজের জন্য, আপনি সত্যই ফ্ল্যাট ফাইলগুলিকে বীট করতে পারবেন না, তথ্যটি র‌্যামে লোড করে, লুপগুলি এবং অস্থায়ী ভেরিয়েবলগুলির একটি সিরিজ ব্যবহার করে এবং এটি ছড়িয়ে দিতে ফলাফল ছড়িয়ে দিতে পারেন। মাইএসকিউএল কখনই এই ধরণের গতির সাথে মেলে উঠতে সক্ষম হবে না, তবে যদি সঠিকভাবে টিউন করা হয় এবং সঠিকভাবে ব্যবহার করা হয় তবে এটি প্রস্থের ক্রমের মধ্যে আসতে পারে।

আপনি যা করতে চান তা হ'ল কীভাবে আপনার ডেটা ভাগ করা যায় তা তদন্ত করা। এটিকে বিভক্ত করতে সক্ষম হওয়ার জন্য আপনার কাছে ক্রস-লিঙ্কগুলির খুব বেশি সংখ্যক ডেটা সেট রয়েছে বা এটির ভাগ করার প্রাকৃতিক জায়গা রয়েছে কি? আপনি যদি এটি বিভাজন করতে পারেন তবে সারিগুলির পুরো গাদা দিয়ে আপনার একটি টেবিল থাকবে না, তবে সম্ভবত অনেকগুলি উল্লেখযোগ্যভাবে ছোট। আরও ছোট সূচী সহ ছোট টেবিলগুলি আরও ভাল সম্পাদন করতে থাকে।

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

যখনই সম্ভব, একাধিক সিস্টেমে আপনার ডেটা বিভক্ত করুন। আপনি যদি সাহসী বোধ করেন তবে আপনি মাইএসকিউএল ক্লাস্টার ব্যবহার করতে পারেন বা মাইএসকিউএল-এর অনেকগুলি স্বতন্ত্র উদাহরণ সন্ধান করতে পারেন যেখানে প্রতিটি বিভাজন স্কিম ব্যবহার করে সম্পূর্ণ ডেটা সেটের একটি স্বেচ্ছাসেবী অংশ সংরক্ষণ করে sense


@ ট্যাডম্যান আপনার পরামর্শের জন্য ধন্যবাদ। আমি বুঝতে পারি যে এটি চেষ্টা করার আসলে কোনও বিকল্প নেই। আমি এটি 250 মিলিমিটার সারিগুলির সাথে বেঞ্চমার্ক করিনি কারণ আমি প্রথমে নিশ্চিত করতে চেয়েছিলাম যে আমার পদ্ধতির বিষয়ে স্পষ্টত কোনও ভুল নেই। মনে হচ্ছে সেখানে নেই। তদতিরিক্ত, এত বেশি ডেটা পাওয়া, এবং কিছুটা বাস্তবসম্মত উপায়ে এটি করা একটি চ্যালেঞ্জ আমি কীভাবে সমাধান করব তা এখনও বুঝতে পারি নি। আমার কাছে ডেটা বিভাজন করার কিছু সম্ভাব্য উপায় আছে। আমার ধারণা আমি পরবর্তী সময়ে আমার ডেটা র‍্যাম্পিংয়ের চেষ্টা করব এবং এটি দেখতে কিভাবে এটি বিভিন্ন চেকপয়েন্টগুলিতে - 1 এম, 10 এম, 100 এম ইত্যাদি রয়েছে
xnickmx

1

সংক্ষিপ্ত সারণি

প্রতিদিন, দিনের ডেটার জন্য সামগ্রিক তথ্য গণনা করুন। এটিকে "সংক্ষিপ্তসার" টেবিলের মধ্যে রাখুন। তাদের বিরুদ্ধে আপনার জিজ্ঞাসা করুন। দ্রুত 10 বার হিসাবে দ্রুত।

আরও আলোচনার জন্য, প্রদান করুন

  • টেবিল তৈরি করুন (এটি এখন দাঁড়িয়ে আছে)
  • টেবিলের আকার (যা আপনি উল্লেখ করেছেন)
  • প্রস্তাবিত নির্বাচন

কিছু সুস্পষ্ট বিষয় ...

  • BIGINT খুব কমই warranted হয়। এটি 8 বাইট লাগে। INS UNNIGNED 4 নেয় এবং মান 0..4 বিলিয়ন দেয়। এবং সেখানে মিডিয়ামমেন্ট ইত্যাদি রয়েছে
  • 'ফ্যাক্ট' টেবিলের একাধিক সূচীগুলি সাধারণত একটি গুরুতর পারফরম্যান্স সমস্যা, বিশেষত INSERTs এর জন্য। আপনি কি সেখানে একটি সমস্যা আছে?
  • DATETIME 8 বাইট; টাইমস্ট্যাম্প 4 টি
  • সুস্পষ্ট বিদেশী কী সংস্থাগুলি দুর্দান্ত তবে ব্যয়বহুল
  • যোগদানগুলি পারফরম্যান্সের সমস্যা হতে পারে বা নাও হতে পারে; নির্বাচন এবং তৈরিগুলি দেখতে হবে to
  • 100 জিবি একটি 'বিগ' মাইএসকিউএল ডাটাবেসের জন্য একটি দুর্দান্ত আকার; আমার সন্দেহ হয় এটি হ্যাডোপ ইত্যাদি ছাড়া কাজ করা যায় etc.
  • আপনি কি কোনও পর্যায়ে ডেটা 'শুদ্ধ' করবেন? (এটি পার্টিশনিংয়ের জন্য প্রধান ব্যবহারের ক্ষেত্রে বাড়ে))

"ছোট -> আরও ক্যাশেযোগ্য -> দ্রুত


0

আপনার সামনের প্রান্তের ডেটা পরিবেশন করার জন্য, যতক্ষণ না সমস্ত সময় serোকানো গোবস এবং গবস না থাকে, আপনি সত্যিকার অর্থে বস্তুগত দৃষ্টিভঙ্গি sertোকানোর জন্য ট্রিগারগুলি ব্যবহার করে বীট করতে পারবেন না যা পিছনের প্রান্তের সাথে সিঙ্কে রাখা হয়েছে তবে ডেটা পরিবেশন করার জন্য অনুকূলিত। অবশ্যই, এই ট্রিগারগুলিতে আপনার অন্তর্ভুক্ত হওয়া উচিত, ইত্যাদি a আমি যে কৌশলটি ব্যবহার করেছি তা হ'ল এই সন্নিবেশগুলি / আপডেটগুলিকে একটি মধ্যবর্তী টেবিলের মধ্যে সারি করা এবং তারপরে প্রতি মিনিট বা তার পরে এগুলি প্রেরণ করা। 4 জিবি রেকর্ডের চেয়ে একটি রেকর্ড প্রেরণ করা অনেক সহজ। আপনার সন্ধান করা রেকর্ডগুলি দ্রুত সন্ধান করতে পারলেও 4 জিবি ডেটা প্রবাহিত হতে দীর্ঘ সময় নেয়।

আমি তাদমানের সাথে একমত আপনি যে ধরণের সিস্টেমে চাইছেন সে সম্পর্কে আপনি যে ধরণের ডেটা আশা করছেন তা সর্বাধিক হ'ল এটি profile


যেমনটি আমি আমার পোস্টে উল্লেখ করেছি, দর্শনগুলি এমন প্রশ্নের উপরে নির্ভর করে যা কয়েক মিলিয়ন রেকর্ড সহ টেবিল জুড়ে চারটি যোগ দেয়, তাই আমি বাস্তবে দেখতে পাচ্ছি না কীভাবে বাস্তবায়িত দৃষ্টিভঙ্গি সাহায্য করবে।
xnickmx

ট্রিগারগুলি এই আকারের ডাটাবেসের জন্য পর্যাপ্ত দ্রুত নাও হতে পারে। প্রতি সেকেন্ডে কত INSERT ঘটছে?
রিক জেমস

1
@ xnickmx যদি এতগুলি সন্নিবেশ / আপডেট না হয় তবে ট্রিগারগুলি ড্যানোরমালাইজড ডেটা সিঙ্কে রাখা সহজ / পারফরম্যান্ট করে তোলে। যদি সন্নিবেশ / আপডেটের জন্য দ্রুত যেতে হয় তবে তাদের এই জাতীয় কিছু দিয়ে সারি করুন: blog.shlomoid.com/2008/04/… বা নিজের বেক করুন। নতুন তথ্য পাওয়ার জন্য আপনাকে এইভাবে 100 মিলিয়ন সারি টেবিলের সাথে যোগ দিতে হবে না যেহেতু ট্রিগারটি আগুন জ্বলেছে, আপনি তখনই নতুন তথ্যটি জেনে গেছেন এবং আপনি এটি টিএক্স এর অংশ হিসাবে অস্বীকৃতি জানাতে পারবেন এমন সুবিধা গ্রহণ করবেন বা পরে ডেনোরালাইজেশনের জন্য এটি সারি করুন।
wes.stueve

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