ಬ್ಲಾಗ್

ಡಿಪ್ಲಾಯ್‌ಗಳನ್ನು ಶೂನ್ಯ 502 ದೋಷಗಳಿಗೆ ಹೇಗೆ ಇಳಿಸಿದೆವು

Mythex ಬ್ಯಾಕೆಂಡ್ ಅನ್ನು ಡಿಪ್ಲಾಯ್ ಮಾಡಿದ ಪ್ರತಿ ಸಲವೂ, ಕೆಲವು ವಿನಂತಿಗಳು 502 Bad Gateway ನೊಂದಿಗೆ ವಿಫಲವಾಗುತ್ತಿದ್ದವು. ಹೆಚ್ಚೇನೂ ಅಲ್ಲ — ಆದರೆ ಡಿಪ್ಲಾಯ್ ಸಮಯದಲ್ಲಿ 502 ಎಂದರೆ ಯಾರದೋ ಕ್ಲಿಕ್ ಏನೂ ಮಾಡಲಿಲ್ಲ, ಅಥವಾ ಅವರು ನೋಡುತ್ತಿದ್ದ ಬಿಲ್ಡ್ ಒಂದು ಕ್ಷಣ ನಿಂತಿತು ಎಂದರ್ಥ. ಇದನ್ನು ಎರಡು ಪ್ರತ್ಯೇಕ ಸಮಸ್ಯೆಗಳಿಗೆ ಹಿಂತಿರುಗಿ ಪತ್ತೆಹಚ್ಚಿದೆವು: ಡಿಪ್ಲಾಯ್‌ಗಳ ವಿರುದ್ಧ ಹೋರಾಡುತ್ತಿದ್ದ ಸ್ವಯಂ-ದುರಸ್ತಿ ವಾಚ್‌ಡಾಗ್, ಮತ್ತು ಸರ್ವರ್ ಆಲಿಸುವುದನ್ನು ನಿಲ್ಲಿಸಿದ ಸಮಯ ಮತ್ತು ಲೋಡ್ ಬ್ಯಾಲೆನ್ಸರ್ ಅದಕ್ಕೆ ಟ್ರಾಫಿಕ್ ಕಳುಹಿಸುವುದನ್ನು ನಿಲ್ಲಿಸಿದ ಸಮಯದ ನಡುವಿನ ಅಂತರ. ಫಿಕ್ಸ್‌ಗಳ ನಂತರ ಸತತ ಮೂರು ಉತ್ಪಾದನಾ ಡಿಪ್ಲಾಯ್‌ಗಳಲ್ಲಿ, ಎಣಿಕೆ 10 ರಿಂದ 6 ಕ್ಕೆ, ನಂತರ 0 ಕ್ಕೆ ಇಳಿಯಿತು.

ಸೆಟಪ್

ನಮ್ಮ API ಮತ್ತು ಆರ್ಕೆಸ್ಟ್ರೇಟರ್ AWS Application Load Balancer (ALB) ಹಿಂದೆ ಕೆಲವು ಸರ್ವರ್‌ಗಳ ಗುಂಪಿನಲ್ಲಿ ಕಂಟೇನರ್‌ಗಳಾಗಿ ಓಡುತ್ತವೆ. ಡಿಪ್ಲಾಯ್ ಒಂದು ಸಮಯದಲ್ಲಿ ಒಂದು ಸರ್ವರ್ ಅನ್ನು ನವೀಕರಿಸುತ್ತದೆ: ಹಳೆಯ ಕಂಟೇನರ್‌ಗಳನ್ನು ಹರಿಸುತ್ತದೆ, ಹೊಸವುಗಳನ್ನು ಆರಂಭಿಸುತ್ತದೆ, ಮುಂದುವರಿಯುತ್ತದೆ. ಪ್ರತಿ ಸರ್ವರ್‌ನಲ್ಲಿರುವ ವಾಚ್‌ಡಾಗ್ ಕಂಟೇನರ್‌ಗಳು ಚಾಲನೆಯಲ್ಲಿವೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸಿ, ನಿಂತಿರುವ ಯಾವುದನ್ನೇ ಆದರೂ ಮರುಆರಂಭಿಸುತ್ತದೆ — ಮಧ್ಯರಾತ್ರಿ 3 ಗಂಟೆಗೆ ಕ್ರ್ಯಾಶ್ ಆದ ಪ್ರಕ್ರಿಯೆ ಯಾರನ್ನೂ ಎಚ್ಚರಿಸದೆ ಮರಳಲು ಇದು ಇದೆ.

ಇವೆರಡೂ ತಮ್ಮದೇ ಆಗಿ ಸಮಂಜಸವಾಗಿವೆ. ಆದರೆ ಒಟ್ಟಿಗೆ ಅವು ಸರಿಯಾಗಿ ಹೊಂದಲಿಲ್ಲ.

ಸಮಸ್ಯೆ 1: ವಾಚ್‌ಡಾಗ್ ಡಿಪ್ಲಾಯ್ ಜೊತೆ ಓಟಕ್ಕಿಳಿದಿತ್ತು

ವಾಚ್‌ಡಾಗ್ ಪ್ರತಿ ನಿಮಿಷಕ್ಕೊಮ್ಮೆ ಓಡಿ, ಒಂದು ವಿಫಲ ಆರೋಗ್ಯ ಪರಿಶೀಲನೆಯ ಮೇಲೆಯೇ "ದುರಸ್ತಿ" ಮಾಡುತ್ತಿತ್ತು. ಡಿಪ್ಲಾಯ್ ಉದ್ದೇಶಪೂರ್ವಕವಾಗಿ ಸೇವೆಗಳನ್ನು 150 ಸೆಕೆಂಡುಗಳವರೆಗೆ ಹರಿಸುತ್ತದೆ — ಆ ಸಮಯದಲ್ಲಿ ಆರೋಗ್ಯ ಪರಿಶೀಲನೆ ವಿಫಲವಾಗುವುದು ನಿರೀಕ್ಷಿತ. ಆದ್ದರಿಂದ ವಾಚ್‌ಡಾಗ್ ಪ್ರತಿ ಡಿಪ್ಲಾಯ್ ಸಮಯದಲ್ಲಿ ಚಲಿಸುತ್ತಿತ್ತು.

ಹೆಚ್ಚಿನ ಸಮಯ ಅದು ಓಟದಲ್ಲಿ ಹಾನಿಯಿಲ್ಲದೆ ಸೋಲುತ್ತಿತ್ತು. ಒಮ್ಮೆ ಅದು ಗೆದ್ದಿತು: ಡಿಪ್ಲಾಯ್ ಮಧ್ಯದಲ್ಲಿ ಕಂಪೋಸ್ ಫೈಲ್ (ಯಾವ ಕಂಟೇನರ್‌ಗಳು ಓಡಬೇಕು ಎಂಬ ವಿವರಣೆ) ಅನ್ನು ಬದಲಾಯಿಸಿತು, ಮತ್ತು ಸರ್ವರ್ ಅನ್ನು ಗೇಟ್‌ವೇ ಕಂಟೇನರ್ ಇಲ್ಲದೆ ಬಿಟ್ಟಿತು — ಡಿಪ್ಲಾಯ್ ಜಾಬ್ ಯಶಸ್ಸು ಎಂದು ವರದಿ ಮಾಡಿದಾಗಲೂ.

ಫಿಕ್ಸ್‌ಗಳು:

  • ಒಂದೇ ಲಾಕ್. ಡಿಪ್ಲಾಯ್ ಈಗ ಸರ್ವರ್‌ನ ಬೂಟ್‌ಸ್ಟ್ರ್ಯಾಪ್ ಸ್ಕ್ರಿಪ್ಟ್‌ನ ಅದೇ ಫೈಲ್ ಲಾಕ್ ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆ, ಆದ್ದರಿಂದ ವಾಚ್‌ಡಾಗ್ ಮತ್ತು ಡಿಪ್ಲಾಯ್ ಎಂದಿಗೂ ಏಕಕಾಲದಲ್ಲಿ ಓಡಲಾರವು.
  • ಒಂದರ ಬದಲು ನಾಲ್ಕು ಎಚ್ಚರಿಕೆಗಳು. ವಾಚ್‌ಡಾಗ್ ಕ್ರಮ ಕೈಗೊಳ್ಳುವ ಮೊದಲು ಸತತ ನಾಲ್ಕು ವಿಫಲ ಪರಿಶೀಲನೆಗಳು ಬೇಕು. ಹರಿಯುತ್ತಿರುವ ಸೇವೆ ಇನ್ನು ಸತ್ತಂತೆ ಕಾಣುವುದಿಲ್ಲ.
  • ಒಂದೇ ವ್ಯಾಖ್ಯಾನ. ಕಂಪೋಸ್ ಫೈಲ್ ಈಗ ಒಂದೇ ಮೂಲದಿಂದ ಬರುತ್ತದೆ, ಸರ್ವರ್‌ಗಳಿಗೆ ಪ್ರಕಟಿಸಲಾಗುತ್ತದೆ, ಭಿನ್ನವಾಗಬಹುದಾದ ನಕಲುಗಳ ಬದಲು.
  • ನಂಬಬೇಡಿ, ಪರಿಶೀಲಿಸಿ. ಒಂದು ಕಮಾಂಡ್ ರಿಟರ್ನ್ ಆಯಿತು ಎಂಬ ಕಾರಣಕ್ಕೆ ಡಿಪ್ಲಾಯ್ ಜಾಬ್ ಈಗ ಪಾಸ್ ಆಗುವುದಿಲ್ಲ. ಯಶಸ್ವಿ ಎನ್ನುವ ಮೊದಲು ಪ್ರತಿ ಸರ್ವರ್‌ನ API, ಆರ್ಕೆಸ್ಟ್ರೇಟರ್, ಗೇಟ್‌ವೇ ಮತ್ತು ಪ್ರಕಟಣೆ ವರ್ಕರ್ ಅನ್ನು ಅದು ಪರಿಶೀಲಿಸುತ್ತದೆ.

ಸಮಸ್ಯೆ 2: ಟ್ರಾಫಿಕ್ ಹೋಗುವ ಮೊದಲೇ ಸರ್ವರ್ ಹೊರಟಿತ್ತು

ಎರಡನೇ ಸಮಸ್ಯೆ ಸದ್ದಿಲ್ಲದೆ ಇತ್ತು. ಡಿಪ್ಲಾಯ್ ಸರ್ವರ್ ಅನ್ನು ಹರಿಸಿದಾಗ, ಸರ್ವರ್ ತನ್ನ ಆರೋಗ್ಯ ಎಂಡ್‌ಪಾಯಿಂಟ್‌ಗೆ 503 ನೀಡಲು ಆರಂಭಿಸುತ್ತದೆ, ಆಗ ಲೋಡ್ ಬ್ಯಾಲೆನ್ಸರ್ ಅದನ್ನು ಸರದಿಯಿಂದ ತೆಗೆಯುತ್ತದೆ. ನಮ್ಮದು 5 ಸೆಕೆಂಡುಗಳ ಕಾಲ ಹಾಗೆ ಮಾಡಿ, ನಂತರ ಮುಚ್ಚುತ್ತಿತ್ತು.

ಆದರೆ ALB ಆರೋಗ್ಯವನ್ನು ಕೆಲವೊಮ್ಮೆ ಮಾತ್ರ ಪರಿಶೀಲಿಸುತ್ತಿತ್ತು, ಮತ್ತು ಗುರಿಗೆ ಟ್ರಾಫಿಕ್ ಕಳುಹಿಸುವುದನ್ನು ನಿಲ್ಲಿಸುವ ಮೊದಲು ಸತತ ಹಲವು ವಿಫಲ ಪರಿಶೀಲನೆಗಳು ಬೇಕಾಗಿದ್ದವು — ಒಟ್ಟಾರೆ ಸುಮಾರು 60 ಸೆಕೆಂಡುಗಳವರೆಗೆ. ಹಾಗಾಗಿ ಸುಮಾರು 55 ಸೆಕೆಂಡುಗಳ ಕಾಲ, ಲೋಡ್ ಬ್ಯಾಲೆನ್ಸರ್ ಈಗಾಗಲೇ ಆಲಿಸುವುದನ್ನು ನಿಲ್ಲಿಸಿದ ಸರ್ವರ್‌ಗೆ ನಿಜವಾದ ವಿನಂತಿಗಳನ್ನು ಕಳುಹಿಸುತ್ತಲೇ ಇತ್ತು. ಅವೇ ನಮ್ಮ 502 ಗಳಾಗಿದ್ದವು.

ಫಿಕ್ಸ್ ಎಂದರೆ ಎರಡು ಸಮಯರೇಖೆಗಳನ್ನು ಒಪ್ಪುವಂತೆ ಮಾಡುವುದು:

  • ಗುರಿ ಗುಂಪು ಈಗ ಪ್ರತಿ 5 ಸೆಕೆಂಡ್‌ಗೆ ಪರಿಶೀಲಿಸುತ್ತದೆ ಮತ್ತು 2 ವಿಫಲತೆಗಳ ನಂತರ ಗುರಿಯನ್ನು ಅನಾರೋಗ್ಯಕರ ಎಂದು ಗುರುತಿಸುತ್ತದೆ — ಗಮನಿಸಲು ಸುಮಾರು 10 ಸೆಕೆಂಡುಗಳು.
  • ಹರಿಯುವಿಕೆ ಆರೋಗ್ಯ ಪರಿಶೀಲನೆಗಳಲ್ಲಿ ವಿಫಲವಾಗಲು ಪ್ರಾರಂಭಿಸಿದ ನಂತರ 15 ಸೆಕೆಂಡುಗಳವರೆಗೆ ನಿಜವಾದ ಟ್ರಾಫಿಕ್ ಅನ್ನು ಸೇವೆ ಮಾಡುತ್ತಲೇ ಇರುತ್ತದೆ, ಆದ್ದರಿಂದ ಯಾವಾಗಲೂ ಅತಿಕ್ರಮಣ ಇರುತ್ತದೆ.
  • ಈ ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಕನ್ಸೋಲ್‌ನಲ್ಲಿ ಯಾರೋ ಒಮ್ಮೆ ಕ್ಲಿಕ್ ಮಾಡಿದ್ದರಲ್ಲಿ ಅಲ್ಲ, ಮೂಲಸೌಕರ್ಯವನ್ನು ಒದಗಿಸುವ ಸ್ಕ್ರಿಪ್ಟ್‌ನಲ್ಲಿ ಇವೆ.

ಸಂಖ್ಯೆಗಳು ಪರಸ್ಪರ ಹೊಂದುವಂತೆ ಮಾಡುವುದು

ಇಂತಹ ಟೈಮ್‌ಔಟ್‌ಗಳು ಒಂದಕ್ಕೊಂದು ಅವಲಂಬಿತವಾಗಿವೆ. ಹರಿಯುವಿಕೆ ಲೋಡ್ ಬ್ಯಾಲೆನ್ಸರ್ ಗಮನಿಸಲು ಬೇಕಾದ ಸಮಯಕ್ಕಿಂತ ಉದ್ದವಾಗಿರಬೇಕು; ಹರಿಯುವಿಕೆ ಮತ್ತು ಶಟ್‌ಡೌನ್ ಸೇರಿ ಕಂಟೇನರ್ ಬಲವಂತವಾಗಿ ಕೊಲ್ಲುವ ಮೊದಲು ಮುಗಿಯಬೇಕು. ಆರು ತಿಂಗಳ ನಂತರ ಯಾರಾದರೂ ಒಂದು ಸಂಖ್ಯೆಯನ್ನು ಬದಲಾಯಿಸಿ ಈ ದೋಷವನ್ನು ಶಾಂತವಾಗಿ ಮರಳಿ ತರುವುದು ಸುಲಭ.

ಆದ್ದರಿಂದ ಆ ಸಂಬಂಧಗಳನ್ನು ಪರೀಕ್ಷೆಗಳಾಗಿ ಬರೆದಿಟ್ಟೆವು: ಹರಿಯುವಿಕೆ ಆರೋಗ್ಯ-ಪರಿಶೀಲನೆ ಮಧ್ಯಂತರ ಮತ್ತು ವಿಫಲತೆ ಮಿತಿಯ ಗುಣಾಕಾರಕ್ಕಿಂತ ಉದ್ದವಾಗಿರಬೇಕು; ಮತ್ತೆ ಆರೋಗ್ಯಕರ ಎಂದು ಗುರುತಿಸಲು ತೆಗೆದುಕೊಳ್ಳುವ ಸಮಯ ಚಿಕ್ಕದಾಗಿರಬೇಕು; ಇಡೀ ಹರಿಯುವಿಕೆ ಕಂಟೇನರ್‌ನ ಸ್ಟಾಪ್ ಗ್ರೇಸ್ ಅವಧಿಯೊಳಗೆ ಹೊಂದಬೇಕು. ಒಂದು ಸಂಖ್ಯೆ ಬದಲಾಯಿಸಿ ಉಳಿದವನ್ನು ಬದಲಾಯಿಸದಿದ್ದರೆ CI ವಿಫಲವಾಗುತ್ತದೆ. ಪರೀಕ್ಷೆಗಳನ್ನೇ ಮ್ಯುಟೇಶನ್-ಪರೀಕ್ಷೆ ಮಾಡಿದೆವು — ಪ್ರತಿ ಸಂಖ್ಯೆಯನ್ನು ತಪ್ಪು ಮೌಲ್ಯಕ್ಕೆ ಬದಲಾಯಿಸಿ ಒಂದು ಪರೀಕ್ಷೆ ಅದನ್ನು ಹಿಡಿಯುತ್ತದೆಯೇ ಎಂದು ನೋಡಿದೆವು.

ಡಿಪ್ಲಾಯ್ ಅಳೆಯುವುದು ಸುಲಭವಾಗಿ ತಪ್ಪಾಗಬಹುದು

ನಮ್ಮ ಮೊದಲ ಅಳತೆ ಹೇಳಿದ್ದು ಸ್ವಚ್ಛ ಡಿಪ್ಲಾಯ್ ಸುಮಾರು 3% ಮುರಿದಿತ್ತು ಎಂದು. ಅದು ನಿಜವಾಗಿರಲಿಲ್ಲ. ನಾವು 200 ಅಲ್ಲದ ಪ್ರತಿ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಎಣಿಸುತ್ತಿದ್ದೆವು, ಮತ್ತು ಹರಿಯುವಿಕೆ ಸಮಯದಲ್ಲಿ ಆರೋಗ್ಯ ಎಂಡ್‌ಪಾಯಿಂಟ್‌ನಿಂದ ಬರುವ 503 ವೈಫಲ್ಯವಲ್ಲ — ಅದು ಹರಿಯುವಿಕೆ ತನ್ನ ಕೆಲಸ ಮಾಡುತ್ತಿರುವುದು, ಲೋಡ್ ಬ್ಯಾಲೆನ್ಸರ್‌ಗೆ ಆ ಸರ್ವರ್ ಅನ್ನು ಆಯ್ಕೆ ಮಾಡಬೇಡ ಎಂದು ಹೇಳುತ್ತಾ, ಅದು ನಿಜವಾದ ವಿನಂತಿಗಳನ್ನು ಸೇವೆ ಮಾಡುತ್ತಲೇ ಇರುತ್ತದೆ.

ಬಳಕೆದಾರರು ಅನುಭವಿಸುವುದು 502 — ವಿನಂತಿ ಏನನ್ನೂ ತಲುಪಲಿಲ್ಲ. ಆ ಮಾತ್ರ ಎಣಿಸಿದಾಗ ನಿಜ ಚಿತ್ರ ಸಿಕ್ಕಿತು — ಮೂರು ಉತ್ಪಾದನಾ ಡಿಪ್ಲಾಯ್‌ಗಳಲ್ಲಿ 10, ನಂತರ 6, ನಂತರ 0.

ನಾವು ಕಲಿತದ್ದು

  • ಸ್ವಯಂ-ದುರಸ್ತಿಗೆ ಯೋಜಿತ ಸ್ಥಗಿತದ ಬಗ್ಗೆ ತಿಳಿದಿರಬೇಕು. ಡಿಪ್ಲಾಯ್ ಮತ್ತು ಕ್ರ್ಯಾಶ್ ನಡುವೆ ವ್ಯತ್ಯಾಸ ಹೇಳಲಾಗದ ವಾಚ್‌ಡಾಗ್ ಅಂತಿಮವಾಗಿ ಡಿಪ್ಲಾಯ್ ಜೊತೆ ಹೋರಾಡುತ್ತದೆ.
  • ಹರಿಯುವಿಕೆ ಒಂದು ಕೈಕುಲುಕುವಿಕೆ. ಲೋಡ್ ಬ್ಯಾಲೆನ್ಸರ್ ಟ್ರಾಫಿಕ್ ಕಳುಹಿಸುವುದನ್ನು ನಿಲ್ಲಿಸಿದೆ ಎಂದು ಸಾಬೀತಾಗುವವರೆಗೆ ಸರ್ವರ್ ಸೇವೆ ಮುಂದುವರಿಸಬೇಕು, ಮತ್ತು ಆ ಸಮಯವನ್ನು ಸರ್ವರ್‌ನಲ್ಲಲ್ಲ, ಬ್ಯಾಲೆನ್ಸರ್‌ನಲ್ಲಿ ಹೊಂದಿಸಲಾಗುತ್ತದೆ.
  • ಅಸ್ಥಿರಗಳನ್ನು ಪರೀಕ್ಷೆಗಳಾಗಿ ಎನ್‌ಕೋಡ್ ಮಾಡಿ. ಕಾರ್ಯಾಚರಣೆಯ ಸಂಖ್ಯೆಗಳು ತಪ್ಪಿ ಹೋಗುತ್ತವೆ. ಅವುಗಳನ್ನು ಪರಸ್ಪರ ಸಂಬಂಧಿಸುವ ಪರೀಕ್ಷೆಗಳು ಹಾಗಲ್ಲ.
  • ಅಳೆಯುವ ಮೊದಲೇ ಏನನ್ನು ಅಳೆಯುತ್ತಿದ್ದೇವೆ ಎಂದು ನಿರ್ಧರಿಸಿ. "ದೋಷಗಳು" ತಪ್ಪು ಮಾಪನವಾಗಿತ್ತು; "ಏನನ್ನೂ ತಲುಪದ ವಿನಂತಿಗಳು" ಸರಿಯಾದ ಮಾಪನವಾಗಿತ್ತು.

Mythex ನಲ್ಲಿ ನೀವು ಆ್ಯಪ್ ಪ್ರಕಟಿಸಿದರೆ, ಇದು ಯಾವುದೂ ನಿಮಗೆ ಕಾಣುವುದಿಲ್ಲ — ಅದೇ ಉದ್ದೇಶ. ಸಂಬಂಧಿತ: ಪ್ರಕಟಿಸಿದ ನಿಮ್ಮ ಆ್ಯಪ್ ನೀವು ಮರುಪ್ರಕಟಿಸುವಾಗಲೂ ಹೇಗೆ ಚಾಲನೆಯಲ್ಲಿರುತ್ತದೆ.

Mythex · Pricing · AI ನೊಂದಿಗೆ ಏನನ್ನಾದರೂ ನಿರ್ಮಿಸಿ · ವೆಬ್‌ಸೈಟ್ ಮತ್ತು ಆ್ಯಪ್ ಟೆಂಪ್ಲೇಟ್‌ಗಳು · Mythex ಹೋಲಿಕೆ · AI ಆ್ಯಪ್ ನಿರ್ಮಾಣ ಗ್ಲಾಸರಿ · ಉಚಿತ AI ಆ್ಯಪ್ ನಿರ್ಮಾಣ ಉಪಕರಣಗಳು · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული Қазақ тілі 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港) 繁體中文(台灣)