Rose در کارگاه نمایشی آکادمی ویونیکس، تکثیر Redis و سه رأی‌دهندهٔ Sentinel را بررسی می‌کند؛ تصویر ساختگی آموزشی.

WIUNIX ACADEMY

آموزش نصب Redis Sentinel در اوبونتو و دبیان

یک سرور نویسنده، دو نسخهٔ آماده‌به‌کار و سه رأی‌دهندهٔ مستقل بسازید؛ رسیدن داده، کشف مقصد، جابه‌جایی و بازیابی امن را بررسی کنید.

پیشرفته75 دقیقه مطالعهبه‌روزرسانی
محیطت را انتخاب کن

آموزش متناسب با محیط تو

کجا اجرا می‌کنی؟

سیستم‌عامل و نسخه را انتخاب کن تا مراحل، دستورها و راه‌حل‌ها برای همان محیط نمایش داده شوند.

Ubuntu 26.10بررسی‌شده با مستندات رسمی ·

از اینجا شروع کن

در پایان چه چیزی خواهی داشت؟

راه‌اندازی سه سرور Redis و Sentinel با TLS دوطرفه، نقش‌های مستقل، بررسی دادهٔ مقصد و تمرین جابه‌جایی و بازیابی با حفظ داده.

01A · نویسندهٔ اولیهRedis و Sentinel · دامنهٔ۱
02B · دریافت‌کنندهRedis و Sentinel · دامنهٔ۲
03C · دریافت‌کنندهRedis و Sentinel · دامنهٔ۳
سیستم‌عامل‌ها و نسخه‌های پوشش‌داده‌شده

بازبینی۲۰۲۶-۱۰-۲۰. پنج مسیر توزیع بر پایهٔ مستندات‌اند و آزمون نصب کامل نیستند. با Redis 7.0.15 موجود، سه نمونهٔ داده و سه Sentinel در شبکهٔ جدا برای TLS دوطرفه، ACL، دادهٔ مقصد، انتخابات پس از توقف سرویس، دادهٔ بعد از جابه‌جایی، بازگشت، بازنویسی تنظیمات، خروجی و بازیابی RDB و رد نوشتن بدون نسخهٔ همراه آزموده شدند. اجرای یک‌میزبانی استقلال دامنهٔ خرابی، نصب کامل، systemd، فایروال، کتابخانهٔ واقعی اپلیکیشن یا همهٔ سیستم‌عامل‌ها را ثابت نمی‌کند. پشتیبانی توزیع و بالادستی جداست. عکس‌ها نمایشی‌اند.

قبل از شروع

  • سه سرور systemd تازه با نسخهٔ یکسان سیستم‌عامل و بسته، دسترسی sudo و SSH، IP خصوصی و ساعت هماهنگ در دامنه‌های خرابی مستقل.
  • سیاست شبکهٔ محدود، میزبان مجاز کلاینت، مدیر اسرار محافظت‌شده و CA اختصاصی موجود با گواهی مستقل هر گره و گواهی جدا برای کلاینت.
  • دادهٔ قبلی Redis یا Valkey و نویسندهٔ اپلیکیشن وجود نداشته باشد. رم و دیسک کافی برای ذخیره‌سازی و بکاپ؛ میزبان بازیابی هم‌نسخه با قابلیت فضای نام شبکه و دسترسی ریشه.

یک سرور نویسنده و دو نسخهٔ آماده‌به‌کار

این آموزش برای سه سرور تازه و اختصاصی است: A با نشانی 10.20.0.10، B با 10.20.0.11 و C با 10.20.0.12. روی هر سرور، Redis روی پورت TLS 6379 و Sentinel روی TLS 26379 اجرا می‌شود. ابتدا A نویسنده است و دو سرور دیگر فقط داده را دریافت می‌کنند. نام گروه academy پس از تغییر سرور اصلی ثابت می‌ماند. رأی‌دهنده‌ها باید در سه دامنهٔ خرابی مستقل باشند؛ سه پردازش روی یک میزبان یا سه ماشین روی یک هایپروایزر چنین استقلالی ندارند. این ساختار برای یک مجموعه‌داده است و شاردینگ یا نوشتن هم‌زمان روی چند سرور را فراهم نمی‌کند.

رأی خرابی با مجوز جابه‌جایی فرق دارد

با حد نصاب ۲، دست‌کم دو Sentinel باید خرابی سرور اصلی را گزارش کنند. برای انتخاب رهبر جابه‌جایی نیز موافقت اکثریت تمام Sentinelهای شناخته‌شده لازم است؛ در این طرح دو رأی از سه رأی. یک رأی‌دهندهٔ تنها اجازهٔ ارتقا ندارد. تکثیر ناهم‌زمان است: حتی نوشتن تأییدشده ممکن است پس از ارتقا از دست برود و پاسخ نسخهٔ پشتیبان می‌تواند قدیمی باشد. WAIT فقط دریافت داده توسط نسخه‌ها را در همان اتصال بررسی می‌کند؛ تضمین ثبت پایدار یا اجماع نیست. ذخیره‌سازی AOF با فاصلهٔ یک ثانیه هم در خرابی ناگهانی ممکن است آخرین تغییرات محلی را از دست بدهد. Sentinel جای حصارگذاری شبکه یا بکاپ را نمی‌گیرد.

پیش از نصب، شبکه و دادهٔ قبلی روشن باشد

این مراحل برای راه‌اندازی تازه است، نه مهاجرت دادهٔ موجود. اگر بررسی اولیه نصب یا داده‌ای پیدا کرد، کار را متوقف کنید؛ پاک‌کردن آن برای عبور از کنترل مجاز نیست. نسخهٔ سیستم‌عامل و بسته‌ها روی سه سرور یکسان باشد. نشانی‌های نمونه و رابط ens 18 را با شبکهٔ واقعی جایگزین کنید. در فایروال یا گروه امنیتی با سیاست پیش‌فرض مسدود، پورت۶۳۷۹ فقط برای سه سرور و نشانی‌های مصوب اپلیکیشن و مدیر باز باشد. پورت۲۶۳۷۹ هم فقط به رأی‌دهنده‌ها و کلاینت‌های مجاز کشف سرویس دسترسی بدهد. قاعدهٔ محدود SSH حفظ شود. پیش از روشن‌کردن سرویس‌ها این کنترل‌ها را برقرار کنید؛ دسترسی عمومی و تغییر پورت با NAT در این طرح جایی ندارد.

نسخهٔ بالادستی، وصلهٔ توزیع و مجوز

در بازبینی۲۰۲۶-۱۰-۲۰، فهرست انتشار بالادستی شاخهٔ۸٫۱۰ را نشان می‌دهد، ولی مبنای بسته‌های انتخابی۸٫۰ یا۷٫۰ است. این دو شاخه در سیاست امنیتی بالادستی پشتیبانی نمی‌شوند؛ تصمیم نگهداری بستهٔ وصله‌شدهٔ توزیع جداست. استفادهٔ عملیاتی این راهنما مشروط به تأیید پوشش امنیتی بسته است، نه توصیه به اجرای باینری بدون نگهداری. مبدأ مخزن و وضعیت امنیتی بسته بررسی شود. مبنای۷٫۰ مجوز BSD-3-Clause دارد؛ Redis 8 گزینه‌های AGPLv 3 و RSALv 2 و SSPLv 1 را عرضه می‌کند. متن copyright بسته و تعهد مجوز انتخابی، به‌ویژه برای نسخهٔ تغییرکرده یا عرضهٔ میزبانی‌شده، باید بررسی شود. شرایط Cloud و Software خودکار به این بسته اعمال نمی‌شود. این راهنما مجموعهٔ ماژول نصب نمی‌کند.

01

قدم بعدی

بررسی سه سرور تازه

روی A و B و C با حساب مدیر دارای sudo اجرا شود. نسخهٔ سیستم‌عامل، نشانی خصوصی، همگام‌بودن ساعت و منابع را بررسی کنید؛ برای آزمایش کوچک دست‌کم۲ گیگابایت رم و فضای کافی برای داده، بازنویسی AOF و بکاپ لازم است. هر پردازشی روی پورت‌های۶۳۷۹ و۲۶۳۷۹ نیاز به بررسی دارد. نصب دستی ممکن است در فهرست بسته‌ها دیده نشود؛ خروجی پردازش‌ها و پورت‌ها نیز ملاک است.

Bash
(
set -euo pipefail
. /etc/os-release
printf '%s %s\n' "$ID" "$VERSION_ID"
dpkg --print-architecture
ip -br address
timedatectl status
df -h / /var
installed=$(dpkg-query -W -f='${binary:Package} ${db:Status-Status}\n')
if printf '%s\n' "$installed" | grep -E '^(redis-server|redis-sentinel|valkey-server|valkey-sentinel)(:[^ ]+)? installed$' >/dev/null; then
  echo 'Existing Redis/Valkey installation: STOP' >&2; exit 1
fi
for path in /etc/redis /var/lib/redis /var/lib/redis-sentinel; do
  if sudo test -e "$path"; then echo "Existing state: $path; STOP" >&2; exit 1; fi
done
sudo ss -lntp
)
از کجا بدانم درست انجام شد؟

هر سه سرور تازه‌اند و نشانی‌های خصوصی به آن‌ها اختصاص دارد.

02

قدم بعدی

نصب بسته‌های هم‌نسخه از مخزن سیستم‌عامل

پس از عبور از بررسی اولیه، روی هر سه سرور اجرا شود. APT اصالت فرادادهٔ امضاشده و هش بسته‌ها را بررسی می‌کند. فقط مخزن همین نسخهٔ سیستم‌عامل و به‌روزرسانی امنیتی آن به کار رود؛ جایگزینی باینری Valkey، آرشیو بالادستی یا مخزن نسخهٔ دیگر اوبونتو مناسب این راهنما نیست. نصب ممکن است سرویس محدود به loopback را روشن کند. بخش بعد فقط همین سرویس تازه و اختصاصی آموزش را متوقف می‌کند. شمارهٔ کامل بسته‌ها در سه سرور باید برابر باشد.

Bash
sudo apt-get update
sudo apt-get install redis-server redis-sentinel redis-tools openssl nano
dpkg-query -W redis-server redis-sentinel redis-tools
redis-server --version
redis-sentinel --version
redis-cli --version
از کجا بدانم درست انجام شد؟

نسخهٔ Redis و Sentinel در سه سرور یکسان است و بستهٔ بدون اعتبارسنجی نصب نشده است.

03

قدم بعدی

توقف نمونهٔ تازه و نگهداری تنظیمات اولیه

فقط روی سرورهای تازهٔ همین آموزش انجام شود؛ توقف Redis محیط عملیاتی مجاز نیست. نسخهٔ تنظیمات با ساختار مسیر نگهداری می‌شود. نبودن هر کدام از فایل‌ها خطاست. این آرشیو محرمانه است و نباید وارد گیت یا فضای عمومی شود.

Bash
sudo systemctl stop redis-sentinel redis-server
sudo bash -eu <<'BACKUP'
umask 077
test -f /etc/redis/redis.conf
test -f /etc/redis/sentinel.conf
install -d -m 0700 /root/academy-backups
backup=$(mktemp -d /root/academy-backups/redis-defaults-XXXXXXXX)
tar -C / -cpf "$backup/etc-redis.tar" etc/redis
tar -tf "$backup/etc-redis.tar" >/dev/null
tar -C / -df "$backup/etc-redis.tar"
printf 'Defaults retained: %s\n' "$backup"
BACKUP
از کجا بدانم درست انجام شد؟

دو سرویس اختصاصی متوقف‌اند و آرشیو تنظیمات خوانده و با منبع تطبیق داده شده است.

04

قدم بعدی

گواهی مستقل برای هر سرور

زیرساخت گواهی مورد اعتماد باید از قبل سه فایل ورودی را در مسیر محافظت‌شده گذاشته باشد. هر سرور کلید و گواهی جداگانه، SAN مطابق IP خصوصی خودش، کاربردهای serverAuth و clientAuth و زنجیرهٔ معتبر داشته باشد. کلید خصوصی CA به سرورها منتقل نشود و یک کلید برای سه سرور تکرار نشود. برای میزبان مدیر و اپلیکیشن هم گواهی کلاینت جدا صادر شود. mTLS اعتماد به CA را بررسی می‌کند و جای نام کاربری ACL را نمی‌گیرد. اعتبارسنجی CA در اتصال داخلی Redis و Sentinel را نباید بررسی نام میزبان نامید. CA اختصاصی این سامانه، مسیر خصوصی و محدودیت مبدأ لازم‌اند؛ کلاینتی که تطبیق نام مقصد می‌خواهد باید آن را صریح پشتیبانی و بررسی کند.

Bash
(
set -euo pipefail
sudo install -d -o root -g redis -m 0750 /etc/redis/tls
sudo install -o root -g redis -m 0640 /root/academy-pki/ca.pem /etc/redis/tls/ca.pem
sudo install -o root -g redis -m 0640 /root/academy-pki/node-fullchain.pem /etc/redis/tls/node.pem
sudo install -o root -g redis -m 0640 /root/academy-pki/node-key.pem /etc/redis/tls/node.key
sudo openssl verify -CAfile /etc/redis/tls/ca.pem -purpose sslserver /etc/redis/tls/node.pem
sudo openssl verify -CAfile /etc/redis/tls/ca.pem -purpose sslclient /etc/redis/tls/node.pem
sudo openssl x509 -in /etc/redis/tls/node.pem -noout -dates -ext subjectAltName
sudo openssl x509 -in /etc/redis/tls/node.pem -checkend 604800 -noout
sudo openssl x509 -in /etc/redis/tls/node.pem -pubkey -noout | openssl sha256
sudo openssl pkey -in /etc/redis/tls/node.key -pubout | openssl sha256
sudo -u redis test -r /etc/redis/tls/node.key
)
از کجا بدانم درست انجام شد؟

هر دو کاربرد گواهی معتبر است، SAN درست است، هش کلید عمومی برابر است و کاربر redis کلید را می‌خواند.

شش اعتبارنامه با مسئولیت جدا

در مدیر اسرار موجود، برای شش نقش رمزهای مستقل۶۴ نویسه‌ای هگز بسازید: ADMIN برای نگهداری، APP برای GET و SET و WAIT و بررسی سلامت و نقش در فضای academy:*، REPL برای تکثیر، CONTROL برای کنترل Redis توسط Sentinel، PEER برای ارتباط مدیریتی Sentinelها و DISCOVERY برای خواندن نشانی سرور اصلی. رمز هر نقش روی سه سرور یکسان است، اما بین نقش‌ها مشترک نباشد. عبارت‌های REPLACE_* نمونه‌اند و باید داخل ویرایشگر محافظت‌شده عوض شوند، نه در آرگومان فرمان. ضبط ترمینال و رهگیری شل هنگام ویرایش اسرار خاموش باشد. نمایش عمومی ACL و فایل تنظیمات هم امن نیست. رمز اتصال خروجی در تنظیمات محافظت‌شده لازم است؛ هش‌کردن ACL ورودی این نیاز را حذف نمی‌کند.

05

قدم بعدی

ویرایش فایل دسترسی Redis

روی هر سه سرور انجام شود. پنل بعد محتوای فایل است و فرمان شل نیست. چهار رمز نمونه را پیش از ذخیره عوض کنید. کاربر پیش‌فرض غیرفعال است. اپلیکیشن دسترسی Pub/Sub، به‌ویژه کانال رزروشدهٔ Sentinel، ندارد. مدیر اختیار نگهداری دارد ولی دسترسی اولیهٔ کانال ندارد؛ فقط CONTROL کانال داخلی را می‌گیرد.

Bash
sudo install -o root -g redis -m 0640 /dev/null /etc/redis/users.acl
sudo nano /etc/redis/users.acl
از کجا بدانم درست انجام شد؟

فایل محافظت‌شده برای محتوای ACL آماده است.

محتوای ACL سرور داده

محتوای یکسان روی A و B و C. حساب REPL با وجود نداشتن فرمان خواندن کلید، جریان کامل داده را دریافت می‌کند و رمز آن محرمانه است. CONTROL می‌تواند نقش سرور را تغییر دهد و تنظیمات را بازنویسی کند؛ این حساب برای اپلیکیشن نیست. دسترسی عمومی کانال به APP یا REPL داده نشود.

Redis ACL · /etc/redis/users.acl
user default off
user admin on >REPLACE_ADMIN_64_HEX ~* resetchannels +@all
user app on >REPLACE_APP_64_HEX ~academy:* resetchannels -@all +ping +role +get +set +wait
user repl on >REPLACE_REPL_64_HEX resetchannels -@all +ping +replconf +psync
user control on >REPLACE_CONTROL_64_HEX resetchannels &__sentinel__:hello -@all +multi +slaveof +ping +exec +subscribe +config|rewrite +role +publish +info +client|setname +client|kill +script|kill
06

قدم بعدی

تنظیم Redis با امکان بازنویسی نقش

روی سه سرور، فایل بسته با تنظیمات اختصاصی پنل بعد جایگزین شود. نشانی محلی A همان10.20.0.10 است؛ در B هر دو مقدار bind و announce به10.20.0.11 و در C به10.20.0.12 تغییر کند. رمز REPL با ACL برابر باشد و روی A هم تنظیم شود تا پس از جابه‌جایی بتواند نسخهٔ دریافت‌کننده شود. فایل باید برای بازنویسی نقش توسط Sentinel قابل نوشتن بماند. نسخهٔ اولیهٔ بسته را حفظ کنید.

Bash
sudo nano /etc/redis/redis.conf
از کجا بدانم درست انجام شد؟

نشانی محلی درست و رمز تکثیر آماده شده‌اند.

محتوای تنظیمات و بودجهٔ حافظه

حد۲۵۶ مگابایت فقط برای آزمایش کوچک است. حافظهٔ جدا برای پردازش، بافر کلاینت، تکثیر و کپی هنگام ذخیره‌سازی لازم است. سیاست noeviction به‌جای حذف کلید، نوشتن جدید را رد می‌کند. شرط یک نسخهٔ همراه، بخشی از نوشتن روی سرور جداافتاده را پس از۱۰ ثانیه محدود می‌کند؛ حصار فوری یا تضمین نبود اتلاف نیست. وجود سه سرور داده باعث می‌شود پس از خرابی یک میزبان، نویسندهٔ تازه هنوز یک نسخهٔ دریافت‌کننده داشته باشد. با فقط دو سرور داده، همین سیاست تا بازگشت سرور دیگر نوشتن را متوقف می‌کند.

Redis configuration · /etc/redis/redis.conf
bind 127.0.0.1 10.20.0.10
protected-mode yes
port 0
tls-port 6379
tls-cert-file /etc/redis/tls/node.pem
tls-key-file /etc/redis/tls/node.key
tls-ca-cert-file /etc/redis/tls/ca.pem
tls-auth-clients yes
tls-protocols "TLSv1.2 TLSv1.3"
tls-replication yes
daemonize no
supervised systemd
pidfile /run/redis/redis-server.pid
logfile /var/log/redis/redis-server.log
dir /var/lib/redis
dbfilename dump.rdb
save 900 1
appendonly yes
appendfsync everysec
maxmemory 256mb
maxmemory-policy noeviction
aclfile /etc/redis/users.acl
masteruser repl
masterauth REPLACE_REPL_64_HEX
replica-announce-ip 10.20.0.10
replica-announce-port 6379
replica-read-only yes
replica-serve-stale-data no
min-replicas-to-write 1
min-replicas-max-lag 10

مبدأ اولیه فقط برای B و C

فقط در B و C این خط به همان فایل تنظیمات اضافه شود. در راه‌اندازی اولیه، A نباید این خط را داشته باشد. پس از جابه‌جایی، نقش و نشانی بازنویسی‌شده را Sentinel مدیریت می‌کند؛ اجرای دوبارهٔ فایل اولیه می‌تواند توپولوژی درست را خراب کند.

Redis configuration · /etc/redis/redis.conf — append only on B/C
replicaof 10.20.0.10 6379
07

قدم بعدی

تفکیک مدیر Sentinel از کلاینت کشف سرویس

روی سه سرور. فایل بعد دسترسی مدیر و همتای Sentinel را از کشف سرویس جدا می‌کند. PEER طبق قرارداد بالادستی اختیار مدیریتی دارد و نباید به اپلیکیشن داده شود. در این روش ACL، تنظیم requirepass هم‌زمان اضافه نمی‌شود.

Bash
sudo install -o root -g redis -m 0640 /dev/null /etc/redis/sentinel-users.acl
sudo nano /etc/redis/sentinel-users.acl
از کجا بدانم درست انجام شد؟

فایل مجزای محافظت‌شده آماده است.

محتوای ACL برای Sentinel

نام نقش‌ها و رمز هر نقش روی سه سرور برابر است. DISCOVERY امکان درخواست جابه‌جایی یا تغییر تنظیمات ندارد. رمز ADMIN برای نگهداری است؛ PEER با CONTROL سرور داده اشتباه نشود.

Redis ACL · /etc/redis/sentinel-users.acl
user default off
user admin on >REPLACE_ADMIN_64_HEX allchannels +@all
user peer on >REPLACE_PEER_64_HEX allchannels +@all
user discovery on >REPLACE_DISCOVERY_64_HEX -@all +auth +client|getname +client|id +client|setname +command +hello +ping +role +sentinel|get-master-addr-by-name +sentinel|master +sentinel|myid +sentinel|replicas +sentinel|sentinels +sentinel|masters
08

قدم بعدی

تنظیم نشانی و رأی‌دهی Sentinel

فایل Sentinel اختصاصی با پنل بعد جایگزین شود. در B و C هر دو نشانی bind و sentinel announce-ip، نشانی همان میزبان باشند؛ مبدأ نظارت اولیه در هر سه A است. رمز CONTROL با ACL داده و PEER با ACL رأی‌دهنده برابر باشد. فایل و پوشهٔ آن باید بازنویسی اتمی را اجازه دهند؛ فقط‌خواندنی‌کردن یا برگرداندن فایل اولیه بعد از انتخابات درست نیست.

Bash
sudo nano /etc/redis/sentinel.conf
از کجا بدانم درست انجام شد؟

هر رأی‌دهنده نشانی قابل دسترس مستقل و تنظیمات مشترک گروه و احراز هویت دارد.

محتوای تنظیمات رأی‌دهنده

زمان۱۰ ثانیه برای تشخیص اولیه است، نه تعهد زمان بازیابی. انتخابات، انتخاب نسخهٔ مناسب، همگام‌سازی و اتصال دوبارهٔ اپلیکیشن زمان بیشتری می‌خواهند. parallel-syncs با مقدار۱ تعداد دریافت‌کننده‌های در حال بازهمگام‌سازی را محدود می‌کند. فعال‌بودن tls-replication ارتباط رأی‌دهنده‌ها و اتصال آن‌ها به Redis را نیز TLS می‌کند.

Sentinel configuration · /etc/redis/sentinel.conf
bind 127.0.0.1 10.20.0.10
protected-mode yes
port 0
tls-port 26379
tls-cert-file /etc/redis/tls/node.pem
tls-key-file /etc/redis/tls/node.key
tls-ca-cert-file /etc/redis/tls/ca.pem
tls-auth-clients yes
tls-protocols "TLSv1.2 TLSv1.3"
tls-replication yes
daemonize no
supervised systemd
pidfile /run/sentinel/redis-sentinel.pid
logfile /var/log/redis/redis-sentinel.log
dir /var/lib/redis
aclfile /etc/redis/sentinel-users.acl
sentinel announce-ip 10.20.0.10
sentinel announce-port 26379
sentinel monitor academy 10.20.0.10 6379 2
sentinel auth-user academy control
sentinel auth-pass academy REPLACE_CONTROL_64_HEX
sentinel sentinel-user peer
sentinel sentinel-pass REPLACE_PEER_64_HEX
sentinel down-after-milliseconds academy 10000
sentinel failover-timeout academy 180000
sentinel parallel-syncs academy 1
09

قدم بعدی

کنترل مجوز و باقی‌نماندن مقدار نمونه

قبل از روشن‌کردن سرویس روی سه سرور اجرا شود. مالک دو فایل قابل بازنویسی redis است؛ فایل‌های ACL ریشه‌مالک می‌مانند. پوشهٔ تنظیمات بخشی از وضعیت حساس اجراست و نباید با استقرار گیت بازنویسی شود. محدودیت سرویس باید نوشتن در این مسیر را مجاز بداند؛ سخت‌سازی واحد را کورکورانه غیرفعال نکنید. محتوای محرمانهٔ فایل‌ها چاپ نشود.

Bash
(
set -euo pipefail
sudo chown redis:redis /etc/redis /etc/redis/redis.conf /etc/redis/sentinel.conf
sudo chmod 0750 /etc/redis
sudo chmod 0640 /etc/redis/redis.conf /etc/redis/sentinel.conf
sudo chown root:redis /etc/redis/users.acl /etc/redis/sentinel-users.acl
sudo chmod 0640 /etc/redis/users.acl /etc/redis/sentinel-users.acl
if sudo grep -E 'REPLACE_' /etc/redis/redis.conf /etc/redis/sentinel.conf /etc/redis/users.acl /etc/redis/sentinel-users.acl >/dev/null; then
  echo 'Unfilled secret placeholder: STOP' >&2; exit 1
else
  status=$?
  test "$status" -eq 1
fi
sudo -u redis test -w /etc/redis
sudo -u redis test -w /etc/redis/redis.conf
sudo -u redis test -w /etc/redis/sentinel.conf
systemctl show redis-server redis-sentinel -p User -p Group -p ExecStart -p ReadWritePaths -p ReadWriteDirectories -p RuntimeDirectory
sudo ss -lntp
)
از کجا بدانم درست انجام شد؟

مقدار نمونه باقی نمانده، بازنویسی مجاز است و مسیر واحد با بستهٔ انتخابی برابر است.

10

قدم بعدی

راه‌اندازی Redis روی سه میزبان اختصاصی

ابتدا A و سپس B و C روشن شوند. این اولین شروع با تنظیمات تازه است. فقط پورت TLS ۶۳۷۹ روی loopback و IP خصوصی انتخابی دیده شود. اگر شروع شکست خورد، پیش از تکرار علت را بخوانید؛ Redis فرمان عمومی بررسی آفلاین تنظیمات مشابه nginx -t ندارد.

Bash
sudo systemctl enable --now redis-server
sudo systemctl status redis-server --no-pager
sudo ss -lntp
از کجا بدانم درست انجام شد؟

هر سه سرویس فعال‌اند و پورت متن ساده یا عمومی ندارند.

11

قدم بعدی

ورود مدیر برای بررسی تکثیر واقعی

روی هر سه سرور، رمز ADMIN در ورودی مخفی داده شود. رمز در آرگومان یا تاریخچهٔ شل قرار نگیرد. پنل بعد نشست تعاملی redis-cli است و نباید در شل اجرا شود.

Bash
sudo redis-cli --tls --cacert /etc/redis/tls/ca.pem --cert /etc/redis/tls/node.pem --key /etc/redis/tls/node.key -h 127.0.0.1 -p 6379 --user admin --askpass
از کجا بدانم درست انجام شد؟

نشست TLS احراز هویت‌شده باز می‌شود.

12

قدم بعدی

بررسی نقش، اتصال و پیشرفت دریافت داده

در A نقش master و دو connected_slaves انتظار می‌رود. در B و C نقش slave، مبدأ10.20.0.10، وضعیت اتصال up و مقدار صفر برای master_sync_in_progress لازم است. هنگام نوشتن، پیشرفت offset را هم ببینید؛ اتصال سالم به‌تنهایی رسیدن دادهٔ مورد نظر را ثابت نمی‌کند. خروجی Redis هنوز بعضی نام‌های قدیمی master و slave را دارد. ذخیره‌سازی هم نباید خطای تکرارشونده داشته باشد.

Redis CLI
ROLE
INFO replication
INFO persistence
QUIT
از کجا بدانم درست انجام شد؟

نقش، مقدار دقیق و پاسخ مشخص‌شده در توضیح همین مرحله بررسی شود؛ نتیجهٔ غیرمنتظره ادامهٔ کار را متوقف می‌کند.

13

قدم بعدی

اتصال آزمایشی با نقش محدود اپلیکیشن

روی A، رمز APP در ورودی مخفی وارد شود. این نقش محدود فقط کلیدهای academy:*، فرمان WAIT و بررسی سلامت و نقش را پوشش می‌دهد و الگوی عمومی همهٔ اپلیکیشن‌ها نیست. SET و WAIT باید در همین اتصال اجرا شوند.

Bash
sudo redis-cli --tls --cacert /etc/redis/tls/ca.pem --cert /etc/redis/tls/node.pem --key /etc/redis/tls/node.key -h 127.0.0.1 -p 6379 --user app --askpass
از کجا بدانم درست انجام شد؟

حساب اپلیکیشن بدون اختیار مدیریتی متصل است.

14

قدم بعدی

نوشتن نشانگر و بررسی دو نسخهٔ دریافت‌کننده

در همان نشست APP اجرا شود. پاسخ SET باید OK باشد و WAIT در پنج ثانیه عدد۲ بدهد. صفر یا یک یعنی بررسی تکثیر کامل نشده؛ در این حالت تمرین ادامه پیدا نکند. حتی عدد۲ هم تضمین اجماع یا ثبت پایدار نیست. این کلید فقط متعلق به آزمایش اختصاصی است.

Redis CLI
SET academy:probe before-failover
WAIT 2 5000
GET academy:probe
QUIT
خروجی نمونه
Illustrative successful output / نمونهٔ خروجی موفق:
OK
(integer) 2
"before-failover"
از کجا بدانم درست انجام شد؟

نقش، مقدار دقیق و پاسخ مشخص‌شده در توضیح همین مرحله بررسی شود؛ نتیجهٔ غیرمنتظره ادامهٔ کار را متوقف می‌کند.

15

قدم بعدی

خواندن داده در مقصد و اثبات رد نوشتن

در B و C با همان پنل ورود APP به نمونهٔ محلی وصل شوید و نشست زیر را اجرا کنید. روی هر دو، GET باید before-failover باشد. تلاش SET باید خطای READONLY بدهد و کلید را تغییر ندهد. رد پاسخ قدیمی هنگام قطع اتصال عمدی است؛ برای پنهان‌کردن نتیجه، نوشتن روی نسخهٔ دریافت‌کننده را فعال نکنید.

Redis CLI
GET academy:probe
SET academy:probe forbidden-write
QUIT
از کجا بدانم درست انجام شد؟

نقش، مقدار دقیق و پاسخ مشخص‌شده در توضیح همین مرحله بررسی شود؛ نتیجهٔ غیرمنتظره ادامهٔ کار را متوقف می‌کند.

16

قدم بعدی

روشن‌کردن رأی‌دهنده‌ها به‌ترتیب

ابتدا A، سپس B و بعد C اجرا شوند. بین افزودن هر رأی‌دهنده۳۰ ثانیه فاصله و بررسی لاگ باشد تا کشف همتاها انجام شود. این فاصله وعدهٔ زمان بازیابی نیست و به واحد سرویس تازه نیاز ندارد.

Bash
sudo systemctl enable --now redis-sentinel
sudo systemctl status redis-sentinel --no-pager
sleep 30
sudo tail -n 40 /var/log/redis/redis-sentinel.log
از کجا بدانم درست انجام شد؟

سه رأی‌دهنده همدیگر را بدون خطای احراز هویت یا بازنویسی پیدا می‌کنند.

17

قدم بعدی

ورود محلی برای بررسی Sentinel

روی هر سرور با رمز ADMIN وارد شوید. پنل بعد فقط بررسی وضعیت است. نقش محدود کشف سرویس در بخش جدا امتحان می‌شود.

Bash
sudo redis-cli --tls --cacert /etc/redis/tls/ca.pem --cert /etc/redis/tls/node.pem --key /etc/redis/tls/node.key -h 127.0.0.1 -p 26379 --user admin --askpass
از کجا بدانم درست انجام شد؟

Sentinel محلی نشست نگهداری TLS را می‌پذیرد.

18

قدم بعدی

پیش از تمرین خرابی، توپولوژی کامل باشد

روی هر سه Sentinel اجرا شود. CKQUORUM باید OK بدهد. در MASTER حد نصاب۲، دو همتای دیگر، دو نسخهٔ دریافت‌کننده و نبود پرچم خرابی یا قطع اتصال لازم است. REPLICAS باید B و C را با اتصال سالم و اولویت قابل انتخاب نشان دهد. MYID سه رأی‌دهنده متفاوت باشد. کم‌کردن حد نصاب برای عبور از بررسی راه‌حل نیست.

Sentinel CLI
SENTINEL MYID
SENTINEL CKQUORUM academy
SENTINEL MASTER academy
SENTINEL REPLICAS academy
SENTINEL SENTINELS academy
QUIT
از کجا بدانم درست انجام شد؟

نقش، مقدار دقیق و پاسخ مشخص‌شده در توضیح همین مرحله بررسی شود؛ نتیجهٔ غیرمنتظره ادامهٔ کار را متوقف می‌کند.

19

قدم بعدی

پیداکردن نویسنده با حساب کشف سرویس

روی میزبان مجاز کلاینت، گواهی مستقل همان کلاینت و CA در مسیرهای زیر قرار داشته باشد. رمز DISCOVERY با APP متفاوت است. کتابخانهٔ واقعی اپلیکیشن باید هر سه نشانی اولیه را بشناسد، مقصد برگشتی را با ROLE بررسی کند و پس از تغییر نقش دوباره مقصد را پیدا کند. IP ثابت اولیه، توزیع سادهٔ TCP یا یک رکورد DNS به‌تنهایی پشتیبانی Sentinel نیست.

Bash
redis-cli --tls --cacert /etc/academy-client/ca.pem --cert /etc/academy-client/client.pem --key /etc/academy-client/client.key -h 10.20.0.11 -p 26379 --user discovery --askpass
از کجا بدانم درست انجام شد؟

نشست محدود کشف سرویس از شبکهٔ مجاز باز می‌شود.

20

قدم بعدی

دریافت نشانی و کنترل محدودیت حساب

در نشست DISCOVERY، پیش از جابه‌جایی نشانی A و پورت۶۳۷۹ برمی‌گردد. درخواست FAILOVER عمداً باید NOPERM بگیرد تا مشخص شود این حساب امکان ارتقا ندارد. برای حذف این خطای مورد انتظار، دسترسی اضافه نکنید.

Sentinel CLI
SENTINEL GET-MASTER-ADDR-BY-NAME academy
SENTINEL FAILOVER academy
QUIT
از کجا بدانم درست انجام شد؟

نقش، مقدار دقیق و پاسخ مشخص‌شده در توضیح همین مرحله بررسی شود؛ نتیجهٔ غیرمنتظره ادامهٔ کار را متوقف می‌کند.

اتصال واقعی اپلیکیشن بخشی از دسترس‌پذیری است

در کتابخانهٔ انتخابی، سه نشانی TLS رأی‌دهنده‌ها، نام academy و اعتبارنامهٔ DISCOVERY تنظیم شود؛ برای اتصال داده از APP جدا استفاده شود. اعتبارسنجی CA، گواهی کلاینت و بررسی نام مقصد در صورت پشتیبانی واقعی کتابخانه فعال باشد. TLS در اتصال Sentinel و اتصال داده جدا بررسی شود. زمان اتصال و فرمان محدود و تلاش مجدد با فاصله و سقف مشخص باشد. نوشتن با نتیجهٔ نامعلوم فقط با منطق تکرارپذیر امن دوباره فرستاده شود؛ خطای شبکه ثابت نمی‌کند نوشتن انجام نشده است. پیش از ورود ترافیک، خود کتابخانه با بار کاری واقعی آزموده شود. این تمرین CLI کشف مقصد و داده را نشان می‌دهد، نه اتصال خودکار اپلیکیشن.

21

قدم بعدی

تهیهٔ بکاپ بررسی‌شده از نویسندهٔ فعلی

روی نویسندهٔ فعلی و پس از توقف نوشتن آزمایشی و تأیید نشانگر در هر دو دریافت‌کننده، شل محافظت‌شدهٔ ریشه را برای پنل بعد باز کنید. پیش از تمرین جابه‌جایی، این بکاپ تهیه و روی میزبان جدا بازیابی شود. پس از تمرین هم برای نگهداری وضعیت تازه دوباره قابل اجراست. خروجی یک RDB سازگار همراه تنظیمات محافظت‌شده است، نه کپی پوشهٔ AOF در حال تغییر. بکاپ داده و رمز دارد و جداگانه به فضای رمزگذاری‌شدهٔ مصوب منتقل شود. پیش از بازیابی موفق جدا، به آن اتکا نکنید.

Bash
sudo -i
از کجا بدانم درست انجام شد؟

شل محافظت‌شدهٔ ریشه روی نویسندهٔ فعلی باز است.

22

قدم بعدی

خروجی RDB و کنترل خوانایی بکاپ

در Bash ریشهٔ نویسندهٔ فعلی اجرا شود. رمز ADMIN فقط در ورودی مخفی داده شود. خطا زیرشل را متوقف می‌کند و پوشهٔ ناقصِ محافظت‌شده برای بررسی می‌ماند؛ در این حالت بازنشستگی یا بازیابی ادامه نیابد. هنگام تمام مراحل نوشتن متوقف باشد. ساختار مسیرها در آرشیو حفظ می‌شود.

Bash
(
set -euo pipefail
umask 077
install -d -m 0700 /root/academy-backups
backup=$(mktemp -d /root/academy-backups/redis-data-XXXXXXXX)
redis-cli --tls --cacert /etc/redis/tls/ca.pem --cert /etc/redis/tls/node.pem --key /etc/redis/tls/node.key -h 127.0.0.1 --user admin --askpass --raw GET academy:probe > "$backup/probe.txt"
case "$(cat "$backup/probe.txt")" in
  before-failover|after-failover) ;;
  *) echo "Unexpected lab marker: STOP" >&2; exit 1 ;;
esac
redis-cli --tls --cacert /etc/redis/tls/ca.pem --cert /etc/redis/tls/node.pem --key /etc/redis/tls/node.key -h 127.0.0.1 --user admin --askpass --rdb "$backup/dump.rdb"
test -s "$backup/dump.rdb"
redis-check-rdb "$backup/dump.rdb"
tar -C / -cpf "$backup/config.tar" etc/redis
tar -tf "$backup/config.tar" >/dev/null
tar -C / -df "$backup/config.tar"
cd "$backup"
sha256sum dump.rdb probe.txt config.tar > SHA256SUMS
sha256sum -c SHA256SUMS
printf 'Protected backup: %s\n' "$backup"
)
exit
از کجا بدانم درست انجام شد؟

RDB از بررسی ساختار و checksum می‌گذرد، آرشیو با منبع برابر است و هش فایل‌ها کنترل شده است.

23

قدم بعدی

بازیابی جداشده پیش از اتکا به بکاپ

پیش از تمرین جابه‌جایی، روی میزبان بازیابی جدا با همان نسخهٔ Redis و نسخهٔ محافظت‌شدهٔ بکاپ اجرا شود. مقدار backup باید مسیر واقعی باشد. پوشهٔ تازه و فضای نام شبکهٔ بدون پورت TCP به کار می‌رود و مسیر دادهٔ اصلی هرگز مقصد نیست. unshare به دسترسی ریشه نیاز دارد. تنظیمات قدیمی و اسرار را روی سامانهٔ روشن استخراج نکنید. برابری نشانگر فقط یک کنترل آزمایش است؛ بازیابی واقعی به بررسی کلیدهای نماینده، انقضا و قواعد اپلیکیشن نیاز دارد. AOF عمداً خاموش است تا RDB بازیابی‌شده بار شود.

Bash
sudo unshare --net --fork bash -eu <<'RESTORE'
umask 077
backup=/root/academy-backups/REPLACE_WITH_VERIFIED_BACKUP_DIRECTORY
cd "$backup"
sha256sum -c SHA256SUMS
redis-check-rdb dump.rdb
restore=$(mktemp -d /root/redis-restore-XXXXXXXX)
install -m 0600 dump.rdb "$restore/dump.rdb"
redis-server --bind 127.0.0.1 --port 0 --unixsocket "$restore/redis.sock" --unixsocketperm 600 --dir "$restore" --dbfilename dump.rdb --appendonly no --save '' --daemonize yes --pidfile "$restore/redis.pid" --logfile "$restore/redis.log"
trap 'redis-cli -s "$restore/redis.sock" SHUTDOWN NOSAVE >/dev/null || true' EXIT
for attempt in $(seq 1 30); do
  if test -S "$restore/redis.sock"; then break; fi
  sleep 1
done
actual=$(redis-cli -s "$restore/redis.sock" --raw GET academy:probe)
expected=$(cat "$backup/probe.txt")
test -n "$expected"
test "$actual" = "$expected"
redis-cli -s "$restore/redis.sock" DBSIZE
redis-cli -s "$restore/redis.sock" INFO persistence
printf 'Isolated marker restore passed; retained at %s\n' "$restore"
RESTORE
از کجا بدانم درست انجام شد؟

هش، بارگذاری RDB و برابری دقیق نشانگر موفق است؛ پردازش موقت خاموش و داده حفظ می‌شود. هر خطا اتکا به بکاپ را متوقف می‌کند.

تمرین خرابی فقط با قطع مسیر نویسندهٔ آزمایشی

پنل توقف و شروع فقط برای همین نمونه‌های اختصاصی و دورریختنی است، نه سرویس عملیاتی. نوشتن آزمایشی را متوقف و با کنترل شبکهٔ موجود آزمایشگاه، دسترسی همهٔ کلاینت‌ها به پورت دادهٔ A را قطع کنید؛ مسیر مدیر و Sentinel باقی بماند. خاموش‌کردن پردازش به‌تنهایی طرح حصارگذاری یک نویسندهٔ جداافتاده در محیط زنده نیست. ابتدا بکاپ و داده بررسی شوند. اگر A دیگر نویسندهٔ اعلام‌شده نیست، اینجا توقف کنید و بر اساس نقش واقعی تصمیم بگیرید. ارتقای دستی دو سرور یا راه‌اندازی با فایل قدیمی اولیه مجاز نیست.

24

قدم بعدی

شبیه‌سازی توقف نویسندهٔ آزمایشی

فقط در A و پس از تأیید نقش فعلی، رسیدن نشانگر به B و C و قطع مسیر کلاینت به A اجرا شود. Sentinel میزبان A روشن می‌ماند. این آزمون توقف سرویس است و خرابی فیزیکی میزبان یا استقلال دامنه‌های خرابی را ثابت نمی‌کند.

Bash
sudo systemctl stop redis-server
sudo systemctl is-active redis-server
از کجا بدانم درست انجام شد؟

سرویس دادهٔ آزمایش خاموش است؛ خروج غیرصفر is-active در این مرحله انتظار می‌رود و Sentinel فعال می‌ماند.

25

قدم بعدی

مشاهدهٔ انتخابات و مقصد جدید

در B و C با پنل ورود مدیریتی Sentinel وصل شوید. حداکثر۱۸۰ ثانیه وضعیت را مشاهده کنید: نشانی باید از A تغییر کند، CKQUORUM موفق باشد و رأی‌دهنده‌ها بر مقصد تازه توافق کنند. نبود ارتقا نیاز به عیب‌یابی دارد؛ کم‌کردن حد نصاب یا درخواست مکرر جابه‌جایی مناسب نیست. زمان به وضعیت واقعی اتصال و انتخابات بستگی دارد.

Sentinel CLI
SENTINEL GET-MASTER-ADDR-BY-NAME academy
SENTINEL CKQUORUM academy
SENTINEL MASTER academy
QUIT
از کجا بدانم درست انجام شد؟

نقش، مقدار دقیق و پاسخ مشخص‌شده در توضیح همین مرحله بررسی شود؛ نتیجهٔ غیرمنتظره ادامهٔ کار را متوقف می‌کند.

26

قدم بعدی

اتصال به نویسندهٔ اعلام‌شده

در میزبان کلاینت، DISCOVERED_PRIMARY_IP با نشانی B یا C که همین حالا برگشته جایگزین شود. رمز APP در ورودی مخفی داده شود. پیش از اجازهٔ نوشتن با سیاست حداقل یک نسخه، سرور دادهٔ باقی‌مانده باید دریافت‌کنندهٔ نویسندهٔ تازه شده باشد. پنل بعد در همین اتصال اجرا شود.

Bash
redis-cli --tls --cacert /etc/academy-client/ca.pem --cert /etc/academy-client/client.pem --key /etc/academy-client/client.key -h DISCOVERED_PRIMARY_IP -p 6379 --user app --askpass
از کجا بدانم درست انجام شد؟

کلاینت مجاز از طریق TLS دوطرفه به مقصد کشف‌شده وصل است.

27

قدم بعدی

دادهٔ قبلی و نوشتن پس از جابه‌جایی

GET باید همان before-failover باشد. SET باید OK و WAIT عدد۱ بدهد؛ در غیر این صورت ادامه ندهید. مقدار تازه با ورود APP محلی روی نسخهٔ دریافت‌کنندهٔ باقی‌مانده هم خوانده شود. بررسی فقط روی نویسنده کافی نیست. گم‌شدن نشانگر نتیجهٔ ناموفق بازیابی است، نه مجوز بازنویسی داده.

Redis CLI
ROLE
GET academy:probe
SET academy:probe after-failover
WAIT 1 5000
GET academy:probe
QUIT
از کجا بدانم درست انجام شد؟

نقش، مقدار دقیق و پاسخ مشخص‌شده در توضیح همین مرحله بررسی شود؛ نتیجهٔ غیرمنتظره ادامهٔ کار را متوقف می‌کند.

28

قدم بعدی

بازگشت سرور قبلی بدون برگرداندن توپولوژی قدیمی

فقط در A و در حالی که مسیر اپلیکیشن به آن بسته است اجرا شود. داده و تنظیمات فعلی حفظ شوند؛ Sentinel باید آن را دریافت‌کنندهٔ نویسندهٔ منتخب کند. ارتقای دستی، کپی فایل اولیه و بازکردن مسیر نوشتن هنگام همگرایی درست نیست. بازهمگام‌سازی می‌تواند دادهٔ متفاوت نویسندهٔ قبلی را جایگزین کند؛ در این تمرین A حصارگذاری شده و نوشتن مستقل ندارد. در حادثهٔ واقعی، ابتدا شواهد و دادهٔ آفلاین سرور متفاوت حفظ و تصمیم بازیابی گرفته شود.

Bash
sudo systemctl start redis-server
sudo systemctl status redis-server --no-pager
sudo tail -n 50 /var/log/redis/redis-sentinel.log
از کجا بدانم درست انجام شد؟

A روشن شده و دریافت‌کننده می‌شود؛ تا پایان بررسی نقش و داده، مسیر کلاینت بسته می‌ماند.

29

قدم بعدی

تأیید دریافت داده پس از بازگشت

در A با حساب ADMIN نقش دریافت‌کننده، نشانی نویسندهٔ تازه، اتصال up، پایان همگام‌سازی کامل و سلامت ذخیره‌سازی بررسی شود. GET با APP باید after-failover برگرداند و SET خطای READONLY بدهد. بررسی حد نصاب و توپولوژی روی همهٔ رأی‌دهنده‌ها تکرار شود. بازگشت اجباری فوری به نویسندهٔ قبلی لازم نیست. پس از این تأییدها، مسیریابی کلاینت و دسترسی خصوصی مصوب برقرار شود.

Redis CLI
ROLE
INFO replication
INFO persistence
QUIT
از کجا بدانم درست انجام شد؟

نقش، مقدار دقیق و پاسخ مشخص‌شده در توضیح همین مرحله بررسی شود؛ نتیجهٔ غیرمنتظره ادامهٔ کار را متوقف می‌کند.

30

قدم بعدی

بازگشت امن با حفظ دادهٔ آزمایش

برای کنارگذاشتن آزمایش، ابتدا ترافیک اپلیکیشن از مسیر مدیریتی خودش قطع و همهٔ مقصدهای داده حصارگذاری شوند. بکاپ بررسی‌شده و شواهد بازیابی موفق جدا نگهداری شوند. سپس در سه میزبان سرویس‌ها با پنل زیر غیرفعال شوند. این توقف نگهداری است، نه روشی برای حفظ HA بدون Sentinel. فایل، RDB، AOF و مجوزها باقی می‌مانند. پاک‌کردن بسته، تخلیهٔ داده یا برگرداندن کورکورانهٔ نقش اولیه مجاز نیست. شروع دوباره به تصمیم روشن دربارهٔ نویسندهٔ فعلی و بررسی تازهٔ نقش، رأی و داده پیش از ورود کلاینت نیاز دارد.

Bash
sudo systemctl disable --now redis-sentinel
sudo systemctl disable --now redis-server
sudo systemctl is-enabled redis-sentinel redis-server
sudo ss -lntp
از کجا بدانم درست انجام شد؟

دو سرویس اختصاصی خاموش و غیرفعال‌اند؛ خروج غیرصفر is-enabled انتظار می‌رود و داده و تنظیمات برای بازیابی باقی است.

عیب‌یابی با توجه به پیامد خطا

هر بررسی در میزبان و نشست مشخص خودش انجام شود. لاگ‌ها ممکن است توپولوژی خصوصی داشته باشند؛ فقط بخش بازبینی و پوشانده‌شده به اشتراک گذاشته شود. رد دسترسی مورد انتظار با شکست رأی‌دهی یا گم‌شدن داده تفاوت دارد.

سرویس روشن نمی‌شود

خطای واقعی واحد و فایل لاگ را بخوانید. مقدار نامعتبر ACL، IP محلی اشتباه، کلید غایب یا مجوز نادرست باید با پنل ویرایش قبلی اصلاح شود. پردازش دوم روی همان داده روشن نکنید و TLS را برای عبور از خطا خاموش نکنید.

Bash
sudo systemctl status redis-server redis-sentinel --no-pager
sudo journalctl -u redis-server -u redis-sentinel -n 60 --no-pager
sudo tail -n 60 /var/log/redis/redis-server.log /var/log/redis/redis-sentinel.log
ip -br address
sudo -u redis test -r /etc/redis/tls/node.key
sudo -u redis test -w /etc/redis/sentinel.conf
حد نصاب کامل نیست یا نسخه‌ها قطع‌اند

در نشست احراز هویت‌شدهٔ Sentinel، پنل وضعیت قبلی را اجرا کنید. نبود همتا می‌تواند از announce اشتباه، پورت۲۶۳۷۹ یا رمز PEER باشد. نبود دریافت‌کننده به پورت۶۳۷۹، ACL نقش REPL یا CONTROL و TLS مربوط می‌شود. هم فایل و هم پوشهٔ تنظیمات باید قابل بازنویسی باشند. دسترسی کانال داخلی فقط برای CONTROL بماند.

Bash
sudo ss -lntp
sudo tail -n 80 /var/log/redis/redis-sentinel.log
sudo -u redis test -w /etc/redis
sudo -u redis test -w /etc/redis/sentinel.conf
خطای NOREPLICAS یا READONLY و نشانگر گم‌شده

NOREPLICAS یعنی سیاست حداقل نسخه، نوشتن را رد کرده است؛ ابتدا وضعیت تکثیر نویسندهٔ فعلی را ببینید، نه اینکه حد را صفر کنید. READONLY در IP اولیه اغلب از تغییر موفق نقش و مقصد قدیمی کلاینت می‌آید. نبودن نشانگر یعنی بررسی داده شکست خورده؛ ترافیک را قطع و نمونه‌ها را برای بازیابی حفظ کنید. پس از ورود ADMIN، نشست زیر اجرا شود.

Redis CLI
ROLE
INFO replication
INFO persistence
QUIT
خطای TLS یا تمدید گواهی

روی میزبان درگیر، اعتبار زمانی، زنجیره و خوانایی کلید با پنل PKI قبلی بررسی شود. IP پنل زیر با نشانی واقعی همان گواهی جایگزین شود. اعتبار CA به‌تنهایی تطبیق نام مقصد نیست. تمدید با هم‌پوشانی اعتماد و بررسی همهٔ مسیرهای TLS انجام شود؛ دورزدن اعتبارسنجی راه‌حل نیست. کلید خصوصی یا تنظیمات رمزدار در تیکت فرستاده نشود.

Bash
sudo openssl verify -CAfile /etc/redis/tls/ca.pem -purpose sslserver -verify_ip 10.20.0.10 /etc/redis/tls/node.pem
sudo openssl x509 -in /etc/redis/tls/node.pem -checkend 604800 -noout
sudo -u redis test -r /etc/redis/tls/node.key
خطای دیسک یا AOF

فضای دیسک، inode و وضعیت واقعی ذخیره‌سازی را با نشست ADMIN قبلی بررسی کنید. بازنویسی AOF به فضای موقت دیسک و رم نیاز دارد. هنگام شکست ذخیره‌سازی ترافیک بیشتر وارد نکنید. حذف قطعه‌های AOF یا تعمیر تنها نسخهٔ موجود مجاز نیست. فایل‌ها حفظ و بکاپ در محیط جدا بازیابی شود تا تصمیم تعمیر بر شواهد تکیه کند.

Bash
df -h /var/lib/redis /var/log/redis
df -i /var/lib/redis
sudo tail -n 80 /var/log/redis/redis-server.log

پس از نصب، مسیر بازیابی را هم نگهداری کنید

تأخیر و offset تکثیر، تعداد نسخه‌ها، حد نصاب، جابه‌جایی‌ها، خطای ذخیره‌سازی، فضای آزاد، انقضای گواهی و خطای اتصال اپلیکیشن پایش شوند. هشدار باید پیش از رد نوشتن به‌علت کمبود نسخه برسد. گام بعد آزمون کتابخانهٔ واقعی، خرابی یک دامنهٔ مستقل و بازیابی بکاپ با دادهٔ نماینده است. اگر اتلاف نوشتن تأییدشده پذیرفتنی نیست، معماری اجماع یا پایگاه دادهٔ دیگری ارزیابی شود؛ Sentinel تضمین RPO صفر ندارد.

پشتوانهٔ این آموزش

منابع رسمی

وضعیت بررسی هر محیط بالای صفحه مشخص است؛ بررسی مستندات به معنی اجرای عملی همهٔ نسخه‌ها نیست.

ادامهٔ مسیر

قدم بعدی تو

همهٔ آموزش‌های آکادمی ↗