EQVPS

Πώς να εγκαταστήσετε το Redis σε VPS: όριο μνήμης, μονιμότητα και κωδικός που μένει

Εγκαταστήστε το Redis σε Ubuntu 24.04, περιορίστε τη μνήμη του ώστε να μην πιάσει όλο τον server, ενεργοποιήστε το αρχείο AOF χωρίς να σβήσετε τα δεδομένα σας και ορίστε κωδικό που αντέχει τις επανεκκινήσεις. Δύο από αυτά τα βήματα κρύβουν παγίδες στις οποίες πέσαμε στον δικό μας δοκιμαστικό server.

Το Redis κρατά δεδομένα στη μνήμη και απαντά σε περίπου ένα χιλιοστό του δευτερολέπτου, γι' αυτό βρίσκεται πίσω από τόσες εφαρμογές ως cache, ουρά ή αποθήκη sessions. Η εγκατάσταση είναι μία εντολή. Η δουλειά βρίσκεται στις προεπιλογές: κανένα όριο μνήμης, στιγμιότυπα που μπορεί να χάσουν πρόσφατες εγγραφές και δύο εύκολα λάθη που σβήνουν αθόρυβα τα δεδομένα σας ή απενεργοποιούν τον κωδικό σας. Ο οδηγός καλύπτει όλα αυτά σε Ubuntu 24.04. Τρέξαμε κάθε βήμα στην εικόνα μας· οι αριθμοί προέρχονται από έναν server 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 και ακούει μόνο στον ίδιο τον server: 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 μέχρι να τελειώσει στον server. Βάλτε ταβάνι και αποφασίστε τι γίνεται όταν το φτάσει:

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 συνολικά, και όλες οι εγγραφές πέρασαν. Σωστή επιλογή για cache.

Το CONFIG REWRITE αποθηκεύει τις τρέχουσες ρυθμίσεις στο /etc/redis/redis.conf, ώστε να επιβιώνουν σε επανεκκίνηση. Προσθέτει επίσης μια γραμμή που πρέπει να ξέρετε πριν από το βήμα 4.

3. Επιλέξτε πώς σώζει στον δίσκο

Από προεπιλογή, το Redis γράφει στιγμιότυπο (/var/lib/redis/dump.rdb) μετά από 1 αλλαγή σε μία ώρα, 100 σε πέντε λεπτά ή 10.000 σε ένα λεπτό. Δοκιμάσαμε τρεις τρόπους να το σταματήσουμε:

Πώς σταμάτησε το RedisΜόνο στιγμιότυπα (προεπιλογή)Με το αρχείο AOF
systemctl restartΤίποτα δεν χάθηκε: σώζει στο κλείσιμοΤίποτα δεν χάθηκε
Σκοτώθηκε με kill -9Το κλειδί μετά το τελευταίο στιγμιότυπο είχε χαθείΈνα κλειδί γραμμένο 2 δευτερόλεπτα πριν ήταν εκεί

Και στις δύο περιπτώσεις το systemd ξεκίνησε ξανά το Redis μόνο του μέσα σε δευτερόλεπτα.

Αν το Redis κρατά δεδομένα που θα σας έλειπαν, ενεργοποιήστε το αρχείο AOF (append-only file). Καταγράφει κάθε εγγραφή και τη γράφει στον δίσκο μία φορά το δευτερόλεπτο. Κάντε το στον server που τρέχει, όχι επεξεργαζόμενοι το αρχείο:

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

Πρώτα δοκιμάσαμε τον άλλο δρόμο, και μας κόστισε τα δεδομένα μας. Αλλάξαμε το appendonly no σε appendonly yes στο redis.conf και κάναμε επανεκκίνηση. Το Redis σηκώθηκε με κενό AOF και δεν φόρτωσε τίποτα από το στιγμιότυπο, οπότε όλα τα υπάρχοντα κλειδιά χάθηκαν. Στο επόμενο κλείσιμο έγραψε το νέο του περιεχόμενο, χωρίς τα παλιά κλειδιά, και πάνω στο dump.rdb. Το CONFIG SET το αποφεύγει: το Redis γράφει πρώτα το AOF από τα δεδομένα στη μνήμη. Μετά από επανεκκίνηση, όλα τα κλειδιά μας ήταν εκεί.

Αν το Redis είναι καθαρή cache που μπορεί να ξεκινήσει άδεια, κάντε το αντίθετο και κλείστε το σώσιμο με 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 τον αποθηκεύει πλέον ως hash SHA-256 στην ίδια γραμμή user default. Μετά από επανεκκίνηση, το 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 tunnel. Βάλτε τη θύρα SSH του server σας, που στα πακέτα NAT είναι η προσωπική σας θύρα:

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

Όσο τρέχει αυτό, το redis-cli -p 6380 και τα εργαλεία του υπολογιστή σας μιλούν με το Redis του server. Τίποτα καινούργιο δεν ανοίγει στο internet. Με τον οδηγό για κλειδιά SSH, το tunnel συνδέεται χωρίς κωδικό.

Πόσο γρήγορο είναι

Στον δοκιμαστικό server Micro, το redis-benchmark με 50 clients έδωσε:

ΔοκιμήΑιτήματα ανά δευτερόλεπτοΔιάμεση καθυστέρηση
SET30.3031,0 ms
GET35.1490,9 ms
SET, 16 εντολές ανά μετάβαση-επιστροφή272.1092,4 ms
GET, 16 εντολές ανά μετάβαση-επιστροφή414.9381,3 ms

Για την cache ή την ουρά εργασιών μιας web εφαρμογής, είναι πολύ περισσότερα απ' όσα θα χρειαστείτε. Η επιπλέον ταχύτητα έρχεται από την αποστολή εντολών σε δέσμες (pipelining).

Ποιο πακέτο

Το Redis χρειάζεται RAM για τα δεδομένα σας και λίγα ακόμη. Το Nano (2 vCPU, 1 GB, $3/μήνα) τρέχει Redis δίπλα σε μια μικρή εφαρμογή με maxmemory 256mb. Το Micro (2 GB, $5/μήνα) αφήνει χώρο για μεγαλύτερη cache και την εφαρμογή. Αν κάτι άλλο πρέπει να συνδεθεί απευθείας στο Redis, πάρτε δική σας IPv4 (από το Nano-IP με $8/μήνα) και επιτρέψτε στο firewall μόνο εκείνη τη διεύθυνση. Όλα τα πακέτα είναι στη σελίδα VPS, και η πληρωμή γίνεται σε USDT, USDC ή ETH στα δίκτυα Base, Ethereum ή Polygon.

Συχνές ερωτήσεις

Πόση RAM χρειάζεται το Redis;

Το ίδιο το Redis είναι μικροσκοπικό: 13,5 MB αμέσως μετά την εγκατάσταση στον server μας. Αυτό που χρειάζεται είναι χώρος για τα δεδομένα σας, που ζουν στη μνήμη. Ορίστε το maxmemory σε ό,τι μπορεί να διαθέσει ο server, για παράδειγμα 256 MB σε server με 1 GB, και επιλέξτε τι γίνεται όταν γεμίσει.

Redis ή Valkey;

Το Valkey είναι fork του Redis που ξεκίνησε από το Redis 7.2 και μιλά το ίδιο πρωτόκολλο, οπότε οι περισσότεροι clients δουλεύουν και με τα δύο. Το 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 στο internet;

Μην το κάνετε. Οι ανοιχτές θύρες Redis σαρώνονται συνεχώς και είναι συνηθισμένος δρόμος εισόδου σε servers. Συνδεθείτε στο Redis από τον υπολογιστή σας μέσω SSH tunnel ή κρατήστε το στον ίδιο server με την εφαρμογή που το χρησιμοποιεί.

Σχόλια

Δεν υπάρχουν ακόμη σχόλια. Γίνετε ο πρώτος.

Αφήστε ένα σχόλιο

Τα σχόλια ελέγχονται πριν εμφανιστούν.