مقدمه

Redis یک فروشگاه ساختار داده در حافظه باز متن‌باز است.

می‌توانید از آن به عنوان یک جایگزین برای Memcached برای ذخیره جفت‌های ساده کلید-مقدار، به عنوان پایگاه داده NoSQL،

یا حتی به عنوان یک توزیع‌کننده پیام با الگوی Pub-Sub استفاده کنید. این راهنما نحوه نصب، پیکربندی، تنظیم دقیق و ایمن‌سازی Redis در CentOS 8 را نشان می‌دهد.

پیش‌نیازها

یک سرور CentOS 8 با حافظه آزاد کافی برای Redis.

  1. نصب Redis

مخزن RPM Remi یک مخزن معتبر و پایین‌آمده ویژه جامعه برای CentOS است. بسته Redis در این مخزن معمولاً جدیدتر از بسته Redis CentOS است.

repo را فعال کنید

$ sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm -y

لیست تمام بسته‌های Redis موجود در مخزن Remi را نمایش دهید.

$ dnf module list | grep redis

نتیجه باید به این شکل باشد:

 

redis     5 [d]        common [d]     Redis persistent key-value database                                         

redis     remi-5.0     common [d]     Redis persistent key-value database                                         

redis     remi-6.0     common [d]     Redis persistent key-value database      

مقادیر در ستون دوم مربوط به نسخه‌های اصلی Redis هستند.

فرض کنید که آخرین نسخه اصلی نسخه 6.0 باشد، آن نسخه را نصب کنید:

$ sudo dnf module install redis:remi-6.0 -y

سرویس Redis را برای شروع در زمان بوت فعال کنید.

$ sudo systemctl enable redis.service

Redis را شروع کنید.

$ sudo systemctl start redis.service

 

2. پیکربندی Redis

 

فایل پیکربندی Redis را در ویرایشگر مورد علاقه‌تان باز کنید:

$ sudo nano /etc/redis.conf

ظرفیت حافظه مورد نظر برای برنامه‌تان را تنظیم کنید.

maxmemory 128mb

 

به طور پیش‌فرض، هنگامی که حداکثر حافظه (maxmemory) رسیده شود، Redis به نوشتن داده‌های جدید متوقف می‌شود. اگر می‌خواهید Redis داده‌های جدید را با حذف داده‌های قدیمی به‌صورت خودکار بنویسد، باید به Redis بگویید چگونه داده‌های قدیمی را حذف کند. سیاست اخراج allkeys-lru یک انتخاب خوب برای اکثر کاربران است. خط زیر را اضافه کنید:

maxmemory-policy allkeys-lru

درباره روش‌های اخراج بیشتر بیاموزید.

سیاست ذخیره‌سازی بر روی دیسک را تنظیم کنید.

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

save 900 1

 save 300 10 

save 60 10000

این بدان معناست که ذخیره‌سازی انجام خواهد شد:

بعد از 900 ثانیه (15 دقیقه) اگر حداقل 1 کلید تغییر کرده باشد

بعد از 300 ثانیه (5 دقیقه) اگر حداقل 10 کلید تغییر کرده باشد

بعد از 60 ثانیه اگر حداقل 10000 کلید تغییر کرده باشد

با تنظیمات پیش‌فرض بالا، هر بار Redis راه‌اندازی می‌شود، داده‌های ذخیره‌شده را به حافظه می‌آورد. بنابراین داده‌های حافظه‌ای قبلی شما بازیابی می‌شود. اگر از این ویژگی استفاده نمی‌کنید، می‌توانید آن را کاملاً غیرفعال کنید با این که این خطوط را کامنت کنید:

# save 900 1 

# save 300 10 

# save 60 10000

اگر تصمیم می‌گیرید این ویژگی را حفظ کنید، باید سرور را به یک پلن بزرگتر ارتقاء دهید یا یک فایل swap مناسب بر روی لینوکس اضافه کنید تا حافظه Redis دو برابر maxmemory اعلام شده در بالا باشد. در غیر این صورت، در حالت بدترین حالت، هنگامی که maxmemory رسیده شود، فرآیند ذخیره‌سازی ممکن است باعث تمام شدن حافظه سرور شما شود.

پس از ذخیره و بسته‌کردن فایل پیکربندی، Redis را برای اعمال تغییرات دوباره راه‌اندازی کنید.

$ sudo systemctl restart redis.service

 

3. بهینه‌سازی سیستم

فایل log Redis را بررسی کنید:

$ sudo tail /var/log/redis/redis.log

شما ممکن است اطلاعاتی مانند زیر را ببینید:

5228:M 15 Aug 2020 04:14:29.133 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

5228:M 15 Aug 2020 04:14:29.133 # Server initialized

5228:M 15 Aug 2020 04:14:29.133 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

5228:M 15 Aug 2020 04:14:29.133 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

 

برای رفع هشدار اول، دستور زیر را وارد کنید.

 

$ echo 'net.core.somaxconn = 512' | sudo tee -a /etc/sysctl.conf > /dev/null

برای رفع هشدار دوم، دستور زیر را وارد کنید.

$ echo 'vm.overcommit_memory = 1' | sudo tee -a /etc/sysctl.conf > /dev/null

مقادیر sysctl را بازنشانی کنید.

$ sudo sysctl -p

برای رفع هشدار آخر، باید قبل از شروع سرویس Redis، hugepages شفاف را در زمان بوت غیرفعال کنید.

یک فایل اسکریپت جدید ایجاد کنید:

$ sudo nano /usr/bin/disable-transparent-hugepage

متن زیر را در فایل قرار دهید:

bash

#!/bin/bash

echo never > /sys/kernel/mm/transparent_hugepage/enabled

exit 0

فایل را ذخیره کرده و ببندید، سپس آن را قابل اجرا و متعلق به حساب کاربری root کنید:

$ sudo chown root:root /usr/bin/disable-transparent-hugepage

$ sudo chmod 770 /usr/bin/disable-transparent-hugepage

بعد، فایل پیکربندی برای سرویس systemd ایجاد کنید که این اسکریپت را در زمان بوت فراخوانی می‌کند:

$ sudo nano /etc/systemd/system/disable-transparent-hugepage.service

متن زیر را در فایل قرار دهید، سپس آن را ذخیره کرده و ببندید:

[Unit]

Description=غیرفعال کردن صفحات بزرگ شفاف (THP) برای Redis.

Before=redis.service

[Service]

Type=exec

ExecStart=/usr/bin/disable-transparent-hugepage

[Install]

WantedBy=multi-user.target

سپس سرویس را فعال کنید:

$ sudo systemctl enable disable-transparent-hugepage.service

4. تأیید تنظیمات

سرور Redis را دوباره راه‌اندازی کنید:

$ sudo reboot

بعد از راه‌اندازی مجدد سرور، فایل log Redis را برای اطمینان از عدم وجود هشدارهایی بررسی کنید:

$ sudo tail /var/log/redis/redis.log

از برنامه redis-cli برای اتصال به Redis از طریق آی‌پی 127.0.0.1 و پورت 6379 استفاده کنید.

$ redis-cli -h 127.0.0.1 -p 6379

اگر اتصال موفقیت‌آمیز باشد، پرومپ دستور Redis را مشاهده خواهید کرد:

127.0.0.1:6379>

چند دستور Redis را وارد کنید تا مطمئن شوید که کار می‌کند:

set testkey testvalue

get testkey

exit

اگر نتیجه زیر را ببینید، به این معناست که Redis به درستی کار می‌کند.

127.0.0.1:6379> set testkey testvalue

OK

127.0.0.1:6379> get testkey

"testvalue"

127.0.0.1:6379> exit

5. (اختیاری) پیکربندی Redis برای دسترسی از طریق شبکه خصوصی

 

اگر یک محیط تولیدی با چند سرور برای برنامه‌تان راه‌اندازی کرده‌اید، سرورهای برنامه نیاز به دسترسی به سرور Redis دارند. توصیه می‌شود از یک شبکه خصوصی برای ایمنی استفاده کنید.

 

پیکربندی شبکه خصوصی

 

این راهنما را دنبال کنید تا شبکه خصوصی را برای سرور Redis و سرورهای برنامه‌ای که باید با Redis ارتباط برقرار کنند، فعال و پیکربندی کنید.

خدمت firewalld را برای اتصالات ورودی از شبکه خصوصی به‌روز کنید:

$ sudo firewall-cmd --permanent --zone=trusted --change-interface=ens7

یک سرویس systemd برای تأخیر شروع Redis تا زمانی که رابط خصوصی فعال و آدرس IP تخصیص داده شود، ایجاد کنید.

$ sudo nano /etc/systemd/system/redis.service.d/wait-for-ips.conf

متن زیر را در فایل قرار دهید، سپس آن را ذخیره کرده و ببندید:

[Unit]

After=network-online.target

 Wants=network-online.target

فایل پیکربندی Redis را ویرایش کنید.

$ sudo nano /etc/redis.conf

آدرس IP خصوصی که Redis باید به آن متصل شود را اضافه کنید. به عنوان مثال، اگر Redis باید به همزمان به ادرس internal loopback (127.0.0.1) و یک آدرس IP خصوصی (192.168.0.100) متصل شود:

bind 127.0.0.1 192.168.0.100

فایل پیکربندی را ذخیره کرده و ببندید.

Redis را برای اعمال تغییرات دوباره راه‌اندازی کنید.

$ sudo systemctl restart redis.service

تست شبکه خصوصی

به یکی از سرورهای برنامه خود در شبکه خصوصی از طریق SSH متصل شوید.

با فرض اینکه سرور برنامه همچنین CentOS 8 باشد، به موقت نصب Redis برای به دست آوردن نرم‌افزار redis-cli از طریق دستور زیر:

$ sudo dnf install redis

از برنامه redis-cli برای اتصال به سرور Redis استفاده کنید.

$ redis-cli -h 192.168.0.100 -p 6379

اگر اتصال موفقیت‌آمیز باشد، پرومپ دستور Redis را مشاهده خواهید کرد:

192.168.0.100:6379>

چند دستور Redis را وارد کنید تا مطمئن شوید که کار می‌کند:

set testkey testvalue 

get testkey 

exit

سایت سازنده