EQVPS

نصب Redis روی VPS: سقف حافظه، ذخیره روی دیسک و رمزی که از کار نمی‌افتد

Redis را روی Ubuntu 24.04 نصب کنید، حافظه‌اش را محدود کنید تا کل سرور را نگیرد، فایل AOF را بدون پاک شدن داده‌ها روشن کنید و رمزی بگذارید که بعد از راه‌اندازی دوباره هم بماند. در دو مرحله از این‌ها تله‌هایی هست که خودمان روی سرور آزمایشی در آن‌ها افتادیم.

Redis داده‌ها را در حافظه نگه می‌دارد و در حدود یک میلی‌ثانیه پاسخ می‌دهد، به همین دلیل پشت بسیاری از برنامه‌ها به‌عنوان کش، صف یا محل نگهداری نشست‌ها کار می‌کند. نصبش یک فرمان است. کار اصلی در پیش‌فرض‌هاست: سقفی برای حافظه نیست، تصویرها ممکن است نوشته‌های اخیر را از دست بدهند، و دو اشتباه ساده هست که بی‌صدا داده‌هایتان را پاک می‌کنند یا رمزتان را از کار می‌اندازند. این راهنما همهٔ این‌ها را روی Ubuntu 24.04 پوشش می‌دهد. همهٔ مراحل را روی ایمیج خودمان اجرا کردیم و عددها از یک سرور Micro (2 vCPU و 2 GB) آمده‌اند.

به یک کاربر با sudo نیاز دارید. راهنمای راه‌اندازی Ubuntu یکی می‌سازد.

1. نصب

sudo apt update
sudo apt install -y redis-server
redis-server --version
redis-cli ping

نصب 13 ثانیه طول کشید و Redis 7.0.15 را آورد. بلافاصله و در هر بوت اجرا می‌شود، با PONG پاسخ می‌دهد و فقط روی خود سرور گوش می‌دهد: 127.0.0.1:6379 و [::1]:6379، با protected-mode yes. بدون داده 13.5 MB رم مصرف می‌کرد.

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

WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition.

Redis از روی نسخه‌ای از خودش که با fork ساخته می‌شود روی دیسک ذخیره می‌کند، و با تنظیم پیش‌فرض کرنل این fork ممکن است وقتی حافظه کم است شکست بخورد. یک بار درستش کنید:

echo 'vm.overcommit_memory = 1' | sudo tee /etc/sysctl.d/90-redis.conf
sudo sysctl -p /etc/sysctl.d/90-redis.conf
sudo systemctl restart redis-server

بعد از راه‌اندازی دوباره، هشدار رفته بود.

2. حافظه‌اش را محدود کنید

به‌طور پیش‌فرض maxmemory برابر 0 است، یعنی بدون سقف، و سیاست noeviction است. Redis تا وقتی حافظهٔ سرور تمام شود رم برمی‌دارد. سقفی بگذارید و تصمیم بگیرید وقتی به آن رسید چه شود:

redis-cli CONFIG SET maxmemory 256mb
redis-cli CONFIG SET maxmemory-policy allkeys-lru
redis-cli CONFIG REWRITE

هر دو سیاست را با سقف 64 MB و 400,000 نوشتن آزمودیم:

  • noeviction (پیش‌فرض): حافظه روی 63 MB ایستاد و نوشتن‌های تازه با خطای OOM command not allowed when used memory > 'maxmemory' شکست خوردند. مناسب صف یا هر چیزی که نباید از دست برود.
  • allkeys-lru: Redis کلیدهایی را که مدت‌ها استفاده نشده بودند، 48,606 تا، دور ریخت و همهٔ نوشتن‌ها انجام شد. مناسب کش.

CONFIG REWRITE تنظیمات جاری را در /etc/redis/redis.conf ذخیره می‌کند تا بعد از راه‌اندازی دوباره بمانند. همچنین سطری اضافه می‌کند که پیش از مرحلهٔ 4 باید از آن خبر داشته باشید.

3. روش ذخیره روی دیسک را انتخاب کنید

به‌طور پیش‌فرض Redis بعد از 1 تغییر در یک ساعت، 100 تغییر در پنج دقیقه یا 10,000 تغییر در یک دقیقه یک تصویر (/var/lib/redis/dump.rdb) می‌نویسد. سه روش متوقف کردنش را آزمودیم:

Redis چطور متوقف شدفقط تصویر (پیش‌فرض)با فایل AOF
systemctl restartچیزی از دست نرفت: هنگام خاموشی ذخیره می‌کندچیزی از دست نرفت
کشته شدن با kill -9کلید نوشته‌شده بعد از آخرین تصویر از بین رفته بودکلیدی که 2 ثانیه قبل نوشته شده بود سر جایش بود

در هر دو حالت systemd ظرف چند ثانیه خودش Redis را دوباره بالا آورد.

اگر در Redis داده‌ای دارید که از دست دادنش برایتان مهم است، فایل AOF (append-only file) را روشن کنید. هر نوشتن را ثبت می‌کند و ثانیه‌ای یک بار روی دیسک می‌ریزد. این کار را روی سرور در حال اجرا انجام دهید، نه با ویرایش فایل:

redis-cli CONFIG SET appendonly yes
redis-cli CONFIG REWRITE
redis-cli INFO persistence | grep aof_

اول راه دیگر را امتحان کردیم و داده‌هایمان را از دست دادیم. در redis.conf مقدار appendonly no را به appendonly yes تغییر دادیم و دوباره راه‌اندازی کردیم. Redis با یک AOF خالی بالا آمد و از تصویر چیزی بار نکرد، پس همهٔ کلیدهای موجود از بین رفتند. بعد هم هنگام خاموشی، محتوای تازه‌اش را، بدون کلیدهای قدیمی، روی dump.rdb هم نوشت. CONFIG SET جلوی این را می‌گیرد: Redis اول AOF را از داده‌های داخل حافظه می‌نویسد. بعد از راه‌اندازی دوباره، همهٔ کلیدهای ما سر جایشان بودند.

اگر Redis فقط یک کش است که می‌تواند خالی شروع کند، برعکس عمل کنید و ذخیره را با redis-cli CONFIG SET save "" خاموش کنید.

4. رمز بگذارید

تلهٔ دوم این است. بعد از هر CONFIG REWRITE، Redis 7 این سطر را به انتهای redis.conf اضافه می‌کند:

user default on nopass ~* &* +@all

معنایش این است: «کاربر پیش‌فرض به رمز نیاز ندارد». بعد ما requirepass را بالاتر در فایل اضافه کردیم و دوباره راه‌اندازی کردیم. Redis همچنان بدون رمز PONG می‌داد، چون سطر user بر آن غلبه می‌کند. رمز را از طریق خود Redis بگذارید:

REDIS_PASS=$(openssl rand -hex 24)
echo "$REDIS_PASS"
redis-cli CONFIG SET requirepass "$REDIS_PASS"
REDISCLI_AUTH="$REDIS_PASS" redis-cli CONFIG REWRITE

رمز را جای امنی نگه دارید. Redis حالا آن را به‌صورت هش SHA-256 در همان سطر user default نگه می‌دارد. بعد از راه‌اندازی دوباره، redis-cli ping پاسخ NOAUTH Authentication required. داد و فقط با رمز کار کرد. رمز را با متغیر REDISCLI_AUTH به redis-cli بدهید. با -a در فهرست فرایندها دیده می‌شود و redis-cli دربارهٔ آن هشدار می‌دهد. در برنامه‌تان آن را در نشانی Redis بگذارید: redis://:PASSWORD@127.0.0.1:6379/0.

5. دسترسی از کامپیوتر خودتان

Redis را روی 127.0.0.1 نگه دارید و از تونل SSH استفاده کنید. پورت SSH سرورتان را بدهید؛ در پلن‌های NAT این پورت اختصاصی شماست:

ssh -N -L 6380:127.0.0.1:6379 deploy@YOUR_SERVER_IP -p 22

تا وقتی این اجراست، redis-cli -p 6380 و ابزارهای دسکتاپ کامپیوترتان با Redis روی سرور حرف می‌زنند و چیز تازه‌ای روی اینترنت باز نمی‌شود. با راهنمای کلیدهای SSH تونل بدون رمز وارد می‌شود.

چقدر سریع است

روی سرور آزمایشی Micro، redis-benchmark با 50 کلاینت این نتیجه را داد:

آزموندرخواست در ثانیهمیانهٔ تأخیر
SET30,3031.0 ms
GET35,1490.9 ms
SET، 16 فرمان در هر رفت‌وبرگشت272,1092.4 ms
GET، 16 فرمان در هر رفت‌وبرگشت414,9381.3 ms

برای کش یا صف کارهای یک برنامهٔ وب، این خیلی بیشتر از نیاز شماست. سرعت اضافه از فرستادن فرمان‌ها به‌صورت دسته‌ای (pipelining) می‌آید.

کدام پلن

Redis برای داده‌هایتان رم لازم دارد و چیز دیگری تقریبًا نه. Nano (2 vCPU، 1 GB، ماهی $3) با maxmemory 256mb Redis را کنار یک برنامهٔ کوچک اجرا می‌کند. Micro (2 GB، ماهی $5) برای کش بزرگ‌تر و خود برنامه جا می‌گذارد. اگر چیز دیگری باید مستقیم به Redis وصل شود، IPv4 اختصاصی بگیرید (از Nano-IP با ماهی $8) و در فایروال فقط همان نشانی را مجاز کنید. همهٔ پلن‌ها در صفحهٔ VPS هستند و پرداخت با USDT، USDC یا ETH روی شبکه‌های Base، Ethereum یا Polygon انجام می‌شود.

پرسش‌های متداول

Redis چقدر رم لازم دارد؟

خود Redis خیلی کوچک است: روی سرور ما بلافاصله بعد از نصب 13.5 MB. چیزی که لازم دارد جا برای داده‌های شماست، چون داده‌ها در حافظه نگه داشته می‌شوند. maxmemory را به اندازه‌ای بگذارید که سرور می‌تواند کنار بگذارد، مثلًا 256 MB روی سرور 1 GB، و انتخاب کنید وقتی پر شد چه شود.

Redis یا Valkey؟

Valkey انشعابی از Redis است که از نسخهٔ 7.2 جدا شد و همان پروتکل را دارد، پس بیشتر کلاینت‌ها با هر دو کار می‌کنند. Ubuntu 24.04 فقط Redis 7.0.15 دارد. Debian 13 هم Redis 8.0 دارد و هم Valkey 8.1، و Debian 12 نسخهٔ Valkey 8.0 را از backports می‌گیرد. مراحل این راهنما برای هر دو کار می‌کند.

چرا Redis بعد از خرابی داده از دست می‌دهد؟

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

requirepass را به redis.conf اضافه کردم، چرا Redis هنوز بدون رمز فرمان می‌پذیرد؟

احتمالًا چون زمانی CONFIG REWRITE اجرا شده است. در Redis 7 این فرمان سطر user default on nopass ~* &* +@all را به انتهای redis.conf اضافه می‌کند و این سطر requirepass بالاتر را بی‌اثر می‌کند. رمز را با CONFIG SET requirepass بگذارید و بعد CONFIG REWRITE را اجرا کنید تا Redis آن را در همان سطر ذخیره کند.

آیا می‌توانم پورت 6379 را روی اینترنت باز کنم؟

این کار را نکنید. پورت‌های باز Redis مدام اسکن می‌شوند و راه رایجی برای نفوذ به سرورها هستند. از کامپیوتر خودتان با تونل SSH به Redis وصل شوید، یا آن را روی همان سروری نگه دارید که برنامهٔ استفاده‌کننده‌اش هست.

نظرات

هنوز نظری نیست. اولین نفر باشید.

یک نظر بگذارید

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