Mongo Database
(۸ ویرایش میانی توسط یک کاربر نشان داده نشدهاست) | |||
سطر ۵۲: | سطر ۵۲: | ||
دارای API های زبانهای عمومی بوسیله Driverها و shell مونگو میباشد. | دارای API های زبانهای عمومی بوسیله Driverها و shell مونگو میباشد. | ||
+ | |||
+ | |||
+ | ==نصب و راه اندازی== | ||
+ | |||
+ | ===نحوه نصب MongoDB بر روی سیستم عامل Debian=== | ||
+ | |||
+ | برای نصب در ابتدا باید آرشیو مونگو را به مخازن اضافه نماییم: | ||
+ | |||
+ | ۱- | ||
+ | <div dir=ltr lang=en> | ||
+ | sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10 | ||
+ | </div> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ۲- | ||
+ | <div dir=ltr lang=en> | ||
+ | echo 'deb http://downloads-distro.mongodb.org/repo/debian-sysvinit dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list | ||
+ | </div> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ۳- حال در این مرحله آرشیو پکیج های خود را آپدیت نمایید: | ||
+ | <div dir=ltr lang=en> | ||
+ | sudo apt-get update | ||
+ | </div> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ۴- در این مرحله آخرین نسخه پایدار مونگو را نصب می کنیم: | ||
+ | <div dir=ltr lang=en> | ||
+ | sudo apt-get install mongodb-10gen | ||
+ | </div> | ||
+ | |||
+ | |||
+ | |||
+ | ===نحوه نصب درایور پایتون مونگو=== | ||
+ | |||
+ | برای اینکه بتوانیم با پایتون به مونگو وصل شویم باید درایور یا بسته یا کتابخانه pymongo را بر روی سرور نصب نماییم. | ||
+ | |||
+ | |||
+ | برای نصب pymongo فقط کافیست با pip آن را نصب نمایید: | ||
+ | |||
+ | |||
+ | <div dir=ltr lang=en> | ||
+ | pip install pymongo | ||
+ | </div> | ||
+ | |||
+ | |||
+ | |||
+ | ===نحوه تنظیمات مونگو=== | ||
+ | |||
+ | |||
+ | در این جان بخشی از تنظیمات که مهمتر هستند را ذکر میکنیم. | ||
+ | |||
+ | برخی موارد شما نیاز دارید تا مونگو را با توجه به نیاز خود تغییر دهید. مثلاً عوض کردن مسیر ذخیره اطلاعات یا سیستم دارای مجوز ورود باشد یا نباشد! که در اینجا به شرح یکسری از این موارد خواهیم پرداخت. | ||
+ | |||
+ | |||
+ | نکته: فایل اصلی تنظیمات مونگو در مسیر زیر می باشد: | ||
+ | |||
+ | <div dir=ltr lang=en> | ||
+ | /etc/mongod.conf | ||
+ | </div> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | * تغییر مسیر حافظه دیتابیس: | ||
+ | |||
+ | برای تغییر مسیری که مونگو دادههای خود را در حافظه ذخیر میکند کافیست dbpath را در فایل mongod.conf مطابق با نیاز خود تغییر دهید. | ||
+ | بصورت پیشفرض در مسیر زیر می باشد: | ||
+ | |||
+ | <div dir=ltr lang=en> | ||
+ | /var/lib/mongodb | ||
+ | </div> | ||
+ | |||
+ | |||
+ | * تغییر مسیر لاگ ها(logs): | ||
+ | |||
+ | کافیست مسیر خود را در پارامتر logpath تغییر دهید. | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | * تغییر پورت اتصال دیتا بیس: | ||
+ | |||
+ | سرویس mongod پیشفرض از پورت ۲۷۰۱۷ استفاده میکند. همچنین برای instance گرفتن هم از این پورت استفاده میکند، لذا برای استفاده از درایورها باید از این پورت استفاده نمایید تا بتوانید از مونگو نمونه بگیرید، مگر اینکه شما در قسمت تنظیمات پارامتر port را تغییر دهید. | ||
+ | پس برای تغییر پورت باید port را در تنظیمات تغییر دهید. | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | * در دسترس گذاشتن مونگو: | ||
+ | |||
+ | بصورت پیشفرض مونگو فقط بر روی local قابل دسترس می باشد، و اگر شما میخواهید این دسترسی را تغییر دهید باید پارامتر bind_ip را در در فایل تنظیمات تغییر دهید. | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | * اعمال مجوز ورود: | ||
+ | |||
+ | اگر شما میخواهید بر روی مونگو و یا هر بخش از دیتابیس خود حق دسترسی و مجوز تعریف نمایید باید مقدار پارامتر auth برابر با true باشد.در غیر این صورت بدون وارد کردن نام کاربری و رمز عبور شما میتوانید از از تمامی بخشها بدون هیچ محدودیتی استفاده نمایید.پس بهتر است این پارامتر را true کرده و برای دیتابیس خود حساب کاربری ایجاد نمایید. | ||
+ | |||
+ | تذکر: پیش از true کردن این پارامتر نخست حساب کاربری خود را ایجاد نمایید و بعد از آن سرویس مونگو را stop کرده و بعد این پارامتر را true نمایید و مجدداً سرویس را راه اندازی نمایید! | ||
+ | توجه: در جلوتر نحوه ساخت حساب کاربری (یوزر) آموزش خواهیم داد. | ||
+ | |||
+ | سایر پارامترها را میتوانید در داخل فایل تنظیمات(mongod.conf) ملاحضه نمایید، | ||
+ | این فایل تمامی پارامترها را بخوبی توضیح داده. | ||
+ | |||
+ | |||
+ | |||
+ | ===راه اندازی سرویس=== | ||
+ | |||
+ | |||
+ | برای راه اندازی سرویس باید سرویس آن را استارت نمایید(البته بعد از اولین نصب اگر سرور را ریستارت کرده باشید نیازی به این کار نمی باشد!) | ||
+ | |||
+ | به این صورت سرویس را اجرا نمایید: | ||
+ | <div dir=ltr lang=en> | ||
+ | /etc/init.d/mongod start | ||
+ | </div> | ||
+ | |||
+ | |||
+ | برای وارد شدن به shell مونگو کافیست در ترمینال mongo را اجرا نماییدتا وارد محیط شل مونگو شوید. | ||
+ | |||
+ | برای دیدن دیتابیس های موجود کافیست دستور زیر را استفاده نمایید: | ||
+ | <div dir=ltr lang=en> | ||
+ | show dbs | ||
+ | </div> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | برای کار با دیتابیس خود باید با دستور use دیتا بیس خود را انتخاب نمایید. | ||
+ | <div dir=ltr lang=en> | ||
+ | Use IBSng | ||
+ | </div> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===ساخت حساب کاربری(ایجاد username و password)=== | ||
+ | |||
+ | |||
+ | نخست باید اول وارد دیتابیس admin شوید، برای این کار از دستور زیر استفاده نمایید: | ||
+ | <div dir=ltr lang=en> | ||
+ | use admin | ||
+ | </div> | ||
+ | |||
+ | |||
+ | نکته: تمامی تنظیمات اصلی خود مونگو در این دیتابیس(admin) قرار دارد. | ||
+ | |||
+ | بعد از متد createUser برای ساخت حساب کاربری استفاده مینماییم. | ||
+ | |||
+ | به مثال زیر دقت نمایید، در این مثال قصد داریم برای کل مونگو یک یوزر با تمامی دسترسی ها(روت) بسازیم. | ||
+ | <div dir=ltr lang=en> | ||
+ | use admin | ||
+ | db.createUser( | ||
+ | { | ||
+ | user: "root", | ||
+ | pwd: "1234", | ||
+ | roles: [ "root" ] | ||
+ | } | ||
+ | ) | ||
+ | </div> | ||
+ | |||
+ | |||
+ | بیشتر موارد واضح هستند، ولی شاید از خود بپرسید چه roles هایی وجود دارد. | ||
+ | |||
+ | همانطور که آشکار هست رول root برای حق دسترسی کامل هست، بقیه رول ها را در زیر می نویسیم: | ||
+ | |||
+ | <div dir=ltr lang=en> | ||
+ | userAdminAnyDatabase , dbAdminAnyDatabase, readWriteAnyDatabase | ||
+ | </div> | ||
+ | |||
+ | |||
+ | رول های دیگری هم وجود دارند ولی اگر شما هر سه رول بالا را باهم به یک یوزر دهید مطابق این خواهد بود که به آن رول root داده اید. | ||
+ | |||
+ | درضمن در مونگو حتی شما قابلیت این را دارید که رول هایی بیشتری را تعریف نمایید. | ||
+ | |||
+ | برای اطلاعات بیشتر در مورد رول ها این [http://docs.mongodb.org/manual/reference/built-in-roles/ لینک] را مطالعه نمایید. | ||
+ | |||
+ | براای اطلاعات بیشتر در مورد ساخت حساب کاربری این [http://docs.mongodb.org/manual/reference/method/db.createUser/#db.createUser لینک] را مطالعه نمایید. | ||
+ | |||
+ | بعد از انجام موارد فوق به فایل تنظیمات مونگو رفته و پارامتر auth را برابر با true نمایید. و سرویس را مجدداً راه اندازی نمایید. | ||
+ | |||
==شروع آموزش== | ==شروع آموزش== | ||
سطر ۱۴۹: | سطر ۳۴۰: | ||
با دستور update میتوان اطلاعات را ویرایش نمود: | با دستور update میتوان اطلاعات را ویرایش نمود: | ||
<div dir=ltr lang=en> | <div dir=ltr lang=en> | ||
− | + | db.test.update({exam: ”test1”}, {$set: {country: ”Canada”)}} | |
</div> | </div> | ||
سطر ۳۱۱: | سطر ۵۰۲: | ||
+ | ===استفاده از query=== | ||
+ | |||
+ | برای استفاده از query از متد <div dir=ltr lang=en>find()</div> استفاده مینماییم، بدین صورت که دیکشنری ایی را مبنی بر شرط مورد استفاده به متد مذکور پاس میدهیم. | ||
+ | |||
+ | |||
+ | <div dir=ltr lang=en> | ||
+ | collection.find(dict) | ||
+ | </div> | ||
+ | |||
+ | ===Indexing=== | ||
+ | |||
+ | برای اجرای سریع query ها باید به مجموعه(collection) ایندکس اعمال نماییم. | ||
+ | |||
+ | ایندکس ها بر دو اساس صعودی و نزولی قابل ایندکس گذاری هستند. | ||
+ | |||
+ | پس از اعمال ایندکس سرعت سرچ، اضافه و حذفو , ... بسیار سرعت این query ها افزایش یافته. | ||
+ | <div dir=ltr lang=en> | ||
+ | Collection.create_index([('key1', 1), ('key2', -1)]) | ||
+ | </div> | ||
+ | |||
+ | مقدار ۱ یا ASCENDING صعودی میباشد و مقدار -۱ یا DESCENDING نزولی میباشد. | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ==ارتباط مونگو با محصول IBSng== | ||
+ | |||
+ | |||
+ | برای ارتباط دیتابیس مونگو با سرویس IBSng در مرحله نخست می بایست، فایل تنظیمات IBSng ، قسمت مربوط به Mongo Database را ملاحضه نمایید. | ||
+ | |||
+ | |||
+ | این فایل در مسیر زیر می باشد: | ||
+ | |||
+ | <div dir=ltr lang=en> | ||
+ | /usr/local/IBSng/config/IBSng.conf | ||
+ | </div> | ||
+ | |||
+ | تنظیمات: | ||
+ | |||
+ | <div dir=ltr lang=en> | ||
+ | ;################################## | ||
+ | ; Mongo DATABASE | ||
+ | ;################################## | ||
+ | [DATABASE_Mongo] | ||
+ | ;TAG: host | ||
+ | ; IP Address or Hostname of database server. leave empty if core should connect to the database using | ||
+ | ; 127.0.0.1 | ||
+ | ;DEFAULT: | ||
+ | host= | ||
+ | |||
+ | ;TAG: port | ||
+ | ; Port number of database server. leave empty if core should connect to the database using | ||
+ | ; 27017 | ||
+ | ;DEFAULT: 27017 | ||
+ | port=27017 | ||
+ | |||
+ | ;TAG: name | ||
+ | ; Name of database | ||
+ | ;DEFAULT: IBSng | ||
+ | name=IBSng | ||
+ | |||
+ | ;TAG: username | ||
+ | ; UserName to connect to database | ||
+ | ;DEFAULT: root | ||
+ | username=root | ||
+ | |||
+ | ;TAG: password | ||
+ | ; password to connect to database | ||
+ | ;DEFAULT:1234 | ||
+ | password=1234 | ||
+ | |||
+ | ;TAG: turn | ||
+ | ; On/Off | ||
+ | turn=On | ||
+ | </div> | ||
+ | |||
+ | |||
+ | |||
+ | بعد از این قسمت حتما دقت نمایید که دیتابیس مونگو شما دارای نام کاربری و رمز عبور باشد، که در بالا به آن اشاره شده.(ساخت حساب کاربری(ایجاد username و password)) | ||
+ | |||
+ | برای راه اندازی مونگو، شما باید از برنچی از IBSng استفاده نمایید که دارای کامپوننت مونگو می باشد. | ||
+ | |||
+ | و در مرحله بعد باید از اسکریپت PsqlToMongo.py برای راه اندازی مونگو استفاده نمایید. | ||
+ | |||
+ | این اسکریپت در مسیر زیر قرار دارد: | ||
+ | |||
+ | <div dir=ltr lang=en> | ||
+ | /usr/local/IBSng/addons/mongo/PsqlToMongo.py | ||
+ | </div> | ||
+ | |||
+ | |||
+ | وقتی اسکریپت را اجرا نمایید سوالات زیر از شما پرسیده میشود: | ||
+ | |||
+ | <div dir=ltr lang=en> | ||
+ | Please Select your option: | ||
+ | 1. Convert connection_log tables for mongo collection | ||
+ | 2. Convert connection_log_charge_rule_details tabels for mongo collection | ||
+ | 3. Set Index | ||
+ | 4. Create counters Collection for get next sequence function | ||
+ | </div> | ||
+ | |||
+ | |||
+ | |||
+ | که در این جا دو راه موجود است: | ||
+ | |||
+ | |||
+ | ===همه چیز از اول راه اندازی شود=== | ||
+ | |||
+ | در این قسمت فقط مراحل ۳ و ۴ را به ترتیب انجام دهید. | ||
+ | |||
+ | |||
+ | ===مونگو قرار است بر روی IBSng راه اندازی شود که از قبل تا کنون در حال سرویس دهی بوده است=== | ||
+ | |||
+ | در این راه شما در گام نخست می بایست گزینه ۴ را انتخاب نموده و بعد ساخت کالکشن counters آن را ویرایش نمایید که می بایست ماکزیمم connection_log_id ها از دیتابیس postgresql دریافت نموده و کمی بیشتر از آن مقدار را مساوی مقدار seq در کالکشن counters مونگو قرار دهید. | ||
+ | در مرحله بعدی از گزینه های ۳ و ۱ و ۲ به ترتیب از راست به چپ اجرا نمایید. | ||
+ | |||
+ | |||
+ | بعد از انجام یکی از دو مرحله بالا سرویس IBSng را ریستارت نمایید. | ||
+ | |||
+ | |||
+ | ==توضیحات دستی مونگو برای IBSng== | ||
+ | |||
+ | |||
+ | ===ایندکس های مونگو برای IBSng=== | ||
+ | |||
+ | تعداد کل ایندکس هایی که برای کالکشن connection_log مورد نیاز هست به شرح زیر می باشد: | ||
+ | |||
+ | |||
+ | نکته: _id بصورت پیشفرض ایندکس دارد، پس نیازی به ایندکس گذاری ندارد. | ||
+ | |||
+ | |||
+ | |||
+ | ایندکس های صعودی: | ||
+ | |||
+ | <div dir=ltr lang=en> | ||
+ | user_id , _id , ras_id , retry_count , credit_used , details.mac , username , details.kill_reason , details.terminate_cause | ||
+ | </div> | ||
+ | |||
+ | |||
+ | یک نمونه برای اعمال ایندکس: | ||
+ | <div dir=ltr lang=en> | ||
+ | use IBSng | ||
+ | db.connection_log.ensureIndex({'user_id': 1}) | ||
+ | </div> | ||
+ | |||
+ | ایندکس های صعودی بصورت compound index: | ||
+ | <div dir=ltr lang=en> | ||
+ | type_details.in_bytes , type_details.out_bytes | ||
+ | </div> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ایندکس های نزولی بصورت compound index: | ||
+ | <div dir=ltr lang=en> | ||
+ | type_details.in_bytes , type_details.out_bytes | ||
+ | </div> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | زمانی که ایندکس ها رو اعمال کردید به کالکشن connection_log باید بعد ورود دستور زیر در مونگو نتایج زیر را مشاهده نمایید: | ||
+ | |||
+ | دستور: | ||
+ | <div dir=ltr lang=en> | ||
+ | db.connection_log.getIndexes() | ||
+ | </div> | ||
+ | |||
+ | |||
+ | نتیجه دستور: | ||
+ | |||
+ | <div dir=ltr lang=en> | ||
+ | [ | ||
+ | { | ||
+ | "v" : 1, | ||
+ | "key" : { | ||
+ | "_id" : 1 | ||
+ | }, | ||
+ | "name" : "_id_", | ||
+ | "ns" : "IBSng.connection_log" | ||
+ | }, | ||
+ | { | ||
+ | "v" : 1, | ||
+ | "key" : { | ||
+ | "user_id" : 1 | ||
+ | }, | ||
+ | "name" : "user_id_1", | ||
+ | "ns" : "IBSng.connection_log" | ||
+ | }, | ||
+ | { | ||
+ | "v" : 1, | ||
+ | "key" : { | ||
+ | "ras_id" : 1 | ||
+ | }, | ||
+ | "name" : "ras_id_1", | ||
+ | "ns" : "IBSng.connection_log" | ||
+ | }, | ||
+ | { | ||
+ | "v" : 1, | ||
+ | "key" : { | ||
+ | "retry_count" : 1 | ||
+ | }, | ||
+ | "name" : "retry_count_1", | ||
+ | "ns" : "IBSng.connection_log" | ||
+ | }, | ||
+ | { | ||
+ | "v" : 1, | ||
+ | "key" : { | ||
+ | "credit_used" : 1 | ||
+ | }, | ||
+ | "name" : "credit_used_1", | ||
+ | "ns" : "IBSng.connection_log" | ||
+ | }, | ||
+ | { | ||
+ | "v" : 1, | ||
+ | "key" : { | ||
+ | "details.mac" : 1 | ||
+ | }, | ||
+ | "name" : "details.mac_1", | ||
+ | "ns" : "IBSng.connection_log" | ||
+ | }, | ||
+ | { | ||
+ | "v" : 1, | ||
+ | "key" : { | ||
+ | "username" : 1 | ||
+ | }, | ||
+ | "name" : "username_1", | ||
+ | "ns" : "IBSng.connection_log" | ||
+ | }, | ||
+ | { | ||
+ | "v" : 1,details.kill_reason | ||
+ | "key" : { | ||
+ | "login_time" : -1, | ||
+ | "logout_time" : -1 | ||
+ | }, | ||
+ | "name" : "login_time_-1_logout_time_-1", | ||
+ | "ns" : "IBSng.connection_log" | ||
+ | }, | ||
+ | { | ||
+ | "v" : 1, | ||
+ | "key" : { | ||
+ | "type_details.in_bytes" : 1, | ||
+ | "type_details.out_bytes" : 1 | ||
+ | }, | ||
+ | "name" : "type_details.in_bytes_1_type_details.out_bytes_1", | ||
+ | "ns" : "IBSng.connection_log" | ||
+ | }, | ||
+ | { | ||
+ | "v" : 1, | ||
+ | "key" : { | ||
+ | "" : 1 | ||
+ | }, | ||
+ | "name" : "details.kill_reason_1", | ||
+ | "ns" : "IBSng.connection_log" | ||
+ | }, | ||
+ | { | ||
+ | "v" : 1, | ||
+ | "key" : { | ||
+ | "details.terminate_cause" : 1 | ||
+ | }, | ||
+ | "name" : "details.terminate_cause_1", | ||
+ | "ns" : "IBSng.connection_log" | ||
+ | } | ||
+ | ] | ||
+ | |||
+ | |||
+ | </div> | ||
+ | |||
+ | |||
+ | ===ساخت کالکشن counters=== | ||
+ | |||
+ | |||
+ | اگر از اول IBSng نصب میشود باید مقدار ۱ رو به connection_log_id بدهید،اما اگر جایی که قبلا IBSng وجود داشته، باید مقدار ماکزیمم connection_log_id دیتابیس postgres به connection_log_id مونگو داده شود. | ||
+ | |||
+ | <div dir=ltr lang=en> | ||
+ | db.counters.insert({ "_id" : "connection_log_id", "seq" : 1 }) | ||
+ | </div> | ||
+ | |||
+ | وجود این کالکشن برای ایجاد توابع get next sequence در IBSng برای مونگو هست.(همانند تولید connection_log_id برای postgresql) | ||
+ | |||
+ | |||
+ | |||
+ | ===Sharding در مونگو=== | ||
+ | |||
+ | این قسمت برای زمانی هست که شما نیاز دارید، حجم بسیار عظیمی از داده های خود را ذخیره نمایید، که پیشنهاد مونگو بجای بهره گیری از الگوی vertical scalling الگوی horizontal scaling می باشد، که در این الگو، اصل برای رشد داده ها بصورت خطی(یا افقی) است، یعنی اضافه کردن سرورهایی که حتی نچندان قوی به مجموعه است، که در این روش همه چیز بصورت خودکار انجام میگیرد. | ||
+ | |||
+ | برای راه اندازی sharding در IBSng کافیست اسکریپت sharding.sh را در مسیر زیر اجرا نمایید: | ||
+ | |||
+ | <div dir=ltr lang=en> | ||
+ | /mnt/sharding.sh | ||
+ | </div> | ||
+ | |||
+ | توجه: | ||
+ | بعد اجرای این دستور باید هر جا که کانکشنی را به دیتابیس مونگو تعریف نموده ایید، باید با پورت 27018 باشد.(چه IBSng.conf، چه در PsqlToMongo.py) | ||
+ | برای اطلاعات بیشتر میتوانید از کدها و کامنت های اسکریپت اطلاعاتی بهتری را دریافت نمایید. | ||
+ | |||
+ | ==امکانات== | ||
+ | |||
+ | ===ویژگی های این کامپوننت=== | ||
+ | # بهینه شدن سرعت کوئری ها | ||
+ | # حذف شدن Join های سنگین | ||
+ | # freeSchema شدن لاگ های اساسی IBSng | ||
+ | # بهبود بهتر گزارشگیری در IBSng | ||
+ | ===قسمت هایی که IBSng از مونگو بهره می برد=== | ||
+ | # connection log report | ||
+ | # connection usage report | ||
+ | # terminate cause | ||
+ | # kill reason | ||
</div> | </div> |
نسخهٔ کنونی تا ۲۶ نوامبر ۲۰۱۴، ساعت ۲۳:۴۰
محتویات |
[ویرایش] MongoDB چیست؟
تمرکز در: سرعت و قدرت، انعطاف پذیری، مقیاس پذیری، گسترش پذیری
[ویرایش] مقدمه
پایگاه داده MongoDB یکی ازبهترین پایگاه داده های بدون رابطه ایی میباشد که بسیار انعطاف پذیر و قوی و سریع و گسترش پذیر میباشد. مدل دادها بصورت json می باشند. قواعد و دستورالعملها همان قواعد نحوی(syntax) جاوا اسکریپت میباشند که رابط shell آن از قواعد جاوا اسکریپت پیروی میکند.بنابراین بسیار ساده و آسان میباشد. بعضی از ویژگیهای مونگو بسیار شبیه به مدل پایگاه داده sql می باشد، اما بعضی ویژگیهای در مونگو وجود ندارند. نظیر:join ها یا trigger ها یا تراکنش های چند سطری پیچیده، که پیاده سازی آنها به روش های برنامه نویسی قابل انجام است.
[ویرایش] مفاهیم اصلی
[ویرایش] سندها یا Documents
سندها همان مفهوم ردیف ها در دیتابیس های رابطه ایی(sql) می باشند
[ویرایش] مجموعه ها یا collection
مجموعه ها همان جداول در دیتابیس های رابطه ایی میباشد.
[ویرایش] دیتابیس
این مفهوم دست نخورده باقیمانده و همان مفهوم DB در دیتابیس های رابطهای میباشد.
[ویرایش] ویژگی ها
[ویرایش] سندگرا
- سندها بسیار شبیه به نوع داده ایی دیکشنری در زبانهای برنامه نویسی بوده و به همین منظور برای برنامه نویس بسیار راحت میباشد.
- قابلیت سندگرا و آرایه ای بودن نیاز به اتصال های اضافی را کاهش داده است.
- اسکیمای داینامیک آن باعث ایجاد چندریختی های آسانتر شده
- هر سند دارای یک کلید مخصوص “_id” هست که در بین سندهای یک مجموعه یکتا هست.
[ویرایش] قدرتمند و سریع
- وجود سرعت بسیار زیاد در خواندن و نوشتن دادهها
- ایجاد ایندکس گذاری بر روی کلیدها(key)
- در هر زمانی ممکن است پردازش بصورت offload و منطقی سمت کلاینت انجام گیرد که این طراحی سبب بالا بردن کارایی MongoDB شده.
[ویرایش] میرورینگ و کلاسترینگ
مونگو هم چنین دارای سرویس کلاسترینگ میباشد.
سرویس کلاسترینگ MongoDB بیشتر برای سازمان و شرکتهایی به کار میرود که برنامه ی آنها تحت هر شرایطی باید اجرا شود و در حالت اجرا باقی بماند حتی زمانی که یکی از سرورها از سرویس خارج شده باشد. در سرویس کلاسترینگ تمامی سرورها همان برنامه و قوانینی را که باقی سرورها اجرا میکنند اجرا خواهند کرد لذا اگر سروری از سرویس خارج شود باقی سرورها بلافاصه شروع به کار خواهند کرد که به آن Failover گفته میشود. زمانی که سرور از سرویس خارج شده دوباره به کار افتاد باقی سرورها آگاه میشوند و روند عادی دوباره ادامه خواهد یافت. به این عمل Failback گفته میشود
[ویرایش] گسترش پذیری آسان
زمانی که چند سرور برنامه MongoDB را با یکدیگر اجرا میکنند که نتیجه آن احتمال خطای کمتر و سرعت لود بالاتربرنامه هاست. MongoDB بر پایه scale out بودن طراحی شده است، سندگرا بودن مدل دادهها این اجازه را میدهد که دادهها به طور جداگانه در روی چندین سرور پخش شوند که دادهها و لود کردن یک گروه را به تعادل میرساند. توزیع مجدد دسته ها اتوماتیک است که این امکان را میدهد که برنامه نویسان بدون نگرانی از ذخیره دادهها روی برنامه نویسی تمرکز کنند به این تکنیک شارد(Shard) گفته میشود که مجموعه ها و داده را در بین چندین سرور بصورت خودکار و اتوماتیک انجام میدهد.
[ویرایش] رابط چندگانه
دارای API های زبانهای عمومی بوسیله Driverها و shell مونگو میباشد.
[ویرایش] نصب و راه اندازی
[ویرایش] نحوه نصب MongoDB بر روی سیستم عامل Debian
برای نصب در ابتدا باید آرشیو مونگو را به مخازن اضافه نماییم:
۱-
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10
۲-
echo 'deb http://downloads-distro.mongodb.org/repo/debian-sysvinit dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list
۳- حال در این مرحله آرشیو پکیج های خود را آپدیت نمایید:
sudo apt-get update
۴- در این مرحله آخرین نسخه پایدار مونگو را نصب می کنیم:
sudo apt-get install mongodb-10gen
[ویرایش] نحوه نصب درایور پایتون مونگو
برای اینکه بتوانیم با پایتون به مونگو وصل شویم باید درایور یا بسته یا کتابخانه pymongo را بر روی سرور نصب نماییم.
برای نصب pymongo فقط کافیست با pip آن را نصب نمایید:
pip install pymongo
[ویرایش] نحوه تنظیمات مونگو
در این جان بخشی از تنظیمات که مهمتر هستند را ذکر میکنیم.
برخی موارد شما نیاز دارید تا مونگو را با توجه به نیاز خود تغییر دهید. مثلاً عوض کردن مسیر ذخیره اطلاعات یا سیستم دارای مجوز ورود باشد یا نباشد! که در اینجا به شرح یکسری از این موارد خواهیم پرداخت.
نکته: فایل اصلی تنظیمات مونگو در مسیر زیر می باشد:
/etc/mongod.conf
- تغییر مسیر حافظه دیتابیس:
برای تغییر مسیری که مونگو دادههای خود را در حافظه ذخیر میکند کافیست dbpath را در فایل mongod.conf مطابق با نیاز خود تغییر دهید. بصورت پیشفرض در مسیر زیر می باشد:
/var/lib/mongodb
- تغییر مسیر لاگ ها(logs):
کافیست مسیر خود را در پارامتر logpath تغییر دهید.
- تغییر پورت اتصال دیتا بیس:
سرویس mongod پیشفرض از پورت ۲۷۰۱۷ استفاده میکند. همچنین برای instance گرفتن هم از این پورت استفاده میکند، لذا برای استفاده از درایورها باید از این پورت استفاده نمایید تا بتوانید از مونگو نمونه بگیرید، مگر اینکه شما در قسمت تنظیمات پارامتر port را تغییر دهید. پس برای تغییر پورت باید port را در تنظیمات تغییر دهید.
- در دسترس گذاشتن مونگو:
بصورت پیشفرض مونگو فقط بر روی local قابل دسترس می باشد، و اگر شما میخواهید این دسترسی را تغییر دهید باید پارامتر bind_ip را در در فایل تنظیمات تغییر دهید.
- اعمال مجوز ورود:
اگر شما میخواهید بر روی مونگو و یا هر بخش از دیتابیس خود حق دسترسی و مجوز تعریف نمایید باید مقدار پارامتر auth برابر با true باشد.در غیر این صورت بدون وارد کردن نام کاربری و رمز عبور شما میتوانید از از تمامی بخشها بدون هیچ محدودیتی استفاده نمایید.پس بهتر است این پارامتر را true کرده و برای دیتابیس خود حساب کاربری ایجاد نمایید.
تذکر: پیش از true کردن این پارامتر نخست حساب کاربری خود را ایجاد نمایید و بعد از آن سرویس مونگو را stop کرده و بعد این پارامتر را true نمایید و مجدداً سرویس را راه اندازی نمایید! توجه: در جلوتر نحوه ساخت حساب کاربری (یوزر) آموزش خواهیم داد.
سایر پارامترها را میتوانید در داخل فایل تنظیمات(mongod.conf) ملاحضه نمایید، این فایل تمامی پارامترها را بخوبی توضیح داده.
[ویرایش] راه اندازی سرویس
برای راه اندازی سرویس باید سرویس آن را استارت نمایید(البته بعد از اولین نصب اگر سرور را ریستارت کرده باشید نیازی به این کار نمی باشد!)
به این صورت سرویس را اجرا نمایید:
/etc/init.d/mongod start
برای وارد شدن به shell مونگو کافیست در ترمینال mongo را اجرا نماییدتا وارد محیط شل مونگو شوید.
برای دیدن دیتابیس های موجود کافیست دستور زیر را استفاده نمایید:
show dbs
برای کار با دیتابیس خود باید با دستور use دیتا بیس خود را انتخاب نمایید.
Use IBSng
[ویرایش] ساخت حساب کاربری(ایجاد username و password)
نخست باید اول وارد دیتابیس admin شوید، برای این کار از دستور زیر استفاده نمایید:
use admin
نکته: تمامی تنظیمات اصلی خود مونگو در این دیتابیس(admin) قرار دارد.
بعد از متد createUser برای ساخت حساب کاربری استفاده مینماییم.
به مثال زیر دقت نمایید، در این مثال قصد داریم برای کل مونگو یک یوزر با تمامی دسترسی ها(روت) بسازیم.
use admin db.createUser( { user: "root", pwd: "1234", roles: [ "root" ] } )
بیشتر موارد واضح هستند، ولی شاید از خود بپرسید چه roles هایی وجود دارد.
همانطور که آشکار هست رول root برای حق دسترسی کامل هست، بقیه رول ها را در زیر می نویسیم:
userAdminAnyDatabase , dbAdminAnyDatabase, readWriteAnyDatabase
رول های دیگری هم وجود دارند ولی اگر شما هر سه رول بالا را باهم به یک یوزر دهید مطابق این خواهد بود که به آن رول root داده اید.
درضمن در مونگو حتی شما قابلیت این را دارید که رول هایی بیشتری را تعریف نمایید.
برای اطلاعات بیشتر در مورد رول ها این لینک را مطالعه نمایید.
براای اطلاعات بیشتر در مورد ساخت حساب کاربری این لینک را مطالعه نمایید.
بعد از انجام موارد فوق به فایل تنظیمات مونگو رفته و پارامتر auth را برابر با true نمایید. و سرویس را مجدداً راه اندازی نمایید.
[ویرایش] شروع آموزش
[ویرایش] سند ها
سندها بصورت object میباشند:
{'key': 'value'}
ترتیب و ارزشها اهمیت دارند:
{'key2': 'value2', 'key1': 'value1'}
متفاوت از
{'key1': 'value1', 'key2': 'value2'}
مونگو case-sensitive و type-sensitive میباشد.
سند در مونگو نمیتواند دارای کلید تکراری باشد! سند زیر غلط میباشد:
{'key': 'value2', 'key': 'value1'}
[ویرایش] mongo
برای کار با مونگو در محیط shell بنویسید
mongo
برای وصل شدن به دیتا بیسی باید از دستور use استفاده کنید.
توجه داشته باشید که شما حتی بدون اینکه از پیش پایگاه داده ای را ایجاد کرده باشید دستور use عمل سوییچ به آن پایگاه را برای شما آنجام میدهد، زیرا که دیتابیس و collection ها در ورود اولین سند بصورت runtime ساخته میشود.
use test
[ویرایش] ایجاد سند
برای ساخت سند باید از دستور insert استفاده شود:
db.test.insert({exam: “test1”})
با دستور find میتوانیم از صحت ورود اطلاعات اطمینان حاصل نماییم:
db.test.find()
خروجی بصورت زیر خواهد بود،
{ _id : ObjectId("4bf9bec50e32f82523389314"),username : ”test1” }
[ویرایش] ساختار find
ساختار این دستور:
این دستور دو پارامتر بسیار مهم را دریافت میکند:
۱-criteria که مربوط به کوئری بوده
db.collection.find( { کوئری شما}, { name: 1, contribs: 1 } )
۲-projection که مربوط ساختار خروجی شما میباشد
{ field1: <boolean>, field2: <boolean> ... }
همینطور با دستور save هم میتوان سند ایجاد کرد:
db.test.save({exam: “test2”})
با دستور زیر میتوان تعداد رکورد های موجود را شمارش کرد:
db.test.count()
برای جستوجو در عناصر از find میتوان استفاده کرد، به این صورت که شرط را بصورت یک دیکشنری به آن پاس میدهیم:
db.test.find({exam: “test1”})
[ویرایش] ویرایش داده ها
با دستور update میتوان اطلاعات را ویرایش نمود:
db.test.update({exam: ”test1”}, {$set: {country: ”Canada”)}}
در این مثال به رکورد exam مقدار country را به حالت free-schema اضافه نمودیم.
با استفاده از دستور unsetمیتوانیم مقادیر را پاک نماییم.
[ویرایش] حذف داده ها
حذف مقادیر با دستور removeمی باشد.
db.test.remove({key and value})
دستور remove فقط اسناد داخل مجموع را پاک میکند، برای حذف کامل مجموعه با تمام index هایش از دستور drop استفاده می نماییم.
db.test.drop()
توجه داشته باشید که drop تمام کالکشن را پاک می نماید!
[ویرایش] JavaScript
تمام دستورات جاوا اسکریپت در shell مونگو قابل استفاده هستند
for(i=0; i<200000; i++) { db.test.save({num: i}); }
با دستور count میتوانیم مطمن بشویم که ۲۰۰۰۰۰ رکورد در کالکشن درج شده است:
db.test.count()
[ویرایش] Index
با ایندکس گذاری قادر خواهیم بود رکورد ها را بر دو اساس صعودی و نزولی مرتب نماییم که این امر باعث سرعت بسیار بالای فعل انفعالات در کالکشن مذبور میباشد.
db.test.ensureIndex({num: 1})
موضوع Background Construction:
در حالت پیشفرض هنگام ایندکس سازی، مجموعه مورد نظر از هر نظر بلاک میشود، برای بر طرف ساختن این موضوع از پارامتر background استفاده نمایید:
db.people.ensureIndex( { zipcode: 1}, {background: true} )
[ویرایش] رابط PyMongo
بسته PyMongo یک ابزار پایتونی برای کار با مونگو می باشد، و پیشنهاد میشود که اگر پایتون کار هستید و میخواهید با مونگو کار کنید حتماً از این ابزار استفاده نمایید.
برای نصب:
pip install pymongo
بهترین منبع برای یادگیری PyMongo
[ویرایش] نگاهی مختصر به PyMongo
در این قسمت نگاهی کوتاه در حد آشنایی با PyMongo خواهیم داشت.
در گام اول کتابخانه PyMongo رو وارد میکنیم:
import pymongo
در گام بعد یک نمونه از mongod(زمانی که مونگو بر روی سیستم نصب باشد، این سرویس باید فعال باشد) میسازیم:
client = pymongo.MongoClient()
یا
Client = pymongo.MongoClient('localhost', 27017)
و یا اگر با نام کاربری و رمز باشد باید از روش زیر استفاده نمایید.
url = "mongodb://%s:%s@%s:%s" % (username, password, host, port) Client = MongoClient(url, max_pool_size=None)
نکته: max_pool_size برای تعیین connection pool شما هست، که یا میتوانید مقدار صحیح وارد نمایید، یا مقدار آن را None بگذارید تا خودش بصورت نامحدود بر حسب نیاز pool ایجاد نماید.
شما در چندین حالت میتوانید دیتابیس خود رابسازید:
1 -
db = client.test_database
2 -
db = client['test-database']
برای نام گذاری و ایجاد پایگاه داده خود میتوانید به یکی از دوشکل بالا عمل نمایید.
برای نام گذاری برای مجموعه ها (collections) باید به یکی از دو روش زیر عمل نماییم:
1 -
collection = db.test_collection
2 -
collection = db['test-collection']
برای ورود اطلاعات یا همان insert سند داخل مجموعه(collection) از متد insert() استفاده کنید:
Example = collection.insert(dictionary) یک دیکشنری از اطلاعات پاس میدهیم
پس از اولین ورود سند مجموعه بصورت حقیقی بر روی سرور ایجاد میشود.
برای آزمایش این موضوع میتوان از دستور زیر استفاده کرد:
>>>db.collection_names() [u'system.indexes', u'collection']
جستوجوی بصورت تک:
collection.find_one(dictionary)
به محض مچ شدن اولین شرط، نتیجه را بر میگرداند.
[ویرایش] Bulk Insert
در مبحث جدید بحث ورود داده بصورت توده های بزرگ که از همان مکانیزم مونگو برای ذخیره سازی های انبوه بصورت آرایه هست استفاده مینماید و این امر موجب سرعت سریع در ذخیره سازی شده است، زیرا که در این نوع ورود داده، دیگر دادهها از نظر صحت ورودشان در دیتابیس بررسی نشده و دادهها بصورت اتومیک ذخیره میگردند. دلیل اصلی سرعت بالا در این نوع ورود، محروم بودن از صحت درج داده میباشد. در مثال زیر آرایه ای از دادهها bulk میشوند:
collection.insert([dict1, dict2, dict3, ...])
[ویرایش] استفاده از query
برای استفاده از query از متد
collection.find(dict)
[ویرایش] Indexing
برای اجرای سریع query ها باید به مجموعه(collection) ایندکس اعمال نماییم.
ایندکس ها بر دو اساس صعودی و نزولی قابل ایندکس گذاری هستند.
پس از اعمال ایندکس سرعت سرچ، اضافه و حذفو , ... بسیار سرعت این query ها افزایش یافته.
Collection.create_index([('key1', 1), ('key2', -1)])
مقدار ۱ یا ASCENDING صعودی میباشد و مقدار -۱ یا DESCENDING نزولی میباشد.
[ویرایش] ارتباط مونگو با محصول IBSng
برای ارتباط دیتابیس مونگو با سرویس IBSng در مرحله نخست می بایست، فایل تنظیمات IBSng ، قسمت مربوط به Mongo Database را ملاحضه نمایید.
این فایل در مسیر زیر می باشد:
/usr/local/IBSng/config/IBSng.conf
تنظیمات:
;################################## ; Mongo DATABASE ;################################## [DATABASE_Mongo] ;TAG: host ; IP Address or Hostname of database server. leave empty if core should connect to the database using ; 127.0.0.1 ;DEFAULT: host= ;TAG: port ; Port number of database server. leave empty if core should connect to the database using ; 27017 ;DEFAULT: 27017 port=27017 ;TAG: name ; Name of database ;DEFAULT: IBSng name=IBSng ;TAG: username ; UserName to connect to database ;DEFAULT: root username=root ;TAG: password ; password to connect to database ;DEFAULT:1234 password=1234 ;TAG: turn ; On/Off turn=On
بعد از این قسمت حتما دقت نمایید که دیتابیس مونگو شما دارای نام کاربری و رمز عبور باشد، که در بالا به آن اشاره شده.(ساخت حساب کاربری(ایجاد username و password))
برای راه اندازی مونگو، شما باید از برنچی از IBSng استفاده نمایید که دارای کامپوننت مونگو می باشد.
و در مرحله بعد باید از اسکریپت PsqlToMongo.py برای راه اندازی مونگو استفاده نمایید.
این اسکریپت در مسیر زیر قرار دارد:
/usr/local/IBSng/addons/mongo/PsqlToMongo.py
وقتی اسکریپت را اجرا نمایید سوالات زیر از شما پرسیده میشود:
Please Select your option: 1. Convert connection_log tables for mongo collection 2. Convert connection_log_charge_rule_details tabels for mongo collection 3. Set Index 4. Create counters Collection for get next sequence function
که در این جا دو راه موجود است:
[ویرایش] همه چیز از اول راه اندازی شود
در این قسمت فقط مراحل ۳ و ۴ را به ترتیب انجام دهید.
[ویرایش] مونگو قرار است بر روی IBSng راه اندازی شود که از قبل تا کنون در حال سرویس دهی بوده است
در این راه شما در گام نخست می بایست گزینه ۴ را انتخاب نموده و بعد ساخت کالکشن counters آن را ویرایش نمایید که می بایست ماکزیمم connection_log_id ها از دیتابیس postgresql دریافت نموده و کمی بیشتر از آن مقدار را مساوی مقدار seq در کالکشن counters مونگو قرار دهید. در مرحله بعدی از گزینه های ۳ و ۱ و ۲ به ترتیب از راست به چپ اجرا نمایید.
بعد از انجام یکی از دو مرحله بالا سرویس IBSng را ریستارت نمایید.
[ویرایش] توضیحات دستی مونگو برای IBSng
[ویرایش] ایندکس های مونگو برای IBSng
تعداد کل ایندکس هایی که برای کالکشن connection_log مورد نیاز هست به شرح زیر می باشد:
نکته: _id بصورت پیشفرض ایندکس دارد، پس نیازی به ایندکس گذاری ندارد.
ایندکس های صعودی:
user_id , _id , ras_id , retry_count , credit_used , details.mac , username , details.kill_reason , details.terminate_cause
یک نمونه برای اعمال ایندکس:
use IBSng db.connection_log.ensureIndex({'user_id': 1})
ایندکس های صعودی بصورت compound index:
type_details.in_bytes , type_details.out_bytes
ایندکس های نزولی بصورت compound index:
type_details.in_bytes , type_details.out_bytes
زمانی که ایندکس ها رو اعمال کردید به کالکشن connection_log باید بعد ورود دستور زیر در مونگو نتایج زیر را مشاهده نمایید:
دستور:
db.connection_log.getIndexes()
نتیجه دستور:
[ { "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "IBSng.connection_log" }, { "v" : 1, "key" : { "user_id" : 1 }, "name" : "user_id_1", "ns" : "IBSng.connection_log" }, { "v" : 1, "key" : { "ras_id" : 1 }, "name" : "ras_id_1", "ns" : "IBSng.connection_log" }, { "v" : 1, "key" : { "retry_count" : 1 }, "name" : "retry_count_1", "ns" : "IBSng.connection_log" }, { "v" : 1, "key" : { "credit_used" : 1 }, "name" : "credit_used_1", "ns" : "IBSng.connection_log" }, { "v" : 1, "key" : { "details.mac" : 1 }, "name" : "details.mac_1", "ns" : "IBSng.connection_log" }, { "v" : 1, "key" : { "username" : 1 }, "name" : "username_1", "ns" : "IBSng.connection_log" }, { "v" : 1,details.kill_reason "key" : { "login_time" : -1, "logout_time" : -1 }, "name" : "login_time_-1_logout_time_-1", "ns" : "IBSng.connection_log" }, { "v" : 1, "key" : { "type_details.in_bytes" : 1, "type_details.out_bytes" : 1 }, "name" : "type_details.in_bytes_1_type_details.out_bytes_1", "ns" : "IBSng.connection_log" }, { "v" : 1, "key" : { "" : 1 }, "name" : "details.kill_reason_1", "ns" : "IBSng.connection_log" }, { "v" : 1, "key" : { "details.terminate_cause" : 1 }, "name" : "details.terminate_cause_1", "ns" : "IBSng.connection_log" } ]
[ویرایش] ساخت کالکشن counters
اگر از اول IBSng نصب میشود باید مقدار ۱ رو به connection_log_id بدهید،اما اگر جایی که قبلا IBSng وجود داشته، باید مقدار ماکزیمم connection_log_id دیتابیس postgres به connection_log_id مونگو داده شود.
db.counters.insert({ "_id" : "connection_log_id", "seq" : 1 })
وجود این کالکشن برای ایجاد توابع get next sequence در IBSng برای مونگو هست.(همانند تولید connection_log_id برای postgresql)
[ویرایش] Sharding در مونگو
این قسمت برای زمانی هست که شما نیاز دارید، حجم بسیار عظیمی از داده های خود را ذخیره نمایید، که پیشنهاد مونگو بجای بهره گیری از الگوی vertical scalling الگوی horizontal scaling می باشد، که در این الگو، اصل برای رشد داده ها بصورت خطی(یا افقی) است، یعنی اضافه کردن سرورهایی که حتی نچندان قوی به مجموعه است، که در این روش همه چیز بصورت خودکار انجام میگیرد.
برای راه اندازی sharding در IBSng کافیست اسکریپت sharding.sh را در مسیر زیر اجرا نمایید:
/mnt/sharding.sh
توجه: بعد اجرای این دستور باید هر جا که کانکشنی را به دیتابیس مونگو تعریف نموده ایید، باید با پورت 27018 باشد.(چه IBSng.conf، چه در PsqlToMongo.py) برای اطلاعات بیشتر میتوانید از کدها و کامنت های اسکریپت اطلاعاتی بهتری را دریافت نمایید.
[ویرایش] امکانات
[ویرایش] ویژگی های این کامپوننت
- بهینه شدن سرعت کوئری ها
- حذف شدن Join های سنگین
- freeSchema شدن لاگ های اساسی IBSng
- بهبود بهتر گزارشگیری در IBSng
[ویرایش] قسمت هایی که IBSng از مونگو بهره می برد
- connection log report
- connection usage report
- terminate cause
- kill reason