EQVPS

VPS پر Redis کیسے انسٹال کریں: میموری کی حد، ڈسک پر محفوظ کرنا اور ایسا پاس ورڈ جو برقرار رہے

Ubuntu 24.04 پر Redis انسٹال کریں، اس کی میموری محدود کریں تاکہ پورا سرور نہ لے لے، ڈیٹا مٹائے بغیر 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 RAM لے رہا تھا۔

لاگ میں پہلے سے ایک وارننگ تھی:

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 تب تک RAM لیتا رہے گا جب تک سرور میں ختم نہ ہو جائے۔ ایک حد مقرر کریں اور طے کریں کہ وہاں پہنچ کر کیا ہو:

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 اسے اسی user default لائن میں SHA-256 ہیش کی شکل میں رکھتا ہے۔ ری اسٹارٹ کے بعد redis-cli ping نے NOAUTH Authentication required. جواب دیا اور صرف پاس ورڈ سے کام چلا۔ redis-cli کو یہ REDISCLI_AUTH ویری ایبل کے ذریعے دیں۔ -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 ٹیسٹ سرور پر 50 کلائنٹس کے ساتھ redis-benchmark کے نتائج:

ٹیسٹفی سیکنڈ درخواستیںدرمیانی تاخیر
SET30,3031.0 ms
GET35,1490.9 ms
SET، ہر آمد و رفت میں 16 کمانڈز272,1092.4 ms
GET، ہر آمد و رفت میں 16 کمانڈز414,9381.3 ms

کسی ویب ایپ کے کیش یا کاموں کی قطار کے لیے یہ ضرورت سے کہیں زیادہ ہے۔ اضافی رفتار کمانڈز کو گروپ میں بھیجنے (pipelining) سے آتی ہے۔

کون سا پلان

Redis کو آپ کے ڈیٹا کے لیے RAM چاہیے اور بہت کم کچھ اور۔ Nano (2 vCPU، 1 GB، $3 ماہانہ) maxmemory 256mb کے ساتھ ایک چھوٹی ایپ کے ساتھ Redis چلا لیتا ہے۔ Micro (2 GB، $5 ماہانہ) بڑے کیش اور ایپ دونوں کے لیے جگہ چھوڑتا ہے۔ اگر کسی اور کو Redis سے براہِ راست جڑنا ہے تو اپنا IPv4 لیں (Nano-IP سے، $8 ماہانہ) اور فائر وال میں صرف وہی پتا اجازت دیں۔ تمام پلانز VPS صفحے پر ہیں، اور ادائیگی Base، Ethereum یا Polygon نیٹ ورکس پر USDT، USDC یا ETH میں ہوتی ہے۔

عمومی سوالات

Redis کو کتنی RAM چاہیے؟

Redis خود بہت چھوٹا ہے: ہمارے سرور پر انسٹال ہوتے ہی 13.5 MB۔ اسے آپ کے ڈیٹا کے لیے جگہ چاہیے، کیونکہ ڈیٹا میموری میں رہتا ہے۔ maxmemory کو اتنا رکھیں جتنا سرور دے سکے، مثلاً 1 GB والے سرور پر 256 MB، اور چن لیں کہ بھرنے پر کیا ہو۔

Redis یا Valkey؟

Valkey، Redis کا فورک ہے جو Redis 7.2 سے الگ ہوا اور وہی پروٹوکول بولتا ہے، اس لیے زیادہ تر کلائنٹ دونوں کے ساتھ چلتے ہیں۔ Ubuntu 24.04 میں صرف Redis 7.0.15 ہے۔ Debian 13 میں Redis 8.0 اور Valkey 8.1 دونوں ہیں، اور Debian 12 کو Valkey 8.0 بیک پورٹس سے ملتا ہے۔ اس گائیڈ کے مراحل دونوں پر لاگو ہوتے ہیں۔

کریش کے بعد Redis ڈیٹا کیوں کھو دیتا ہے؟

ڈیفالٹ طور پر Redis، بدلی ہوئی کیز کی تعداد کے لحاظ سے، ہر چند منٹ بعد ڈسک پر اسنیپ شاٹ محفوظ کرتا ہے۔ جب ہم نے پروسیس ختم کیا تو آخری اسنیپ شاٹ کے بعد لکھی گئی کی غائب تھی۔ AOF فائل آن کریں جو ہر سیکنڈ لکھتی ہے، پھر کریش میں زیادہ سے زیادہ تقریباً ایک سیکنڈ کی تحریریں ضائع ہوں گی۔

میں نے redis.conf میں requirepass شامل کیا، پھر بھی Redis بغیر پاس ورڈ کمانڈز کیوں لے رہا ہے؟

غالباً اس لیے کہ کسی وقت CONFIG REWRITE چلایا گیا تھا۔ Redis 7 میں یہ redis.conf کے آخر میں user default on nopass ~* &* +@all والی لائن جوڑ دیتا ہے، اور یہ لائن اوپر لکھے requirepass کو بے اثر کر دیتی ہے۔ پاس ورڈ CONFIG SET requirepass سے لگائیں، پھر CONFIG REWRITE چلائیں، تو Redis اسے اسی لائن میں محفوظ کر لے گا۔

کیا میں پورٹ 6379 انٹرنیٹ پر کھول سکتا ہوں؟

نہ کھولیں۔ کھلے Redis پورٹس مسلسل اسکین ہوتے ہیں اور سرورز میں گھسنے کا عام راستہ ہیں۔ اپنے کمپیوٹر سے Redis تک SSH ٹنل کے ذریعے جائیں، یا اسے اسی سرور پر رکھیں جس پر اسے استعمال کرنے والی ایپ ہے۔

تبصرے

ابھی کوئی تبصرہ نہیں۔ پہلے بنیں۔

ایک تبصرہ چھوڑیں

تبصرے ظاہر ہونے سے پہلے moderate کیے جاتے ہیں۔