Replication and Sharding in MongoDB pt2

 

بخش دوم این مطلب به تنظیمات مربوط به سرورهای دیتا می‌پردازیم.

 

مسیر زیر را بر روی تمامی سرورهای shard ایجاد می‌کنیم:

mkdir /data/db

دستور مقابل را اجرا کرده تا پیام زیر نمایش داده شود:

mongod –shardsvr

waiting for connection on port 27018

 

در این مرحله باید سرورهای shard را به کلاستر اضافه کنیم. بر روی سرور مستر یک ترمینال جدید باز کرده و دستور mongo را اجرا می‌کنیم تا وارد خط فرمان دیتابیس شویم.

سپس دستورات زیر را جهت افزودن shard اجرا می کنیم تا پیام اضافه شدن نمایش داده شود:

sh.addShard(“repSet01:27018”)

sh.addShard(“repSet01:27018”)

sh.addShard(“repSet01:27018”)

“shardAdded” ….

با اجرای این دستور از وضعیت و اضافه شدن سرورهای دیتا به کلاستر اطمینان پیدا می‌کنیم:

sh.status()

حالا می توانیم sharding را بر روی یک دیتابیس تستی ساده فعال کنیم:

db.runCommand({enablesharding:”tesstdb”});

sh.shardCollection(“testdb.testdata”,{“name”:1})

 

با انجام این دستورات به صورت صحیح تنظیمات مربوط به راه‌اندازی یک کلاستر توزیع شده mongo به پایان می‌رسد. در بخش بعدی به نحوه کارکرد و ذخیره دیتا بر روی دیتابیس می‌پردازیم.

 

Replication and Sharding in MongoDB pt1

 

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

نمای کلی از یک Sharding را در شکل زیر میتوانید ببینید.

 

 

در این حالت ما سه سرور دیتا با نامهای repSet01 , repSet02 , repSet03 و یک مجموعه کانفیگ سرور با نامهای confSrv01 , confSrv02 , confSrv03 و یک Routing Server نصب می‌کنیم.

بر روی تمامی سرورها MongoDB را نصب می‌کنیم:

 

echo “deb http://repo.mongodb.org/apt/debian jessie/mongodb-org/3.6 main” | sudo tee /etc/apt/sources.list.d/mongodb-org-3.6.list

sudo apt-get update

sudo apt-get install -y mongodb-org

 

بر روی کانفیگ سرورها این مسیر را ایجاد می‌کنیم:

mkdir /data/configdb

و این دستور را اجرا

mongod –configsvr

تا خروجی زیر بر روی هر سه سرور نمایش داده شود:

websvr admin web console waiting for connections on port 28019

 

حالا بر روی سرور مستر یا Routing Server لاگین کرده و دستور زیر را اجرا می کنیم: (توجه داشته باشید که من قبلا تنظیمات فایل /etc/hosts را بر روی تمامی سرورها انجام داده ام)

 

mongos –configdb repSet01:27019,repSet02:27019,repSet03:27019 –port 27020

 

تا خروجی زیر بر روی سرور مستر و کانفیگ سرورها نمایش داده شود:

config servers and shards connected successfully

connection accepted from nasterSrv01

 

در بخش اول کار ما با سرورهای Configتمام شد. در بخش دوم به نصب و تنظیمات سرورهای Replica Set می پردازیم.

 

DataFlow with Apache Flume

 

یک ابزار مناسب برای انتقال داده‌ها از یک منبع به یک ذخیره ساز داده جهت نگهداری و پردازش جریان داده Apache Flume می باشد.

flume توانایی انتقال داده‌ها به صورت  stream و log را از منابع مختلف مثل kafka , Local Disk , HTTP , SysLog و انواع دیگر منابع تولید دیتا را دارد.

اینجا یک مثال کاربردی و ساده برای انتقال event های تولید شده بر روی یک دیسک را به محیط HDFS را بررسی می کنیم.

 

ابتدا اجزای اصلی را تعیین می کنیم: منبع تولید داده (source) ، نوع ارتباط (channel) ، محل ذخیره سازی (sink)

agent.sources = iot-log
agent.sinks = hdfs-data
agent.channels = ch1
agent.channels.ch1.type = memory

سپس ارتباط مابین منبع و ذخیره ساز:

agent.sources.iot-log.channels = ch1
agent.sinks.hdfs-data.channel = ch1

مشخصات منبع. spooldir نام یکی از انواع source در flume است که فایلهای ایجاد شده در یک مسیر حاص را ارسال می کند. flieHeader برای اینکه مسیر اصلی فایل هم انتقال داده شود.

agent.sources.iot-log.type = spooldir
agent.sources.iot-log.spoolDir = /log/event/spool/
agent.sources.iot-log.fileHeader = true

پارامترهای محل انتقال و ذخیره داده ها. DataStream تغییری در نوع داده ایجاد نمی‌کند و فقط جریان داده دریافتی را ذخیره می‌کند.

agent.sinks.hdfs-data.type = hdfs
agent.sinks.hdfs-data.hdfs.fileType = DataStream
agent.sinks.hdfs-data.hdfs.path = /flume/event/iot/

 

هم اکنون این تنظیمات را در یک فایل مانند iot-data-stream.conf ذخیره و با دستور زیر بر روی سرور که flume نصب شده اجرا می‌کنیم

flume@hell:~# flume-ng agent -n agent -c conf -f /home/iot-data-stream.conf

هر فایل جدیدی که در مسیر /log/event/spool/ ایجاد گردد به محیط HDFS و در مسیر flume/event/iot/ منتقل می‌شود.

برای توضیحات کامل در مورد تمام پارامترها به http://flume.apache.org/FlumeUserGuide.html مراجعه کنید.

 

کپی فایل بین کلاسترهای Hadoop

 

برای کپی فایل بر روی یک کلاستر هدوپ از دستور DistCp به راحتی میشه استفاده کرد.

کاربرد این دستور برای کپی فایل بر روی چند کلاستر HDFS یا بین چندین کلاستر می باشد. این دستور از MapReduce  برای کپی کردن و ایجاد تسک‌های map برای توزیع کردن بلاک‌های فایل بر روی کلاستر استفاده می‌کند.

ساده ترین شکل استفاده از این دستور به صورت زیر است:

hadoop distcp hdfs://node-01:8020/source hdfs://node-02:8020/destination

با اجرا این دستور بر روی node-01 یک فایل temporary ایجاد شده و سپس با اجرای مجموعه ای از تسکهای map عملیات کپی بر روی HDFS مقصد با نام node-02 شروع می شود.

برای کپی چندین فایل از روی یک source بر روی مجموعه‌ای کلاسترها به صورت زیر نیز می‌توان کپی را انجام داد:

hadoop distcp hdfs://node-01:8020/source/xxa hdfs://node-01:8020/source/xxb hdfs://node-02:8020/destination