800 ಮಿಲಿಯನ್ ChatGPT ಬಳಕೆದಾರರಿಗಾಗಿ PostgreSQL ವಿಸ್ತರಣೆ
ಬೋಹಾನ್ ಝಾಂಗ್, ತಾಂತ್ರಿಕ ಸಿಬ್ಬಂದಿಯ ಸದಸ್ಯ ಅವರಿಂದ
ಹಲವು ವರ್ಷಗಳಿಂದ, ChatGPT ಮತ್ತು OpenAI ಯ API ಮುಂತಾದ ಕೋರ್ ಉತ್ಪನ್ನಗಳಿಗೆ ಶಕ್ತಿ ನೀಡುವ ಅತ್ಯಂತ ಪ್ರಮುಖ, ಒಳಗಿನಿಂದ ಕಾರ್ಯನಿರ್ವಹಿಸುವ ಡೇಟಾ ವ್ಯವಸ್ಥೆಗಳಲ್ಲಿ PostgreSQL ಒಂದಾಗಿದೆ. ನಮ್ಮ ಬಳಕೆದಾರರ ಆಧಾರವು ವೇಗವಾಗಿ ಬೆಳೆಯುತ್ತಿರುವಂತೆ, ನಮ್ಮ ಡೇಟಾಬೇಸ್ಗಳ ಮೇಲಿನ ಬೇಡಿಕೆಗಳು ಕೂಡ ಬಹಳಷ್ಟು ಹೆಚ್ಚಿವೆ. ಕಳೆದ ವರ್ಷದಲ್ಲಿ, ನಮ್ಮ PostgreSQL ಲೋಡ್ 10 ಪಟ್ಟಿಗಿಂತ ಹೆಚ್ಚಾಗಿದೆ, ಮತ್ತು ಅದು ಇನ್ನೂ ವೇಗವಾಗಿ ಏರುತ್ತಿದೆ.
ನಮ್ಮ ಉತ್ಪಾದನಾ ಮೂಲಸೌಕರ್ಯವನ್ನು ಈ ಬೆಳವಣಿಗೆಯನ್ನು ನಿರಂತರವಾಗಿ ಬೆಂಬಲಿಸಲು ಮುಂದುವರಿಸಿದ ಪ್ರಯತ್ನಗಳು ಒಂದು ಹೊಸ ಒಳನೋಟವನ್ನು ಬಹಿರಂಗಪಡಿಸಿವೆ: PostgreSQL ಅನ್ನು ಅನೇಕರು ಹಿಂದೆ ಸಾಧ್ಯವೆಂದು ಭಾವಿಸಿದ್ದಕ್ಕಿಂತಲೂ ಬಹಳ ರೀಡ್ ಹೆವಿ-ಕೇಂದ್ರಿತ ಕಾರ್ಯಭಾರಗಳನ್ನು ವಿಶ್ವಾಸಾರ್ಹವಾಗಿ ಬೆಂಬಲಿಸಲು ವಿಸ್ತರಿಸಬಹುದು. ಈ ವ್ಯವಸ್ಥೆಯನ್ನು (ಆರಂಭದಲ್ಲಿ ಕ್ಯಾಲಿಫೋರ್ನಿಯಾ ವಿಶ್ವವಿದ್ಯಾಲಯ, ಬರ್ಕ್ಲಿಯಲ್ಲಿನ ವಿಜ್ಞಾನಿಗಳ ತಂಡದಿಂದ ರಚಿಸಲಾಯಿತು) ಒಂದು ಏಕೈಕ ಪ್ರಾಥಮಿಕ Azure PostgreSQL ನಮ್ಯವಾದ ಸರ್ವರ್ ಇನ್ಸ್ಟನ್ಸ್(ಹೊಸ ಕಿಟಕಿಯಲ್ಲಿ ತೆರೆಯುತ್ತದೆ) ಮತ್ತು ಜಾಗತಿಕವಾಗಿ ಅನೇಕ ಪ್ರದೇಶಗಳಲ್ಲಿ ಹರಡಿರುವ ಸುಮಾರು 50 ಓದು ಪ್ರತಿಗಳೊಂದಿಗೆ ಭಾರೀ ಜಾಗತಿಕ ಟ್ರಾಫಿಕ್ಗೆ ಬೆಂಬಲ ನೀಡಲು ನಮಗೆ ಸಾಧ್ಯವಾಗಿಸಿದೆ. OpenAI ನಲ್ಲಿ ನಾವು PostgreSQL ಅನ್ನು 800 ಮಿಲಿಯನ್ ಬಳಕೆದಾರರಿಗೆ ಪ್ರತಿ ಸೆಕೆಂಡಿಗೆ ಲಕ್ಷಾಂತರ ಕ್ವೆರಿಗಳನ್ನು ಬೆಂಬಲಿಸಲು ಹೇಗೆ ಸ್ಕೇಲ್ ಮಾಡಿದ್ದೇವೆ ಎಂಬ ಕಥೆಯಿದು, ಇದು ಕಠಿಣ ಆಪ್ಟಿಮೈಸೇಶನ್ಗಳು ಮತ್ತು ದೃಢ ಎಂಜಿನಿಯರಿಂಗ್ ಮೂಲಕ ಸಾಧ್ಯವಾಯಿತು; ಜೊತೆಗೆ, ಈ ಪ್ರಯಾಣದಲ್ಲಿ ನಾವು ಕಲಿತ ಪ್ರಮುಖ ಪಾಠಗಳನ್ನು ಸಹ ನಾವು ಹಂಚಿಕೊಳ್ಳುತ್ತೇವೆ.
ChatGPT ಬಿಡುಗಡೆ ಮಾಡಿದ ನಂತರ, ಟ್ರಾಫಿಕ್ ಅಪೂರ್ವ ವೇಗದಲ್ಲಿ ಹೆಚ್ಚಿತು. ಇದನ್ನು ಬೆಂಬಲಿಸಲು, ನಾವು ಅಪ್ಲಿಕೇಶನ್ ಮತ್ತು PostgreSQL ಡೇಟಾಬೇಸ್ ಲೇಯರ್ಗಳಲ್ಲಿ ವ್ಯಾಪಕ ಆಪ್ಟಿಮೈಸೇಶನ್ಗಳನ್ನು ತ್ವರಿತವಾಗಿ ಜಾರಿಗೆ ತಂದೆವು, ಇನ್ಸ್ಟನ್ಸ್ ಗಾತ್ರವನ್ನು ಹೆಚ್ಚಿಸುವ ಮೂಲಕ ಸ್ಕೇಲ್ ಅಪ್ ಮಾಡಿದೆವು, ಮತ್ತು ಹೆಚ್ಚಿನ ರೀಡ್ ರೆಪ್ಲಿಕಾಗಳನ್ನು ಸೇರಿಸುವ ಮೂಲಕ ಸ್ಕೇಲ್ ಔಟ್ ಮಾಡಿದೆವು. ಈ ವಿನ್ಯಾಸವು ಬಹಳ ಕಾಲದಿಂದ ನಮಗೆ ಉತ್ತಮವಾಗಿ ಸೇವೆ ಸಲ್ಲಿಸಿದೆ. ನಿರಂತರ ಸುಧಾರಣೆಗಳೊಂದಿಗೆ, ಇದು ಭವಿಷ್ಯದ ಬೆಳವಣಿಗೆಗೆ ಸಾಕಷ್ಟು ಅವಕಾಶವನ್ನು ಒದಗಿಸುತ್ತಲೇ ಇರುತ್ತದೆ.
ಒಂದು ಏಕ-ಪ್ರಾಥಮಿಕ ವಾಸ್ತುಶಿಲ್ಪವು OpenAI ಯ ಪ್ರಮಾಣದ ಬೇಡಿಕೆಗಳನ್ನು ಪೂರೈಸಬಹುದು ಎಂಬುದು ಆಶ್ಚರ್ಯಕರವಾಗಿ ತೋರುತ್ತದೆ; ಆದರೆ, ಇದನ್ನು ಪ್ರಾಯೋಗಿಕವಾಗಿ ಕಾರ್ಯಗತಗೊಳಿಸುವುದು ಸುಲಭವಲ್ಲ. ನಾವು Postgres ಓವರ್ಲೋಡ್ನಿಂದ ಉಂಟಾದ ಹಲವಾರು SEV ಗಳನ್ನು ಕಂಡಿದ್ದೇವೆ, ಮತ್ತು ಅವು ಸಾಮಾನ್ಯವಾಗಿ ಒಂದೇ ಮಾದರಿಯನ್ನು ಅನುಸರಿಸುತ್ತವೆ: ಅಪ್ಸ್ಟ್ರೀಮ್ ಸಮಸ್ಯೆಯು ಡೇಟಾಬೇಸ್ ಲೋಡ್ನಲ್ಲಿ ತಕ್ಷಣದ ಏರಿಕೆಗೆ ಕಾರಣವಾಗುತ್ತದೆ, ಉದಾಹರಣೆಗೆ ಕ್ಯಾಶಿಂಗ್-ಲೇಯರ್ ವೈಫಲ್ಯದಿಂದ ವ್ಯಾಪಕ ಕ್ಯಾಶ್ ಮಿಸ್ಗಳು, CPU ಅನ್ನು ಸ್ಯಾಚುರೇಟ್ ಮಾಡುವ ದುಬಾರಿ ಬಹು-ಮಾರ್ಗ ಜಾಯಿನ್ಗಳ ಏರಿಕೆ, ಅಥವಾ ಹೊಸ ವೈಶಿಷ್ಟ್ಯ ಲಾಂಚ್ನಿಂದ ಉಂಟಾಗುವ ರೈಟ್ ಸ್ಟಾರ್ಮ್. ಸಂಪನ್ಮೂಲ ಬಳಕೆ ಹೆಚ್ಚಿದಂತೆ, ಕ್ವೆರಿ ಲೇಟೆನ್ಸಿ ಹೆಚ್ಚುತ್ತದೆ ಮತ್ತು ವಿನಂತಿಗಳು ಟೈಮ್ ಔಟ್ ಆಗಲು ಪ್ರಾರಂಭಿಸುತ್ತವೆ. ಮರುಪ್ರಯತ್ನಗಳು ಲೋಡ್ ಅನ್ನು ಹೆಚ್ಚಿಸುತ್ತವೆ, ಇದರಿಂದ ಸಂಪೂರ್ಣ ChatGPT ಮತ್ತು API ಸೇವೆಗಳ ಕುಸಿತಕ್ಕೆ ಕಾರಣವಾಗುವ ವಿಷವರ್ತುಲ ಪ್ರಾರಂಭವಾಗುತ್ತದೆ.
PostgreSQL ನಮ್ಮ ರೀಡ್-ಹೆವಿ ಕಾರ್ಯಭಾರಗಳಿಗೆ ಉತ್ತಮವಾಗಿ ವಿಸ್ತರಿಸಿದರೂ, ಹೆಚ್ಚಿನ ಬರವಣಿಗೆ ದಟ್ಟಣೆಯ ಸಮಯದಲ್ಲಿ ನಾವು ಇನ್ನೂ ಸವಾಲುಗಳನ್ನು ಎದುರಿಸುತ್ತಿದ್ದೇವೆ. ಇದು ಬಹುಮಟ್ಟಿಗೆ PostgreSQL ನ ಮಲ್ಟಿವರ್ಷನ್ ಕಾಂಕರೆನ್ಸಿ ಕಂಟ್ರೋಲ್ (MVCC) ಅನುಷ್ಠಾನದ ಕಾರಣದಿಂದಾಗಿದ್ದು, ಇದು ರೀಡ್-ಹೆವಿ ಕಾರ್ಯಭಾರಗಳಿಗೆ ಕಡಿಮೆ ದಕ್ಷತೆಯನ್ನು ಹೊಂದಿದೆ. ಉದಾಹರಣೆಗೆ, ಒಂದು ಕ್ವೆರಿ ಒಂದು ಟ್ಯುಪಲ್ ಅಥವಾ ಒಂದೇ ಕ್ಷೇತ್ರವನ್ನು ನವೀಕರಿಸಿದಾಗ, ಹೊಸ ಆವೃತ್ತಿಯನ್ನು ರಚಿಸಲು ಸಂಪೂರ್ಣ ಸಾಲನ್ನು ನಕಲಿಸಲಾಗುತ್ತದೆ. ರೀಡ್-ಹೆವಿ ಲೋಡ್ಗಳ ಅಡಿಯಲ್ಲಿ, ಇದರಿಂದ ಗಮನಾರ್ಹ ಬರೆಯುವ ವೃದ್ಧಿ ಉಂಟಾಗುತ್ತದೆ. ಇದು ರೀಡ್ ವರ್ಧನೆಯನ್ನು ಕೂಡ ಹೆಚ್ಚಿಸುತ್ತದೆ, ಏಕೆಂದರೆ ಇತ್ತೀಚಿನದನ್ನು ಪಡೆಯಲು ಪ್ರಶ್ನೆಗಳು ಅನೇಕ ಟ್ಯುಪಲ್ ಆವೃತ್ತಿಗಳ (ಟೆಡ್ ಟ್ಯುಪಲ್ಗಳು) ಮೂಲಕ ಸ್ಕ್ಯಾನ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ. MVCC ಟೇಬಲ್ ಮತ್ತು ಸೂಚ್ಯಂಕ ಬ್ಲೋಟ್, ಹೆಚ್ಚಿದ ಸೂಚ್ಯಂಕ ನಿರ್ವಹಣಾ ಓವರ್ಹೆಡ್, ಮತ್ತು ಸಂಕೀರ್ಣ autovacuum ಟ್ಯೂನಿಂಗ್ ಮುಂತಾದ ಹೆಚ್ಚುವರಿ ಸವಾಲುಗಳನ್ನು ಪರಿಚಯಿಸುತ್ತದೆ. (ನೀವು ಈ ವಿಷಯಗಳ ಆಳವಾದ ವಿಶ್ಲೇಷಣೆಯನ್ನು ನಾನು ಕಾರ್ನೆಗಿ ಮೆಲ್ಲನ್ ವಿಶ್ವವಿದ್ಯಾಲಯದ ಪ್ರೊ. ಆಂಡಿ ಪಾವ್ಲೊ ಅವರೊಂದಿಗೆ ಬರೆದ The Part of PostgreSQL We Hate the Most(ಹೊಸ ಕಿಟಕಿಯಲ್ಲಿ ತೆರೆಯುತ್ತದೆ) ಎಂಬ ಬ್ಲಾಗ್ನಲ್ಲಿ ಕಂಡುಕೊಳ್ಳಬಹುದು, ಇದು PostgreSQL Wikipedia ಪುಟದಲ್ಲಿ ಉಲ್ಲೇಖಿತ(ಹೊಸ ಕಿಟಕಿಯಲ್ಲಿ ತೆರೆಯುತ್ತದೆ) ವಾಗಿದೆ.)
ಈ ಮಿತಿಗಳನ್ನು ತಗ್ಗಿಸಲು ಮತ್ತು ಬರವಣಿಗೆ ಒತ್ತಡವನ್ನು ಕಡಿಮೆ ಮಾಡಲು, ನಾವು ವಲಸೆ ಮಾಡಿದ್ದೇವೆ, ಮತ್ತು ವಲಸೆ ಮಾಡುತ್ತಲೇ ಇದ್ದೇವೆ, ಶಾರ್ಡ್ ಮಾಡಬಹುದಾದ (ಅಂದರೆ ಅಡ್ಡವಾಗಿ ವಿಭಜಿಸಬಹುದಾದ ವರ್ಕ್ಲೋಡ್ಗಳು), Azure Cosmos DB ನಂತಹ ಶಾರ್ಡ್ ಮಾಡಿದ ವ್ಯವಸ್ಥೆಗಳಿಗೆ ಬರವಣಿಗೆ-ಹೆಚ್ಚಿನ ವರ್ಕ್ಲೋಡ್ಗಳನ್ನು ನಿರ್ವಹಿಸುವುದು, ಅನಗತ್ಯ ಬರವಣಿಗೆಗಳನ್ನು ಕನಿಷ್ಠಗೊಳಿಸಲು ಅಪ್ಲಿಕೇಶನ್ ಲಾಜಿಕ್ ಅನ್ನು ಆಪ್ಟಿಮೈಸ್ ಮಾಡುವುದು. ನಾವು ಪ್ರಸ್ತುತ PostgreSQL ನಿಯೋಜನೆಗೆ ಹೊಸ ಟೇಬಲ್ಗಳನ್ನು ಸೇರಿಸಲು ಇನ್ನು ಮುಂದೆ ಅನುಮತಿಸುವುದಿಲ್ಲ. ಹೊಸ ಕಾರ್ಯಭಾರಗಳು ಪೂರ್ವನಿಯೋಜಿತವಾಗಿ ಶಾರ್ಡೆಡ್ ವ್ಯವಸ್ಥೆಗಳಿಗೆ ಇರುತ್ತವೆ.
ನಮ್ಮ ಮೂಲಸೌಕರ್ಯ ವಿಕಸನಗೊಂಡಿದ್ದರೂ, PostgreSQL ಶಾರ್ಡಿಂಗ್ ಮಾಡದೆ ಉಳಿದಿದೆ, ಮತ್ತು ಒಂದೇ ಪ್ರಾಥಮಿಕ ಇನ್ಸ್ಟನ್ಸ್ ಎಲ್ಲಾ ಬರವಣಿಗೆಗಳನ್ನು ನಿರ್ವಹಿಸುತ್ತಿದೆ. ಪ್ರಾಥಮಿಕ ಕಾರಣವೆಂದರೆ, ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಅಪ್ಲಿಕೇಶನ್ ವರ್ಕ್ಲೋಡ್ಗಳನ್ನು ಶಾರ್ಡಿಂಗ್ ಮಾಡುವುದು ಅತ್ಯಂತ ಸಂಕೀರ್ಣ ಮತ್ತು ಸಮಯವಿಲ್ಲದ ಕೆಲಸವಾಗಿದ್ದು, ನೂರಾರು ಅಪ್ಲಿಕೇಶನ್ ಎಂಡ್ಪಾಯಿಂಟ್ಗಳಲ್ಲಿ ಬದಲಾವಣೆಗಳನ್ನು ಮಾಡಬೇಕಾಗುತ್ತದೆ ಮತ್ತು ಇದಕ್ಕೆ ತಿಂಗಳುಗಳು ಅಥವಾ ವರ್ಷಗಳ ಕಾಲ ಬೇಕಾಗಬಹುದು. ನಮ್ಮ ವರ್ಕ್ಲೋಡ್ಗಳು ಮುಖ್ಯವಾಗಿ ಓದು-ಆಧಾರಿತವಾಗಿರುವುದರಿಂದ, ಮತ್ತು ನಾವು ವ್ಯಾಪಕ ಆಪ್ಟಿಮೈಸೇಶನ್ಗಳನ್ನು ಜಾರಿಗೆ ತಂದಿರುವುದರಿಂದ, ಪ್ರಸ್ತುತ ವಾಸ್ತುಶಿಲ್ಪವು ಮುಂದುವರಿದ ಟ್ರಾಫಿಕ್ ವೃದ್ಧಿಯನ್ನು ಬೆಂಬಲಿಸಲು ಇನ್ನೂ ಸಾಕಷ್ಟು ಅವಕಾಶವನ್ನು ಒದಗಿಸುತ್ತದೆ. ನಾವು ಭವಿಷ್ಯದಲ್ಲಿ PostgreSQL ಅನ್ನು ಶಾರ್ಡಿಂಗ್ ಮಾಡುವುದನ್ನು ಸಂಪೂರ್ಣವಾಗಿ ತಳ್ಳಿಹಾಕುತ್ತಿಲ್ಲ, ಆದರೆ ಪ್ರಸ್ತುತ ಮತ್ತು ಭವಿಷ್ಯದ ಬೆಳವಣಿಗೆಗೆ ಸಾಕಷ್ಟು ಸಮಯವಿರುವುದರಿಂದ ಇದು ತಕ್ಷಣದ ಆದ್ಯತೆಯಲ್ಲ.
ಮುಂದಿನ ವಿಭಾಗಗಳಲ್ಲಿ, ನಾವು ಎದುರಿಸಿದ ಸವಾಲುಗಳು ಮತ್ತು ಅವುಗಳನ್ನು ಪರಿಹರಿಸಲು ಹಾಗೂ ಭವಿಷ್ಯದ ಔಟೇಜ್ಗಳನ್ನು ತಡೆಯಲು ನಾವು ಜಾರಿಗೆ ತಂದ ವ್ಯಾಪಕ ಆಪ್ಟಿಮೈಸೇಶನ್ಗಳನ್ನು ಆಳವಾಗಿ ಪರಿಶೀಲಿಸುತ್ತೇವೆ, PostgreSQL ಅನ್ನು ಅದರ ಮಿತಿಗಳವರೆಗೆ ತಳ್ಳುತ್ತಾ ಮತ್ತು ಅದನ್ನು ಪ್ರತಿ ಸೆಕೆಂಡಿಗೆ ಲಕ್ಷಾಂತರ ಕ್ವೆರಿಗಳು (QPS) ಮಟ್ಟಕ್ಕೆ ಸ್ಕೇಲ್ ಮಾಡುತ್ತೇವೆ.
ಸವಾಲು: ಕೇವಲ ಒಂದು ರೈಟರ್ ಇದ್ದರೆ, ಸಿಂಗಲ್-ಪ್ರೈಮರಿ ಸೆಟಪ್ ಬರವಣಿಗೆಗಳನ್ನು ಪ್ರಮಾಣದಲ್ಲಿ ವಿಸ್ತರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಭಾರೀ ಬರವಣಿಗೆ ಸ್ಪೈಕ್ಗಳು ಪ್ರಾಥಮಿಕ ವ್ಯವಸ್ಥೆಯನ್ನು ತ್ವರಿತವಾಗಿ ಓವರ್ಲೋಡ್ ಮಾಡಬಹುದು ಮತ್ತು ChatGPT ಮತ್ತು ನಮ್ಮ API ನಂತಹ ಸೇವೆಗಳ ಮೇಲೆ ಪರಿಣಾಮ ಬೀರುತ್ತವೆ.
ಪರಿಹಾರ: ಬರವಣಿಗೆಯ ಏರಿಕೆಗಳನ್ನು ನಿಭಾಯಿಸಲು ಇದಕ್ಕೆ ಸಾಕಷ್ಟು ಸಾಮರ್ಥ್ಯವಿರುವುದನ್ನು ಖಚಿತಪಡಿಸಲು, ನಾವು ಪ್ರಾಥಮಿಕದ ಮೇಲಿನ ಲೋಡ್ ಅನ್ನು ಸಾಧ್ಯವಾದಷ್ಟು ಕಡಿಮೆ ಮಾಡುತ್ತೇವೆ—ಓದುವಿಕೆ ಮತ್ತು ಬರವಣಿಗೆ ಎರಡನ್ನೂ. ಸಾಧ್ಯವಾದಲ್ಲಿ ರೀಡ್ ಟ್ರಾಫಿಕ್ ಅನ್ನು ಪ್ರತಿಗಳಿಗೆ ಹಸ್ತಾಂತರಿಸಲಾಗುತ್ತದೆ. ಆದರೆ, ಕೆಲವು ಓದು ಪ್ರಶ್ನೆಗಳು ಬರವಣಿಗೆ ವ್ಯವಹಾರಗಳ ಭಾಗವಾಗಿರುವುದರಿಂದ ಅವು ಪ್ರಾಥಮಿಕದಲ್ಲಿಯೇ ಉಳಿಯಬೇಕು. ಅವುಗಳಿಗಾಗಿ, ನಾವು ಅವು ಪರಿಣಾಮಕಾರಿಯಾಗಿರುವುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು ಮತ್ತು ನಿಧಾನಗತಿಯ ಕ್ವೆರಿಗಳನ್ನು ತಪ್ಪಿಸಲು ಗಮನಹರಿಸುತ್ತೇವೆ. ಬರೆಯುವ ಟ್ರಾಫಿಕ್ಗಾಗಿ, ಶಾರ್ಡ್ ಮಾಡಬಹುದಾದ, ಬರೆಯುವ-ಭಾರೀ ಕೆಲಸದ ಹೊರೆಗಳನ್ನು Azure CosmosDB ಮುಂತಾದ ಶಾರ್ಡ್ ಸಿಸ್ಟಮ್ಗಳಿಗೆ ನಾವು ವಲಸೆ ಮಾಡಿದ್ದೇವೆ. ಶಾರ್ಡ್ ಮಾಡಲು ಕಷ್ಟವಾಗುವ, ಆದರೆ ಇನ್ನೂ ಹೆಚ್ಚಿನ ಬರವಣಿಗೆ ಪ್ರಮಾಣವನ್ನು ಉತ್ಪಾದಿಸುವ ವರ್ಕ್ಲೋಡ್ಗಳನ್ನು ಮೈಗ್ರೇಟ್ ಮಾಡಲು ಹೆಚ್ಚು ಸಮಯ ಬೇಕಾಗುತ್ತದೆ, ಮತ್ತು ಆ ಪ್ರಕ್ರಿಯೆ ಇನ್ನೂ ನಡೆಯುತ್ತಿದೆ. ನಾವು ಬರಹ ಲೋಡ್ ಅನ್ನು ಕಡಿಮೆ ಮಾಡಲು ನಮ್ಮ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಆಕ್ರಮಕವಾಗಿ ಆಪ್ಟಿಮೈಸ್ ಮಾಡಿದ್ದೇವೆ; ಉದಾಹರಣೆಗೆ, ಅನಾವಶ್ಯಕ ಪುನರಾವರ್ತಿತ ಬರಹಗಳಿಗೆ ಕಾರಣವಾಗುತ್ತಿದ್ದ ಅಪ್ಲಿಕೇಶನ್ ದೋಷಗಳನ್ನು ನಾವು ಸರಿಪಡಿಸಿದ್ದೇವೆ ಮತ್ತು ಟ್ರಾಫಿಕ್ ಸ್ಪೈಕ್ಗಳನ್ನು ಸಮತೋಲನಗೊಳಿಸಲು, ಸೂಕ್ತವಾದಲ್ಲಿ, ಲೇಜಿ ಬರಹಗಳನ್ನು ಪರಿಚಯಿಸಿದ್ದೇವೆ. ಇದಲ್ಲದೆ, ಟೇಬಲ್ ಕ್ಷೇತ್ರಗಳನ್ನು ಬ್ಯಾಕ್ಫಿಲ್ ಮಾಡುವಾಗ, ಅತಿಯಾದ ಬರವಣಿಗೆ ಒತ್ತಡವನ್ನು ತಡೆಯಲು ನಾವು ಕಟ್ಟುನಿಟ್ಟಾದ ದರ ಮಿತಿಗಳನ್ನು ಜಾರಿಗೊಳಿಸುತ್ತೇವೆ.
ಸವಾಲು: ನಾವು PostgreSQL ನಲ್ಲಿ ಹಲವಾರು ದುಬಾರಿ ಕ್ವೆರಿಗಳನ್ನು ಗುರುತಿಸಿದ್ದೇವೆ. ಹಿಂದೆ, ಈ ಕ್ವೆರಿಗಳಲ್ಲಿ ಹಠಾತ್ ಪ್ರಮಾಣದ ಏರಿಕೆಗಳು ದೊಡ್ಡ ಪ್ರಮಾಣದ CPU ಅನ್ನು ಬಳಸಿ, ChatGPT ಮತ್ತು API ವಿನಂತಿಗಳನ್ನು ನಿಧಾನಗೊಳಿಸುತ್ತಿದ್ದವು.
ಪರಿಹಾರ: ಅನೇಕ ಟೇಬಲ್ಗಳನ್ನು ಒಟ್ಟಿಗೆ ಜೋಡಿಸುವಂತಹ ಕೆಲವು ದುಬಾರಿ ಕ್ವೆರಿಗಳು, ಸಂಪೂರ್ಣ ಸೇವೆಯ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ಗಮನಾರ್ಹವಾಗಿ ಹದಗೆಡಿಸಬಹುದು ಅಥವಾ ಸಂಪೂರ್ಣ ಸೇವೆಯನ್ನು ಸ್ಥಗಿತಗೊಳಿಸಬಹುದು. PostgreSQL ಪ್ರಶ್ನೆಗಳು ದಕ್ಷವಾಗಿರುವುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು ಮತ್ತು ಸಾಮಾನ್ಯ ಆನ್ಲೈನ್ ವಹಿವಾಟು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸುವಿಕೆ (OLTP) ತಡೆ ಪ್ಯಾಟರ್ನ್ಗಳನ್ನು ತಪ್ಪಿಸಲು ನಾವು ಅವುಗಳನ್ನು ನಿರಂತರವಾಗಿ ಆಪ್ಟಿಮೈಸ್ ಮಾಡಬೇಕಾಗಿದೆ. ಉದಾಹರಣೆಗೆ, ನಾವು ಒಮ್ಮೆ 12 ಟೇಬಲ್ಗಳನ್ನು ಜೋಡಿಸುವ ಅತ್ಯಂತ ದುಬಾರಿ ಕ್ವೆರಿಯನ್ನು ಗುರುತಿಸಿದ್ದೇವೆ, ಅಲ್ಲಿ ಈ ಕ್ವೆರಿಯಲ್ಲಿನ ಸ್ಪೈಕ್ಗಳು ಹಿಂದಿನ ಅಧಿಕ-ತೀವ್ರತೆಯ SEVsಗಳಿಗೆ ಕಾರಣವಾಗಿದ್ದವು. ನಾವು ಸಾಧ್ಯವಾದಷ್ಟು ಸಂಕೀರ್ಣ ಬಹು-ಕೋಷ್ಟಕ ಜೋಡಣೆಯನ್ನು ತಪ್ಪಿಸಬೇಕು. ಜಾಯಿನ್ಗಳು ಅಗತ್ಯವಿದ್ದರೆ, ನಾವು ಕ್ವೆರಿಯನ್ನು ವಿಭಜಿಸಲು ಮತ್ತು ಸಂಕೀರ್ಣ ಜಾಯಿನ್ ಲಾಜಿಕ್ ಅನ್ನು ಅಪ್ಲಿಕೇಶನ್ ಲೇಯರ್ಗೆ ಸ್ಥಳಾಂತರಿಸಲು ಪರಿಗಣಿಸುತ್ತೇವೆ. ಈ ಸಮಸ್ಯಾತ್ಮಕ ಪ್ರಶ್ನೆಗಳಲ್ಲಿ ಅನೇಕವು ಒಬ್ಜೆಕ್ಟ್-ರಿಲೇಷನಲ್ ಮ್ಯಾಪಿಂಗ್ ಫ್ರೇಮ್ವರ್ಕ್ಗಳು (ORMs) ಮೂಲಕ ರಚಿಸಲ್ಪಡುತ್ತವೆ, ಆದ್ದರಿಂದ ಅವು ಉತ್ಪಾದಿಸುವ SQL ಅನ್ನು ಎಚ್ಚರಿಕೆಯಿಂದ ಪರಿಶೀಲಿಸಿ ಮತ್ತು ಅದು ನಿರೀಕ್ಷಿತ ರೀತಿಯಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತಿದೆಯೇ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳುವುದು ಮುಖ್ಯ. PostgreSQL ನಲ್ಲಿ ದೀರ್ಘಕಾಲೀನ ನಿಷ್ಕ್ರಿಯ ಕ್ವೆರಿಗಳನ್ನು ಕಂಡುಹಿಡಿಯುವುದು ಸಹ ಸಾಮಾನ್ಯವಾಗಿದೆ. idle_in_transaction_session_timeout ನಂತಹ ಸಮಯ ಮಿತಿಗಳನ್ನು ಸಂರಚಿಸುವುದು ಅವು autovacuum ಅನ್ನು ತಡೆಯುವುದನ್ನು ತಪ್ಪಿಸಲು ಅತ್ಯಗತ್ಯವಾಗಿದೆ.
ಸವಾಲು: ರೀಡ್ ರೆಪ್ಲಿಕಾ ಡೌನ್ ಆದಾಗಲೂ ಸಹ ಟ್ರಾಫಿಕ್ ಅನ್ನು ಬೇರೆ ರೆಪ್ಲಿಕಾಗಳಿಗೆ ರೌಟ್ ಮಾಡಬಹುದು. ಆದಾಗ್ಯೂ, ಒಂದೇ ರೈಟರ್ ಮೇಲೆ ಅವಲಂಬಿಸುವುದು ಅಂದರೆ ಏಕ ಬಿಂದುವಿನೇ ವೈಫಲ್ಯ ಹೊಂದಿರುವುದು ಆಗಿರುತ್ತದೆ—ಅದು ವಿಫಲವಾದರೆ, ಸಂಪೂರ್ಣ ಸೇವೆ ಪ್ರಭಾವಿತವಾಗುತ್ತದೆ.
ಪರಿಹಾರ: ಅತ್ಯಂತ ಪ್ರಮುಖ ವಿನಂತಿಗಳು ರೀಡ್ ಕ್ವೆರಿಗಳನ್ನಷ್ಟೇ ಒಳಗೊಂಡಿರುತ್ತವೆ. ಪ್ರಾಥಮಿಕದಲ್ಲಿ ವೈಫಲ್ಯದ ಏಕ ಬಿಂದುವನ್ನು ನಿವಾರಿಸಲು, ನಾವು ಆ ರೀಡ್ಗಳನ್ನು ರೈಟರ್ನಿಂದ ಪ್ರತಿಗಳಿಗೆ ಆಫ್ಲೋಡ್ ಮಾಡಿದ್ದೇವೆ, ಪ್ರಾಥಮಿಕ ಡೌನ್ ಆದರೂ ಆ ವಿನಂತಿಗಳು ಸೇವೆಯನ್ನು ಮುಂದುವರಿಸಬಹುದು ಎಂದು ಖಚಿತಪಡಿಸಿದ್ದೇವೆ. ಬರೆಯುವ ಕಾರ್ಯಾಚರಣೆಗಳು ಇನ್ನೂ ವಿಫಲವಾಗುತ್ತವೆ, ಆದರೆ ಪರಿಣಾಮ ಕಡಿಮೆಯಾಗಿದೆ; ಓದುಗಳು ಲಭ್ಯವಿರುವುದರಿಂದ ಇದು ಇನ್ನು ಮುಂದೆ SEV0 ಆಗಿರುವುದಿಲ್ಲ.
ಪ್ರಾಥಮಿಕ ವೈಫಲ್ಯಗಳನ್ನು ತಗ್ಗಿಸಲು, ನಾವು ಪ್ರಾಥಮಿಕವನ್ನು ಅಧಿಕ-ಲಭ್ಯತೆ (HA) ಮೋಡ್ನಲ್ಲಿ ಹಾಟ್ ಸ್ಟ್ಯಾಂಡ್ಬೈ ಜೊತೆಗೆ ನಡೆಸುತ್ತೇವೆ, ಇದು ನಿರಂತರವಾಗಿ ಸಮನ್ವಯಗೊಳಿಸಲ್ಪಟ್ಟ ಪ್ರತಿರೂಪವಾಗಿದ್ದು, ಯಾವಾಗಲೂ ಟ್ರಾಫಿಕ್ ಸೇವೆಯನ್ನು ತೆಗೆದುಕೊಳ್ಳಲು ಸಿದ್ಧವಾಗಿರುತ್ತದೆ. ಪ್ರಾಥಮಿಕ ಸರ್ವರ್ ಡೌನ್ ಆದಾಗ ಅಥವಾ ನಿರ್ವಹಣೆಗೆ ಆಫ್ಲೈನ್ಗೆ ತೆಗೆದುಕೊಳ್ಳಬೇಕಾದಾಗ, ಡೌನ್ಟೈಮ್ ಅನ್ನು ಕಡಿಮೆ ಮಾಡಲು ನಾವು ತಕ್ಷಣವೇ ಸ್ಟ್ಯಾಂಡ್ಬೈ ಸರ್ವರ್ ಅನ್ನು ಪ್ರೋಮೋಟ್ ಮಾಡಬಹುದು. Azure PostgreSQL ತಂಡವು ಅತ್ಯಂತ ಹೆಚ್ಚಿನ ಲೋಡ್ನಲ್ಲಿಯೂ ಈ ಫೇಲ್ಓವರ್ಗಳು ಸುರಕ್ಷಿತವಾಗಿಯೂ ವಿಶ್ವಾಸಾರ್ಹವಾಗಿಯೂ ಉಳಿಯುವಂತೆ ಖಚಿತಪಡಿಸಲು ಮಹತ್ವದ ಕೆಲಸವನ್ನು ಮಾಡಿದೆ. ರೀಡ್ ರೆಪ್ಲಿಕಾ ವೈಫಲ್ಯಗಳನ್ನು ನಿರ್ವಹಿಸಲು, ನಾವು ಪ್ರತಿ ಪ್ರದೇಶದಲ್ಲಿ ಸಾಕಷ್ಟು ಸಾಮರ್ಥ್ಯ ಹೆಡ್ರೂಮ್ನೊಂದಿಗೆ ಅನೇಕ ರೆಪ್ಲಿಕಾಗಳನ್ನು ನಿಯೋಜಿಸುತ್ತೇವೆ, ಇದರಿಂದ ಒಂದು ರೆಪ್ಲಿಕಾ ವೈಫಲ್ಯವು ಪ್ರಾದೇಶಿಕ ನಿಲುಗಡೆಗೆ ಕಾರಣವಾಗುವುದಿಲ್ಲ.
ಸವಾಲು: ನಾವು PostgreSQL ಇನ್ಸ್ಟನ್ಸ್ಗಳಲ್ಲಿ ಕೆಲವು ವಿನಂತಿಗಳು ಅಸಮ ಪ್ರಮಾಣದಲ್ಲಿ ಸಂಪನ್ಮೂಲಗಳನ್ನು ಬಳಕೆ ಮಾಡುವ ಸಂದರ್ಭಗಳನ್ನು ಆಗಾಗ್ಗೆ ಎದುರಿಸುತ್ತೇವೆ. ಇದು ಅದೇ ಇನ್ಸ್ಟನ್ಸ್ಗಳಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತಿರುವ ಇತರ ಕಾರ್ಯಭಾರಗಳ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ಕುಗ್ಗಿಸಬಹುದು. ಉದಾಹರಣೆಗೆ, ಹೊಸ ವೈಶಿಷ್ಟ್ಯದ ಲಾಂಚ್ PostgreSQL CPU ಅನ್ನು ಭಾರಿಯಾಗಿ ಬಳಸಿ, ಇತರ ಪ್ರಮುಖ ವೈಶಿಷ್ಟ್ಯಗಳ ವಿನಂತಿಗಳನ್ನು ನಿಧಾನಗೊಳಿಸುವ ಅಕಾರ್ಯಕ್ಷಮ ಕ್ವೆರಿಗಳನ್ನು ಪರಿಚಯಿಸಬಹುದು.
Solution: To mitigate the “noisy neighbor” problem, we isolate workloads onto dedicated instances to ensure that sudden spikes in resource-intensive requests don’t impact other traffic. Specifically, we split requests into low-priority and high-priority tiers and route them to separate instances. This way, even if a low-priority workload becomes resource-intensive, it won’t degrade the performance of high-priority requests. We apply the same strategy across different products and services as well, so that activity from one product does not affect the performance or reliability of another.
Challenge: Each instance has a maximum connection limit (5,000 in Azure PostgreSQL). It’s easy to run out of connections or accumulate too many idle ones. We’ve previously had incidents caused by connection storms that exhausted all available connections.
Solution: We deployed PgBouncer as a proxy layer to pool database connections. Running it in statement or transaction pooling mode allows us to efficiently reuse connections, greatly reducing the number of active client connections. This also cuts connection setup latency: in our benchmarks, the average connection time dropped from 50 milliseconds (ms) to 5 ms. Inter-region connections and requests can be expensive, so we co-locate the proxy, clients, and replicas in the same region to minimize network overhead and connection use time. Moreover, PgBouncer must be configured carefully. Settings like idle timeouts are critical to prevent connection exhaustion.
ಪ್ರತಿ ರೀಡ್ ರೆಪ್ಲಿಕಾ ತನ್ನದೇ ಆದ Kubernetes ನಿಯೋಜನೆಯನ್ನು ಹೊಂದಿದ್ದು, ಅದರಲ್ಲಿ ಅನೇಕ PgBouncer ಪಾಡ್ಗಳು ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತವೆ. ನಾವು ಒಂದೇ Kubernetes Service ಹಿಂದೆ ಅನೇಕ Kubernetes ನಿಯೋಜನೆಗಳನ್ನು ನಡೆಸುತ್ತೇವೆ, ಇದು ಪಾಡ್ಗಳಾದ್ಯಂತ ಟ್ರಾಫಿಕ್ ಅನ್ನು ಲೋಡ್-ಬ್ಯಾಲೆನ್ಸ್ ಮಾಡುತ್ತದೆ.
Challenge: A sudden spike in cache misses can trigger a surge of reads on the PostgreSQL database, saturating CPU and slowing user requests.
Solution: To reduce read pressure on PostgreSQL, we use a caching layer to serve most of the read traffic. However, when cache hit rates drop unexpectedly, the burst of cache misses can push a large volume of requests directly to PostgreSQL. This sudden increase in database reads consumes significant resources, slowing down the service. To prevent overload during cache-miss storms, we implement a cache locking (and leasing) mechanism so that only a single reader that misses on a particular key fetches the data from PostgreSQL. When multiple requests miss on the same cache key, only one request acquires the lock and proceeds to retrieve the data and repopulate the cache. All other requests wait for the cache to be updated rather than all hitting PostgreSQL at once. This significantly reduces redundant database reads and protects the system from cascading load spikes.
Challenge: The primary streams Write Ahead Log (WAL) data to every read replica. As the number of replicas increases, the primary must ship WAL to more instances, increasing pressure on both network bandwidth and CPU. This causes higher and more unstable replica lag, which makes the system harder to scale reliably.
Solution: We operate nearly 50 read replicas across multiple geographic regions to minimize latency. However, with the current architecture, the primary must stream WAL to every replica. Although it currently scales well with very large instance types and high-network bandwidth, we can’t keep adding replicas indefinitely without eventually overloading the primary. To address this, we’re collaborating with the Azure PostgreSQL team on cascading replication(ಹೊಸ ಕಿಟಕಿಯಲ್ಲಿ ತೆರೆಯುತ್ತದೆ), where intermediate replicas relay WAL to downstream replicas. This approach allows us to scale to potentially over a hundred replicas without overwhelming the primary. However, it also introduces additional operational complexity, particularly around failover management. The feature is still in testing; we’ll ensure it’s robust and can fail over safely before rolling it out to production.
Challenge: A sudden traffic spike on specific endpoints, a surge of expensive queries, or a retry storm can quickly exhaust critical resources such as CPU, I/O, and connections, which causes widespread service degradation.
Solution: We implemented rate-limiting across multiple layers—application, connection pooler, proxy, and query—to prevent sudden traffic spikes from overwhelming database instances and triggering cascading failures. It’s also crucial to avoid overly short retry intervals, which can trigger retry storms. We also enhanced the ORM layer to support rate limiting and when necessary, fully block specific query digests. This targeted form of load shedding enables rapid recovery from sudden surges of expensive queries.
Challenge: Even a small schema change, such as altering a column type, can trigger a full table rewrite(ಹೊಸ ಕಿಟಕಿಯಲ್ಲಿ ತೆರೆಯುತ್ತದೆ). We therefore apply schema changes cautiously—limiting them to lightweight operations and avoiding any that rewrite entire tables.
Solution: Only lightweight schema changes are permitted, such as adding or removing certain columns that do not trigger a full table rewrite. We enforce a strict 5-second timeout on schema changes. Creating and dropping indexes concurrently is allowed. Schema changes are restricted to existing tables. If a new feature requires additional tables, they must be in alternative sharded systems such as Azure CosmosDB rather than PostgreSQL. When backfilling a table field, we apply strict rate limits to prevent write spikes. Although this process can sometimes take over a week, it ensures stability and avoids any production impact.
This effort demonstrates that with the right design and optimizations, Azure PostgreSQL can be scaled to handle the largest production workloads. PostgreSQL handles millions of QPS for read-heavy workloads, powering OpenAI’s most critical products like ChatGPT and the API platform. We added nearly 50 read replicas, while keeping replication lag near zero, maintained low-latency reads across geo-distributed regions, and built sufficient capacity headroom to support future growth.
This scaling works while still minimizing latency and improving reliability. We consistently deliver low double-digit millisecond p99 client-side latency and five-nines availability in production. And over the past 12 months, we’ve had only one SEV-0 PostgreSQL incident (it occurred during the viral launch(ಹೊಸ ಕಿಟಕಿಯಲ್ಲಿ ತೆರೆಯುತ್ತದೆ) of ChatGPT ImageGen, when write traffic suddenly surged by more than 10x as over 100 million new users signed up within a week.)
While we’re happy with how far PostgreSQL has taken us, we continue to push its limits to ensure we have sufficient runway for future growth. We’ve already migrated the shardable write-heavy workloads to our sharded systems like CosmosDB. The remaining write-heavy workloads are more challenging to shard—we’re actively migrating those as well to further offload writes from the PostgreSQL primary. We’re also working with Azure to enable cascading replication so we can safely scale to significantly more read replicas.
Looking ahead, we’ll continue to explore additional approaches to further scale, including sharded PostgreSQL or alternative distributed systems, as our infrastructure demands continue to grow.
ಲೇಖಕ
ಕೃತಜ್ಞತೆಗಳು
ಈ ಪೋಸ್ಟ್ಗೆ ಕೊಡುಗೆ ನೀಡಿದ ಜಾನ್ ಲೀ, ಚಾವೊಮಿನ್ ಯು ಮತ್ತು ಚೆಂಗ್ಲಾಂಗ್ ಹಾವೊ ಅವರಿಗೆ, ಮತ್ತು PostgreSQL ಅನ್ನು ಸ್ಕೇಲ್ ಮಾಡಲು ಸಹಾಯ ಮಾಡಿದ ಸಂಪೂರ್ಣ ತಂಡಕ್ಕೆ ವಿಶೇಷ ಧನ್ಯವಾದಗಳು. ನಾವು Azure PostgreSQL ತಂಡದ ಬಲವಾದ ಪಾಲುದಾರಿಕೆಗೆ ಧನ್ಯವಾದಗಳನ್ನು ಸಲ್ಲಿಸಲು ಬಯಸುತ್ತೇವೆ.


