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 به پایان می‌رسد. در بخش بعدی به نحوه کارکرد و ذخیره دیتا بر روی دیتابیس می‌پردازیم.

 

Bash Tips بخش اول

 

وقتی یک دستور طولانی با بخش‌های متفاوت را در bash تایپ می کنید، ویرایش یک کلمه یا سطر کار مشکلی هست بخصوص حرکت بین حروف با نشانگر صفحه کلید.

در این نوشته چند تا از کلیدهای میانبر bash را با هم مرور میکنیم:

ALT+F حرکت نشانگر یک کلمه به جلو

ALT+B حرکت نشانگر یک کلمه به عقب

ALT+T جابجایی دو کلمه بعد از نشانگر با یکدیگر

ALT+U تبدیل تمام حروف یک کلمه به کاراکترهای Capital

ALT+L تبدیل تمام حروف یک کلمه به کاراکترهای Uncapital

ALT+R برگرداندن تمام تغییرات به حالت قبل

CTRL+A بردن نشانگر به ابتدای سطر

CTRL+E حرکت نشانگر به انتهای سطر

CTRL+K پاک کردن تمام کاراکترهای پس از نشانگر

CTRL+T جابجابی دو کاراکتر بعد از نشانگر

CTRL+U پاک کردن تمام کاراکترها قبل از نشانگر

و..

 

vi Tips بخش اول

 

کار کردن با وبرایشگر متن vi خیلی مشکل نیست. اگر کسی به این ویرایشگر عادت پیدا کنه، کار کردن با بقیه ادیتورها خیلی مشکل میشه. من که بعد چند سال کار با این برنامه هنوز مشکل دارم.

اینجا یکی دو تا از دستورات را مرور میکنیم.

 

برای اضافه کردن یه کاراکتر به ابتدای چند سطر متوالی. برای مثال جایی به درد میخوره که در یک کد نیاز به کامنت کردن بخشی از کد برنامه دارید.

۱- کلید Esc را بزنید تا در حالت command mode باشید.

۲- کلیدهای Ctrl + v را بزنید تا وارد حالت Visual Block  بشوید بعد با حرکت نشانگر به بالا یا پایین سطرهای مورد نظر را انتخاب کنید.

۳- کلید Ctrl + i را بزنید و کاراکتر مورد نظر را تایپ کنید برای مثال # را برای کامنت کرذن سطرها

۴- حالا کلید Esc را بزنید و منتظر اضافه شدن کاراکتر به اول خط باشید.

 

برای اضافه کردن شمارشگر خط به اول هر سطر

با زدن کلید Esc وارد حالت دستوری شده و عبارت set number را تایپ کنید. شمارشگر ظاهر میشه.

برای غیرفعال کردن عبارت set nonumber را وارد کنید.

 

در هنگام کد نویسی اضافه کردن فاصله به ابتدای هر سطر برای خوانا شدن کد خیلی مفید هست. برای فعال کردن حالت Auto-indentation رد ویرایشگر vi

ابتدا وارد command mode شده و سپس عبارت set autoindent را وارد کنید.

برای مشخص کردن اندازه فاصله هر سطر از ابتدای خط در حالت دستوری عبارت set shiftwidth را وارد کنید. برای مثال برای اندازه 5 کاراکتر space از ابتدای هر خط دستور set shiftwidth=5 را وارد کنید.

برای غیر فعال کردن این حالت عبارت set noautoindent را وارد کنید.

 

این دستورات فقط چندتا عبارت کاربردی کوچک بود. ویرایشگر متن vi شامل صدها دستور و عبارت ترکیبی و حتی regex هست که کار کردن با متن را بسیار ساده میکنه.

 

کپی فایل بین کلاسترهای 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

 

ایجاد یک ارتباط امن با Reverse SSH

 

تقریبا همه حداقل یکبار ارتباط ssh بین سرور و کلاینت را ایجاد کرده اند. در اکثر شبکه ها این ارتیاط یکطرفه است یعنی فقط از کلاینت به سرور ssh میشه وصل شد. حالا تصور کنید از یک سرور روی اینترنت میخواهید به یک کلاینت ارتباط بگیرید ولی پشت فایروال و همینطور NATبر روی شبکه قرار دارید که این‌کار غیر ممکن میشه. اینجا راه حلی که خیلی به درد بخور  Reverse SSH هست.

به شکل زیر دقت کنید شما ارتباط یکطرفه از A  به سرور B دارید همینطور از C به B  و حالا تصمیم دارید برخلاف میل مدیر شبکه فایروال و قواعد سازمان را دور بزنید 🙂 و یک ارتباط از C به A برقرار کنید.

 

 

راه حل این هست که یک تونل Reverse SSH از B به A برقرار کرده و سرور B را به عنوان SSH Server Gateway استفاده کنید، که باید یک سرور لینوکس باشه.

اگر از کلاینت و سرور ویندوز استفاده میکنید برنامه putty را روی هر دو سیستم مبدا و مقصد نصب کنید.

از روی سرور A برنامه putty را اجرا کرده و در بخش SSH – Connection – Tunnel را انتخاب و مقدار Source Port را یک پورت آزاد مثل 50000 انتخاب کنید این پورتی هست که بر روی سرور SSH باز خواهد شد. مقدار Destination برابر با پورتی که میخواهید بر روی سرور دسترسی داشته باشید انتخاب کنید برای مثال 8080 پس مقدار این فیلد برابر با localhost:8080 خواهد شد. حالا گزینه  Remote را انتخاب و ارتباط SSH را با سرور B یرقرار کنید. در اینجا پورت 50000 بر روی SSH Server باز و ارتباط تونل بین دو سرور برقرار خواهد شد.

حالا بر روی کلاینت C برنامه putty را اجرا کنید و در همان بخش SSH – Connection – Tunnel مقدار Source Port برابر با یک پورت آزاد مثل 50005 قرار داده و در فیلد Destination مقدار localhost:8080 را قرار داده و ارتباط SSH از کلاینت C به سرور B را برقرار کنید.

حالا اگر شما بر روی کلاینت C پورت 50005 را فراخوانی کنید به پورت و یا برنامه ای که بر روی سرور A بر روی این پورت در حال اجرا هست دسترسی خواهید داشت.

سیستم های لینوکسی مراحل خیلی ساده تر هست.

بر روی سرور A دستور زیر را اجرا کنید:

user@server-a:~$ ssh -R 50000:localhost:22 user@ssh-server-b

از روی کلاینت C دستور زیر را اجرا کنید:

user@client-c:~$ ssh user@ssh-server-b

user@ssh-server-b:~$ ssh localhost -p 50000

الان دسترسی شما به سرور A و پورت 22 برقرار خواهد بود.

 

تقسیم یک فایل به چند بخش با dd

 

دیروز یه فایل تقریبا بزرگ در حدود 250GiB روی یک datastore متصل به سرور ESXi داشتیم که باید به یک سرور لینوکس دیگه منتقل میشد. امکان اتصال storage به سرور وجود نداشت، وضعیت شبکه هم بسیار کند و ناپایدار بود. راحترین راه که به ذهن رسید انتقال با scp از روی esxi به سرور بود ولی اگر شبکه در موقع انتقال قطع می شد یا اختلال داشت باید تمام مراحل را از اول انجام می‌دادیم پس فایل را به چند قسمت تقسیم کردیم و انتقال دادیم که در صورت خرابی فقط مجبور به انتقال یک بخش از فایل باشیم.

حجم فایل در حدود 250GiB بود، اون را به بخش‌های 50GiB تقسیم می کنیم.

 

dd if=/vmfs/volumes/ds-04/xyz.img bs=1MB count=51200  | ssh user@192.168.66.6 dd of=/home/user/xyz.img.pt01

 

اینجا چون اندازه هر بلاک را 1MiB در نظر گرفتیم و به 50 گیگابایت ابتدای فایل نیاز داشتیم تعداد 51200 بلاک اول را جدا کردیم. و خروجی را با دستور ssh مستقیما به سرور remote ارسال کردیم تا فایل در هنگام تقسیم بر روی دیسک مقصد نوشته شود.

برای بخش بعدی می نویسیم:

 

dd if=/vmfs/volumes/ds-04/xyz.img bs=1MB count=51200  skip=51200 | ssh user@192.168.66.6 dd of=/home/user/xyz.img.pt02

 

که با سوئیچ skip از 51200 بلاک اول صرف نظر کردیم. و همینطور تعداد بلاک‌ها را افزایش می‌دهیم تا به انتهای فایل برسیم:

 

dd if=/vmfs/volumes/ds-04/xyz.img bs=1MB count=51200  skip=102400 | ssh user@192.168.66.6 dd of=/home/user/xyz.img.pt03

dd if=/vmfs/volumes/ds-04/xyz.img bs=1MB count=51200  skip=153600 | ssh user@192.168.66.6 dd of=/home/user/xyz.img.pt04

dd if=/vmfs/volumes/ds-04/xyz.img bs=1MB count=51200  skip=204800 | ssh user@192.168.66.6 dd of=/home/user/xyz.img.pt05

 

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

 

cat /home/user/xyz.img.pt0* | dd of=/home/user/xyz.img

 

این ساده‌ترین راهی بود که با دستورات عادی به ذهن من رسید، مسلما دستورات و روش‌های دیگه ای هم وجود دارند 🙂

 

رمزگذاری فایل‌ها در لینوکس

 

خیلی پیش میاد که نیاز به رمز گذاشتن بر روی یا محافظت از یک فایل داریم. در لینوکس این کار بدون هیچ پیچیدگی قابل انجام هست. خیلی راحت ابتدا بسته mcrypt را نصب می‌کنیم:

apt install mcrypt

بعد فقط کافی هست که اسم و مسیر فایل مورد نظر را به عنوان ورودی به این دستور بدبم:

mcrypt /home/morteza/securefile.gz

 از شما یک عبارت جهت کلید رمزگذاری می‌پرسه و خروجی یک فایل با پسوند nc هست که با الگوریتم rijndael-128 رمزگذاری (Encryption) شده.

حالا میتونید فایل اصلی را پاک کنید. هر موقع به بازیابی فایل نیاز داشتید کافی هست با سوئیچ -d فایل را باز کنید:

mcrypt -d /home/morteza/securefile.nc

این ابزار از سایر الگوریتم های رایج رمزنگاری هم پشتیبانی می‌کنه که با سوئیچ –list-hash لیست الگوریتم‌ها را نمایش میده. برای استفاده از یک مورد خاص مثل whirlpool هم از این دستور استفاده کنید:

mcrypt -h whirlpool /home/morteza/securefile.gz

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

 

تغییر نام فایل و ایجاد پوشه در لینوکس

 

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

خب اول از همه، اسم بعضی از فایل‌ها با کاراکتر فاصله space بود، من میخواستم این کاراکتر حذف بشه و با یک نقطه dotجایگزین کنم.

find . -name “* *” -type f | rename ‘s/ /./g’

این دستور اول تمام فایل‌های موجود در مسیر جاری که توی اسم اونها کاراکتر فاصله هست را پیدا میکنه، بعد خروجی را به دستور rename میده. اینجا هم با کاراکتر space را با کاراکتر dot جایگزین میکنه.

دستور rename در واقع یه اسکریپت با زبان پرل هست که میتونه یه جایگزین خوب برای mv باشه.

حالا که تغییر نام فایل‌ها انجام شد باید به اسم تمام فایلها یه فولدر درست کنم و هر فایل را به پوشه هم اسم خودش منتقل کنم.

find . -name “*.mkv” -exec sh -c ‘MYNDIR=`basename “$1” .mkv` ; mkdir “$MYNDIR” ; mv “$1” “$MYNDIR” ‘ _ {} \;

بخش اول هر فایل با پسوند mkv را پیدا میکنه بعد بخش اسم هر فایل رل بپن در نظر گرفتن پسوند جدا میکنه و در یک متغیر می‌ریزه. حالا با مقدار اون متغیر یه فولدر ایجاد میکنه. بعد از این دو تا دستور فقط کافی هست فایل مورد نظر را به پوشه ایجاد شده منتقل کنیم.

خب حالا من تعداد زیادی فولدر دارم که فیلم به اسم خودش داخل اون هست.

 

بازی با raspberry

 

خب سرانجام من هم یه raspberry خریدم. و مطابق معمول من raspberry pi 2 خریدم هفته بعد مدل 3 معرفی شد!

RaspberryPi2

اولین کار نصب سیستم عامل.

نسخه Raspbian Jessie را از اینجا دانلود می کنیم. نصب خیلی ساده است. اول کارت SD  را فرمت و سپس umount می کنیم بعد فایل دانلودی را از حالت فشرده خارج کرده و بر روی کارت حافظه می نویسیم:

#dd bs=4M if=/home/2016-02-09-raspbian-jessie.img | pv | of=/dev/mmcblk0

کارت حافظه را در اسلات حافظه پای میزاریم ، کابل شبکه و خروجی تصویر را متصل می کنیم در صورت تمایل یه حافظه جانبی و هدفون را هم وصل می کنیم. حالا وقت اتصال ورودی جریان استاندارد 5V 1500mA هست.

اگه همه چیز درست یاشه حالا شما اولین خروجی تصویر و بوت سیستم عامل پای را خواهید دید.

RaspberryPi2-ON

خب اینها که چیزی نبود، حالا میخوام با پای ام چیکار بکنم. اولین فکر تبدیل به یک دستگاه پخش موسیقی هست. من یه کارت صوتی اکسترنال Creative دارم، که با پورت usb وصل میشه و انواع مختلف خروجی های استاندارد را داره. خروجی صوتی استاندارد Raspberry هم واقعا افتضاح هست. پس باید خروجی استاندارد را غیر فعال کنم و خروجی usb را به عنوان پیشفرض بزارم.

sudo apt-get install alsa-base alsa-utils

sudo tail -f /var/log/messages

الان کارت صوتی را به پورت usb متصل می کنم و باید پیغام شناسایی دیوایس جدید را ببینم.

XFI-SBX

برای اطمینان از لود شدم ماژول

lsmod | grep snd_usb_audio

نصب و ویرایش ALSA

ALSA

عملکرد اسپیکر را چک می کنیم

speaker-test -D hw:0,0 -c2 -f wav

باید همه چیز درست باشه. پس نوبت به نصب پخش کننده موسیقی می رسه. من از MPD استفاده می کنم که علاوه بر سبکی فوق العاده انعطاف پذیر هست.

sudo apt-get mpd

sudo adduser mpd audio

برای اینکه حافظه های usb که متصل می کنیم به صورت خودکار ماونت بشوند از usbmount استفاده می کنیم. نصب و کانفیگ با خودتون، می تونید  از آپشنهایی مثل ماونت خودکار در مسیر پیشفرض mpd هم استفاده کنید..!

یک بار سیستم را ری استارت کنید و حالا فایل تنظیمات mpd را تغییر بدید.

Screenshot from 2016-03-13 16:03:00
سرویس mpd  را ری استارت کنید.

من برای راحتی کار MPDroid را روی گوشی نصب کردم و کنترل را از روی اون انجام میدم. انواع کلاینتهای ویندوزی ، لینوکسی و تحت وب هم برای سرویس mpd وجود داره.

 

Music-HiFi
از سیستم موسیقی دست ساز خودتون لذت ببرید..! 🙂

 

 

چگونه داده های عددی را به صورت نمودار در لینوکس نمایش دهیم

 

چند روز قبل یکی از همکاران  تکست زد و یه سوال پرسید که ” CPU monitor for Linux? / میخوام data collection با history داشته باشه ” خب من هم که تمام جوابهام کلی ، نامفهوم و گنگ هست. اول یه چیزهایی زمزمه کردم که بدرد هیچ بنی بشری نمیخورد. بعد موتورم روشن شد..

خب من میدونستم که با sysstat میشه منابع سیستم را مانیتور کرد. یکی از ابزار های خوب این مجموعه sar هست که اطلاعات سی پی یو را به ما میده. یه خروجی مثل این:

 

sar-output

خب حالا با این چیکار کنم؟ البته دوستی که این سوال را پرسید ارزش وقت گذاشتن را داشت و من هم بیکار و دنبال دردسر! پس میریم شروع میکنیم، چطوری میشه خیلی راحت همه این داده ها را روی گراف دید و نتیجه گیری کرد.

من میدونستم که با rrdtool میشه نمودارهای هندسی کشید، ولی دنبال یک راه حل ساده تر بودم. یه جستجو روی گوگل به من ابزار خوب gnuplot را معرفی کرد. خیلی راحت از روی مطالب سایت برنامه با آدرس http://www.gnuplot.info/documentation.html میشه به یه کد ساده رسید.

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

sar -f | grep -Ev ‘Average|LINUX|CPU|^$’ > sar.dat

خروجی سر را میفرستم به گرپ و سطر های خالی و سطرهایی که اون کلمات اضافه را دارند حذف میکنم و همه نتایج را در یک فایل ذخیره میکنم که بعدا قابل استفاده باشه. محتویات فایل  میشه این:

sar-grep

خب حالا میریم سراغ gnuplot و این کد را مینویسیم و به عنوان یک فایل اسکریپت ذخیره و اجرا میکنیم:

#!/usr/bin/gnuplot
set terminal png truecolor
set output “sar-graph.png”
set autoscale
set grid
set style data lines
set title “CPU usage with sar”
set xlabel “Time”
set ylabel “Percent”
set xdata time
set timefmt “%H:%M:%S”
set format x “%H:%M”
plot “sar.dat” using 1:3 title “User” with lines, \
“sar.dat” using 1:5 title “System” with lines, \
“sar.dat” using 1:8 title “Usage” with lines

خیلی ساده اول اومدم نوع نمودار و خروجی و سرنویس ها را مشخص کردم بعد گفتم که نمودار ایکس ها زمان هست که با قالب مشخص شده از ستون اول فایل که بعدا بهش میگم از کجا اون را بخونه و روی صفحه گراف نشون بده. خب حالا تو سه سطر آخر گفتم یه نمودار خطی با هر کدوم از سطرهای مشخص شده از فایل مثلا 3,5,8 بکشه و رنگ و عنوانش زا هم مشخص کنه. خروجی میشه یه فایل تصویر png شبیه این:

sar-graph

خب این از خروجی گزارش کارکرد امروز سی پی یو، بقیه روزها را از کجا بیارم؟

خیلی ساده کافیه فایلی که ابزار sar به عنوان لاگ ذخیره میکنه را با سوییچ -f بهش بدیم مثل این:

sar -f /var/log/sysstat/sa20151025 > sar.dat

خب کار دیگه ای که من کردم این بود که همه اینها را داخل یک فایل اسکریپت مرتب کردم و نوشتم و تاریخ را هم به عنوان آرگومان ورودی گرفتم تا گراف روز دلخواه رسم بشه. فایل را هم میزارم اینجا تا شما هم استفاده و کدهای ناشیانه و ناقص من را بهینه کنید. به  همکار و در واقع استادم که این سوال را پرسیده بود و از امروز تصمیم گرفته با جدیت وارد دنیای آزاد لینوکس بشه خوش آمد میگیم  🙂