بانکهای اطلاعاتی سطر گسترده

مقدمه ای بر کاساندرا

نصب و پیکربندی کاساندرا

حال که با مفاهیم کلی کاساندرا آشنا شده‌ایم، به نحوه نصب و راه‌اندازی آن مي‌پردازیم. با توجه به این‌که کاساندرا با استفاده از جاوا توسعه داده شده، به همین دلیل، نصب و راه اندازی آن روی سیستم عامل‌هاي مختلف بسیار ساده است. برای استفاده از این پایگاه‌داده، باید از جاوا نسخه ۶ یا بالاتر استفاده كرد. پس از دانلود و نصب جاوا، نوبت به دانلود محتوای برنامه از آدرس زیر است:

http://cassandra.apache.org/download/

روی سیستم عامل ویندوز، پس از دانلود فایل فشرده موجود در سایت پروژه، باید آن را در یک پوشه دلخواه extract و پس از آن متغیرهای محیطی مناسبی را که برای کارکرد درست برنامه لازم هستند، مقدار‌دهی كرد. برای این کار، باید متغیر محیطی JAVA_HOME به پوشه bin از نسخه‌اي از جاوا که روي سیستم مورد استفاده نصب است، اشاره كند. یک متغیر نیز با نام CASSANDRA_HOME مورد نیاز است که به پوشه فایل‌هاي extract شده کاساندرا اشاره می‌کند. پس از تعیین این متغیرهای محیطی در ویندوز (environmental variables) باید پنجره خط فرمان را باز کرده و دستورات زیر را اجرا كرد:

C:\> cd c:\development\cassandra\bin
C:\> cassandra.bat

با این دستورات کاساندرا روي سیستم مذکور شروع به کار خواهد كرد. برای چک کردن اجرای کاساندرا، ابتدا با دستورهاي زیر کلاینت آن را اجرا کرده و سپس با دستور Connect به پایگاه داده مورد نظر متصل می‌شویم:

C:\> cd c:\development\cassandra\bin
C:\> cassandra-cli.bat
Connect localhost/9160

در صورت اتصال موفقیت آمیز کلاینت به سرور، کاساندرا اجرا شده و آماده کار است. برای چگونگی استفاده از کاساندرا روي لینوکس نیز روش‌های مشابهی وجود دارد که با یک جست‌وجوی ساده در اینترنت قابل دسترس است.

کار با داده‌ها

اکنون، نوبت به وارد‌كردن داده‌هاي مثال مطرح شده هتل‌ها در کاساندرا است. برای این کار از خط فرمان و کلاینت CLI کاساندرا استفاده خواهیم کرد.ابتدا با دو دستوری که در بالا گفته شد کلاینت کاساندرا را اجرا می‌کنیم. در این صورت پیغام خوش‌آمد نشان داده مي‌شود و کاربر آماده استفاده از کلاینت است. نخستين گام، برقراری اتصال به نود اجرایی کاساندرا است. برای این کار از دستور connect استفاده مي‌كنيم:

connect localhost/9160;
Connected to: “Test Cluster” on localhost/9160

در صورت اتصال موفقیت آمیز کلاینت به سرور، پیغام اتصال موفقیت آمیز در زیر دستور نمایش داده خواهد شد. حال باید یک Keyspace جدید با نام Hotelier در پایگاه داده کاساندرا بسازیم. برای این کار از دستور زیر استفاده مي‌کنیم:

create keyspace Hotelier;
d105c4f1-3c93-11e0-9fb5-e700f669bcfc

در صورت موفقیت‌آمیز بودن عملیات، شناسه منحصر به فرد فضای کلیدی مورد نظر به نمایش در‌خواهد آمد. حال، برای ایجاد Column Family در این فضای کلیدی ، ابتدا باید به کلاینت بگوییم که مي‌خواهیم از آن استفاده كنيم:

use Hotelier;
Authenticated to keyspace: Hotelier

اکنون، با استفاده از دستور زیر یک Column Family جدید در فضای کلیدی Hotelier ایجاد مي‌كنيم:

create column family Hotel with comparator = UTF8Type and
column_metadata =
[
{column_name: name, validation_class: UTF8Type},
{column_name: phone, validation_class: UTF8Type},
{column_name: address, validation_class: UTF8Type},
{column_name: city, validation_class: UTF8Type},
{column_name: state, validation_class: UTF8Type},
];
۰۰۳۸۹۸۱۲-۳c94-11e0-9fb5-e700f669bcfc

در صورت موفقیت آمیز بودن عملیات، شناسه شیء ایجاد شده به نمایش در مي‌آید. برای ورود داده‌هاي جدید باید از دستور set مطابق آنچه در زیر آمده، استفاده كنيم:

set Hotel[‘THE_043’][‘name’] = ‘Espinas’;
Value inserted.
set Hotel[‘THE_043’][‘phone’] = ‘۰۲۱-۶۶۳۵۲۵۶۵’;
Value inserted.
set Hotel[‘THE_043’][‘address’] = ‘Keshavarz Blvd.’;
Value inserted.
set Hotel[‘THE_043’][‘city’] = ‘Tehran’;
Value inserted.
set Hotel[‘THE_043’][‘state’] = ‘Tehran’;
Value inserted.

برای بقیه رکوردهای مطرح شده در بخش‌هاي قبل نیز باید دستورات بالا را برای هر رکورد تکرار كرد. برای دریافت داده‌هاي موجود در Keyspace نیز باید از دستور get استفاده كرد که نمونه‌اي از آن در زیر آمده است:

get User[‘THE_043’];
=> (column=name, value=Espinas, timestamp=1298504259386000)
=> (column=phone, value=021-66352565, timestamp=1298504239938000)
=> (column=address, value=Keshavarz Blvd., timestamp=1298504248570000)
=> (column=city, value=536d697468, timestamp=1298504248570000)
=> (column=state, value=4a6f686e, timestamp=1298504248570000)
Returned 3 results.

همان‌طور که مشخص است، در اینجا دو ستون به‌جای نشان دادن مقدار رشته‌ای، مقداری HEX را نمایش مي‌دهند. دلیل این امر آن است که کلاس validation تعیین شده برای این ستون‌ها در حالت get ، BytesType تعریف‌شده است. برای نمایش مقدار به‌صورت رشته‌ای، باید از validation کلاس UTF8Type استفاده كرد.

اتصال به کاساندرا از طریق برنامه‌ها

برای اتصال به کاساندرا، به‌خصوص برای استفاده از API در برنامه‌هاي کاربردی مختلف، از Thrift استفاده مي‌شود. Thrift در اصل یک پروتکل است که توسط سازنده کاساندرا برای برقراری ارتباط با آن از طریق زبان‌هاي مختلف برنامه‌نویسی به ساده‌ترین و کم دردسر‌ترین راه ممکن ایجاد شده است. اجرای Thrift از طریق دانلود کد آن در سیستم‌عامل حامل کاساندرا انجام مي‌پذیرد و به همین دلیل، اجرای آن روي لینوکس بسیار ساده‌تر است. با این حال، با استفاده از Cygwin و کامپایلر اختصاصی Thrift، مي‌توان آن را در ویندوز کامپایل و اجرا كرد. برای کسب اطلاعات بیشتر در این زمینه، به آدرس http://wiki.apache.org/thrift/ThriftInstallationWin32 مراجعه كنيد.

از تفاوت‌هاي کلی موجود میان مدل کاساندرا و مدل سنتی رابطه‌اي مي‌توان به مواردی نظیر نبود زبان پرس‌و‌جو، نبود یکپارچگی مرجعی و در نتیجه نبود عملیات Join و انطباق بهتر کاساندرا با مدل Denormalize شده داده‌اي اشاره‌كرد.
پس از کامپایل و اجرای Thrift روي سیستم مورد نظر، نوبت به استفاده از کتابخانه‌هاي آن برای زبان‌هاي مختلف مي‌رسد. برای دستیابی به چنین کتابخانه‌هایی، مي‌توان به پوشه‌هاي مرتبط در فایل دانلود شده Thrift مراجعه (در پوشه lib) یا دستور زیر را در Thrift اجرا كرد:

thrift –gen csharp Cassandra.thrift

این دستور، کلاس‌های مناسب برای استفاده از طریق C# را بر اساس فایل‌هاي Thrift موجود فراهم مي‌سازد. نمونه‌های این کدها با یک جست‌وجوی ساده از اینترنت قابل دریافت است. توجه کنید که با کامپایل این کدها باید فایل DLL مربوط را ایجاد‌کرده و بعدها در پروژه‌هاي مورد نظر به‌عنوان reference استفاده كنيد. راه‌حل ساده‌تر ساخت کتابخانه‌هاي Thrift برای C#، مراجعه به پوشه lib/csharp/ و استفاده از Thrift.csproj برای ساخت Thrift.dll و مراجعه به پوشه lib/csharp/ThriftMSBuildTask و استفاده از ThriftMSBuildTask.csproj برای تولید کتابخانه‌هاي C# از روی فایل‌هاي Thrift و کامپایل آن‌ها در کتابخانه Thriftlmpl.dll است.

استفاده از کاساندرا از طریق .NET

اکنون نوبت به بررسی نحوه اتصال و استفاده از کاساندرا مي‌رسد. به همین دليل، مثال هتل‌هاي ارائه شده در بالا را در نظر گرفته و روش کار را از طریق محیط .NET و با زبان C# مرور مي‌کنیم. بدیهی است که استفاده از زبان‌هاي دیگر به‌جای C# برای کار با کاساندرا نیز بسیار ساده است و تنها در اصول زبان با نمونه حاضر متفاوت خواهند بود. پس از ساخت دو فایل dll که در بخش قبل مطرح شدند و پس از اضافه کردن آن‌ها به‌عنوان رفرنس در یک پروژه جدید کنسول C#، آماده نوشتن یک برنامه برای کار با کاساندرا هستیم. طبق معمول قبل از هر کار باید فضای نام کاساندرا را در کد مورد استفاده تعریف کنیم:

using Apache.Cassandra;
using Thrift.Protocol;
using Thrift.Transport;

پس از این کار، مي‌توانیم از انواع داده‌ و کلاس‌هاي کتابخانه Thrift برای ارتباط با کاساندرا استفاده كنيم. نخستين کار، ایجاد یک نمونه از کلاس‌هاي transport، protocol و شیء Client است که برای ارتباط با سرور به‌کار خواهند رفت:
برای دسترسی به سرور محلی و روي پورت ۹۱۶۰ //

TTransport transport =
new TSocket(“localhost”, ۹۱۶۰);
TProtocol protocol =
new TBinaryProtocol(transport);

ایجاد یک نمونه از کلاینت کاساندرا بر اساس //پروتکل تعریف شده در بالا برای اتصال//

Cassandra.Client client =
new Cassandra.Client(protocol);

پس از این نمونه سازی‌ها و مقداردهی‌هاي اولیه کلاینت، از متد زیر برای اتصال کلاینت به سرور استفاده خواهد شد:

transport.Open();

حال که اتصال به پایگاه داده آماده است، نوبت فراگیری روش دریافت داده‌ها از سرور است. برای این کار، باید ابتدا ستون‌ها را با یک شیء ColumnPath مشخص‌کرده و سپس مورد استفاده قرار دهید. بنابراين، برای آدرس‌دهی ستون نام هتل از Column Family هتل که در بالا مطرح شده است خواهیم داشت:

ColumnPath nameColumnPath =
new ColumnPath()
{
Column_family = “Hotel”,
Column = utf8Encoding.GetBytes(“name”)
};

اکنون، برای دریافت یک مقدار منفرد بر اساس ستون “نام” باید از اشیاء و متدهای زیر استفاده کرد:

ColumnOrSuperColumn returnedColumn = client.get(“Hotelier”, “۱”, nameColumnPath, ConsistencyLevel.ONE);

در کد بالا، با استفاده از متد get در شیء کلاینت، مي‌توان مقدار منفرد یک ستون خاص از یک سطر خاص را بازخوانی كرد. در دستور get، نخستين پارامتر، Keyspace مورد نظر برای کار(در اینجا Hotelier) است، پارامتر دوم سطر مورد‌نظر را مشخص‌کرده و پارامتر سوم ستون مورد نظر را برای دریافت مقدار تعیین مي‌كند. برای چاپ این مقدار در کنسول از کد زیر استفاده مي‌کنیم:

Console.WriteLine(
“Column Data in Hotelier/Hotel: name: {0}, value: {1}”
,utf8Encoding.GetString(returnedColumn.Column.Name)
,utf8Encoding.GetString(returnedColumn.Column.Value)
);

بنابراين، نتیجه چاپ شده بر‌اساس داده‌هاي مثال قبل، اين‌گونه خواهد بود:

Column Data in Hotelier/Hotel: name: name, value: Espinas

دریافت مقادیر کل سطر، فرآیندی پیچیده‌تر است. برای این کار باید از متد multiget_slice در شیء کلاینت استفاده‌كرد. با این حال، استفاده از این متد تکنیک‌هاي خاصی دارد که در کد زیر آورده شده است:

SlicePredicate predicate = new SlicePredicate()
{
Slice_range = new SliceRange()
{
آغاز و پایان نباید خالی باشند//
Start = new byte[0],
Finish = new byte[0],
Count = 10,
Reversed = false
};

}

تعریف یک نوع داده‌اي برای دریافت داده‌ها از طریق متد مالتی گت //

ColumnParent parent =
new ColumnParent() {Column_family = “Hotel”};

تعریف یک دیکشنری برای ذخیره داده‌هاي برگردانده شده //

Dictionary<string , List<ColumnOrSuperColumn>> results =
client.multiget_slice(
“Hotelier”,
new List<string>() { “۱”, “۲”},
parent,
predicate,
ConsistencyLevel.ONE);

حلقه برای پیمایش داده‌هاي دریافت شده و چاپ آن‌ها در کنسول//

foreach (KeyValuePair<string, List<ColumnOrSuperColumn>> resultPair in results)
{
Console.WriteLine(“Key: {0}”, resultPair.Key);

حلقه برای پیمایش لیست ذخیره‌‌شده در مقدار دیکشنری //

foreach (ColumnOrSuperColumn resultColumn in resultPair.Value)
{
Column column = resultColumn.Column;
Console.WriteLine(“name: {0}, value: {1}”,
utf8Encoding.GetString(column.Name),
utf8Encoding.GetString(column.Value));
}
}

نتیجه اجرای کد فوق در کنسول خط فرمان از قرار زیر خواهد بود:

name: name, value: Espinas
name: phone, value: 021-66352565
name: address, value: Keshavarz Blvd.
name: city, value: Tehran
name: state, value: Tehran
name: name, value: Evin
name: phone, value: 021-22668562
name: address, value: Chamran Highway
name: city, value: Tehran
name: state, value: Tehran

پس از دریافت داده‌ها و اتمام کار با پایگاه داده، باید با استفاده از متد close، اتصال کلاینت با محیط پایگاه داده را بست‌:

transport.Close();

امروزه CQL که زبانی مشابه با SQL است جایگزین تریفت شده است و برای تولید برنامه های مبتنی بر کاساندرا بهتر است سراغ این استاندارد جدید بروید .

جمع‌بندی
در نوشتار حاضر، به معرفی و بررسی ساختار‌داده‌اي و مفاهیم جدید موجود در پایگاه داده کاساندرا پرداختیم و با مطرح‌کردن یک مثال، به توضیح و تبیین بهتر ساختار داده‌اي جدید و نامأنوس آن پرداختیم. در ادامه، نحوه نصب و راه‌اندازی کاساندرا در ویندوز را بررسی کرده و سپس‌، چگونگي استفاده از آن را با استفاده از کلاینت استانداردش مورد بررسی قرار دادیم. در ادامه رابط Thrift و روش برقراری ارتباط با کاساندرا از طریق برنامه‌هاي کاربردی را مرور کرده و روش تهیه کتابخانه‌هاي رابط را برای زبان‌هاي مختلف برنامه‌نویسی و چگونگي استفاده از کاساندرا از طریق محیط دات‌نت را برای یک برنامه کاربردی ساده کنسولی بررسی کردیم. به يقين نوشتار حاضر نگاهی اجمالی به پایگاه داده NoSQL کاساندرا است و بسیاری از مفاهیم و مطالب حرفه‌اي مرتبط با این پایگاه‌داده‌، به خصوص تکنیک‌هاي کلاسترسازی و جایگزین‌سازی ماشین‌هاي مختلف که نقطه قوت کاساندرا به شمار مي‌آیند، به دليل بسیاری از محدودیت‌ها مطرح نشدند. با این حال، سعی شده تا آشنایی کلی با این مجموعه جدید برای کاربر فراهم شود تا در صورت علاقه، ادامه راه و ابزار برای جست­‌وجوی وی به سادگی فراهم باشد. برای آشنایی بیشتر با مفاهیم پیشرفته‌تر کاساندرا مي‌توانيد به اينترنت مراجعه كنيد. همچنين، در بخش کتابخانه همین پرونده نیز مي‌توانید منابع ارزشمندی برای کسب اطلاعات بیشتر در رابطه با کاساندرا بیابید که در خیلی از زمینه‌ها راهگشا است.

۰

میانگین امتیاز

شما هم امتیاز بدهید!

امتیاز کاربران: ۴٫۱۳ ( ۱۳ رای)
برگهٔ قبلی 1 2

۲ دیدگاه

  1. سلام

    خیلی ممنون از مطلب خوبتون

    می خواستم سول کنم آیا شما در زمینه اشکالات این نوع پایگاه های اطلاعاتی هم تجربه ای داشته اید یا خیر؟

    چون اینگونه دیتابیس ها برای انجام Join مشکلاتی دارند برای مثال فرض کنید اگر اطلاعات افراد روی ۴ نود باشد اطلاعات حسابهای افراد روی ۸ نود و اطلعات مربوط به تراکنشهای آنها روی ۴۰ نود و نیاز به Join  نمودن روزانه داده ها به تعداد زیاد داشته باشیم آیا کاساندرا یا SparkSQL یا … می تواند مدیریت داده ها انجام دهد

    با تشکر

    1. سلام .
      بنده به طور عملی چند سالیست که درگیر این پروژه ها هستم. اوایل فقط با هوس اینکه نو اسکیو ال کار کنیم به سمت این بانکها آمدم و طی اذیت هایی که بابت انتخاب نادرست بانک اطلاعاتی متحمل شدیم،‌تجربیات خیلی خوبی در این حوزه کسب کردم .
      شما اگر نیاز به Join دارید نباید سمت کاساندرا بیایید و اصلا قرار نیست که شما یک بانک رابطه ای را به کاساندرا منتقل کنید. کاساندرا بیشتر برای ذخیره داده هایی استفاده می شود که به ازای یک کلید خاص قرار است داده های مختلفی به یک ترتیب مشخص که معمولا ترتیب زمانی است ذخیره شوند .
      به عنوان مثال فرض کنید که شما قصد طراحی دیتابیسی برای نرم افزار تلگرام دارید . در این نرم افزار افراد می توانند در هر متن از هشتگ ها استفاده کنندو قرار است با کلیک روی هر هشتگ، تمام متنهایی که آن هشتگ را دارند به کاربر نشان دهید. در این جا برای فقط همین قسمت ، به سراغ کاساندرا بروید و جدولی بگیرید با نام هشتگ که کلید هر سطر آن خود هشتگ باشد و هر متنی که هشتگ داشت، به سطر همان هشتگ در کاساندرا به ترتیب زمانی افزوده شود. (البته اطلاعاتی مانند زمان و نویسنده متن و گروه هم باید ذخیره شود .)
      حال با کلیک کاربر روی هر هشتگ، کافیست ده تا ستون بالایی این سطر را بخوانید و به کاربر نمایش دهید. در این صورت شما با سرعت بالا وبدون نیاز به جوین و اتصال کار خود را انجام داده اید . این سطر مربوط به هشتگ مثلا #رمضان ممکن است بسیار عریض شود اما شما همیشه از بالای جدول اطلاعات را به کاربر نمایش می دهید.
      به عنوان مثال دیگر فرض کنید می خواهید فعالیتهای یک کاربر در سایت خود را ذخیره کنید اینکه به ازای هر باری که وارد سایت شما می شود چه صفحاتی را کلیک می کند و چه لینکهایی را مشاهده می کند. شما جدولی در کاساندرا در نظر میگیرید که کلید هر سطر آن، ترکیب نام کاربری شخص و آی دی جلسه جاری کاربر(سشن) باشد. با هر کلیک کاربر شما یک ستون به این سطر اضافه میکنید که بعدا بتوانید براساس کاربر، تحلیل مربوطه را انجام دهید.
      مثال دیگر ذخیره لاگهای یک برنامه است . به ازای هر خطا کافیست در سطر مربوط به آن خطا یک ستون اضافه و ذخیره کنید و مدیر سیستم هم هر وقت نیاز به مشاهده لاگ ها داشت ، به ترتیب از بالای سطر شروع به نمایش خواهید کرد. در این جا هم نیاز به جوین و اتصال نداریم .
      بنابراین باز هم تاکید می کنم که اگر ماهیت کار شما یک کار رابطه ایست سراغ مای اس کیو ال ،‌پستگرس یا اس کیو ال سرور و … بروید و فقط بخشهایی از کار را به کاساندرا بسپارید که با ساختار داده ای آن مطابقت دارد . قبلا در مقاله ای با نام «نگاهی اجمالی به نسخه های مختلف مای اس کیو ال – MySQL » توضیح داده ام که در نسخه های جدید مای اس کیو ال ، امکان اتصال مای اسکیو ال به کاساندرا فراهم شده است و این یعنی این که این دو نوع دیتابیس مکمل هم هستند و قرار نیست کاساندرا جای مای اس کیو ال را بگیرد و یا بالعکس .
      موفق باشید .

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.

دکمه بازگشت به بالا