এসকিউএল সার্ভার 2016, সহ একাধিক ভাড়াটে সিস্টেমের ভাড়াটে বা পৃথক পৃথক ডাটাবেসের মাধ্যমে ভাড়াটে বিচ্ছিন্ন হওয়া উচিত?


12

ব্যবহারের ক্ষেত্রে দেওয়া:

  • ভাড়াটিয়াদের ডেটা আলাপের বাইরে যাওয়া উচিত নয়, একজন ভাড়াটেকে অন্য ভাড়াটের ডেটার প্রয়োজন হয় না।
  • প্রতিটি ভাড়াটেটির পক্ষে সম্ভাব্য পরিমাণে historicalতিহাসিক ডেটা পরিমাণ রয়েছে।
  • এসকিউএল সার্ভার এডাব্লুএস ইসি 2 উদাহরণে হোস্ট করা হয়েছে।
  • প্রতিটি ভাড়াটে ভৌগলিকভাবে দূর।
  • তৃতীয় পক্ষের ভিজুয়ালাইজেশন সরঞ্জাম যেমন পাওয়ার বিবিআই এম্বেডেড ব্যবহার করার উদ্দেশ্য রয়েছে
  • সময়ের সাথে সাথে ডেটা ভলিউম বৃদ্ধি পেতে পারে বলে আশা করা হচ্ছে
  • সিস্টেমের ব্যয় সীমাবদ্ধ।
  • 24/7 প্রোডাকশন ডিবিএ ছাড়াই সমাধানটি অবশ্যই বজায় রাখতে হবে
  • সমাধানটি অনুভূমিকভাবে স্কেল করতে সক্ষম হওয়া উচিত।
  • ভাড়াটেদের মোট সংখ্যা 50 এরও কম

প্রস্তাবিত আর্কিটেকচার কী হবে, এই ব্যবহারের ক্ষেত্রে কোনও রেফারেন্স বাস্তবায়ন আছে কি? আমি বিশ্বাস করি এন্টারপ্রাইজ সফ্টওয়্যার বিকাশের জন্য অনেকে ইতিমধ্যে এই সমস্যার মুখোমুখি হতে পারেন।

আমি মনে করি মাল্টি-টেন্যান্ট ডেটাবেস আর্কিটেকচারে ভাড়াটেদের ক্রমবর্ধমান সংখ্যা পরিচালনা করা থেকে এটি আলাদা পরিস্থিতি । এই প্রশ্নে উল্লিখিত ব্যবহারের ক্ষেত্রে উচ্চতর ভাড়াটিয়া রয়েছে, যা খুব কম (৫০) বড় ভাড়াটে থাকার থেকে খুব আলাদা very উল্লিখিত আর্কিটেকচারটি এখানে একটি সমাধান হতে পারে, যা আমি এটি সম্পর্কে আরও জানতে চাই।

উত্তর:


16

শারডিং সহ গোটচাটি হ'ল অ্যাপ্লিকেশনটিতে কোন্ শার্ডটি কোয়েরি করতে হবে তা জানতে হবে। সাধারণত, এটি ক্লায়েন্টের মতো কোনও কিছুর উপর ঝাঁকিয়ে পড়ে। আমি আমার উত্তর হিসাবে ব্যবহার করতে আমার পুরানো ব্লগ পোস্টগুলির একটি অভিযোজিত করব ।

যখন আপনি প্রচুর ক্লায়েন্টের জন্য অ্যাপ্লিকেশন তৈরি করছেন, তখন ডাটাবেসগুলি ডিজাইনের দুটি সাধারণ উপায় রয়েছে:

  • বিকল্প একটি: সমস্ত ক্লায়েন্টকে একই ডাটাবেসে রাখুন
  • বিকল্প 2: প্রতি ক্লায়েন্টের জন্য একটি ডেটাবেস তৈরি করুন

সমস্ত ক্লায়েন্টকে একই ডেটাবেসে রাখা

এটি সহজ: স্কিমার শীর্ষে কেবলমাত্র একটি ক্লায়েন্ট টেবিল যুক্ত করুন, লোকেরা কেবল তাদের নিজস্ব ডেটা দেখতে পাবে এবং আমরা চলে যাব তা নিশ্চিত করার জন্য একটি ক্লায়েন্ট ব্যবহারকারীদের টেবিল যুক্ত করুন।

এই পদ্ধতির সুবিধা:

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

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

একটি বাহ্যিক API তৈরি করা সহজ। আমাদের যদি পণ্য তৈরির জন্য বাইরের লোকদের জন্য আমাদের সম্পূর্ণ ডাটাবেসে অ্যাক্সেস দেওয়ার প্রয়োজন হয়, তবে সমস্ত ডেটা একক ডাটাবেসে থাকলে আমরা আরও সহজ করতে পারি। যদি API কে একাধিক সার্ভারে একাধিক ডাটাবেস থেকে ডেটা গ্রুপিংয়ের সাথে মোকাবিলা করতে হয় তবে এটি বিকাশ এবং পরীক্ষার সময় যুক্ত করে। (অন্যদিকে, সেই "একাধিক সার্ভার" জিনিসটি ওয়ান-ডাটাবেস-বিধি-বিধি-সমস্ত-পরিস্থিতিটির জন্য সীমাবদ্ধতার ইঙ্গিত দিতে শুরু করে: একটি ডাটাবেস সাধারণত আমাদের সমস্ত লোডের প্রভাবকে কেবল একটি ডাটাবেস সার্ভারকে বোঝায়)) আপনার ক্ষেত্রে , পাওয়ারবিআইয়ের সাথে, প্রত্যেকের একটি ডাটাবেসে থাকা সংযোগগুলি পরিচালনা করা আরও সহজ করে তোলে।

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

প্রতিটি ক্লায়েন্টকে তার নিজস্ব ডেটাবেস বা শ্যাডে রেখে দেওয়া

আপনার এখনও একটি ক্লায়েন্টের তালিকা প্রয়োজন, তবে এখন এটি ডিরেক্টরিতে পরিণত হয় - প্রতিটি ক্লায়েন্টের জন্য, আপনি এতে থাকা শার্পটিকেও ট্র্যাক করেন start সূচনাতে, আপনার অ্যাপ্লিকেশনটি এই টেবিলটি অনুসন্ধান করে এবং এটি র‍্যামে ক্যাশে করে। যখন কোনও ক্লায়েন্টের জন্য এটির ডেটা প্রয়োজন হয়, এটি সরাসরি সেই শারডের সাথে সংযুক্ত হয় (ডাটাবেস এবং সার্ভার)।

এই পদ্ধতির সুবিধা:

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

আরও সহজ ডেটা রফতানি। ক্লায়েন্টরা তাদের ডেটাতে হাত পেতে পছন্দ করে। ভয়ঙ্কর বিক্রেতার লক-ইন দৃশ্যটি এড়িয়ে তারা যে কোনও সময় তাদের ডেটা বের করতে পারে তা জানার সুরক্ষা চায় এবং তারা তাদের নিজস্ব প্রতিবেদন করতে চায়। প্রতিটি ক্লায়েন্টের ডেটা তাদের নিজস্ব ডাটাবেসে বিচ্ছিন্ন করার সাথে আমরা কেবল তাদের নিজস্ব ডাটাবেস ব্যাকআপের একটি অনুলিপি দিতে পারি। আমাদের ডেটা এক্সপোর্ট এপিআই তৈরি করতে হবে না।

আরও সহজ মাল্টি সার্ভার স্কেলিবিলিটি। যখন আমাদের অ্যাপ্লিকেশনটির একটি একক সার্ভার থেকে পাওয়ার চেয়ে আরও বেশি শক্তি প্রয়োজন তখন আমরা একাধিক সার্ভারের মধ্যে ডাটাবেসগুলি ভাগ করতে পারি। আমরা ভৌগলিকভাবে লোডটি ছড়িয়ে দিতে পারি, এশিয়া বা ইউরোপে সার্ভারগুলি ক্লায়েন্টের কাছাকাছি রাখতে putting

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

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

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

তোমার জন্য কোনটা সঠিক?

সঠিক কোনও পছন্দ নেই: আপনাকে নিজের কোম্পানির শক্তি এবং দুর্বলতাগুলি জানতে হবে। উদাহরণস্বরূপ আমার দুটি ক্লায়েন্টকে নেওয়া যাক।

হার্ডওয়্যার পারফরম্যান্স টিউনিং এ সংস্থা এ এক্সেলস। তারা হার্ডওয়্যার থেকে বেরিয়ে আসার শেষ মুহুর্তে খুব কার্যকরী হয়ে ওঠে, এবং 12-18 মাসের চক্রে তাদের এসকিউএল সার্ভার হার্ডওয়্যার প্রতিস্থাপন করতে তারা আপত্তি করে না। (তারা প্রতি 4-6 মাসে ওয়েব সার্ভারগুলিকে রিফ্রেশ করে!) তাদের অ্যাকিলিসের হিল চূড়ান্ত সম্মতি এবং সুরক্ষা প্রয়োজনীয়তা। তাদের অবিশ্বাস্য অডিটিংয়ের চাহিদা রয়েছে এবং কয়েক হাজার সার্ভারের কয়েক হাজার ডাটাবেস জুড়ে এই প্রয়োজনীয়তাগুলি পরিচালনা করা তার চেয়ে একক সার্ভারে, একক ডাটাবেসে বুলেটপ্রুফ নিয়ন্ত্রণগুলি প্রয়োগ করা কেবল তাদের পক্ষে সহজ easier তারা একটি ডাটাবেস, একটি সার্ভার, অনেক ক্লায়েন্ট বেছে নিয়েছে।

সংস্থা 2 উন্নয়নের চর্চায় এক্সেলস। হাজার হাজার ডাটাবেস জুড়ে স্কিমা পরিবর্তন এবং কোড মোতায়েন পরিচালনা করা তাদের জন্য সমস্যা নয়। তাদের বিশ্বজুড়ে ক্লায়েন্ট রয়েছে এবং তারা এই ক্লায়েন্টদের জন্য চব্বিশ ঘন্টা ক্রেডিট কার্ড লেনদেন প্রক্রিয়াজাত করছে। তাদের ভৌগলিকভাবে লোড ছড়িয়ে দেওয়ার দক্ষতার প্রয়োজন এবং তারা প্রতি 12-18 মাসে বিশ্বজুড়ে সার্ভারগুলি প্রতিস্থাপন করতে চায় না। তারা প্রতিটি ক্লায়েন্টের জন্য একটি করে ডাটাবেস বেছে নিয়েছিল এবং তারা তাদের অফশোর ক্লায়েন্টদের জন্য এশিয়া এবং ইউরোপে এসকিউএল সার্ভার স্থাপন শুরু করার সাথে সাথে এটি পরিশোধ করে।


"আপনার ক্ষেত্রে, পাওয়ারবিআইয়ের সাথে, প্রত্যেকের একটি ডাটাবেসে থাকা সংযোগগুলি পরিচালনা করা আরও সহজ করে তুলবে"। এই মুহুর্তে পাওয়ারবিবি এম্বেডে রো স্তরের সুরক্ষা নেই এবং সুতরাং এক ডাটাবেসে প্রত্যেক ভাড়াটে থাকায় এই ব্যবহারের ক্ষেত্রে কিছুটা সন্দেহ তৈরি হচ্ছে, দেখুন: সম্প্রদায়. powerbi.com/t5/Developer/…, এই তথ্যের আলোকে আপনি কি পুনরায় সংশোধন করতে পারবেন এটি বা বিকল্প প্রস্তাব বা আমার বোঝার সংশোধন?
ডিএস

এছাড়াও, "প্রতিটি ক্লায়েন্টকে তার নিজস্ব ডেটাবেস বা শারডে রেখে দেওয়া" আপনি এই দুটি পরামর্শের মধ্যে পার্থক্যটি এখানে বিস্তারিতভাবে বর্ণনা করতে পারেন
ডিএস

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

5

আরও একটি বিবেচনা আমি অন্য উত্তরে এখনও দেখিনি।

একটি ডিজাইন যা একক ডাটাবেসে অনেক ভাড়াটেদের জন্য অনুমতি দেয় তা পরে নমনীয়তা দেয়। পরে / সুরক্ষা / ভূ-অবস্থানের দাবিগুলি লোড / স্কেল করা উচিত যদি কোনও ভাড়াটিয়াকে পৃথক ডাটাবেস থাকা উচিত তবে নতুন স্রোতের ডিবি পুনরুদ্ধার করে এটি তৈরি করা যেতে পারে। অন্যান্য ভাড়াটেদের ডেটা এখনও যেকোনো প্রক্রিয়া ছিল তার দ্বারা সুরক্ষিত। সময়-অনুমতি অনুসারে এখন-অপ্রচলিত ডেটা পুরানো এবং নতুন উভয় ডাটাবেস থেকে টুকরোয়াল সরানো যাবে।

বিপরীত সত্য নয়। অনেকগুলি এক-ভাড়াটে ডাটাবেস একীকরণ করতে যথেষ্ট আরও কাজের প্রয়োজন হবে।


4

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

* এটি সর্বদা স্বাভাবিকীকরণ ভঙ্গ করে না, তবে তা পারে। উদাহরণস্বরূপ, যদি আপনার একটি Personএবং একটি PersonAddressটেবিল থাকে। Personটেবিল থাকবে TenantID, PersonIDপ্রাথমিক কী হিসাবে। আমার পরামর্শ অনুসারে PersonAddressটেবিলে TenantID, PersonID, AddressTypeIDপ্রাথমিক কী হিসাবে থাকবে ।

সাধারণত কেবলমাত্র PersonIDযথেষ্ট হবে, কারণ আপনি এটির জন্য Personটেবিলে ফিরে আসতে পারেন Tenant। আমি আপনাকে TenantIDপরবর্তী প্রতিটি টেবিলের দিকে এগিয়ে যাওয়ার পরামর্শ দিচ্ছি , এমনকি যদি একটি পাতলা কী কাজ করে।

এটি আমার বোঝা ছিল যে কোনও তথ্য যে কোনও টেবিলের কাছে অন্য ডেটা থেকে নেওয়া যেতে পারে সেগুলি ভাঙ্গা স্বাভাবিককরণ হিসাবে বিবেচিত হয়েছিল। তবে সম্ভবত পাতলা কীগুলি ব্যবহার করা একটি সেরা অনুশীলন।


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

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