Metabase

مسیریابی پایگاه داده

با مسیریابی پایگاه داده، یک ادمین می‌تواند یک سؤال یک بار با استفاده از یک پایگاه داده بسازد، و سؤال کوئری خود را علیه یک پایگاه داده متفاوت با همان schema بسته به اینکه چه کسی سؤال را مشاهده می‌کند اجرا می‌کند.

مسیریابی پایگاه داده برای موارد زیر مفید است:

  • مدیریت تنظیمات جاسازی تعاملی که هر مشتری پایگاه داده خودش را با schemaهای یکسان دارد.

    مسیریابی پایگاه داده نمی‌تواند با جاسازی ایستا استفاده شود، چون مسیریابی پایگاه داده نیاز دارد افرادی که از سؤال‌ها و داشبوردهای جاسازی‌شده استفاده می‌کنند یک حساب متابیس داشته باشند. بدون یک حساب متابیس، متابیس نمی‌تواند کوئری‌ها را مسیریابی کند چون نمی‌داند چه کسی جاسازی را مشاهده می‌کند.

  • جابه‌جایی بین انبارهای داده dev و prod.

  • تغییر انبار داده هدف برای تیم‌های خاص.

  • مدیریت اتصال‌های جداگانه به همان انبار داده، با هر اتصال دارای مجوزهای جداگانه. این مدیریت اتصال شبیه جعل هویت اتصال برای پایگاه‌داده‌هایی است که از تغییر نقش‌ها توسط همان اتصال جلوگیری می‌کنند.

محدودیت‌های مسیریابی پایگاه داده

مسیریابی پایگاه داده پشتیبانی نمی‌شود در ClickHouse، Oracle، Spark SQL، و Vertica.

پایگاه‌داده‌های مختلف تنظیمات متفاوتی دارند، بنابراین آنچه می‌توانید بین آن‌ها مسیریابی کنید (پایگاه داده، schema، کاتالوگ داده، و غیره) بسته به اینکه از کدام انبار داده استفاده می‌کنید کمی متفاوت خواهد بود.

  • Athena: فقط مسیریابی بین اتصال‌های مختلف پشتیبانی می‌شود (مثلاً bucketهای مختلف، نقش‌ها، یا کاتالوگ‌ها).
  • BigQuery: فقط مسیریابی بین پایگاه‌داده‌ها در پروژه‌های مختلف پشتیبانی می‌شود.
  • Databricks: وقتی multi-catalog فعال نیست، می‌توانید بین کاتالوگ‌ها در همان host مسیریابی کنید. اگر multi-catalog فعال باشد، فقط می‌توانید بین پایگاه‌داده‌ها در hostهای جداگانه مسیریابی کنید.

نحوهٔ کار مسیریابی پایگاه داده

متابیس را به یک پایگاه داده به‌صورت عادی متصل می‌کنید. وقتی مسیریابی پایگاه داده را برای آن پایگاه داده روشن می‌کنید، به یک پایگاه داده router تبدیل می‌شود - پایگاه داده اصلی که مسیریابی کوئری‌ها به پایگاه‌داده‌های مقصد را مدیریت می‌کند. این پایگاه‌داده‌های مقصد را به این پایگاه داده router اضافه می‌کنید، با هر پایگاه داده مقصد مرتبط با یک مقدار برای ویژگی کاربری که به پایگاه داده router اختصاص می‌دهید. نیازی نیست پایگاه‌داده‌های مشتری خود را به‌عنوان اتصال‌های جداگانه داشته باشید.

با پایگاه داده router تنظیم‌شده با پایگاه‌داده‌های مقصدش، یک ادمین می‌تواند سپس سؤال‌هایی ایجاد کند که پایگاه داده router را کوئری می‌کنند. وقتی افراد دیگر وارد می‌شوند و این سؤال‌ها را مشاهده می‌کنند، متابیس کوئری‌ها را به پایگاه داده مقصد مشخص‌شده توسط ویژگی کاربر شخص مسیریابی می‌کند.

تنظیم مسیریابی پایگاه داده

مسیریابی پایگاه داده

  1. به یک پایگاه داده متصل شوید که همان schema همهٔ پایگاه‌داده‌های مشتری شما را دارد. این پایگاه داده باید یک پایگاه داده mock/dev باشد، ترجیحاً با برخی داده‌های جعلی. نام استفاده‌شده برای این پایگاه داده router نامی است که همه کاربران می‌بینند، صرف نظر از اینکه به کدام پایگاه داده مقصد مسیریابی می‌شوند، بنابراین مطمئن شوید نام برای همه منطقی است. (می‌توانید نام نمایشی را در هر زمان تغییر دهید).
  2. بعد از اتصال به این پایگاه داده اولیه (پایگاه داده "Router")، به بخش Database routing آن بروید و Enable database routing را toggle کنید.
  3. ویژگی کاربری که می‌خواهید برای تعیین اینکه یک کاربر باید به کدام پایگاه داده مسیریابی شود استفاده کنید را وارد کنید.
  4. در بخش Destination databases، روی Add کلیک کنید، سپس جزئیات اتصال را پر کنید. برای هر پایگاه داده مقصد، باید یک slug مشخص کنید - این slug مقداری است که متابیس برای تطبیق با ویژگی کاربری که به پایگاه داده router اختصاص داده‌اید استفاده می‌کند. در زمان اجرا، وقتی یک کاربر یک سؤال ساخته‌شده روی پایگاه داده router را مشاهده می‌کند، متابیس ویژگی کاربر شخص را بررسی می‌کند. اگر مقدار با این slug تطبیق داشته باشد، سؤال این پایگاه داده مقصد را کوئری می‌کند.

ویژگی‌های کاربر و مسیریابی پایگاه داده

برای اینکه مسیریابی پایگاه داده کار کند، کاربران شما باید یک ویژگی کاربر داشته باشند که متابیس بتواند از آن برای مسیریابی آن‌ها به پایگاه داده مقصد درست استفاده کند.

می‌توانید ویژگی‌های کاربر را به صورت دستی اضافه کنید، یا از طریق Single Sign-On (SSO) از طریق JWT یا SAML.

اگر یک کاربر ادمین فاقد یک مقدار برای ویژگی کاربر باشد، پایگاه داده router را می‌بیند. همچنین می‌توانید مقدار را برای ادمین‌ها (یا هر کاربری) به صراحت به __METABASE_ROUTER__ تنظیم کنید.

اگر یک حساب کاربر غیرادمین فاقد یک مقدار معتبر برای ویژگی کاربر باشد، اصلاً نمی‌توانند سؤال را مشاهده کنند.

به مستندات ما دربارهٔ ویژگی‌های کاربر مراجعه کنید.

تست مسیریابی پایگاه داده

برای دیدن اینکه آیا مسیریابی پایگاه داده کار می‌کند:

  1. به‌عنوان یک ادمین وارد شوید.
  2. یک سؤال ایجاد کنید که پایگاه داده router را کوئری می‌کند.
  3. یک حساب کاربر ایجاد کنید و ویژگی کاربری که با پایگاه داده router خود مرتبط کرده‌اید را اضافه کنید. مقدار را به‌عنوان slug یکی از پایگاه‌داده‌های مقصد تنظیم کنید.
  4. در یک تب private/incognito، به‌عنوان کاربر وارد شوید و سؤالی که ایجاد کردید را مشاهده کنید. باید داده از پایگاه داده مقصد مرتبط با ویژگی کاربر شخص را ببینید، نه داده در پایگاه داده router.

اضافه کردن پایگاه‌داده‌های مقصد با API

برای اضافه کردن پایگاه‌داده‌های مقصد به‌صورت برنامه‌نویسی، نیاز به یک کلید API دارید.

چون هر موتور پایگاه داده تنظیمات خودش را دارد، توصیه می‌کنیم که از تب Network در ابزارهای توسعه‌دهنده مرورگر خود استفاده کنید در حالی که به صورت دستی یک پایگاه داده مقصد را در UI اضافه می‌کنید. به این ترتیب می‌توانید درخواستی که متابیس تولید می‌کند را ببینید.

وقتی روی Add کلیک می‌کنید، یک درخواست POST به /mirror-database?check_connection_details=true می‌بینید. روی آن درخواست کلیک کنید تا headerها و payload JSON درخواست را دریافت کنید.

اضافه کردن یک پایگاه داده مقصد جدید: مثال با PostgreSQL از طریق curl

در اینجا یک دستور curl برای اضافه کردن یک پایگاه داده PostgreSQL به‌عنوان یک پایگاه داده مقصد آورده شده است. اینجا slug پایگاه داده توسط name تعریف شده است (در این مورد، Green PostgreSQL).

curl 'http://localhost:3000/api/ee/database-routing/mirror-database?check_connection_details=true' \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'X-Api-Key: mb_CpkoZHvSB5R+P+WsuXWRbdT3WbVphFv/rgMX9UGux/4=' \
  --data '{
  "router_database_id": 2,
  "mirrors": [
    {
     "details": {
        "host": "red-postgres",
        "port": 5432,
        "dbname": "sample",
        "user": "metabase",
        "use-auth-provider": false,
        "password": "metasample123",
        "schema-filters-type": "all",
        "ssl": false,
        "tunnel-enabled": false,
        "destination-database": true
      },
      "name": "Green PostgreSQL",
      "engine": "postgres"
    }
  ]
}'

شیء details بسته به پایگاه داده مجموعه‌ای متفاوت از کلیدها خواهد داشت.

اگر payload را از تب Network مرورگر می‌گیرید، ممکن است تنظیمات اضافی و غیرالزامی ببینید:

curl 'http://localhost:3000/api/ee/database-routing/mirror-database?check_connection_details=true' \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'X-Api-Key: mb_CpkoZHvSB5R+P+WsuXWRbdT3WbVphFv/rgMX9UGux/4=' \
  --data '{
  "router_database_id": 2,
  "mirrors": [
    {
      "is_on_demand": false,
      "is_full_sync": true,
      "is_sample": false,
      "cache_ttl": null,
      "refingerprint": null,
      "auto_run_queries": true,
      "schedules": {
        "metadata_sync": {
          "schedule_minute": 14,
          "schedule_day": null,
          "schedule_frame": null,
          "schedule_hour": null,
          "schedule_type": "hourly"
        },
        "cache_field_values": {
          "schedule_minute": 0,
          "schedule_day": null,
          "schedule_frame": null,
          "schedule_hour": 18,
          "schedule_type": "daily"
        }
      },
      "details": {
        "host": "red-postgres",
        "port": 5432,
        "dbname": "sample",
        "user": "metabase",
        "use-auth-provider": false,
        "password": "metasample123",
        "schema-filters-type": "all",
        "ssl": false,
        "tunnel-enabled": false,
        "destination-database": true
      },
      "name": "Red PostgreSQL",
      "engine": "postgres"
    }
  ]
}'