مقدمه
Redis یک فروشگاه ساختار داده در حافظه باز متنباز است.
میتوانید از آن به عنوان یک جایگزین برای Memcached برای ذخیره جفتهای ساده کلید-مقدار، به عنوان پایگاه داده NoSQL،
یا حتی به عنوان یک توزیعکننده پیام با الگوی Pub-Sub استفاده کنید. این راهنما نحوه نصب، پیکربندی، تنظیم دقیق و ایمنسازی Redis در CentOS 8 را نشان میدهد.
پیشنیازها
یک سرور CentOS 8 با حافظه آزاد کافی برای Redis.
نصب 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