
Shopify-მ ჯავშნები Redis-იდან MySQL-ზე გადაიტანა და მასშტაბირდა
Shopify-მ ზედმეტი გაყიდვებისგან დაცვის სისტემა Redis-იდან MySQL-ზე გადაიტანა და MySQL 8-ის SKIP LOCKED-ზე ააგო. მთავარი გაკვეთილი ისაა, რომ შემაფერხებელი კავშირებში იყო და არა CPU-ში.
Shopify-მ ზედმეტი გაყიდვებისგან დამცავი სისტემა Redis-იდან MySQL-ზე გადაიტანა და MySQL 8-ის SKIP LOCKED ფუნქციაზე ააგო; კომპანიის თქმით, ახალმა დიზაინმა 2025 წლის პიკური დატვირთვის დროს მაღალი გამტარობის მიზნებს მიაღწია.
რატომ ვეღარ უძლებდა ძველი დიზაინი
ზედმეტი გაყიდვებისგან დაცვა ორ ოპერაციას მოიცავს: დაჯავშნას — მოკლე დაბლოკვას, რომელიც გადახდის დაწყებისას სრულდება — და დადასტურებას, რომელიც გადახდის წარმატების შემდეგ ერთეულს სამუდამოდ აკლებს მარაგის რეესტრს. ადრე ჯავშნები Redis-ში ინახებოდა: დაჯავშნა გასაღების შემცირებას ნიშნავდა, გათავისუფლება — გაზრდას. Redis კონკურენტულობას კარგად უმკლავდებოდა, მაგრამ ჯავშნები და რეესტრი სხვადასხვა სისტემაში ცხოვრობდა, ამიტომ დადასტურებისას საჭირო იყო MySQL-ის განახლებაც და Redis-ის გაწმენდაც — ერთ ატომურ ნაბიჯში ამ ორს ვერ აერთიანებდნენ. შედეგად, თანმიმდევრობიდან გამომდინარე, შესაძლებელი იყო როგორც ზედმეტი, ისე ნაკლები გაყიდვა, და მოდელს მრავალლოკაციური მარაგის გათვალისწინება არ შეეძლო.
ერთი მწკრივი ერთეულზე, შეზღუდული აუზით
ახალი დიზაინი ერთ მწკრივს ინახავს თითო გაყიდვად ერთეულზე და არა თითო პროდუქტზე რაოდენობის სვეტით — ანუ 10 ერთეულიან პროდუქტს 10 მწკრივი აქვს — რაც ჯავშნებს საშუალებას აძლევს რეესტრთან ერთად ერთ ACID ტრანზაქციაში მოექცეს. გუნდი თავისუფალი მწკრივების შეზღუდულ აუზს ინახავს — მაქსიმუმ 1000 მწკრივი პროდუქტ-ლოკაციის წყვილზე — და მას რეესტრიდან შევსების პროცესი ავსებს. თუ ფლეშ-გაყიდვა აუზს დაცლის, შევსება ჩაკეტვის მიღმა ერთდროულად მიმდინარეობს, რომ პარალელური ჯავშნები ლოდინში დარჩეს და არა ერთდროულად ჩასვას ცდილობდეს მწკრივები.
ჩაკეტვების რეგულირება და ნამდვილი ბოსტნელი
რამდენიმე დეტალი მნიშვნელოვანი აღმოჩნდა. ფილტრაციისთვის გამოყენებულ სვეტებზე შედგენილმა კომპოზიტურმა პირველადმა გასაღებმა მწკრივის ჩაკეტვა ერთ ჩაკეტვამდე შეამცირა ორის ნაცვლად. ტრანზაქციების READ COMMITTED დონეზე გადასვლამ თავიდან აიცილა gap-ჩაკეტვები, რომლებიც შევსებას აფერხებდა. ჩაკეტვის ერთიანი თანმიმდევრობის დაცვამ deadlock-ები მოხსნა, UNION ALL-ით პაკეტირებამ კი მრავალპოზიციური კალათებისთვის მიმოქცევების რაოდენობა შეამცირა.
მოსალოდნელი ბოსტნელი არ გამოჩნდა. CPU შორს იყო გაჯერებისგან და მოთხოვნები უკვე ოპტიმიზებული, მაგრამ გუნდი მაინც ჭერს მიაღწია: კავშირებს checkout-ის გზის სხვა ნაწილები ხარჯავდა. თითოეული SQL განაცხადის მონიშვნამ შესაბამისი ბიზნეს-პროცესით და ProxySQL-ის დონეზე კავშირის დაკავების დროის აგრეგაციამ ცხადყო, რომელი კომპონენტი მოიხმარდა ყველაზე მეტ დროს. checkout-ის გზის გაწმენდამ ბაზის ძირითად კვანძზე წაკითხვების 50% და ტრანზაქციების 33% მოხსნა, ხოლო InnoDB-ის ძველი პარამეტრის გადახედვამ კიდევ ერთი ზღვარი მოხსნა.
გადართვა და შედეგები
Redis და MySQL პარალელურად, „ჩრდილოვან რეჟიმში“ მუშაობდნენ, სადაც ჭეშმარიტების წყარო ჯერ კიდევ Redis იყო; შემდეგ Shopify-მ ჭეშმარიტების წყარო MySQL-ზე გადაიტანა, გადაუდებელი გამორთვის საშუალება შეინარჩუნა და გაშვება pod-ობით, ეტაპობრივად განახორციელა. 2025 წლის Black Friday-ზე პლატფორმის ვაჭრებმა პიკზე წუთში 5,1 მილიონი დოლარის გაყიდვების რეკორდი დაამყარეს.
SiTech — AI-გაძლიერებული ვებ დეველოპმენტი
ვქმნით სწრაფ, თანამედროვე ვებსაიტებს და AI-ს ვაერთიანებთ ქართული ბიზნესებისთვის. გაქვთ პროექტი ან კითხვა? სიამოვნებით დაგეხმარებით.