پایگاه داده توزیع یافته کلاستر MySQL امکان دسترسی و بازده بالایی برای سیستم مدیریت پایگاه داده MySQL فراهم می‌سازد. یک کلاستر MySQL شامل یک یا چند گره مدیریتی (ndb_mgmd) است که پیکربندی کلاستر را ذخیره کرده و گره‌های داده (ndbd) که داده‌های کلاستر در آن ذخیره می‌شوند را کنترل می‌کنند. کلاینت‌ها (کلاینت‌های MySQL، سرورها یا API های بومی) پس از ارتباط با گره مدیریت، به طور مستقیم با این گره‌های داده ارتباط می‌گیرند.

در کلاستر MySQL معمولاً هیچ رونوشتی (replication) از داده‌ها نگهداری نمی‌شود، بلکه به جای آن از همگام‌سازی گره‌های داده استفاده می‌شود. به همین منظور یک موتور داده ویژه به نام NDBCluster یا (NDB) باید مورد استفاده قرار گیرد. بهتر است تصور کنیم که کلاستر یک محیط MySQL منطقی منفرد با اجزای دارای افزونگی است. از این رو کلاستر MySQL می‌تواند در ایجاد رونوشت با کلاسترهای MySQL دیگر همکاری کند.

کلاستر MySQL در محیطی که هیچ چیز به اشتراک گذاشته نشود، بهترین عملکرد خود را دارد. به طور ایده‌آل، هیچ دو جزئی در این کلاستر نباید در هیچ سخت‌افزاری شریک باشند. به منظور بیان و نمایش ساده‌تر موضوع خود را به استفاده از تنها سه سرور محدود می‌کنیم. ما دو سرور را به عنوان گره‌های داده راه‌اندازی می‌کنیم که داده‌ها بین آن‌ها همگام‌سازی می‌شوند. سرور سوم برای مدیریت کلاستر و همچنین برای سرور/کلاینت MySQL مورد استفاده قرار می‌گیرد. اگر سرورهای بیشتری در آینده به کلاستر اضافه شوند، می‌توانید گره‌های داده بیشتری به کلاستر اضافه کنید، سرور مدیر کلاستر را از سرور/کلاینت MySQL جدا کنید و سرورهای بیشتری را به عنوان مدیر کلاستر و سرور/کلاینت‌های MySQL پیکربندی نمایید.

پیش‌نیازها

برای تکمیل این راهنما باید در مجموع سه سرور داشته باشید که دو مورد از آن‌ها به عنوان گره‌های افزونگی داده‌ای MySQL یا (ndbd) و یک سرور به عنوان مدیر کلاستر (ndb_mgmd) و سرور /کلاینت MySQL به صورت (mysqld و mysql) استفاده می‌شوند.

  • سه سرور اوبونتو 18.04 که بین این سرورها باید شبکه خصوصی وجود داشته باشد.
  • یک کاربر غیر root با دسترسی‌های sudo برای هر سرور باید پیکربندی شده باشد.
    • اطمینان حاصل کنید که IP های خصوصی سرورهای خود را جایی یادداشت کرده‌اید. در این راهنما آی‌پی‌های خصوصی سرورها به شرح زیر هستند:
    • 198.51.100.0 آی‌پی گره نخست داده‌ای کلاستر MySQL است.
    • 198.51.100.1 آی‌پی گره داده‌ای دوم است
    • 198.51.100.2 آی‌پی گره مدیر کلاستر و سرور MySQL است.

زمانی که سرورها آماده شدند، کاربر غیر root پیکربندی شد و آدرس‌های آی‌پی برای هر سه گره را یادداشت کردید؛ آماده هستیم تا این راهنما را آغاز کنیم.

گام 1 – نصب و پیکربندی مدیر کلاستر (Cluster Manager)

در ابتدا کار خود را با دانلود و نصب مدیر کلاستر MySQL یا (ndb_mgmd) آغاز می‌کنیم. برای نصب مدیر کلاستر قبلاً باید برنامه نصب مناسب deb. را از صفحه دانلود کلاستر رسمی MySQL دانلود کرده باشیم. در این صفحه در بخش زیر Select Operating System، گزینه Ubuntu Linux را انتخاب کنید. سپس زیر گزینه Select OS Version، آیتم (Ubuntu Linux 18.04 (x86, 64-bit را انتخاب نمایید.

به بخش پایین صفحه مراجعه کنید تا این که گزینه DEB Package, NDB Management Server را ببینید و بر روی لینک دانلودی که شامل dbgsym نیست کلیک کنید. در صورتی که به نمادهای دیباگ نیاز دارید، می‌توانید گزینه دیگر را انتخاب کنید. سپس به صفحه آغاز دانلود هدایت می‌شوید. در این جا بر روی گزینه No thanks, just start my download کلیک کرده و لینک فایل deb. را کپی کنید. اینک وارد سرور مدیر کلاستر خود شده (در این راهنما آی‌پی 198.51.100.2 است) و این فایل deb. را دانلود کنید:

با استفاده از دستور زیر، موارد ndb_mgmd و dpkg را نصب کنید:

اینک باید پیش از اجرا، ndb_mgmd را پیکربندی کنیم، چون پیکربندی صحیح تضمین می‌کند که همگام‌سازی صحیح و توزیع بار مناسبی بین گره‌های داده وجود دارد. مدیر کلاستر باید نخستین جزئی باشد که در کلاستر MySQL راه‌اندازی می‌شود. این مدیر نیازمند یک فایل پیکربندی است که به صورت یک آرگومان به فایل اجرایی ارسال می‌شود. ما فایل پیکربندی زیر را ایجاد و استفاده خواهیم کرد: var/lib/mysql-cluster/config.ini/. در سرور مدیر کلاستر دایرکتوری var/lib/mysql-cluster/ را به طور مستقیم در جایی که فایل قرار خواهد گرفت ایجاد کنید:

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

متن زیر را در ویرایشگر وارد کنید:

پس از چسباندن متن فوق، مطمئن شوید که مقادیر hostname با آی‌پی‌های صحیح سرورهایی که پیکربندی خواهند شد جایگزین شده است. تنظیم پارامتر hostname یک معیار امنیتی مهم است که از اتصال سرورهای دیگر به مدیر کلاستر جلوگیری می‌کند. فایل را ذخیره کرده و از ویرایشگر متنی خارج شوید.

فایل فوق یک فایل پیکربندی کمینه برای کلاستر MySQL محسوب می‌شود. شما می‌توانید پارامترهای این فایل را بسته به نیازهای محیط production تغییر دهید. برای این که با یک فایل پیکربندی نمونه کاملاً تنظیم شده ndb_mgmd آشنا شوید، می‌توانید از مستندات کلاستر MySQL استفاده کنید.

در فایل فوق می‌توانید اجزای دیگری مانند گره‌های داده (ndbd) یا گره‌های سرور MySQL یعنی (mysqld) را با اضافه کردن آدرس‌ها به بخش مربوطه تنظیم کنید. اینک می‌توانیم مدیر کلاستر را با اجرای فایل باینری ndb_mgmd و تعیین فایل پیکربندی با استفاده از فلگ f- آغاز کنیم:

در این مرحله خروجی زیر را می‌بینید:

این مسئله نشان می‌دهد که سرور مدیریت کلاستر MySQL با موفقیت نصب شده و بر روی سرور دبیان ما در حال اجرا است. به طور ایده‎آل، دوست داریم که سرور مدیریت کلاستر به طور خودکار در زمان بوت آغاز شود. برای این وضعیت باید یک سرویس سیستمی را ایجاد و فعال کنیم. پیش از ایجاد چنین سرویسی باید سرور در حال اجرا را متوقف کنیم:

اینک فایل واحد systemd را با استفاده از ویرایشگر مورد علاقه خود باز کنید:

کد زیر را در آن بچسبانید:

در این بخش مجموعه کمی از گزینه‌ها را برای آموزش شیوه آغاز، توقف و ری‌استارت کردن پروسه ndb_mgmd به system معرفی کرده‌ایم. برای یادگیری موارد بیشتر در مورد نقش این گزینه‌ها در فایل پیکربندی واحد سیستمی به راهنمای آن مراجعه کنید. فایل را ذخیره کرده و خارج شوید. اینک پیکربندی مدیر system را با استفاده از دستور مجدداً بارگذاری کنید:

ما سرویسی که اخیراً ایجاد کرده بودیم را فعال نمودیم به طوری که مدیر کلاستر MySQL در هنگام ریبوت شدن سیستم مجدداً آغاز می‌شود.

در نهایت سرویس را آغاز می‌کنیم:

می‌توانید عملکرد صحیح سرویس مدیریت کلاستر NDB را با دستور زیر بررسی کنید:

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

خروجی فوق نشان می‌دهد که سرور مدیریت کلاستر MySQL به عنوان یک سرویس سیستمی در حال اجرا است. مرحله نهایی برای راه اندازی مدیر کلاستر این است که امکان اتصال‌های ورودی از دیگر گره‌های کلاستر MySQL به این شبکه خصوصی را فراهم کنیم. اگر هنگام راه‌اندازی سرور، فایروال ufw را پیکربندی نکرده‌اید، می‌توانید از این مرحله عبور کرده و به مرحله بعدی بروید. قواعد زیر را به اتصال‌های ورودی محلی از هر دو گره داده اضافه می‌کنیم:

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

اینک مدیر کلاستر آغاز شده و در حال اجرا است و می‌توانید با دیگر گره‌های کلاستر بر روی یک شبکه خصوصی تعامل داشته باشد.

گام 2 – نصب و پیکربندی گره‌های داده‌ای

توجه کنید که همه دستورها در این بخش باید بر روی هر دو گره داده‌ای اجرا شوند. در این مرحله ما daemon گره داده‌های کلاستر MySQL به نام ndbd را نصب می‌کنیم و گره‌ها را طوری پیکربندی می‌کنیم که بتوانند با مدیر کلاستر ارتباط داشته باشند.

برای فایل‌های باینری روی گره‌های داده‌های در ابتدا باید فایل‌های نصبی deb. مناسب را از صفحه دانلود رسمی MySQL دانلود کنیم. بدین منظور در زیر بخش Select Operating System، گزینه buntu Linux را انتخاب کنید. سپس زیر عنوان Select OS Version، گزینه (Ubuntu Linux 18.04 (x86, 64-bit را انتخاب نمایید.

به بخش پایین اسکرول کنید تا گزینه DEB Package, NDB Data Node Binaries را ببینید و بر روی لینک Download برای فایلی که شامل dbgsym نیست کلیک کنید. بدین ترتیب به صفحه Begin Your Download می‌روید که با راست کلیک روی گزینه No thanks, just start my download می‌توانید لینک فایل deb. را کپی کنید. اینک وارد سرور گره داده‌ای شوید و فایل deb. را دانلود کنید.

پیش از آن که فایل باینری گره داده‌ای را نصب کنیم باید وابستگی libclass-methodmaker-perl را نصب نماییم:

اینک می‌توانیم فایل باینری گره داده‌ای را با استفاده از dpkg نصب کنیم:

گره‌های داده‌ای پیکربندی خود را از مکان استاندارد MySQL یعنی (etc/my.cnf/) می‌گیرند. این فایل را با استفاده از ویرایشگر متنی ایجاد کرده و ویرایش می‌کنیم:

پارامترهای پیکربندی زیر را به فایل اضافه کنید:

معرفی مکان گره مدیر کلاستر تنها نیازمندی پیکربندی است که برای آغاز ndbd لازم است، چون باقی پیکربندی‌ها به طور مستقیم از مدیر کلاستر دریافت خواهد شد. فایل را ذخیره کرده و خارج شوید. در این مثال، گره داده‌ای درمی‌یابد که دایرکتوری داده بر اساس پیکربندی مدیر در مکان usr/local/mysql/data/ است. پیش از آغاز daemon این دایرکتوری را روی گره ایجاد می‌کنیم:

اینک می‌توانیم گره داده را با استفاده از دستور زیر آغاز کنیم:

خروجی زیر مشاهده خواهد شد:

daemon گره داده NDB به طور موفقیت‌آمیزی نصب شده و اینک روی سرور در حال اجرا است. همچنین باید امکن دریافت اتصال‌های ورودی از گره‌های کلاستر MySQL بر روی شبکه خصوصی را فعال کنیم. اگر فایروال ufw را در زمان راه‌اندازی سرور پیکربندی نکرده باشید، می‌توانید از بخشی که در ادامه معرفی می‌کنیم بگذرید و به بخش راه‌اندازی سرویس system برای ndbd بروید. در این بخش قواعدی برای اتصال‌های ورودی از مدیر کلاستر و دیگر گره‌های داده‌ای تعریف می‌کنیم:

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

سرورهای گره داده‌ای MySQL اینک می‌توانند با مدیر کلاستر و دیگر گره‌های داده بر روی شبکه خصوصی ارتباط بگیرند. در نهایت بهتر خواهد بود که از یک daemon برای گره داده استفاده کنیم تا زمانی که سرور بوت می‌شود به طور خودکار این پروسه آغاز شود. در این جا نیز از همان رویه‌ای که برای مدیر کلاستر استفاده کردیم بهره می‌گیریم و یک سرویس systemd ایجاد می‌کنیم. پیش از ایجاد چنین سرویسی باید پروسه در حال اجرای ndbd را متوقف کنیم:

اینک فایل واحد systemd را با ویرایشگر متنی محبوب خود باز کنید:

کد زیر را در آن وارد کنید:

در این بخش مجموعه کمینه‌ای از گزینه‌ها وارد کردیم تا به systemd بگوییم که چگونه می‌تواند پروسه ndbd را آغاز، متوقف و ری‌استارت کند. برای دانستن موارد بیشتر در مورد این پیکربندی می‌توانید به مستندات آن مراجعه کنید. فایل را ذخیره کرده و خارج شوید. اینک پیکربندی مدیر systemd را با استفاده از دستور زیر مجدداً بارگذاری می‌کنیم:

در این مرحله سرویسی که ایجاد کردیم، فعال شده است و هر بار که سرور بوت شود این پروسه نیز روی گره داده آغاز می‌شود:

در نهایت سرویس را آغاز می‌کنیم:

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

خروجی زیر مشاهده می‌شود:

خروجی فوق نشان می‌دهد که daemon گره داده کلاستر MySQL ndbd اینک به عنوان یک سرویس سیستمی در حال اجرا است. گره داده باید کاملاً فعال باشد و بتواند با مدیر کلاستر MySQL ارتباط بگیرد. زمانی که مراحل راه‌اندازی برای گره اول پایان یافت، همه مراحل فوق را در مورد گره داده‌ای دیگر نیز اجرا کنید.

گام 3 – پیکربندی و آغاز سرور و کلاینت MySQL

یک سرور استاندارد MySQL مانند آن که در ریپازیتوری APT اوبونتو وجود دارد، از موتور کلاینت MySQL NDB پشتیبانی نمی‌کند. این بدان معنی است که ما باید یک سرور SQL که برای نرم‌افزار کلاستر MySQL دیگری بسته‌بندی شده است نصب کنیم.

یک بار دیگر فایل باینری کلاستر MySQL را از صفحه دانلود رسمی کلاستر MySQL دریافت می‌کنیم. در این صفحه زیر بخش Select Operating System گزینه Ubuntu Linux را انتخاب کنید و سپس زیر Select OS Version گزینه (Ubuntu Linux 18.04 (x86, 64-bit را انتخاب نمایید. به سمت پایین صفحه اسکرول کنید تا گزینه DEB Bundle را ببینید و بر روی لینک Download کلیک کنید. بدین ترتیب به صفحه Begin Your Download هدایت می‌شوید. در این صفحه بر روی No thanks, just start my download راست کلیک کنید و لینک فایل فشرده tar. را انتخاب نمایید.

در این مرحله وارد سرور مدیر کلاستر شوید و این فایل فشرده را دانلود کنید. به خاطر داشته باشید که ما مشغول نصب سرور MySQL روی همان گرهی هستیم که مدیر کلاستر است؛ اما در محیط پروداکشن، این daemon ها باید روی گره‌های متفاوتی اجرا شوند.

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

سپس فایل را در این دایرکتوری از حالت فشرده خارج می‌کنیم:

به این دایرکتوری که شامل فایل‌های باینری اجرای کلاستر MySQL استخراج شده است، می‌رویم:

پیش از نصب فایل‌های باینری سرور MySQL باید چند وابستگی را نصب کنیم:

سپس لازم است وابستگی‌های سرور کلاستر MySQL را که به همراه فایل فشرده بسته‌بندی شده بود نصب کنیم:

زمانی که نوبت نصب mysql-cluster-community-server می‌رسد یک اعلان پیکربندی ظاهر می‌شود که از شما می‌خواهد تا رمز عبوری برای حساب کاربری root پایگاه داده MySQL خود تعیین کنید. در این مرحله باید رمز عبور قدرتمندی وارد کرده و <ok> را بزنید. رمز عبور root را مجدداً وارد کنید و دوباره <ok> را بزنید تا نصب کامل شود. اینک می‌توانیم فایل باینری سرور MySQL را با استفاده از دستور زیر نصب کنیم:

می‌بایست این نصب سرور MySQL را پیکربندی کنیم. فایل پیکربندی سرور MySQL به صورت پیش‌فرض در آدرس etc/mysql/my.cnf/ ذخیره می‌شود. فایل پیکربندی را در ویرایشگر متنی باز کنید:

خروجی زیرا را خواهد دید:

پیکربندی‌های زیر را به آن الحاق کنید:

فایل را ذخیره کرده و خارج شوید. سرور MySQL را ری‌استارت کنید تا این تغییرات اعمال شوند:

MySQL به صورت پیش‌فرض باید به طور خودکار زمانی که سرور را ریبوت می‌کنید، آغاز شود. اگر چنین نبود دستور زیر باعث اصلاح مشکل می‌شود:

یک سرور SQL باید روی سرور مدیر کلاستر / MySQL اجرا شوند. در مرحله بعدی چند دستور وارد می‌کنیم تا مطمئن شویم که نصب کلاستر همان طور که انتظار داریم عمل می‌کند.

گام 4 – تأیید نصب صحیح کلاستر MySQL

برای این که تأیید کنیم نصب کلاستر MySQL صحیح بوده است، وارد گره مدیر کلاستر / سرور SQL می‌شویم. کلاینت MySQL را از خط فرمان باز می‌کنیم و با تایپ کردن دستور زیر به حساب root که ایجاد کردیم، وارد می‌شویم:

رمز عبور را وارد کرده و اینتر را بزنید. خروجی در این لحظه چیزی شبیه زیر خواهد بود:

زمانی که وارد کلاینت MySQL شدید، دستور زیر را اجرا کنید:

اینک اطلاعاتی در مورد موتور کلاستر NDB می‌بیند که با پارامترهای اتصال آغاز شده است:

این امر نشان می‌دهد که شما با موفقیت به کلاستر SQL وصل شده‌اید. توجه کنید که تعداد ready_data_nodes برابر با 2 است. این افزونگی به کلاستر MySQL اجازه می‌دهد که حتی در صورتی که یکی از گره‌های داده از کار بیفتد، به فعالیت خود ادامه دهد. همچنین به این معنی است که کوئری‌های SQL در میان دو گره داده به صورت متوازنی تقسیم می‌شوند.

برای تست پایداری کلاستر می‌توانید یکی از گره‌ها را خاموش کنید. ساده‌ترین راه برای این کار، ری‌استارت کرده سرور گره داده‌ای جهت تست کامل فرایند بازیابی است. در این حالت می‌بایست مشاهده کنید که مقدار ready_data_nodes به 1 تغییر می‌یابد و دوباره با ریبوت شدن گره و اتصال مجدد به مدیر کلاستر به 2 باز می‌گردد.

برای خروج از اعلان MySQL دستور quit را تاپ کرده و CTRL-D را بزنید. این نخست تستی است که تأیید می‌کند کلاستر MySQL، سرور و کلاینت مشغول فعالیت هستند. اینک تست دیگری را اجرا می‌کنیم تا تأیید کنیم که کلاستر به طور صحیحی فعالیت می‌کند. کنسول مدیریت کلاستر ndb_mgm را با استفاده از دستور زیر باز کنید:

خروجی زیر مشاهده می‌شود:

زمانی که وارد کنسول شدید، دستور SHOW را وارد کرده و ENTER را بزنید:

خروجی زیر را مشاهده خواهید کرد:

خروجی فوق نشان می‌دهد که گره‌های داده با آی‌دی‌های 2 و 3 وصل شده‌اند. تنها یک گره مدیریت با آی‌دی 1 وجود دارد و یک سرور SQL نیز با آی‌دی 4 موجود است. می‌توانید با دستور STATUS به صورت زیر اطلاعات بیشتری در این مورد مشاهده کنید:

دستور فوق وضعیت، نسخه MySQL و نسخه NDB گره 2 را به شما نشان می‌دهد:

برای خروج از کنسول مدیریت دستور quit را تایپ کرده و اینتر را بزنید. کنسول مدیریت ابزاری بسیار قدرتمند است که گزینه‌های زیاد دیگری برای مدیریت کلاستر و داده‌های آن در اختیار شما قرار می‌دهد. این گزینه‌ها شامل پشتیبان‌گیری آنلاین نیز می‌شود. برای اطلاعات بیشتر به مستندات رسمی MySQL مراجعه کنید.

در این لحظه شما مراحل نصب کلاستر MySQL را به طور کامل تست کرده‌اید. مرحله آخر این راهنما اطلاعاتی در مورد شیوه ایجاد و درج داده‌های تست درون کلاستر MySQL در اختیار شما قرار می‌دهد.

گام 5 – درج داده در کلاستر MySQL

برای نمایش کارکرد کلاستر با استفاده از موتور NDB یک جدول جدید ایجاد کرده و مقادیری داده نمونه در آن درج می‌کنیم. توجه داشته باشید که برای استفاده از کارکرد کلاستر، این موتور باید به طور صریح به صورت NDB ذکر شده باشد. اگر از InnoDB (مقدار پیش‌فرض) یا هر موتور دیگری استفاده می‌کنید، نمی‌توانید از کلاستر استفاده نمایید. ابتدا با دستور زیر یک پایگاه داده به نام clustertest ایجاد می‌کنیم:

سپس به پایگاه داده جدید سوئیچ می‌کنیم:

اینک یک جدول ساده به نام test_table ایجاد می‌کنیم:

ما به طور صریح موتور ndbcluster را تعیین کرده‌ایم تا بتوانیم از کلاستر استفاده کنیم. اینک می‌توانیم با کوئری SQL زیر اقدام به درج داده‌ها بکنیم:

برای تأیید این که داده‌ها به طور صحیحی در جدول مربوطه درج شده‌اند کوئری انتخاب زیر را اجرا کنید:

زمانی که داده‌ها را وارد کردید و آن‌ها را از جدول مربوطه انتخاب نمودید، کلاستر کوئری‌ها را بین گره‌های داده‌ای موجود بالانس می‌کند. این امر موجب بهبود پایداری و عملکرد نصب پایگاه داده MySQL شما می‌شود. همچنین می‌توانید ndbcluster موتور ذخیره‌سازی پیش‌فرض را در فایل my.cnf که قبلاً ویرایش کردیم تعیین کنید. اگر چنین کاری کرده‌اید نیاز به تعیین گزینه ENGINE هنگام ایجاد جدول نخواهد بود. برای یادگیری بیشتر در این مورد به راهنمای ترجیحات MySQL مراجعه کنید.

نتیجه‌گیری

در این راهنما شیوه راه‌اندازی و پیکربندی کلاستر MySQL روی سرورهای اوبونتو 18.04 را آموزش دادیم. حتماً به خاطر داشته باشید که این معماری کاملاً کمینه است و صرفاً جهت مقاصد آموزشی در مورد رویه نصب ارائه شده است و گزینه‌ها و ویژگی‌های بسیار پیشرفته‌ای وجود دارند که هنگام توزیع کلاستر MySQL در محیط پروداکشن باید به آن‌ها توجه کنید. برای مثال یکی از این گزینه‌ها بحث پشتیبان‌گیری است.

اگر این نوشته مورد توجه شما قرار گرفته است، پیشنهاد می‌کنیم موارد زیر را نیز ملاحظه کنید:

==

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

آیا این مطلب برای شما مفید بود؟

نظر شما چیست؟

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