{"id":1698,"date":"2025-11-11T18:17:13","date_gmt":"2025-11-11T15:17:13","guid":{"rendered":"https:\/\/www.dchost.com\/blog\/proxysql-ile-mysql-read-write-split-ve-baglanti-havuzu-woocommerce-laravel-icin-gercek-dunya-rehberi\/"},"modified":"2025-11-11T18:17:13","modified_gmt":"2025-11-11T15:17:13","slug":"proxysql-ile-mysql-read-write-split-ve-baglanti-havuzu-woocommerce-laravel-icin-gercek-dunya-rehberi","status":"publish","type":"post","link":"https:\/\/www.dchost.com\/blog\/proxysql-ile-mysql-read-write-split-ve-baglanti-havuzu-woocommerce-laravel-icin-gercek-dunya-rehberi\/","title":{"rendered":"ProxySQL ile MySQL Read\/Write Split ve Ba\u011flant\u0131 Havuzu: WooCommerce\/Laravel \u0130\u00e7in Ger\u00e7ek D\u00fcnya Rehberi"},"content":{"rendered":"<div class=\"dchost-blog-content-wrapper\"><p>Hi\u00e7 beklenmedik bir cuma ak\u015fam\u0131, d\u00fc\u011fmeye basar gibi sipari\u015flerin patlad\u0131\u011f\u0131 oldu mu? Benim oldu. WooCommerce\u2019te kampanya ba\u015flad\u0131, sayfalar ak\u0131yor, sepetler doluyor, ama bir yerden sonra site a\u011f\u0131rla\u015f\u0131yor, admin sayfas\u0131 bir a\u00e7\u0131l\u0131yor bir kapan\u0131yor. Klasik hik\u00e2ye: uygulama ya\u015f\u0131yor, ama veri taban\u0131 nefes nefese. O an d\u00fc\u015f\u00fcnd\u00fcm; bu kadar okuma ve yazma iste\u011fi ayn\u0131 kap\u0131ya y\u0131\u011f\u0131l\u0131rsa, kap\u0131y\u0131 geni\u015fletmek yerine ak\u0131\u015f\u0131 d\u00fczenlemek daha mant\u0131kl\u0131. \u0130\u015fte o ak\u015fam tan\u0131\u015fl\u0131\u011f\u0131m\u0131z peki\u015fti: ProxySQL.<\/p>\n<p>Bu yaz\u0131da ProxySQL ile MySQL <strong>read\/write split<\/strong> ve <strong>ba\u011flant\u0131 havuzu<\/strong> kurup, \u00f6zellikle WooCommerce ve Laravel projelerinde nas\u0131l daha ak\u0131\u015fkan bir trafi\u011fe kavu\u015fabilece\u011fimizi konu\u015faca\u011f\u0131z. Kuru bir kurulum rehberi de\u011fil; sahada kar\u015f\u0131la\u015ft\u0131\u011f\u0131m tuhafl\u0131klardan, minik kazalardan, tatl\u0131 \u00e7\u00f6z\u00fcmlerden bahsedece\u011fim. Mesela \u015f\u00f6yle d\u00fc\u015f\u00fcn\u00fcn: bir kafede tek bir kasiyere hem sipari\u015f hem \u00f6deme hem de \u201cmen\u00fcde ne var?\u201d sorular\u0131 gidiyor. Kasiyer yorulur. Biz sipari\u015fi bir tarafa, \u00f6demeyi di\u011fer tarafa y\u00f6nlendirip kasiyerin y\u00fck\u00fcn\u00fc dengelemekten s\u00f6z ediyoruz. Hem de uygulama kodunu \u00e7ok bozmadan.<\/p>\n<div id=\"toc_container\" class=\"toc_transparent no_bullets\"><p class=\"toc_title\">\u0130&ccedil;indekiler<\/p><ul class=\"toc_list\"><li><a href=\"#ProxySQL_Nedir_ve_Neden_Araya_Girer\"><span class=\"toc_number toc_depth_1\">1<\/span> ProxySQL Nedir ve Neden Araya Girer?<\/a><\/li><li><a href=\"#ReadWrite_Split_Mantigi_Sihir_Degil_Kuralli_Trafik\"><span class=\"toc_number toc_depth_1\">2<\/span> Read\/Write Split Mant\u0131\u011f\u0131: Sihir De\u011fil, Kurall\u0131 Trafik<\/a><\/li><li><a href=\"#Baglanti_Havuzu_Her_Istek_Icin_Sifirdan_Tanismayalim\"><span class=\"toc_number toc_depth_1\">3<\/span> Ba\u011flant\u0131 Havuzu: Her \u0130stek \u0130\u00e7in S\u0131f\u0131rdan Tan\u0131\u015fmayal\u0131m<\/a><\/li><li><a href=\"#Adim_Adim_Kurulum_Kucuk_Bir_Prova_Sonra_Canli\"><span class=\"toc_number toc_depth_1\">4<\/span> Ad\u0131m Ad\u0131m Kurulum: K\u00fc\u00e7\u00fck Bir Prova, Sonra Canl\u0131<\/a><ul><li><a href=\"#Temel_Bilesenler\"><span class=\"toc_number toc_depth_2\">4.1<\/span> Temel Bile\u015fenler<\/a><\/li><li><a href=\"#Gecikmeye_Duyarli_Okuma\"><span class=\"toc_number toc_depth_2\">4.2<\/span> Gecikmeye Duyarl\u0131 Okuma<\/a><\/li><li><a href=\"#Baglanti_Havuzu_Ayarlarini_Dengelemek\"><span class=\"toc_number toc_depth_2\">4.3<\/span> Ba\u011flant\u0131 Havuzu Ayarlar\u0131n\u0131 Dengelemek<\/a><\/li><\/ul><\/li><li><a href=\"#Laravel_ile_Uyum_ReadWrite_Spliti_Yapistirip_Gecmek\"><span class=\"toc_number toc_depth_1\">5<\/span> Laravel ile Uyum: Read\/Write Split\u2019i Yap\u0131\u015ft\u0131r\u0131p Ge\u00e7mek<\/a><\/li><li><a href=\"#WooCommercete_Ince_Ayar_Checkout_Kirilmadan_Nasil_Paylastiririz\"><span class=\"toc_number toc_depth_1\">6<\/span> WooCommerce\u2019te \u0130nce Ayar: Checkout K\u0131r\u0131lmadan Nas\u0131l Payla\u015ft\u0131r\u0131r\u0131z?<\/a><\/li><li><a href=\"#Izleme_Guncelleme_ve_Kucuk_Kazalari_Zarifce_Yonetmek\"><span class=\"toc_number toc_depth_1\">7<\/span> \u0130zleme, G\u00fcncelleme ve K\u00fc\u00e7\u00fck Kazalar\u0131 Zarif\u00e7e Y\u00f6netmek<\/a><\/li><li><a href=\"#Gercek_Dunyada_Karsilastigim_Tikanmalar_ve_Cozumler\"><span class=\"toc_number toc_depth_1\">8<\/span> Ger\u00e7ek D\u00fcnyada Kar\u015f\u0131la\u015ft\u0131\u011f\u0131m T\u0131kanmalar ve \u00c7\u00f6z\u00fcmler<\/a><\/li><li><a href=\"#Guvenlik_ve_Dayaniklilik_Sessiz_Kahramanlar\"><span class=\"toc_number toc_depth_1\">9<\/span> G\u00fcvenlik ve Dayan\u0131kl\u0131l\u0131k: Sessiz Kahramanlar<\/a><\/li><li><a href=\"#ProxySQL_Kurallariyla_Ince_Iscilik_WooCommerce_ve_Laravel_Icin_Ornekler\"><span class=\"toc_number toc_depth_1\">10<\/span> ProxySQL Kurallar\u0131yla \u0130nce \u0130\u015f\u00e7ilik: WooCommerce ve Laravel \u0130\u00e7in \u00d6rnekler<\/a><\/li><li><a href=\"#Dokumantasyon_ve_Ufak_Yol_Arkadaslari\"><span class=\"toc_number toc_depth_1\">11<\/span> Dok\u00fcmantasyon ve Ufak Yol Arkada\u015flar\u0131<\/a><\/li><li><a href=\"#Kapanis_Sakin_Trafik_Mutlu_Siparisler\"><span class=\"toc_number toc_depth_1\">12<\/span> Kapan\u0131\u015f: Sakin Trafik, Mutlu Sipari\u015fler<\/a><\/li><\/ul><\/div>\n<h2 id=\"section-1\"><span id=\"ProxySQL_Nedir_ve_Neden_Araya_Girer\">ProxySQL Nedir ve Neden Araya Girer?<\/span><\/h2>\n<p>ProxySQL, uygulama ile MySQL\/MariaDB aras\u0131nda duran ak\u0131ll\u0131 bir kap\u0131 g\u00f6revlisi gibi. Ba\u011flant\u0131lar\u0131 havuzlar, hangi sorgunun yazma hangisinin okuma oldu\u011funu anlar, gerekti\u011finde yazmalar\u0131 yaz\u0131c\u0131 d\u00fc\u011f\u00fcme, okumalar\u0131 okuyucu d\u00fc\u011f\u00fcmlere yollar. Uygulama her seferinde veri taban\u0131na s\u0131f\u0131rdan ba\u011flanmak yerine, ProxySQL\u2019in s\u0131cak tuttu\u011fu ba\u011flant\u0131lardan faydalan\u0131r. Sonu\u00e7 basit: daha az maliyetli ba\u011flant\u0131 kurulumu, daha iyi yan\u0131t s\u00fcresi ve daha dengeli bir y\u00fck.<\/p>\n<p>WooCommerce taraf\u0131nda sipari\u015f akarken, arka planda stok g\u00fcncellemeleri, sipari\u015f stat\u00fcleri, meta veriler ve raporlamalar ayn\u0131 anda hareket eder. Laravel\u2019de ise API\u2019ler, kuyruk i\u015fler ve planl\u0131 g\u00f6revler bir orkestrada gibi \u00e7al\u0131\u015f\u0131r. Hepsi veriye dokunur ama her istek yazma yapmak zorunda de\u011fil. \u0130\u015fte <strong>read\/write split<\/strong> tam burada devreye giriyor; yazmalar ana d\u00fc\u011f\u00fcme, okumalar kopyalara. \u00d6zetle: yo\u011funlu\u011fu b\u00f6l, arkadaki makinelerin nefes almas\u0131n\u0131 sa\u011fla.<\/p>\n<h2 id=\"section-2\"><span id=\"ReadWrite_Split_Mantigi_Sihir_Degil_Kuralli_Trafik\">Read\/Write Split Mant\u0131\u011f\u0131: Sihir De\u011fil, Kurall\u0131 Trafik<\/span><\/h2>\n<p>ProxySQL sorguyu g\u00f6r\u00fcnce \u00f6nce c\u00fcmle yap\u0131s\u0131na bakar. \u201cINSERT, UPDATE, DELETE, REPLACE\u201d diyorsa hi\u00e7 uzatmadan yaz\u0131c\u0131 d\u00fc\u011f\u00fcme yollar. \u201cSELECT\u201d diyorsa, e\u011fer bir i\u015flemin (transaction) i\u00e7indeyse veya belli bir i\u015faret varsa, yine yaz\u0131c\u0131ya g\u00f6ndermeyi tercih edebilir. \u00c7\u00fcnk\u00fc bazen bir \u201cSELECT\u201d bile, taze yazd\u0131\u011f\u0131n veriyi g\u00f6rmek istiyorsundur. \u00d6zellikle WooCommerce\u2019te \u00f6deme an\u0131nda, Laravel\u2019de sipari\u015fi yazd\u0131ktan hemen sonra okuma yaparken bu tutarl\u0131l\u0131k \u00f6nemli.<\/p>\n<p>Buradaki p\u00fcf nokta \u015fu: replicalarda milisaniyelerle de olsa gecikme olabilir. \u201cAz\u0131c\u0131k gecikme ne olacak?\u201d deme. M\u00fc\u015fteri sipari\u015fi verdi, \u201csipari\u015finiz bulunamad\u0131\u201d gibi bir \u015fey g\u00f6rmek istemez. ProxySQL\u2019e \u201cyazd\u0131ktan sonra \u015fu kadar s\u00fcre okumalarda da ana d\u00fc\u011f\u00fcm\u00fc tercih et\u201d dedirtebilirsin. Laravel\u2019de bu, <em>sticky read<\/em> yakla\u015f\u0131m\u0131yla birka\u00e7 saniyeli\u011fine yaz\u0131c\u0131ya yap\u0131\u015fmak gibi. WooCommerce\u2019te ise daha \u00e7ok ak\u0131ll\u0131 kural yazmak ve replika gecikmesini d\u00fc\u015f\u00fck tutmakla \u00e7\u00f6z\u00fcl\u00fcyor.<\/p>\n<h2 id=\"section-3\"><span id=\"Baglanti_Havuzu_Her_Istek_Icin_Sifirdan_Tanismayalim\">Ba\u011flant\u0131 Havuzu: Her \u0130stek \u0130\u00e7in S\u0131f\u0131rdan Tan\u0131\u015fmayal\u0131m<\/span><\/h2>\n<p>Her PHP iste\u011finde yeni bir MySQL ba\u011flant\u0131s\u0131 kurman\u0131n bedeli var. SSL el s\u0131k\u0131\u015fmalar\u0131, kimlik do\u011frulamalar, a\u011f gecikmesi\u2026 Hepsi birikince sayfalar yava\u015fl\u0131yor. ProxySQL burada b\u00fcy\u00fck kazan\u0131m sa\u011flar: o zaten veri taban\u0131yla konu\u015fuyor ve ba\u011flant\u0131lar\u0131 s\u0131cak tutuyor. Uygulama ise ProxySQL\u2019e ba\u011flan\u0131p \u201chaz\u0131r\u201d bir boruya su ak\u0131t\u0131r gibi ak\u0131yor.<\/p>\n<p>Mesela WooCommerce\u2019te kampanya a\u00e7t\u0131n, trafik ikiye katland\u0131. Eskiden MySQL\u2019de 5000 ba\u011flant\u0131 g\u00f6r\u00fcp tedirgin olurdun; \u015fimdi ProxySQL bu ba\u011flant\u0131lar\u0131 havuzlay\u0131p makul say\u0131da tutuyor. Laravel\u2019de de benzer; i\u015f\u00e7i s\u00fcre\u00e7leri ve kuyruklar yo\u011funken, havuzun limitlerini do\u011fru ayarlad\u0131\u011f\u0131nda, dalgalanmalar\u0131 \u00e7ok daha zarif kar\u015f\u0131lars\u0131n. Burada sihirli ayar yok, ama mant\u0131k net: uygulamadan gelen binlerce k\u0131sa \u00f6m\u00fcrl\u00fc ba\u011flant\u0131 yerine, ProxySQL arka tarafta uzun \u00f6m\u00fcrl\u00fc ve verimli kanallar a\u00e7\u0131k tutar.<\/p>\n<h2 id=\"section-4\"><span id=\"Adim_Adim_Kurulum_Kucuk_Bir_Prova_Sonra_Canli\">Ad\u0131m Ad\u0131m Kurulum: K\u00fc\u00e7\u00fck Bir Prova, Sonra Canl\u0131<\/span><\/h2>\n<h3><span id=\"Temel_Bilesenler\">Temel Bile\u015fenler<\/span><\/h3>\n<p>\u00d6nce ProxySQL\u2019i kur, sonra veri taban\u0131 d\u00fc\u011f\u00fcmlerini ve kullan\u0131c\u0131y\u0131 tan\u0131t. Bir ana (yaz\u0131c\u0131) ve bir veya birka\u00e7 kopya (okuyucu) d\u00fc\u011f\u00fcm\u00fcn\u00fc <strong>hostgroup<\/strong> mant\u0131\u011f\u0131yla etiketle. Uygulama ProxySQL\u2019e ba\u011flanacak, o da sorguya g\u00f6re do\u011fru hostgruba y\u00f6nlendirecek.<\/p>\n<pre class=\"language-sql line-numbers\"><code class=\"language-sql\"># \u00d6rnek: mysql_servers i\u00e7ine d\u00fc\u011f\u00fcmleri eklemek\nINSERT INTO mysql_servers(hostgroup_id, hostname, port, max_connections) VALUES\n  (10, 'db-writer.internal', 3306, 200),\n  (20, 'db-replica-1.internal', 3306, 200),\n  (20, 'db-replica-2.internal', 3306, 200);\n\n# Kullan\u0131c\u0131y\u0131 tan\u0131mla (uygulama ProxySQL'e bu bilgilerle ba\u011flan\u0131r)\nINSERT INTO mysql_users(username, password, default_hostgroup, transaction_persistent)\nVALUES ('appuser', 'sifren', 20, 1);\n\n# Kurallar\u0131 yaz: yazmalar\u0131 10'a, okumalar\u0131 20'ye\nINSERT INTO mysql_query_rules (rule_id, match_pattern, destination_hostgroup, apply)\nVALUES\n  (10, '^(?i)(INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|ALTER) ', 10, 1),\n  (20, '^(?i)SELECT ', 20, 1);\n\nLOAD MYSQL SERVERS TO RUNTIME; SAVE MYSQL SERVERS TO DISK;\nLOAD MYSQL USERS TO RUNTIME;   SAVE MYSQL USERS TO DISK;\nLOAD MYSQL QUERY RULES TO RUNTIME; SAVE MYSQL QUERY RULES TO DISK;<\/code><\/pre>\n<p>Bu \u00e7ok basit bir iskelet. Ger\u00e7ekte sa\u011fl\u0131k kontrollerini, replikasyon gecikmesi \u00f6l\u00e7\u00fcm\u00fcn\u00fc ve failover davran\u0131\u015f\u0131n\u0131 da yap\u0131land\u0131rmak istersin. Ama ilk ad\u0131mda ama\u00e7 basit\u00e7e trafi\u011fi ikiye ay\u0131rmak.<\/p>\n<h3><span id=\"Gecikmeye_Duyarli_Okuma\">Gecikmeye Duyarl\u0131 Okuma<\/span><\/h3>\n<p>Replikasyon gecikmesi artarsa okuma sorgular\u0131n\u0131 otomatik yaz\u0131c\u0131ya y\u00f6nlendirmek hayati olabilir. ProxySQL, belirledi\u011fin e\u015fi\u011fin \u00fczerindeki kopyalar\u0131 ge\u00e7ici olarak devre d\u0131\u015f\u0131 b\u0131rakabilir. Senaryosu net: b\u00fcy\u00fck raporlar \u00e7al\u0131\u015f\u0131yor, replika ard\u0131na bakam\u0131yor; ProxySQL \u201ctamam, seni yormayay\u0131m\u201d diyerek o replika i\u00e7in okuma ak\u0131\u015f\u0131n\u0131 keser.<\/p>\n<h3><span id=\"Baglanti_Havuzu_Ayarlarini_Dengelemek\">Ba\u011flant\u0131 Havuzu Ayarlar\u0131n\u0131 Dengelemek<\/span><\/h3>\n<p>Uygulama taraf\u0131nda y\u00fczlerce k\u0131sa ba\u011flant\u0131 a\u00e7mak yerine, ProxySQL\u2019de uygun bir tavan koymak gerekir. \u00c7ok d\u00fc\u015f\u00fck olursa kuyruk olu\u015fur, \u00e7ok y\u00fcksek olursa bo\u015funa kaynak yer. K\u00fc\u00e7\u00fck bir test ortam\u0131nda trafik sim\u00fcle edip hem ProxySQL istatistiklerine hem de MySQL thread y\u00fck\u00fcne bakarak birka\u00e7 tur ayar yapmak en sa\u011fl\u0131kl\u0131s\u0131.<\/p>\n<h2 id=\"section-5\"><span id=\"Laravel_ile_Uyum_ReadWrite_Spliti_Yapistirip_Gecmek\">Laravel ile Uyum: Read\/Write Split\u2019i Yap\u0131\u015ft\u0131r\u0131p Ge\u00e7mek<\/span><\/h2>\n<p>Laravel g\u00fczel bir avantaj sunuyor: uygulama seviyesinde read\/write ba\u011flant\u0131 tan\u0131m\u0131. ProxySQL\u2019i araya koydu\u011funda iki yolu var. Birincisi, t\u00fcm ba\u011flant\u0131lar\u0131 ProxySQL\u2019e verip kurallar\u0131 ProxySQL\u2019de y\u00f6netmek. \u0130kincisi, Laravel\u2019in native read\/write deste\u011fini de kullan\u0131p <em>sticky read<\/em> gibi tatl\u0131 bir dokunu\u015f eklemek. Sipari\u015f yaz\u0131ld\u0131ktan sonraki birka\u00e7 saniye boyunca okumalarda da yaz\u0131c\u0131ya gitmek, \u201cyazd\u0131\u011f\u0131m\u0131 hemen g\u00f6reyim\u201d hissini g\u00fcvenli k\u0131lar.<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">\/\/ config\/database.php i\u00e7inde basitle\u015ftirilmi\u015f \u00f6rnek\n'mysql' =&gt; [\n  'driver' =&gt; 'mysql',\n  'host' =&gt; env('DB_HOST', 'proxysql.internal'),\n  'port' =&gt; env('DB_PORT', 6033),\n  'database' =&gt; env('DB_DATABASE', 'app'),\n  'username' =&gt; env('DB_USERNAME', 'appuser'),\n  'password' =&gt; env('DB_PASSWORD', ''),\n  'sticky' =&gt; true, \/\/ Yazd\u0131ktan sonra k\u0131sa s\u00fcre yaz\u0131c\u0131ya yap\u0131\u015f\u0131r\n  'read' =&gt; ['host' =&gt; 'proxysql.internal'],\n  'write' =&gt; ['host' =&gt; 'proxysql.internal'],\n],<\/code><\/pre>\n<p>Laravel taraf\u0131nda bu yap\u0131 ta\u015f gibi i\u015fler. \u00d6zellikle kuyruk i\u015flerinde ve transaction bloklar\u0131nda, tutarl\u0131l\u0131k \u015f\u00fcphesini azalt\u0131r. Ayr\u0131ca uygulama hostunu ProxySQL yapt\u0131\u011f\u0131nda, veri taban\u0131 sertifikalar\u0131n\u0131 ve ba\u011flant\u0131 zaman a\u015f\u0131m\u0131 ayarlar\u0131n\u0131 da ProxySQL taraf\u0131nda merkezi bi\u00e7imde y\u00f6netme rahatl\u0131\u011f\u0131 gelir. Laravel dok\u00fcmantasyonunda bu konu gayet sade anlat\u0131l\u0131yor; detaylara <a href=\"https:\/\/laravel.com\/docs\/database#read-and-write-connections\" target=\"_blank\" rel=\"noopener nofollow\">Laravel\u2019in read\/write ba\u011flant\u0131 y\u00f6nlendirme b\u00f6l\u00fcm\u00fcnden<\/a> g\u00f6z atabilirsin.<\/p>\n<h2 id=\"section-6\"><span id=\"WooCommercete_Ince_Ayar_Checkout_Kirilmadan_Nasil_Paylastiririz\">WooCommerce\u2019te \u0130nce Ayar: Checkout K\u0131r\u0131lmadan Nas\u0131l Payla\u015ft\u0131r\u0131r\u0131z?<\/span><\/h2>\n<p>WordPress d\u00fcnyas\u0131 biraz farkl\u0131. Uygulama kodunda her sorguya i\u015faret koymak pek m\u00fcmk\u00fcn de\u011fil. Ama ProxySQL\u2019in kurallar\u0131yla WooCommerce\u2019in kalp at\u0131\u015f\u0131na uyum sa\u011flayabilirsin. \u00d6deme ve sipari\u015fle ilgili sorgular\u0131n yaz\u0131c\u0131ya gitmesi kritik. Sipari\u015f ekran\u0131nda o an olu\u015fan verinin an\u0131nda g\u00f6r\u00fcnmesi gerekir; replikaya d\u00fc\u015fen gecikme iftira gibi alg\u0131lan\u0131r.<\/p>\n<p>Ben \u015fu yoldan gidiyorum: checkout ak\u0131\u015f\u0131nda s\u0131k g\u00f6r\u00fclen tablo ve \u00f6r\u00fcnt\u00fclere ufak kurallar. \u00d6rne\u011fin \u201cwp_posts i\u00e7inde shop_order\u201d veya \u201cwp_wc_orders\u201d gibi order depolar\u0131na bakan SELECT\u2019leri yaz\u0131c\u0131ya y\u00f6nlendirmek. \u00c7ok agresif olmaz, ama \u00f6deme an\u0131nda rahatlat\u0131r. E\u011fer WooCommerce\u2019te <strong>High-Performance Order Storage (HPOS)<\/strong> kullan\u0131yorsan, sipari\u015f verisi art\u0131k \u00f6zel tablolarda durdu\u011fundan, kurallar\u0131 bu tablo adlar\u0131yla e\u015fle\u015ftirmek daha g\u00fcvenli. \u0130lgilenenler i\u00e7in HPOS detaylar\u0131na <a href=\"https:\/\/woocommerce.com\/document\/high-performance-order-storage\/\" target=\"_blank\" rel=\"noopener nofollow\">WooCommerce\u2019in y\u00fcksek performansl\u0131 sipari\u015f depolamas\u0131 rehberinden<\/a> bakabilir.<\/p>\n<p>Bir de kullan\u0131c\u0131 oturumlar\u0131 konusu var. Giri\u015f yapt\u0131ktan hemen sonra kullan\u0131c\u0131ya \u201cprofiliniz g\u00fcncellendi\u201d gibi bir mesaj g\u00f6steriyorsun; bu okuma yazmay\u0131 takip ediyor. Burada ya replikasyon gecikmesini \u00e7ok d\u00fc\u015f\u00fck tutacaks\u0131n ya da kritik sayfalarda k\u0131sa s\u00fcreli yaz\u0131c\u0131 tercihine izin vereceksin. ProxySQL taraf\u0131nda transaction i\u00e7inde gelen SELECT\u2019leri yaz\u0131c\u0131ya g\u00f6ndermek g\u00fczel bir emniyet supab\u0131. Checkout ve admin i\u015flemleri \u00e7o\u011funlukla transaction\u2019l\u0131 oldu\u011fu i\u00e7in bu, hedefi vuruyor.<\/p>\n<h2 id=\"section-7\"><span id=\"Izleme_Guncelleme_ve_Kucuk_Kazalari_Zarifce_Yonetmek\">\u0130zleme, G\u00fcncelleme ve K\u00fc\u00e7\u00fck Kazalar\u0131 Zarif\u00e7e Y\u00f6netmek<\/span><\/h2>\n<p>Read\/write split kurduk, havuzlar\u0131 ayarlad\u0131k. \u015eimdi spor saatini takma zaman\u0131: \u00f6l\u00e7, g\u00f6zle, d\u00fczelt. ProxySQL\u2019in <strong>query digest<\/strong> istatistikleri, hangi sorgular\u0131n ne kadar s\u00fcre ald\u0131\u011f\u0131n\u0131 ve hangi hostgruba gitti\u011fini f\u0131s\u0131ldar. Replikalar\u0131n gecikmesini izleyip e\u015fik koydu\u011funda, gece yar\u0131s\u0131 patlayan raporlar bile can s\u0131kmaz. MySQL taraf\u0131nda da yava\u015f sorgu logunu hafif\u00e7e a\u00e7\u0131p, uzun ya\u015fayan sorgular\u0131 s\u0131k\u0131\u015ft\u0131rmak g\u00fczel bir temizliktir.<\/p>\n<p>Canl\u0131ya al\u0131rken s\u0131f\u0131r kesinti hedefi akl\u0131nda olsun. ProxySQL\u2019in arada olmas\u0131 burada avantaj, \u00e7\u00fcnk\u00fc arka tarafta d\u00fc\u011f\u00fcm de\u011fi\u015ftirmek, y\u00fck\u00fc kademeli da\u011f\u0131tmak daha kolay. E\u011fer da\u011f\u0131t\u0131m ve DNS taraf\u0131nda s\u00fcre\u00e7leri otomatikle\u015ftirmek hedefin varsa, \u015fu bak\u0131\u015f a\u00e7\u0131s\u0131 i\u015fine yarayabilir: <a href=\"https:\/\/www.dchost.com\/blog\/terraform-ile-vps-ve-dns-otomasyonu-cloudflare-proxmox-openstack-ve-sifir-kesinti-dagitim-nasil-bir-araya-gelir\/\">Terraform ile otomasyon ve s\u0131f\u0131r kesinti da\u011f\u0131t\u0131m\u0131 bir araya getirmek<\/a> g\u00fczel bir \u00e7er\u00e7eve sunuyor.<\/p>\n<p>Uygulama g\u00f6zleminin tad\u0131n\u0131 art\u0131rmak i\u00e7in u\u00e7tan uca izler kurmak \u015fahane. Laravel\u2019de \u00f6nemli endpoint\u2019lerin DB \u00e7a\u011fr\u0131lar\u0131n\u0131 da izledi\u011finde, ProxySQL\u2019in elinden ge\u00e7en sorgular\u0131n nas\u0131l dola\u015ft\u0131\u011f\u0131n\u0131 daha iyi anlars\u0131n. Bu sayede \u201ccheckout neden bazen uzuyor?\u201d sorusunu say\u0131larla konu\u015fur hale getirirsin.<\/p>\n<h2 id=\"section-8\"><span id=\"Gercek_Dunyada_Karsilastigim_Tikanmalar_ve_Cozumler\">Ger\u00e7ek D\u00fcnyada Kar\u015f\u0131la\u015ft\u0131\u011f\u0131m T\u0131kanmalar ve \u00c7\u00f6z\u00fcmler<\/span><\/h2>\n<p>En \u00e7ok g\u00f6rd\u00fc\u011f\u00fcm s\u0131k\u0131nt\u0131: <strong>read-your-write<\/strong> tutarl\u0131l\u0131\u011f\u0131. Yazd\u0131ktan hemen sonra okudu\u011funda, replika arkadan gelirse hayal k\u0131r\u0131kl\u0131\u011f\u0131. \u00c7\u00f6z\u00fcm olarak \u00fc\u00e7 dokunu\u015f \u00f6neriyorum. Birincisi, kritik ak\u0131\u015flarda transaction kullan ve transaction i\u00e7indeki SELECT\u2019leri yaz\u0131c\u0131ya y\u00f6nlendir. \u0130kincisi, Laravel\u2019de sticky \u00f6zelli\u011fini a\u00e7; yaz\u0131dan sonra birka\u00e7 saniye ayn\u0131 d\u00fc\u011f\u00fcmde kal. \u00dc\u00e7\u00fcnc\u00fcs\u00fc, WooCommerce\u2019te checkout\u2019la ilgili SELECT\u2019leri yaz\u0131c\u0131ya y\u00f6nlendirecek kurallar yaz; abartma, nokta at\u0131\u015f\u0131 yap.<\/p>\n<p>\u0130kinci yayg\u0131n konu: <strong>havuz doymas\u0131<\/strong>. \u00d6zellikle k\u0131sa \u00f6m\u00fcrl\u00fc yo\u011fun PHP isteklerinde ProxySQL\u2019in arka ba\u011flant\u0131 havuzu tavan\u0131 iyi ayarlanmazsa kuyruklar olu\u015fur. Burada k\u00fc\u00e7\u00fck bir y\u00fck testi alt\u0131n de\u011ferinde. Az az art\u0131r, grafiklere bak, \u201caha\u201d dedi\u011fin noktay\u0131 bul. Uygulama taraf\u0131ndaki e\u015fzamanl\u0131l\u0131k ile arka ba\u011flant\u0131 tavan\u0131n\u0131 uyumlu tut.<\/p>\n<p>\u00dc\u00e7\u00fcnc\u00fc ba\u015fl\u0131k: <strong>uzun ya\u015fayan SELECT\u2019ler<\/strong>. Rapor, d\u0131\u015fa aktarma, b\u00fcy\u00fck JOIN\u2019ler\u2026 Replikan\u0131n ritmini bozar. Bu sorgular\u0131 ya zamanlay\u0131p sakin saatlere al ya da kaynaklar\u0131 bol bir replika ay\u0131r. ProxySQL\u2019de belirli sorgu kal\u0131plar\u0131n\u0131 \u00f6zel bir okuyucu gruba g\u00f6ndermek hayat kurtar\u0131r. Bir de indeks temizlikleri, sorgu planlar\u0131n\u0131 tazelemek, \u015fi\u015fkin tablo sorunlar\u0131n\u0131 sakin sakin \u00e7\u00f6zmek uzun vadede kan bas\u0131nc\u0131n\u0131 d\u00fc\u015f\u00fcr\u00fcr.<\/p>\n<h2 id=\"section-9\"><span id=\"Guvenlik_ve_Dayaniklilik_Sessiz_Kahramanlar\">G\u00fcvenlik ve Dayan\u0131kl\u0131l\u0131k: Sessiz Kahramanlar<\/span><\/h2>\n<p>Uygulama ve ProxySQL aras\u0131na TLS koymak, \u00f6zellikle farkl\u0131 a\u011flar aras\u0131nda konu\u015fuyorsan, i\u00e7ini rahatlat\u0131r. ProxySQL, arka tarafa giden ba\u011flant\u0131da da TLS konu\u015fabilir; sertifikalar\u0131 d\u00fczenli yenilemek ve s\u00fcreleri takip etmek \u00f6nemli. Kimlik do\u011frulamada uygulamaya \u00f6zel bir DB kullan\u0131c\u0131s\u0131 verip, ProxySQL i\u00e7inde en az yetkiyle \u00e7al\u0131\u015ft\u0131rmak iyi bir al\u0131\u015fkanl\u0131k.<\/p>\n<p>Failover senaryolar\u0131nda ProxySQL\u2019in kalp at\u0131\u015f\u0131 kontrolleri devreye girer. Yaz\u0131c\u0131 \u00e7\u00f6kerse, kontrol\u00fc ele al\u0131p uygun d\u00fc\u011f\u00fcm\u00fc yaz\u0131c\u0131 yapman gerekir; burada otomasyon iyidir ama aceleci davranan otomasyon bazen fazla cesur olabilir. \u00d6nce replikan\u0131n g\u00fcncel oldu\u011fundan emin olmak, sonra yaz\u0131c\u0131 atamas\u0131n\u0131 yapmak, en sonunda ProxySQL\u2019e \u201coyunu buna kur\u201d demek daha g\u00fcvenli bir ritim.<\/p>\n<h2 id=\"section-10\"><span id=\"ProxySQL_Kurallariyla_Ince_Iscilik_WooCommerce_ve_Laravel_Icin_Ornekler\">ProxySQL Kurallar\u0131yla \u0130nce \u0130\u015f\u00e7ilik: WooCommerce ve Laravel \u0130\u00e7in \u00d6rnekler<\/span><\/h2>\n<p>K\u00fc\u00e7\u00fck ama etkili birka\u00e7 kural fikri b\u0131rakay\u0131m. Checkout\u2019ta sipari\u015f tabanl\u0131 SELECT\u2019leri yaz\u0131c\u0131ya g\u00f6nder:<\/p>\n<pre class=\"language-sql line-numbers\"><code class=\"language-sql\">INSERT INTO mysql_query_rules (rule_id, match_pattern, destination_hostgroup, apply)\nVALUES\n  (30, '^(?i)SELECT .* FROM (wp_wc_orders|wp_posts).*shop_order', 10, 1);\n\nLOAD MYSQL QUERY RULES TO RUNTIME; SAVE MYSQL QUERY RULES TO DISK;<\/code><\/pre>\n<p>Transaction i\u00e7indeki SELECT\u2019leri yaz\u0131c\u0131ya g\u00f6ndererek tutarl\u0131l\u0131\u011f\u0131 g\u00fc\u00e7lendir:<\/p>\n<pre class=\"language-sql line-numbers\"><code class=\"language-sql\">UPDATE mysql_query_rules SET \n  flagIN = 1, \n  destination_hostgroup = 10\nWHERE rule_id = 20 AND match_pattern = '^(?i)SELECT ' AND log = 0 AND apply = 1;\n\n-- Not: flagIN ve transaction_persistent ayarlar\u0131yla birlikte d\u00fc\u015f\u00fcn.<\/code><\/pre>\n<p>Laravel\u2019de kritik i\u015f ak\u0131\u015flar\u0131n\u0131 transaction ile \u00e7epe\u00e7evre sar:<\/p>\n<pre class=\"language-sql line-numbers\"><code class=\"language-sql\">DB::transaction(function () {\n    $order = Order::create([...]);\n    \/\/ Buradaki SELECT'lerin yaz\u0131c\u0131da kalmas\u0131 i\u00e7in transaction korumas\u0131 yeterli olur\n    $summary = Order::where('id', $order-&gt;id)-&gt;first();\n});<\/code><\/pre>\n<p>Bunlar birer iskelet. \u00dcretimde kurcalay\u0131p kendi sorgu desenlerine g\u00f6re inceltmek gerekir. Zorlamadan, \u00f6l\u00e7erek, ad\u0131m ad\u0131m.<\/p>\n<h2 id=\"section-11\"><span id=\"Dokumantasyon_ve_Ufak_Yol_Arkadaslari\">Dok\u00fcmantasyon ve Ufak Yol Arkada\u015flar\u0131<\/span><\/h2>\n<p>Detaylara dalmak istedi\u011finde, <a href=\"https:\/\/proxysql.com\/documentation\/\" target=\"_blank\" rel=\"noopener nofollow\">ProxySQL\u2019in resmi dok\u00fcmantasyonu<\/a> yol g\u00f6sterici. Laravel cephesinde read\/write ba\u011flant\u0131lar\u0131n\u0131 k\u00fc\u00e7\u00fcc\u00fck bir dokunu\u015fla etkinle\u015ftirmek i\u00e7in <a href=\"https:\/\/laravel.com\/docs\/database#read-and-write-connections\" target=\"_blank\" rel=\"noopener nofollow\">resmi dok\u00fcman\u0131n ilgili b\u00f6l\u00fcm\u00fc<\/a> \u00e7ok net. WooCommerce\u2019te ise sipari\u015f depolamas\u0131n\u0131 HPOS\u2019a ta\u015f\u0131d\u0131ysan, <a href=\"https:\/\/woocommerce.com\/document\/high-performance-order-storage\/\" target=\"_blank\" rel=\"noopener nofollow\">y\u00fcksek performansl\u0131 sipari\u015f depolamas\u0131 rehberi<\/a> i\u015fini kolayla\u015ft\u0131r\u0131r.<\/p>\n<h2 id=\"section-12\"><span id=\"Kapanis_Sakin_Trafik_Mutlu_Siparisler\">Kapan\u0131\u015f: Sakin Trafik, Mutlu Sipari\u015fler<\/span><\/h2>\n<p>\u00d6zetle \u015funu g\u00f6rd\u00fcm: ProxySQL araya girince, MySQL ile uygulama aras\u0131ndaki ini\u015f \u00e7\u0131k\u0131\u015flar daha yumu\u015fak oluyor. Read\/write split ile yazmalar\u0131 g\u00fcvenli limana, okumalar\u0131 ferah denize yolluyoruz. Ba\u011flant\u0131 havuzu sayesinde \u201cher istekte yeniden tan\u0131\u015fma\u201d derdinden kurtuluyoruz. WooCommerce\u2019te checkout nefes al\u0131yor, Laravel\u2019de kuyruklar daha az s\u00fcrpriz yap\u0131yor.<\/p>\n<p>Pratik \u00f6neri olarak; \u00f6nce k\u00fc\u00e7\u00fck bir test ortam\u0131nda kural ve havuz ayarlar\u0131n\u0131 dene, sonra kademeli canl\u0131 al. Transaction\u2019lar\u0131 kritik yerlerde a\u00e7, Laravel\u2019de sticky\u2019yi \u00e7ekinmeden kullan, WooCommerce\u2019te checkout\u2019a \u00f6zg\u00fc SELECT\u2019leri yaz\u0131c\u0131ya y\u00f6nlendir. Replika gecikmesini izle, e\u015fi\u011fi ge\u00e7eni dinlendir. Ve en \u00f6nemlisi, \u00f6l\u00e7meden karar verme. Umar\u0131m bu rehber elini rahatlatt\u0131; sorular\u0131n olursa, b\u0131rak konu\u015fal\u0131m. Bir dahaki yaz\u0131da g\u00f6r\u00fc\u015fmek \u00fczere.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Hi\u00e7 beklenmedik bir cuma ak\u015fam\u0131, d\u00fc\u011fmeye basar gibi sipari\u015flerin patlad\u0131\u011f\u0131 oldu mu? Benim oldu. WooCommerce\u2019te kampanya ba\u015flad\u0131, sayfalar ak\u0131yor, sepetler doluyor, ama bir yerden sonra site a\u011f\u0131rla\u015f\u0131yor, admin sayfas\u0131 bir a\u00e7\u0131l\u0131yor bir kapan\u0131yor. Klasik hik\u00e2ye: uygulama ya\u015f\u0131yor, ama veri taban\u0131 nefes nefese. O an d\u00fc\u015f\u00fcnd\u00fcm; bu kadar okuma ve yazma iste\u011fi ayn\u0131 kap\u0131ya y\u0131\u011f\u0131l\u0131rsa, kap\u0131y\u0131 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1699,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26],"tags":[],"class_list":["post-1698","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-teknoloji"],"_links":{"self":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts\/1698","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/comments?post=1698"}],"version-history":[{"count":0,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts\/1698\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/media\/1699"}],"wp:attachment":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/media?parent=1698"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/categories?post=1698"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/tags?post=1698"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}