etcd ಬಳಸಿ ಏಷ್ಯಾ-ಪೆಸಿಫಿಕ್ ವೀಡಿಯೊ ಟ್ರಾಫಿಕ್ ಅನ್ನು ರೂಟಿಂಗ್ ಮಾಡುವುದು

ಎಂಟು ಏಷ್ಯಾ-ಪೆಸಿಫಿಕ್ ಮಾರುಕಟ್ಟೆಗಳಿಗೆ ಸೇವೆ ನೀಡುವ ವೀಡಿಯೊ-ಸ್ಟ್ರೀಮಿಂಗ್ ಪ್ಲಾಟ್‌ಫಾರ್ಮ್, ಪ್ರದೇಶ-ನಿರ್ದಿಷ್ಟ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು etcd ಗೆ ವರ್ಗಾಯಿಸುವ ಮೂಲಕ ಪದೇ ಪದೇ ಆಗುತ್ತಿದ್ದ ರೂಟಿಂಗ್ ತಪ್ಪುಗಳನ್ನು ತಡೆಗಟ್ಟಿತು. ರೂಟಿಂಗ್ ಬದಲಾವಣೆಗಳ ಪ್ರಸರಣ ಸಮಯವು (propagation time) ಸುಮಾರು ಒಂದು ಸೆಕೆಂಡಿಗೆ ಇಳಿಕೆಯಾಯಿತು. ಎಡಿಟರ್‌ಗಳು ಈಗ ಕೋಡ್ ಅನ್ನು ಮುಟ್ಟದೆಯೇ ಕೆಲವು ಗಂಟೆಗಳ ಕಾಲ ಮ್ಯೂಸಿಕ್ ಪೂಲ್ ಅನ್ನು ಬೂಸ್ಟ್ ಮಾಡಬಹುದು ಮತ್ತು ಪ್ಲಾಟ್‌ಫಾರ್ಮ್ ದಕ್ಷಿಣ ಕೊರಿಯಾದ ವೀಕ್ಷಕರಿಗೆ ಟೋಕಿಯೋ ಫೀಡ್ ಅನ್ನು ಕಳುಹಿಸುವುದನ್ನು ನಿಲ್ಲಿಸಿತು.

ಹಳೆಯ ವಿಧಾನ ಏಕೆ ವಿಫಲವಾಯಿತು

ಪ್ರತಿ ವಿನಂತಿಗೂ (request) ಪ್ರತಿಯೊಂದು ರೂಟರ್ ಮೂರು ಮೌಲ್ಯಗಳನ್ನು ಓದುತ್ತಿತ್ತು: ಟ್ರೆಂಡಿಂಗ್ ಪೂಲ್, ಭಾಷೆ-ನಿರ್ದಿಷ್ಟ ಟೋಕಿನೈಜರ್ ಮತ್ತು ಫಾಲ್‌ಬ್ಯಾಕ್ ಚೈನ್. ಹೊಸ ಕಲಾವಿದನನ್ನು ಪ್ರಚಾರ ಮಾಡುವುದು, ಪ್ರಾದೇಶಿಕ ಸೇವೆಯ ವ್ಯತ್ಯಯಕ್ಕೆ ಪ್ರತಿಕ್ರಿಯಿಸುವುದು ಅಥವಾ ಶಿಫಾರಸು ಮಾಡುವ ಅಲ್ಗಾರಿದಮ್ ಅನ್ನು ಪರೀಕ್ಷಿಸುವುದು ಮುಂತಾದ ವ್ಯವಹಾರದ ನಿರ್ಧಾರಗಳು ಈ ಮೌಲ್ಯಗಳನ್ನು ನಿರ್ಧರಿಸುತ್ತಿದ್ದವು, ಕೋಡ್ ಬದಲಾವಣೆಗಳಲ್ಲಲ್ಲ.

ಆರಂಭದಲ್ಲಿ ಪ್ರತಿ ನಿಯೋಜನೆಯು (deployment) ರೂಟಿಂಗ್ ಟೇಬಲ್‌ನೊಂದಿಗೆ ಒಂದು JSON ಫೈಲ್ ಅನ್ನು ಒಳಗೊಂಡಿತ್ತು. ಒಂದು ಘಟನೆಯ ಸಮಯದಲ್ಲಿ, ಆನ್-ಕಾಲ್ ಇಂಜಿನಿಯರ್ ಟ್ರಾಫಿಕ್ ಅನ್ನು ಬ್ಯಾಕಪ್ ಪೂಲ್‌ಗೆ ತಿರುಗಿಸಲು ಒಂದು ನೋಡ್‌ನಲ್ಲಿ ಫೈಲ್ ಅನ್ನು ಎಡಿಟ್ ಮಾಡಿದರು, ಆದರೆ ಉಳಿದ ಏಳು ನೋಡ್‌ಗಳನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡಲಿಲ್ಲ. ಇದರಿಂದ 'ಕಾನ್ಫಿಗರೇಶನ್ ಡ್ರಿಫ್ಟ್' (Config drift) ಉಂಟಾಯಿತು: ಎಂಟು ದೇಶಗಳು ವಿಭಿನ್ನ ಟೇಬಲ್‌ಗಳನ್ನು ಬಳಸುತ್ತಿದ್ದವು ಮತ್ತು ಯಾವುದೇ ಏಕೈಕ ಮೂಲವು "ಸತ್ಯವನ್ನು" (truth) ದೃಢೀಕರಿಸುತ್ತಿರಲಿಲ್ಲ. ಸಿಯೋಲ್ ವೀಕ್ಷಕರಿಗೆ ಟೋಕಿಯೋ ಫೀಡ್ ಕಳುಹಿಸುತ್ತಿದ್ದ ಬಗ್ ಮುಂದುವರಿಯಿತು ಏಕೆಂದರೆ ಕೋಡ್ ಬದಲಾಗಲಿರಲಿಲ್ಲ; ಕೇವಲ ಗುಪ್ತ ಕಾನ್ಫಿಗರೇಶನ್ ಮಾತ್ರ ವ್ಯತ್ಯಾಸವಾಗಿತ್ತು.

ಏಕೈಕ ಸತ್ಯದ ಮೂಲವಾಗಿ (single source of truth) etcd ಅನ್ನು ಆಯ್ಕೆ ಮಾಡುವುದು

ತಂಡವು ಮೂರು ಆಯ್ಕೆಗಳನ್ನು ಹೋಲಿಕೆ ಮಾಡಿತು:

  • SQLite/MySQL – ಇದು ಪ್ರತಿ ರೂಟರ್ ಅನ್ನು ಡೇಟಾಬೇಸ್ ಅನ್ನು ಪೋಲ್ (poll) ಮಾಡಲು ಒತ್ತಾಯಿಸುತ್ತದೆ, ಇದರಿಂದ ವಿಳಂಬ (latency) ಹೆಚ್ಚಾಗುತ್ತದೆ ಅಥವಾ ಕ್ವೇರಿಗಳ ಹೊರೆ ಉಂಟಾಗುತ್ತದೆ.
  • Consul – ಇದು ಒಂದು ಉತ್ತಮ ಸರ್ವಿಸ್-ಡಿಸ್ಕವರಿ ಟೂಲ್ ಆಗಿದೆ, ಆದರೆ ಪ್ಲಾಟ್‌ಫಾರ್ಮ್‌ಗೆ ಅದರ ಪೂರ್ಣ ಮೆಶ್ (mesh) ವೈಶಿಷ್ಟ್ಯಗಳ ಅಗತ್ಯವಿರಲಿಲ್ಲ.
  • etcd – ಇದು ಒಂದು ಸ್ಟ್ರಾಂಗ್ಲಿ ಕನ್ಸಿಸ್ಟೆಂಟ್ ಕೀ-ವ್ಯಾಲ್ಯೂ ಸ್ಟೋರ್ ಆಗಿದ್ದು, ಕೀ ಬದಲಾದ ತಕ್ಷಣ ಕ್ಲೈಂಟ್‌ಗಳಿಗೆ ತಿಳಿಸುವ watch ಪ್ರಿಮಿಟಿವ್ ಅನ್ನು ಹೊಂದಿದೆ.

'watch' ವೈಶಿಷ್ಟ್ಯವು ನಿರ್ಧಾರವನ್ನು ಬದಲಿಸಿತು. ಪ್ರತಿ ರೂಟರ್ "ಏನಾದರೂ ಬದಲಾಗಿದೆಯೇ?" ಎಂದು ಪದೇ ಪದೇ ಕೇಳುವ ಬದಲು, etcd ಅಪ್‌ಡೇಟ್ ಅನ್ನು ಕಳುಹಿಸುವವರೆಗೆ ರೂಟರ್‌ಗಳು ನಿಷ್ಕ್ರಿಯವಾಗಿರುತ್ತವೆ. ಅನಗತ್ಯ ನೆಟ್‌ವರ್ಕ್ ಟ್ರಾಫಿಕ್ ಮಾಯವಾಯಿತು ಮತ್ತು ಪ್ರತಿಯೊಂದು ಇನ್‌ಸ್ಟೆನ್ಸ್ ಕೂಡ ಏಕಕಾಲದಲ್ಲಿ ಬದಲಾವಣೆಯನ್ನು ತಿಳಿಯಿತು.

ವ್ಯವಸ್ಥೆಯನ್ನು ಸುರಕ್ಷಿತವಾಗಿರಿಸುವ ಮಾದರಿಗಳು (Patterns)

Etcd ಮಾತ್ರ ಎಲ್ಲಾ ಅಪಾಯಗಳನ್ನು ಪರಿಹರಿಸಲಿಲ್ಲ. ಇಂಜಿನಿಯರ್‌ಗಳು ಮೂರು ಪೂರಕ ಮಾದರಿಗಳನ್ನು ಸೇರಿಸಿದರು:

  1. Leases – ಎಡಿಟರ್ ತಾತ್ಕಾಲಿಕ ಬೂಸ್ಟ್ ಅನ್ನು ಹೊಂದಿಸಬಹುದು (ಉದಾಹರಣೆಗೆ, ಆರು ಗಂಟೆಗಳ ಕಾಲ ಕೊರಿಯನ್-ಪಾಪ್ ಪೂಲ್‌ನ ತೂಕವನ್ನು ಹೆಚ್ಚಿಸುವುದು). ಲೀಸ್ (lease) ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಮುಕ್ತಾಯಗೊಳ್ಳುತ್ತದೆ, ಆದ್ದರಿಂದ ಮ್ಯಾನುಯಲ್ ರೋಲ್‌ಬ್ಯಾಕ್ ಇಲ್ಲದೆಯೇ ಬೂಸ್ಟ್ ಮಾಯವಾಗುತ್ತದೆ.
  2. Compare-and-swap (CAS) – ಇಬ್ಬರು ವ್ಯಕ್ತಿಗಳು ಏಕಕಾಲದಲ್ಲಿ ಒಂದೇ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಎಡಿಟ್ ಮಾಡಿದಾಗ, CAS ಒಬ್ಬರಿಗೆ ವಿಫಲವಾಗುತ್ತದೆ, ಇದು ಮೌನವಾಗಿ ಓವರ್‌ರೈಟ್ ಆಗುವುದನ್ನು ತಡೆಯುತ್ತದೆ.
  3. Sidecar process – PHP ದೀರ್ಘಕಾಲದ ಕನೆಕ್ಷನ್‌ಗಳೊಂದಿಗೆ ಹೋರಾಡುತ್ತದೆ. ಪ್ರತಿ ಬಾಕ್ಸ್‌ನಲ್ಲಿರುವ ಸಣ್ಣ Go sidecar, etcd ಅನ್ನು ಗಮನಿಸುತ್ತದೆ ಮತ್ತು ರೂಟಿಂಗ್ ಟೇಬಲ್‌ನ ಸ್ನ್ಯಾಪ್‌ಶಾಟ್ ಅನ್ನು ಶೇರ್ಡ್-ಮೆಮೊರಿ ಫೈಲ್‌ಗೆ (/dev/shm) ಬರೆಯುತ್ತದೆ. PHP ಆ ಲೋಕಲ್ ಫೈಲ್ ಅನ್ನು ಓದುತ್ತದೆ, ಇದರಿಂದ ವಿನಂತಿ ನಿರ್ವಹಣೆಯ ಸಮಯದಲ್ಲಿ ಯಾವುದೇ ನೆಟ್‌ವರ್ಕ್ ರೌಂಡ್-ಟ್ರಿಪ್ ತಪ್ಪುತ್ತದೆ.

ಆರ್ಕಿಟೆಕ್ಚರ್‌ನಲ್ಲಿ ನಿರ್ಮಿಸಲಾದ ಸ್ಥಿತಿಸ್ಥಾಪಕತ್ವ (Resilience)

ಹೊಸ ವಿನ್ಯಾಸವು ಹಲವಾರು ಸುರಕ್ಷತಾ ಜಾಲಗಳನ್ನು ಸೇರಿಸುತ್ತದೆ:

  • Zero-latency reads – PHP ಹಾಟ್ ಪಾತ್ ಲೋಕಲ್ ಮೆಮೊರಿಯಿಂದ ಓದುತ್ತದೆ, ಆದ್ದರಿಂದ ರಿಮೋಟ್ ಸ್ಟೋರ್ ಕಾಯುವಾಗ ವಿನಂತಿಗಳು ಎಂದಿಗೂ ನಿಲ್ಲುವುದಿಲ್ಲ.
  • Graceful degradation – ಒಂದು ವೇಳೆ etcd ಡೌನ್ ಆದರೆ, ರೂಟರ್‌ಗಳು ಕೊನೆಯ ತಿಳಿದಿರುವ ಸರಿಯಾದ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ನೀಡುತ್ತಲೇ ಇರುತ್ತವೆ, ಇದು ಹಠಾತ್ ಸೇವೆಯ ವ್ಯತ್ಯಯವನ್ನು ತಡೆಯುತ್ತದೆ.
  • Reliable updates – sidecar ಕನೆಕ್ಷನ್ ಮರುಸಂಪರ್ಕ ತರ್ಕವನ್ನು (reconnection logic) ನಿರ್ವಹಿಸುತ್ತದೆ ಮತ್ತು etcd ಕನೆಕ್ಷನ್ ತಾತ್ಕಾಲಿಕವಾಗಿ ಸ್ಥಗಿತಗೊಂಡರೂ ಯಾವುದೇ ಬದಲಾವಣೆಯನ್ನು ತಪ್ಪಿಸುವುದಿಲ್ಲ ಎಂದು ಖಾತರಿಪಡಿಸುತ್ತದೆ.

ವಾಸ್ತವದಲ್ಲಿ ಏನಾಯಿತು

ಮೈಗ್ರೇಷನ್ ನಂತರ, ಹಳೆಯ ಅಥವಾ ಹೊಂದಾಣಿಕೆಯಿಲ್ಲದ ರೂಟಿಂಗ್ ಡೇಟಾದಿಂದ ಉಂಟಾಗುವ ಘಟನೆಗಳಲ್ಲಿ ಭಾರಿ ಇಳಿಕೆಯನ್ನು ತಂಡವು ಕಂಡಿತು. ಈಗ ಒಂದೇ ಕನ್ಸೋಲ್ ಪ್ರಸ್ತುತ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ತೋರಿಸುತ್ತದೆ ಮತ್ತು ಯಾವುದೇ ಎಡಿಟ್ ಒಂದು ಸೆಕೆಂಡಿನೊಳಗೆ ಎಲ್ಲಾ ಎಂಟು ಪ್ರದೇಶಗಳಿಗೆ ಪ್ರಸಾರವಾಗುತ್ತದೆ. ತಾತ್ಕಾಲಿಕ ಬೂಸ್‌ಗಳು ಅವುಗಳ ಲೀಸ್ ಮುಗಿದ ನಂತರ ತಾವಾಗಿಯೇ ಸ್ವಚ್ಛವಾಗುತ್ತವೆ, ಇದು ಹಿಂದೆ ಮಾನವ ತಪ್ಪುಗಳಿಗೆ ಕಾರಣವಾಗುತ್ತಿದ್ದ ಮ್ಯಾನುಯಲ್ ಕ್ಲೀನ್-ಅಪ್ ಹಂತಗಳನ್ನು ತೆಗೆದುಹಾಕುತ್ತದೆ.

ವಿರೋಧಾತ್ಮಕ ಅಂಶ: sidecar ನ ವೆಚ್ಚ

sidecar ಅನ್ನು ಸೇರಿಸುವುದು ಎಂದರೆ ಪ್ರತಿ ಸರ್ವರ್‌ಗೆ ಎರಡನೇ ಪ್ರಕ್ರಿಯೆ ಮತ್ತು PHP-ಕೇಂದ್ರಿತ ಸ್ಟ್ಯಾಕ್‌ನಲ್ಲಿ Go runtime ಇರುತ್ತದೆ ಎಂದರ್ಥ. ಕೆಲವು ಆಪರೇಟರ್‌ಗಳು ಹೆಚ್ಚುವರಿ ಮೆಮೊರಿ ಬಳಕೆ ಮತ್ತು ಇನ್ನೊಂದು ಬೈನರಿಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡುವ ಅಗತ್ಯದ ಬಗ್ಗೆ ಚಿಂತಿಸುತ್ತಾರೆ. ಪ್ರಾಯೋಗಿಕವಾಗಿ sidecar ನ ಬಳಕೆ (footprint) ಸಾಧಾರಣವಾಗಿರುತ್ತದೆ ಮತ್ತು ಅದರಿಂದ ಸಿಗುವ ವಿಶ್ವಾಸಾರ್ಹತೆಯ ಲಾಭಗಳು—ವಿಶೇಷವಾಗಿ PHP ಎಂದಿಗೂ ನೆಟ್‌ವರ್ಕ್ ಕಾಲ್‌ನಲ್ಲಿ ಬ್ಲಾಕ್ ಆಗುವುದಿಲ್ಲ ಎಂಬ ಖಾತರಿ—ಕಾರ್ಯಾಚರಣೆಯ ಹೊರೆಯಗಿಂತ ಹೆಚ್ಚಾಗಿವೆ.

ಮುಂದೆ ಗಮನಿಸಬೇಕಾದವುಗಳು

ಬಹು-ಪ್ರದೇಶದ ಸೇವೆಗಳನ್ನು ನಿರ್ವಹಿಸುವ ತಂಡಗಳು ಇವುಗಳನ್ನು ಗಮನಿಸಬೇಕು:

  • etcd health metrics – ರೂಟಿಂಗ್ ಲೇಯರ್ ಒಂದೇ ಸ್ಟೋರ್ ಮೇಲೆ ಅವಲಂಬಿತವಾಗಿದೆ; ಕ್ವಾರಮ್ (quorum) ಸ್ಥಿತಿ ಮತ್ತು ವಿಳಂಬವನ್ನು ಗಮನಿಸುತ್ತಿರಿ.
  • Lease expiration handling – ಲೀಸ್ ಸಮಯವನ್ನು ವ್ಯವಹಾರದ ಅವಧಿಗಳಿಗೆ ಅನುಗುಣವಾಗಿ ಹೊಂದಿಸಿ; ಅತಿಯಾದ ದೀರ್ಘಾವಧಿಯ ಲೀಸ್‌ಗಳು ಹಳೆಯ ಬೂಸ್‌ಗಳನ್ನು ಹಾಗೆಯೇ ಉಳಿಸಬಹುದು.
  • Scaling the watch load – ರೂಟರ್‌ಗಳು ಹೆಚ್ಚಾದಂತೆ, watch ಕನೆಕ್ಷನ್‌ಗಳು ಹೆಚ್ಚಾಗುತ್ತವೆ; ಅದಕ್ಕನುಗುಣವಾಗಿ etcd ಸರ್ವರ್‌ಗಳ ಸಾಮರ್ಥ್ಯವನ್ನು ಯೋಜಿಸಿ.

ಮುಖ್ಯಾಂಶಗಳು

ಅನೇಕ ಪ್ರದೇಶಗಳಲ್ಲಿ ವೇಗವಾದ ಮತ್ತು ಸಮನ್ವಯಗೊಳಿಸಿದ ಕಾನ್ಫಿಗರೇಶನ್ ಬದಲಾವಣೆಗಳ ಅಗತ್ಯವಿರುವ ಯಾವುದೇ ಸೇವೆಗೆ, etcd ನ watch, lease, ಮತ್ತು transaction primitives ಗಳು ಫೈಲ್ ಆಧಾರಿತ ಕಾನ್ಫಿಗರೇಶನ್‌ಗಳು ಅಥವಾ ಭಾರೀ ಮೆಶ್‌ಗಳಿಗೆ (heavyweight meshes) ಬದಲಾಗಿ ಹಗುರವಾದ ಮತ್ತು ಬಲವಾದ ಸ್ಥಿರತೆಯನ್ನು ಹೊಂದಿರುವ ಪರ್ಯಾಯವನ್ನು ನೀಡುತ್ತವೆ. ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು push-driven ಮತ್ತು ಸ್ವಯಂ-ಶುದ್ಧೀಕರಣಗೊಳ್ಳುವ (self-cleaning) ಸ್ಟೋರ್ ಆಗಿ ಪರಿವರ್ತಿಸುವುದರಿಂದ ಒಂದು ಇಡೀ ವರ್ಗದ ಘಟನೆಗಳನ್ನು ನಿವಾರಿಸಲು ಸಾಧ್ಯವಾಯಿತು ಮತ್ತು ಇದು ಪ್ಲಾಟ್‌ಫಾರ್ಮ್‌ಗೆ ಅದರ ರೂಟಿಂಗ್ ಲಾಜಿಕ್ ಮೇಲೆ ನೈಜ-ಸಮಯದ ನಿಯಂತ್ರಣವನ್ನು ನೀಡಿತು.