বিপুল সংখ্যক ডাটাবেস সহ পোস্টগ্রেএসকিউএল কত ভাল সম্পাদন করে?


9

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

সুতরাং, আমরা প্রতিটি গ্রাহকের জন্য পোস্টগ্রিসে একটি পৃথক ডাটাবেস তৈরি করার কথা চিন্তা করেছিলাম। এই সমাধানটি 10-20 কে ডাটাবেসগুলিতে স্কেল করতে পারে? কত ভাল?

কারও কি এর জন্য আরও ভাল সমাধান আছে?

আগাম ধন্যবাদ.

উত্তর:


10

নিম্ন প্রান্তে, এটি মূলত নীচে ফোটে "আপনি কি পুরোপুরি বলতে পারবেন যে আপনার কাছে কোনও ভাগ করা ডেটা নেই?" মাইএসকিএল-এর বিপরীতে, ডাটাবেসটি পোস্টগ্রেস্কলিতে একটি পরম সীমানা। আপনি SELECT zip_code FROM common.city_zip WHERE city=...পৃথক ডাটাবেস (কমপক্ষে ছাড়া না dblink) নিয়ে গেলে আপনি পারবেন না ।

আপনার কাছে যদি কোনও ভাগ করা ডেটা থাকে তবে পোস্টগ্র্যাসিকেলের "স্কিমা" মাইএসকিএল একটি "ডাটাবেস" বলে যা তার মতই । আপনি পারেন CREATE SCHEMA clienta; CREATE TABLE clienta.customer (...);। আপনি প্রতিটি ক্লায়েন্টের জন্য একটি স্কিমা তৈরি করবেন, সেই ক্লায়েন্টের ব্যবহারকারীর তাদের অনুসন্ধানের পথে প্রথমে তাদের স্কিমা থাকবে এবং অনুমতি দেওয়া হবে যাতে ক্লায়েন্ট এ এর ​​ব্যবহারকারীর clientaএবং publicস্কিমার (এবং তাদের টেবিলগুলি) অ্যাক্সেস থাকে ।

আপনার সমস্যাটি হ'ল # ক্লায়েন্টের উচ্চ প্রান্তে, প্রতিটি টেবিলটি একটি ফাইল হিসাবে সংরক্ষণ করা হয়, তাই আপনি ক্লায়েন্টের প্রতি একটি ডাটাবেস, ক্লায়েন্টের জন্য একটি স্কিমা, বা ${client}_customerআপনার টেবিলের নামগুলির মতো কিছু ব্যবহার করেন না কেন , আপনি আপনার কাছে প্রতি ক্লায়েন্টের কাছে কেবল একটি টেবিল থাকলে (সংযোগে প্রতি একটি ফাইলডেস্ক্রিপ্টর) থাকলেও সম্ভবত 10 কে ক্লায়েন্টের সাথে ফাইলডিসিপিটার সীমাতে চালিত হতে পারে । অবশ্যই, আপনি সিস্টেপ্ট ব্যবহার করে ফ্লাইটে কার্নেলের সর্বাধিক সংখ্যক ফাইল বর্ণনাকারী সামঞ্জস্য করতে পারেন, তবে প্রতি-প্রক্রিয়া সীমাতে (উলিমিট) যদি আপনি প্রথমবারের মতো খুব কম সেট করেন তবে পোস্টগ্র্যাসকিল পুনরায় চালু করতে হবে।

বিকল্পটি হল একটি ক্লায়েন্ট কলামের সাথে "একটি বড় টেবিল" থাকা যা সারিটি কোন ক্লায়েন্টের অন্তর্ভুক্ত তা চিহ্নিত করে (আদর্শভাবে, ব্যবহারকারীর নাম অনুসারে যদি প্রতি ক্লায়েন্টে আপনার একজন ব্যবহারকারী থাকে, এটি লটটির নীচে থাকা জিনিসকে আরও সহজ করে তোলে)। ক্লায়েন্টদের দ্বারা এই টেবিলটিতে মোটামুটি কোনও অ্যাক্সেস না দিয়ে আপনি ক্লায়েন্ট-নির্দিষ্ট দৃষ্টিভঙ্গি তৈরি করতে পারেন (বা session_userবর্তমান ক্লায়েন্ট সনাক্ত করতে ব্যবহার করতে পারেন )। আপডেটগুলি সরাসরি কোনও দৃশ্যের মাধ্যমে করা যায় না। টেবিলগুলিতে সন্নিবেশ / আপডেট / মুছার অনুমতি সহ একটি বিশেষ ব্যবহারকারী হিসাবে এক্সিকিউটিভ করার জন্য session_userফাংশনগুলি ব্যবহার করে টেবিলের উপরে (কোনও ক্লায়েন্ট প্রতি ফাংশনের একটি সেট বা অন্য ব্যবহার করে ) সন্নিবেশ / আপডেট / মুছতে আপনার সংজ্ঞায়িত ফাংশন থাকতে হবে SECURITY DEFINER(নোট : session_userকারণ userএবং ব্যবহৃত হয়current_user বর্তমান প্রসঙ্গের উপর ভিত্তি করে, এবং একটি সুরক্ষা ডিফাইনার ফাংশনের মধ্যে এটি সর্বদা ফাংশনটি সংজ্ঞায়িতকারী ব্যবহারকারী হবে)।

পারফরম্যান্স অনুসারে, এফডি ইস্যুটির বাইরে, আমি সতর্কতার সাথে জানি না যে পোস্টগ্রেস্কেএল-তে 10000 ডাটাবেসগুলির সাথে কী ঘটবে, বনাম এতে একটি বড় টেবিল রয়েছে যার মধ্যে এতে 10000 ক্লায়েন্টের মূল্যবান ডেটা রয়েছে। যথাযথ সূচী নকশাগুলি কোয়েরি থেকে ধীরে ধীরে বড় টেবিলটি রাখা উচিত।

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


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

@ এদুয়ার্দো আমার সাথে সবচেয়ে বড় সমস্যাটি হ'ল এটি নিশ্চিত করা যে যখন ডেটা মডেলটি সবার জন্য পরিবর্তিত হওয়া দরকার, তা হয়ে গেছে। কোনও দিন আমরা ডেটা মডেলটিতে পরিবর্তনগুলি পরিচালনা করার জন্য রেলসের সিস্টেমের মতো কিছু গ্রহণ করব, ততক্ষণ আমার কাছে একটি স্ক্রিপ্ট রয়েছে যা ক্লায়েন্টদের মধ্য দিয়ে যায় এবং প্রতিটি ডাটাবেসে একই কমান্ড কার্যকর করে। যেহেতু আমরা মোটামুটি ভাগ করা ডেটা করি না, তাই সমস্ত কিছু খুব সহজ ছিল। আপনি যদি একাধিক স্কিমার সাথে একটি ডিবি নিয়ে যান তবে আপনি pg_dump -npsql -E\dn
স্কাইমাকে তালিকাবদ্ধ

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

@ ডারফকে, আপনি আজ যে ওয়েব স্ট্যাকটি ব্যবহার করছেন তা কী?
কার্লোস

@ জেরেমিয়া, আপনার পক্ষে ভাল কথা আছে আপনি বহুজাতিক অ্যাপ্লিকেশন সঙ্গে অভিজ্ঞতা আছে?
কার্লোস

3

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

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

আপনি যদি নিজের নকশাটি নিয়ে এগিয়ে যেতে চান তবে আমার প্রাথমিক উদ্বেগগুলি এখানে:

  1. ulimit -nআপনার হোস্ট ওএসে খোলা ফাইল বর্ণনাকারী ( ) এর বাইরে চলেছে
  2. বিভিন্ন অনুসন্ধানের নিদর্শনগুলির জন্য 10,000+ ডাটাবেস টিউন করে
  3. বিভিন্ন সুরক্ষা উদ্বেগের সাথে 10,000+ ডাটাবেসগুলি পরিচালনা করা (ব্যাকআপ এবং সম্ভাব্য পুনরুদ্ধার, আপনি যদি সত্যিই কোনও সার্ভারের ব্যর্থতা থাকে তবে 10,000+ ডাটাবেসটি পুনরুদ্ধার করতে চান?)
  4. 10,000+ ডাটাবেস জুড়ে পরিবর্তন আউট

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

প্যারামিটারাইজড সঞ্চিত পদ্ধতিগুলি এসকিউএল ইঞ্জেকশনগুলি ছাড়া আর কোনও কিছুই রক্ষা করে না। যদি এই পদ্ধতির কোনও একটি করে থাকে তবে SELECT * WHERE clientId = 3আপনার একটি সুরক্ষা ফাঁস হবে।
মিকেরোবি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.