با نام خدا و سلام، یه چند وقتی میشه دارم برای مدیریت task های یکی از پروژه ها با Celery کار می کنم. قرار شد برای backend از MongoDB استفاده کنم که کم اذیتم نکرد و تصمیم گرفت آموزش مرحله به مرحله اش رو بزارم که شاید به درد کسی بخوره.
نکته: مسئله اصلی این بود که MongoDBروی یه ماشین دیگه ای نصب بود و به صورت remote قرار بود بهش اتصال داشته باشم.
فرضیات و پیش نیاز ها:
۱- فرض بر آن داریم که Celery و پایتون و تمامی پیش نیاز های celery نصب شده است.
۲- فرض داریم سیستم عامل مورد استفاده linux Ubuntu 20.04 می باشد.
نصب Mongo روی اوبونتو
نکته: برای نصب حتما اتصال به پیلتر شکن داشته باشید.
برای شروع، کلید public GPG key آخرین ورژن پایدار از MongoDB را با دستور زیر import می کنیم.
curl -fsSL https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
خروجی باید ok باشد. (برای مشاهده کلیدها می توانید از دستور apt-key list استفاده نمایید.)
روی سرور شما دو مکان وجود دارد که apt برای دانلود پکیج ها به آن نگاه می کند.۱) فایل sources.list و ۲) دایرکتوری sources.list.d
با استفاده از دستور زیر، یک فایل با نام mongodb-org-4.4.list درون دایرکتوری sources.list.d می سازیم و تنها محتوای این فایل، خط زیر می باشد.
deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse
:
دستور به شرح زیر است:
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
حال نوبت به بروزرسانی می رسد.
sudo apt update
پس از آپدیت شدن، نوبت به نصب mongoDBمی رسد:
sudo apt install mongodb-org
خب امیدوارم که هیچ مشکلی بهنگام دانلود و نصب براتون بوجود نیامده باشد. در صورت ارور دادن حتما اون فایل ساخته شده در sources.list.d را ابتدا حذف و سپس از دستورات remove و purge برای پاک کردن mongoDB استفاده کنید و مجدد اقدام به نصب کنید.
به راه انداختن سرویس MongoDB
برای شروع شدن سرویس MongoDB از دستور زیر استفاده کنید:
sudo systemctl start mongod.service
برای مشاهده وضعیت سرویس MongoDB از دستور زیر استفاده کنید:
sudo systemctl status mongod
برای فعال سازی سرویس MongoDB جهت اجرا به هنگام بوت، از دستور زیر استفاده نمایید:
sudo systemctl enable mongod
برای تست MongoDBنصب شده از دستور زیر استفاده نمایید:
mongo --eval 'db.runCommand({ connectionStatus: 1 })'
در صورت نصب صحیح، خروجی به شکل زیر خواهد بود:
MongoDB shell version v4.4.4 connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb Implicit session: session { "id" : UUID("dedd89ff-c0efad") } MongoDB server version: 4.4.4 { "authInfo" : { "authenticatedUsers" : [ ], "authenticatedUserRoles" : [ ] }, "ok" : 1 }
ایمن کردن ارتباط ریموت به MongoDB
همون طور که ابتدا گفتم، قصد ارتباط ریموت به ماشین MongoDB را داریم، به همین دلیل باید یه سری تغییرات در تنظیمات MongoDBانجام داد.
ابتدا باید بک user سطح ادمین به MongoDB اضافه کنیم.
با استفاده از دستور mongoوارد محیط شل می شویم:
mongo
خروجی به صورت زیر خواهد بود:
MongoDB shell version v4.4.4 connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb Implicit session: session { "id" : UUID("978616c5-988ee52086") } MongoDB server version: 4.4.4 >
ابتدا دستور زیر را بزنید:
> show dbs
دستور فوق لیست پایگاه داده ها را نمایش می دهد.
admin 0.000GB config 0.000GB local 0.000GB
خب بدلیل اینکه نیاز به ساخت کاربر ادمین داریم ابتدا نیاز دارید که به پایگاه داده ادمین متصل شوید، دستور زیر را وارد کنید :
> use admin
خروجی به شکل زیر خواهد بود:
switched to db admin
MongoDB با تعدادی متد های مبتنی بر جاوا اسکریپت نصب می شود، که می توان از آنها برای مدیریت پایگاه داده ها استفاده کرد، یکی از آنها db.createUser می باشد.
> db.createUser(
با توجه با ساختار json باید user جدید با ساختار jsonساخته شود، پرانتز و آکولادها برای همین منظور است.
حال یک آکولاد باز کنید:
... {
حال فیلد user: و نام کاربری مورد نظر خودتون رو بزنید:
... user: "sadegh-khan",
پس از نام کاربری به رمز عبور می رسیم که از pwd: استفاده کنید یا اگر mongoDBورزن بالاتر از 4.2 دارید از دستور زیر استفاده کنید:
... pwd: passwordPrompt(),
... pwd: "password",
سپس دستور زیر برای دسترسی های ادمین بزنید:
... roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
حال آکولاد را ببنیدید:
... }
و همچنین پرانتز:
... )
کل دستورات به شکل زیر شد:
> db.createUser( ... { ... user: "sadegh-khan", ... pwd: passwordPrompt(), ... roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ] ... } ... )
پس از بستن پرانتز، از شما ورود رمز عبور را میخواهد و خروجی زیر نمایش داده می شود:
Successfully added user: { "user" : "AdminSammy", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" }, "readWriteAnyDatabase" ] }
برای خروج دستور exitرا بزنید و اینتر کنید.
حال باید ورود و authenticate کردن را فعال کنیم، فایل کانفیگ mongoDB را باید تغییر دهیم:
sudo nano /etc/mongod.conf
با قسمت securityکار خواهیم داشت، پس security را از حالت کامنت خارج کنید و در خط بعدیاش با دو تا فاصله، عبارت authorization: "enabled"
را بنویسید.
. . . security: authorization: "enabled" . . .
همچنین باید bind را از حالت زیر به bind: 0.0.0.0 تغییر دهیم.
net: port: 27017 bindIp: 127.0.0.1
حال مونگو را ریست کنید:
sudo systemctl restart mongod
برای ورود به شل با کاربر ساخته شده ی جدید، از دستور زیر استفاده کنید:
mongo u sadegh-khan -p --authenticationDatabase admin
اتصال به MongoDB در Celery به عنوان backend
اول از همه مطمین باشید پکیج pymongo نصب باشد.
برای اتصال به mongodbبرای backend هم به صورت زیر پیش روید:
app = Celery('tasks', backend='mongodb://sadegh-khan:password@192.168.100.31:27017/?authSource=admin', broker='redis://192.168.100.31:6379')
مراجع :
مراجع:
سلام
شما با celery کار کردید یه سوال داشتم ، من میخوام task ها رو نگه داری کنم ، یعنی اگه سرویسم stop شد و دوباره اجرا شد
بتونم دوباره تسک های قبلی رو ببینم
ظاهرا باید تو flower تنظیم بزنم، این رو زدم ولی کار نمیکنه، شما تجربه ش رو داشتید؟
celery -A tasks flower –persistent=True –db=flower.db –state_save_interval=5
از result backend استفاده کردم و تو mongo ذخیره میکنم ، منتها برای نمایش ش مشکل دارم
که وفتی ریست شد دوباره قبلی ها رو ببینم
سلام،
من برای یه پروژه از celerys استفاده کردم و به صورت کامل مسلط نیستم.
اما celeryتسک ها رو روی Brokerذخیره می کنه. از معروف هاش هم redis و rabbitmq رو میشه نام برد.
با تنظیم بروکر، تسک های شما با stop شدن سرویس نباید از بین برند.
نگاهی به این لینک بندازید: بروکر در سلری