একাধিক অ্যাপের দৃষ্টান্ত সহ নিরাপদে কীভাবে ডেটাবেস স্থানান্তর করবেন?


10

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

পরিস্থিতি এখানে:

আমাদের কাছে এই অ্যাপ্লিকেশনটির একাধিক উদাহরণ রয়েছে - প্রায় 5 টি উত্পাদন production আসুন তাদের কল করুন node1, ..., node5। প্রতিটি অ্যাপ্লিকেশন একটি একক এসকিউএল সার্ভার উদাহরণের সাথে সংযোগ স্থাপন করে এবং আমরা রোলিং ডিপ্লোয়মেন্টগুলি ব্যবহার করি না (যতক্ষণ পর্যন্ত আমি জানি সমস্ত অ্যাপ্লিকেশন একসাথে মোতায়েন করা হয়েছে)

সমস্যা: বলুন আমাদের দীর্ঘকাল চলতে চলেছে have এই ক্ষেত্রে, node1শুরু হয়, তারপরে স্থানান্তর চালানো শুরু করে। এখন, node4শুরু হয়, এবং দীর্ঘ-চলমান মাইগ্রেশন এখনও শেষ হয়নি, তাই node4মাইগ্রেশন চালানোও শুরু করে -> সম্ভাব্য ডেটা দুর্নীতি? আপনি কীভাবে এই সমস্যার বিরুদ্ধে রোধ করবেন বা সমস্যাটি চিন্তার পক্ষে যথেষ্ট গুরুত্বপূর্ণ?

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

তবে, আমার অন্ত্রে বলছে "এটি ওভারকিল, এর একটি সহজ সমাধান হতে হবে," তাই আমি বুঝতে পেরেছিলাম যে এখানে অন্য কারও কোনও ভাল ধারণা আছে কিনা তা জানতে আমি এখানে জিজ্ঞাসা করব।


1
আপনার বিশ্বব্যাপী / বিতরণ করা লক হিসাবে "মাইগ্রেশন স্থিতি" টেবিলটি কীভাবে ব্যবহার করবেন? একক সারিতে ইঙ্গিত দেওয়া হবে যদি কোনও মাইগ্রেশন বর্তমানে সক্রিয় থাকে এবং সম্ভবত শেষ পর্যন্ত কোন মাইগ্রেশনটি কার্যকর হয়েছিল।
বার্ট ভ্যান ইনজেন শেহেনো

আপনার অ্যাপ্লিকেশনগুলি অ্যাসিঙ্ক্রোনলি মোতায়েন করা দরকার?
বেন

উত্তর:


4

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

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

  • একটি লেনদেন শুরু করুন
  • SELECT FROM Migrations FOR UPDATE WHERE MigrationLabel='MyMigration42'
  • যদি পূর্বের বিবৃতিটি কোনও মান দেয় তবে লেনদেন শেষ করে
  • মাইগ্রেশন প্রয়োগ করুন (ব্যর্থ হলে ফিরে রোল করুন, ব্যর্থতা লগ করুন এবং লেনদেন শেষ করুন)
  • INSERT 'MyMigration42' INTO Migrations(MigrationLabel)
  • লেনদেন শেষ

এটি সরাসরি "মাইগ্রেশন ইতিমধ্যে প্রয়োগ করা হয়েছিল" পরীক্ষায় লকিং প্রক্রিয়া তৈরি করে ।

নোট করুন এই নকশাটি - তাত্ত্বিকভাবে - কোন অ্যাপ্লিকেশন আসলে এটি প্রয়োগ করে তা সম্পর্কে আপনার মাইগ্রেশন পদক্ষেপগুলি অজানা হতে দেয় - এটি সম্ভব হতে পারে যে পদক্ষেপ 1 অ্যাপ্লিকেশন দ্বারা প্রয়োগ করা হয়েছে, অ্যাপ 2 দ্বারা পদক্ষেপ 2, অ্যাপের 3 ধাপে 3, অ্যাপ 1 দ্বারা পদক্ষেপ 4 প্রয়োগ করা হবে আবার, এবং তাই। তবে অন্যান্য অ্যাপ্লিকেশনগুলির উদাহরণ যতক্ষণ না ব্যবহার করা যায় ততক্ষণ মাইগ্রেশন প্রয়োগ না করাও ভাল ধারণা। আপনার প্রশ্নে উল্লিখিত সমান্তরাল স্থাপনা ইতিমধ্যে এই সীমাবদ্ধতার যত্ন নিতে পারে।


1

হতে পারে আপনি এমন একটি লাইব্রেরি খুঁজে পাবেন যা একাধিক নোডের সাহায্যে ডাটাবেস স্থানান্তরকে সমর্থন করে।

আমি জাভা বিশ্বে দুটি গ্রন্থাগার সম্পর্কে জানি, উভয়ই আপনার যা প্রয়োজন তা সমর্থন করে:

  • লিকুইবেস : তাদের এফএকিউ থেকে : লিকুইবেস একটি সময়ে কেবলমাত্র একটি প্রক্রিয়া ডেটাবেস আপডেট করার অনুমতি দেওয়ার জন্য বিতরণ করা লকিং সিস্টেম ব্যবহার করে। অন্যান্য প্রক্রিয়াগুলি কেবল লকটি প্রকাশ না হওয়া পর্যন্ত অপেক্ষা করবে।
  • ফ্লাইওয়ে : তাদের ডাউনলোড পৃষ্ঠা থেকে : সমান্তরাল multiple একাধিক নোডের জন্য নিরাপদ ✓

জাভা এবং অন্যান্য ভাষার পাশাপাশি সম্ভবত অন্যান্য সরঞ্জাম রয়েছে।


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

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