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 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 წერს სნეპშოტს (/var/lib/redis/dump.rdb) საათში 1, ხუთ წუთში 100 ან წუთში 10 000 ცვლილების შემდეგ. მისი გაჩერების სამი გზა შევამოწმეთ:

როგორ გაჩერდა 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. და მხოლოდ პაროლი მუშაობდა. 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 სატესტო სერვერზე 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-ს RAM სჭირდება თქვენი მონაცემებისთვის და სხვა თითქმის არაფერი. Nano (2 vCPU, 1 GB, $3/თვე) Redis-ს პატარა აპლიკაციის გვერდით ამუშავებს maxmemory 256mb-ით. Micro (2 GB, $5/თვე) ადგილს უტოვებს უფრო დიდ ქეშს და თავად აპლიკაციას. თუ Redis-თან პირდაპირ რამე სხვა უნდა დაუკავშირდეს, აიღეთ საკუთარი IPv4 (Nano-IP-დან, $8/თვე) და ფაირვოლში მხოლოდ ეს მისამართი დაუშვით. ყველა პაკეტი VPS გვერდზეა, გადახდა კი USDT-ით, USDC-ით ან ETH-ით ხდება Base, Ethereum ან Polygon ქსელებში.

ხდკ

რამდენი RAM სჭირდება Redis-ს?

თავად Redis პაწაწინაა: ჩვენს სერვერზე დაყენებისთანავე 13,5 MB. მას ადგილი სჭირდება თქვენი მონაცემებისთვის, რადგან ისინი მეხსიერებაში ინახება. maxmemory დააყენეთ იმდენზე, რამდენსაც სერვერი დათმობს, მაგალითად 256 MB 1 GB-იან სერვერზე, და აირჩიეთ, რა მოხდეს, როცა მეხსიერება გაივსება.

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-ს backports-იდან იღებს. ამ სახელმძღვანელოს ნაბიჯები ორივეზე ვრცელდება.

რატომ კარგავს 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 გვირაბით დაუკავშირდით, ან შეინახეთ ის იმავე სერვერზე, სადაც მისი მომხმარებელი აპლიკაციაა.

კომენტარები

ჯერ არ არის კომენტარები. იყავით პირველი.

დატოვეთ კომენტარი

კომენტარები მოდერირდება გამოჩენამდე.