𝗗𝟭 ರೀಡ್ ರೆಪ್ಲಿಕಾಗಳು 6 ಸೆಕೆಂಡ್‌ಗಳ ವಿಳಂಬವನ್ನು (Lag) ಹೊಂದಿದ್ದವು

ಟೋಕಿಯೊದಲ್ಲಿರುವ ಒಂದು D1 ರೀಡ್ ರೆಪ್ಲಿಕಾ, ಉತ್ತರ ಅಮೆರಿಕಾದಲ್ಲಿನ ಬರವಣಿಗೆಯಿಂದ (write) 6.1 ಸೆಕೆಂಡ್‌ಗಳಷ್ಟು ಹಿಂದೆ ಬಿದ್ದಿತ್ತು.

ತಪ್ಪು ಇಂಪ್ರೆಶನ್‌ಗಳನ್ನು ತಡೆಗಟ್ಟುತ್ತಿರುವ (throttling) ಟ್ರ್ಯಾಕರ್‌ನಿಂದ ನಾನು ಇದನ್ನು ತಿಳಿದುಕೊಂಡೆ. ಡಾಕ್ಯುಮೆಂಟೇಶನ್ 'eventual consistency' ಬಗ್ಗೆ ಉಲ್ಲೇಖಿಸುತ್ತದೆ. ಆದರೆ ಯೋಜಿಸಲು ಬೇಕಾದ ನಿರ್ದಿಷ್ಟ ಸಮಯವನ್ನು ಅದು ನೀಡುವುದಿಲ್ಲ.

ನೈಜ ಅಂಕಿಅಂಶಗಳನ್ನು ಕಂಡುಹಿಡಿಯಲು ನಾನು ಒಂದು 'staleness probe' ಅನ್ನು ನಿರ್ಮಿಸಿದೆ. ಈ ಪ್ರೋಬ್ ಒಂದು UUID ಮತ್ತು epoch ಹೊಂದಿರುವ ಸಾಲನ್ನು (row) ಬರೆಯುತ್ತದೆ. ಆ ಸಾಲು ಕಾಣಿಸಿಕೊಳ್ಳುವವರೆಗೆ ಅದು ರೆಪ್ಲಿಕಾವನ್ನು ಪೋಲ್ (poll) ಮಾಡುತ್ತದೆ. ನಂತರ ಅದು ವಿಳಂಬವನ್ನು ದಾಖಲಿಸುತ್ತದೆ.

ಏಷ್ಯಾದಲ್ಲಿನ 200 ಪ್ರೋಬ್‌ಗಳಿಂದ ಬಂದ ಫಲಿತಾಂಶಗಳು:

ನಿಮ್ಮ ಪ್ರೈಮರಿ (primary) ಉತ್ತರ ಅಮೆರಿಕಾದಲ್ಲಿದ್ದರೆ ಮತ್ತು ನಿಮ್ಮ ಬಳಕೆದಾರರು ಏಷ್ಯಾದಲ್ಲಿದ್ದರೆ, ವಿಳಂಬವು ಹೆಚ್ಚಾಗಿರುತ್ತದೆ.

ನಾನು ಸ್ಕೀಮಾ ದೋಷವನ್ನೂ (schema error) ಎದುರಿಸಿದೆ. ಪ್ರೈಮರಿಯಲ್ಲಿ ಒಂದು ಮೈಗ್ರೇಷನ್ (migration) ಚಲಾಯಿಸಲಾಯಿತು. ಒಂದು Worker ಮರುಪ್ರಾರಂಭವಾಯಿತು (restarted). ಹೊಸ ಟೇಬಲ್ ಬರುವ ಮೊದಲೇ ಮೊದಲಿನ ವಿನಂತಿಗಳು (requests) ರೆಪ್ಲಿಕಾವನ್ನು ತಲುಪಿದವು. ಟೇಬಲ್ ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲ ಎಂದು ದೋಷವು ತಿಳಿಸಿತು. ಟೇಬಲ್ ಅಲ್ಲೇ ಇತ್ತು, ಆದರೆ ರೆಪ್ಲಿಕಾ ವಿಳಂಬವಾಗಿತ್ತು.

ವಿಳಂಬವನ್ನು ತಪ್ಪಿಸುವ ಮೂಲಕ (routing around the lag) ನಾನು ಇದನ್ನು ಪರಿಹರಿಸಿದೆ. ನಾನು ಅದರ ವಿರುದ್ಧ ಹೋರಾಡುವುದಿಲ್ಲ.

ನನ್ನ ವಿನ್ಯಾಸ ಇಲ್ಲಿದೆ:

  1. ರೈಟರ್ (writer) ಸಾಲಿಗೆ written_at epoch ಅನ್ನು ಸೇರಿಸುತ್ತಾನೆ.
  2. ರೈಟರ್ ರೆಸ್ಪಾನ್ಸ್‌ಗೆ X-D1-Written-At ಹೆಡರ್ ಅನ್ನು ಸೇರಿಸುತ್ತಾನೆ.
  3. ರೀಡರ್ (reader) ಆ ಹೆಡರ್ ಅನ್ನು ರೆಪ್ಲಿಕಾದ ಡೇಟಾದೊಂದಿಗೆ ಹೋಲಿಸುತ್ತಾನೆ.
  4. ರೆಪ್ಲಿಕಾ ಡೇಟಾ ಹೆಡರ್ ಗಿಂತ ಹಳೆಯದಾಗಿದ್ದರೆ, ರೀಡರ್ ಬದಲಿ ಮಾರ್ಗವಾಗಿ KV ಅನ್ನು ಬಳಸುತ್ತಾನೆ.

KV ಅದೇ ಪ್ರದೇಶದಲ್ಲಿ (region) 500ms ಗಿಂತ ಕಡಿಮೆ ಸಮಯದಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ. ಇದು ದಿನಕ್ಕೆ 10M ರೀಡ್‌ಗಳವರೆಗೆ ಉಚಿತವಾಗಿದೆ. ಇದು ನಿರ್ಣಾಯಕ ಫ್ಲಾಗ್‌ಗಳಿಗಾಗಿ (critical flags) ತಾಜಾ ಡೇಟಾವನ್ನು ಪಡೆಯಲು ಒಂದು ಅಗ್ಗದ ಮಾರ್ಗವನ್ನು ಒದಗಿಸುತ್ತದೆ.

ರೆಪ್ಲಿಕಾ ವಿಳಂಬವಾಗಿರುವ ಆ ಸಣ್ಣ ಅವಧಿಯಲ್ಲಿ ಮಾತ್ರ ನೀವು KV ಅನ್ನು ಬಳಸುತ್ತೀರಿ. ರೆಪ್ಲಿಕಾ ಅಪ್‌ಡೇಟ್ ಆದ ನಂತರ ಹೆಚ್ಚಿನ ರೀಡ್‌ಗಳು ಸಾಮಾನ್ಯವಾಗಿ D1 ಅನ್ನು ತಲುಪುತ್ತವೆ.

ನಾನು ನನ್ನ ವಿವರವಾದ ಪೋಸ್ಟ್‌ನಲ್ಲಿ ಪೂರ್ಣ ಸ್ಕ್ರಿಪ್ಟ್ ಮತ್ತು ಮೈಗ್ರೇಷನ್ ಮಾದರಿಯನ್ನು ಹಂಚಿಕೊಂಡಿದ್ದೇನೆ.

ಮೂಲ: https://dev.to/riversea/d1-read-replicas-returned-stale-data-for-6-seconds-heres-what-i-measured-and-how-i-designed-mme