একজন মাইএসকিউএল মাস্টার / স্লেভ কনফিগারেশনটি কীভাবে উপার্জন করতে পারবেন?


21

আমি এই প্রশ্নটি পড়েছি মাইএসকিউএল মাস্টার / স্লেভ প্রতিরূপ কাজ করছে না এবং এর উত্তর:

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

বিড়ালছানা হত্যা না করে একটি উপায় আছে মূল হ্যাকিং করাকে আরও স্লেভ এসএলএফ কোয়েরি করতে db_query()এবং db_select()করার জন্য?

ডিফল্টরূপে, এই ফাংশনগুলি মাস্টারকে জিজ্ঞাসা করবে যদি না নির্দিষ্টভাবে ক্রীতদাসকে জিজ্ঞাসা করতে বলা হয় (তাদের এপিআই দেখুন)। db_query($query, $args, array('target' => 'slave'))স্লেভকে জিজ্ঞাসা করার জন্য আপনাকে লিখতে হবে এবং এটি অর্জনের জন্য মূল (এবং সমস্ত মডিউল) লেখা হয়নি।

কেবল অনুসন্ধান (স্লেভ অংশটি দেখুন) এবং একিগ্রিগেটর এটিকে উপকৃত করে বলে মনে হচ্ছে।

সম্পাদনা: অক্টোবর, 25
আমি প্রেসফ্লো 7 দেখতে পেয়েছি তবে এখনই এটি খুব বেশি সহায়তা করে কিনা তা আমি নিশ্চিত নই।
আমি প্রাসঙ্গিক কিছু খুঁজে পাইনি সুতরাং এর উত্তর পেতে সহায়তা করার জন্য একটু অনুগ্রহের চেষ্টা করি।

সম্পাদনা: অক্টোবর, 31
আমি মূলত এই বিষয় সম্পর্কে ক্রেলের মন্তব্য সম্পর্কে উদ্বিগ্ন : দাসদের কী করব?
মূলত, যদি আমি SELECTক্রীতদাসের কাছে প্রশ্নগুলি প্রেরণ করি তবে এর পুনরাবৃত্তিতে বিলম্বের সাথে কী ঘটে এবং আমি node_load()একটি নতুন নোড সংরক্ষণের পরে ঠিক কী করতে চাইব তাতে কি সমস্যা আছে ?

উত্তর:


17

আমি বর্তমানে এটি কীভাবে বাস্তবায়ন করছি তা এখানে।

প্রথমে আপনাকে এর মতো একটি সিলেক্টকিউরিএকসেটেন্ডার শ্রেণি স্থাপন করতে হবে:

class SlaveTarget extends SelectQueryExtender {
  public function __construct(SelectQueryInterface $query, DatabaseConnection $connection) {
    if ($connection->getTarget() != 'slave') {
      $connection = Database::getConnection('slave', $connection->getKey());
    }
    parent::__construct($query, $connection);
    $this->addTag('SlaveTarget');
  }
}

একবার আপনার কাছে তা হয়ে গেলে, আপনাকে কেবলমাত্র যা করতে হবে তা হল এক্সটেন্ডারটি বাড়ানোর জন্য অন্যান্য সমস্ত প্রশ্নের সন্ধান করুন। :) যদি তা বোঝা যায়। এখানে স্নিপেট।

/**
 * Implements hook_query_alter().
 */
function example_query_alter(QueryAlterableInterface $query) { 
  if (is_a($query, 'SelectQuery') && !$query->hasTag('SlaveTarget')) {
    $query->extend('SlaveTarget');
  }
}

এবং এখন আপনার সমস্ত সিলেক্টকিউরি দাসকে আঘাত করেছে ;-) এটিই কেবলমাত্র আমি এটি সম্পাদন করতে সক্ষম হয়েছি। যাইহোক এটি দুর্দান্ত কাজ করে।

এছাড়াও যদি আপনার এটি একটি কাস্টম মডিউলে থাকে তবে আপনি স্ল্যাভ টার্জেট সেট আপ করতে পারেন এটি স্লেভটার্জেট.ইঙ্ক ফাইলটিতে রয়েছে এবং আপনার মডিউল তথ্য ফাইলে একটি ফাইল [] = SlaveTarget.inc যুক্ত করতে পারেন।


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

এটি কেবল নির্বাচন প্রশ্নাবলীতে ডাটাবেসটিকে স্লেভে পরিবর্তন করছে। এটি কেবল তখনই ঘটে যখন সিলেক্টক্যুয়ারি দিয়ে কোয়েরিটি db_query না লিখে লেখা হয়েছে তাই ক্রীতদাসকে লক্ষ্য করে চিহ্নিত করা বা orোকানো বা আপডেট করার দরকার নেই। আমরা কোনও সমস্যা ছাড়াই 3 টি বিশাল উত্পাদন পরিবেশে এটি চালাচ্ছি। আমি মাইএসকিএল প্রতিলিপিটি প্রায় তাত্ক্ষণিক হিসাবে (আমার ক্ষেত্রে) হিসাবে খুব বেশি চিন্তিত হইনি তবে আমি দেখতে পারি যে এটি নির্দিষ্ট পরিবেশে কীভাবে একটি ছোট সমস্যা হতে পারে।
এরিকদুরান

আপনার উত্তরের জন্য ধন্যবাদ, এটি একটি দুর্দান্ত সমাধান, আমি এটি দেখতে পারি এটি আমাদের পরিবেশে কার্যকর কিনা if
tostinni

এরিক, এই কোডটি কোথাও অবদান বা স্যান্ডবক্স মডিউল হিসাবে আছে?
পল-মি


5

AutoSlave মডিউল পুনঃনির্দেশ SELECTপ্রশ্নের শুধুমাত্র পাঠযোগ্য করার রেপ্লিক্যান্ট ডেটাবেস এবং এটা অ্যাকাউন্ট রেপ্লিকেশন ল্যাগ লাগে।

মডিউল দস্তাবেজ অনুসারে, যখন নিম্নলিখিত সমস্ত শর্ত সত্য হয় এটি কেবলমাত্র পঠনযোগ্য প্রতিরূপ ব্যবহার করে:

  1. ক্যোয়ারী একটি নির্বাচিত ক্যোয়ারী
  2. অনুরোধ চলাকালীন এবং অনুমানিত প্রতিরূপের ব্যবধানের মধ্যে বাছাই করা প্রশ্নের মধ্যে থাকা সারণীগুলি লেখা হয়নি
  3. একটি লেনদেন শুরু করা হয়নি
  4. নির্বাচিত ক্যোয়ারির টেবিলগুলি ড্রাইভার সেটিংসে 'সারণী' বিকল্পে নির্দিষ্ট করা হয়নি
  5. একটি লক শুরু করা হয়নি (কোর ডিবি-লক এবং মেমক্যাস-লক সমর্থিত)

1

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


1
বর্তমানে প্রেসফ্লো 7 = ডি 7, এখনও কিছুই নেই (এখনও) যে প্রেসফ্লো ডি 7 করে না :(
টোস্টিনি

1

দ্রুপাল 7-এ ডাটাবেস বিমূর্তকরণ স্তরে সমস্ত আশ্চর্যজনক কাজ সত্ত্বেও, ড্রুপাল কোরটিকে বাক্সের বাইরে রেখে আশ্চর্যজনকভাবে করা কঠিন। অন্যরা যেমন বলেছে , অটোস্লেভ একটি বিকল্প, যদিও আমার জেদী অস্বীকারের কারণে আমি বিশ্বাস করি নি যে এটি করা খুব কঠিন হওয়া উচিত not

একটি সহজ সমাধান আমি খুঁজে পেয়েছি: সকলকে SELECT স্লেভ সার্ভারে রুট করতে , আপনি নীচের বিষয়বস্তু সহ select.incমূল includes/database/mysqlডিরেক্টরিটির ভিতরে একটি ফাইল তৈরি করুন :

<?php

/**
 * @file
 * Select builder for MySQL database engine, routing all SELECTs to the slave.
 */

/**
 * @addtogroup database
 * @{
 */

class SelectQuery_mysql extends SelectQuery {
  public function __construct($table, $alias = NULL, DatabaseConnection $connection, $options = array()) {
    $key = $connection->getKey();
    $connection = Database::getConnection('slave', $key);
    $options['target'] = 'slave';
    parent::__construct($table, $alias, $connection, $options);
  }
}

/**
 * @} End of "addtogroup database".
 */

এই পদ্ধতির সাথে কিছু ঝুঁকি রয়েছে:

  1. এই পদ্ধতিটি সকলকে হাইজ্যাক করবে SELECTএবং সেগুলি ক্রীতদাসের দিকে পরিচালিত করবে, যা যদি আপনার অনুলিপি করতে কোনও সন্দেহ থাকে তবে নিঃসন্দেহে সমস্যা সৃষ্টি করবে। সেই বাক্যটি আবার পড়ুন।
  2. আপনি যখন দ্রুপাল কোর আপগ্রেড করবেন, সম্ভবত এই ফাইলটি মুছে ফেলা হবে।
  3. যদি দ্রুপাল কোর নিজেই শিপিং শুরু includes/database/mysql/select.incকরত তবে আপগ্রেড করার সময় আপনার ফাইলটি ওভাররাইট হয়ে যাবে এবং আপনাকে ড্রপাল কোর সহ জাহাজীকরণের সিলেক্ট.নিস্কের নিজস্ব প্যাচ সংস্করণ বজায় রাখতে হবে।

আপনার যদি সেটিংস.এফপিএফ-তে নির্দিষ্ট কোন স্লেভ সার্ভার না থাকে তবে উপরের কোডটি কোনও সমস্যা তৈরি করবে না। এটি এখনও মাস্টার সার্ভারটি ব্যবহার করে করুণভাবে হ্রাস পাবে ।


হ্যাঁ, সংযোগটি "ক্রীতদাস" হিসাবে সেট করা থাকা সত্ত্বেও এটি উপস্থিত হয়, যদি ক্যোয়ারীতে নিজেই target => 'slave'বিকল্প সেট না থাকে তবে এটি ডিফল্ট সংযোগে চলবে। এটি একটি ব্যথার query_alterমাত্রায় আরও সহজে সংযোগের লক্ষ্য নির্ধারণ করা সহজ নয় ।
ডেভিড থমাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.