คลัสเตอร์ MySQL แบบโหลดบาลานซ์โดยไม่มี load balancer


10

ฉันต้องการสร้างคลัสเตอร์ MySQL ที่มีความสมดุลในการโหลด แต่ไม่มี load-balancer จริงเพื่อที่จะไม่เพิ่มจุดของความล้มเหลวหรือความซับซ้อนอื่น

สิ่งที่ฉันคิดคือการมีดังต่อไปนี้:

  1. มีการตั้งค่าหลักสำหรับ MySQL

  2. บนไคลเอนต์ทุก ๆ ให้วางพร็อกซี round-robin อย่างง่ายซึ่งจะหมุนเวียนการร้องขอระหว่างเซิร์ฟเวอร์

เป็นไปได้ไหม หรือมีวิธีที่ดีกว่าเพื่อให้บรรลุนี้

mysql 

ฉันอยากรู้อยากเห็นคุณจะใช้มันเพื่ออะไร

ฉันพยายามเพิ่ม HA ลงในโซลูชันของเราโดยไม่เกี่ยวข้องกับ load-balancer และสิ่งที่คล้ายกัน

คำตอบ:


3

โปรดอ่านคำตอบของฉันสำหรับคำถามนี้ก่อนที่จะใช้พร็อกซี MySQL จริง ๆ หากคุณมีเซิร์ฟเวอร์ต้นแบบหลัก 2 แห่งที่ CMS กำลังเขียนถึงและ 10 httpd ที่อ่านจากเซิร์ฟเวอร์เท่านั้นคุณจะไม่เป็นไร แต่ (ดังที่ได้กล่าวไว้ในคำตอบอื่น ๆ ) ซึ่งไม่ได้เป็นเช่นนั้นเสมอไป คุณได้รับการเตือน

MySQL Proxyเป็นโปรแกรมง่าย ๆ ที่ตั้งอยู่ระหว่างไคลเอนต์ของคุณกับเซิร์ฟเวอร์ MySQL ที่สามารถตรวจสอบวิเคราะห์หรือแปลงการสื่อสารของพวกเขา ความยืดหยุ่นช่วยให้สามารถใช้งานได้ไม่ จำกัด คนทั่วไป ได้แก่ : สมดุลภาระ; failover; การวิเคราะห์แบบสอบถาม การกรองและแก้ไขแบบสอบถาม และอื่น ๆ อีกมากมาย.

.

HAProxyเป็นโซลูชันฟรีที่รวดเร็วและเชื่อถือได้ซึ่งให้ความพร้อมใช้งานสูงการทำโหลดบาลานซ์และการจัดหาสำหรับแอปพลิเคชันที่ใช้ TCP และ HTTP

หากคุณจะรันในโหมด TCP มันอาจจะดีกว่า Wackamole ถ้าฉันต้องเลือกระหว่างพวกเขาฉันจะใช้ HAProxy นอกจากนี้ HAProxy สามารถมีแบ็กเอนด์จำนวนมาก Waclamole สามารถมีได้เพียง 2 โปรดทราบว่า HAProxy นั้นเป็น "โง่" มันเชื่อมต่อซ็อกเก็ตโดยไม่ต้องมองหาสิ่งที่อยู่ในกระแสข้อมูล - พร็อกซี MySQL โดยเฉพาะอาจมีตัวเลือก .


เพียงเพื่อตรวจสอบ: 1) HAProxy จะต้องใช้เครื่องเพิ่มเติม 2 เครื่องสำหรับ HA 2) Wackamole สามารถรองรับ 2 เซิร์ฟเวอร์ต่อการตั้งค่าเท่านั้น ความนับถือ.

รูปแบบการใช้มาตรฐานของ Wackamole (อันที่จริงอันเดียวที่ฉันรู้) คือให้ serverA และ serverB ดูกันและกันและใช้ IP ของตัวเองถ้ามันตาย เว็บไซต์ Wackamole บอกว่ามันสามารถใช้เพื่อป้องกันกลุ่มของ IP ... แต่ฉันต้องบอกว่า Wackamole ไม่ให้ความมั่นคงเหมือนที่เราต้องการดังนั้นฉันไม่แนะนำอีกเลย เกี่ยวกับ HAProxy คุณจะใส่ 2 เครื่องไว้ใน 2 เครื่องเฉพาะสำหรับการทำซ้ำหรือคุณสามารถใส่หนึ่งเครื่องในแต่ละโหนดได้ตามที่คุณพูดในคำถาม หากคำค้นหาของคุณส่วนใหญ่อ่านแล้วฉันคิดว่ามันจะทำงานได้ดี

สวัสดีรีฟ เพียงเล็กน้อยสุดท้ายเกี่ยวกับ Wackamole - จากประสบการณ์ของคุณมันไม่เสถียรพอสำหรับสองเครื่องใช่ไหม

2 เครื่องปิงแต่ละคนก็โอเค แต่หนึ่งในนั้นมีโหลด 200 ซีพียูทั้งหมดที่ใช้งาน 100% ใช้ RAM ทั้งหมด MySQL ขัดข้อง <- wackamole จะไม่ทำงานที่นั่น HAProxy สามารถตรวจสอบว่าแอปพลิเคชันระยะไกลนั้นทำงานได้หรือไม่ Wackamole เฉพาะเมื่อเซิร์ฟเวอร์ทำงานและ application_uptime <server_uptime เรามีหลายกรณีที่เราพึ่งพา wackamole และทำให้เราผิดหวัง

4

น่าจะกล่าวถึงเป็นอย่างมากการจำลองแบบ Galera สำหรับ MySQL สำหรับการติดตั้ง MySQL หลายหลักอย่างแท้จริง Galera เป็นโปรโตคอลการจำลองแบบซิงโครนัสดังนั้นแอปพลิเคชันสามารถอ่านและเขียนไปยังเซิร์ฟเวอร์ MySQL ใด ๆ นี่คือบทแนะนำด่วน: http://www.severalnines.com/clustercontrol-mysql-galera-tutorial

สำหรับโหลดบาลานเซอร์หน้าเซิร์ฟเวอร์ MySQL ให้ใช้ตัวเชื่อมต่อ MySQL ที่รองรับฟังก์ชั่นนี้ (เช่นตัวเชื่อมต่อ / J สำหรับ Java หรือ Mysqlnd สำหรับ php)

หากคุณไม่มีตัวเชื่อมต่อที่สามารถทำได้ให้ใช้บางอย่างเช่น HA Proxy สคริปต์นี้จะตั้งค่า HA Proxy โดยอัตโนมัติและเก็บรักษารายการเซิร์ฟเวอร์ MySQL ที่ดี: https://github.com/severalnines/haproxy

ขอแสดงความนับถืออย่างสูง,

Vinay

www.severalnines.com


เป็นสิ่งสำคัญที่คุณจะต้องเปิดเผยความสัมพันธ์ของคุณกับผลิตภัณฑ์ที่คุณแนะนำอย่างชัดเจน นอกจากนี้เว็บไซต์นี้ไม่ได้มีไว้สำหรับการส่งเสริมตนเอง หากคุณมีผลิตภัณฑ์ที่สามารถแก้ปัญหาที่โพสต์ได้ หากคำตอบทั้งหมดของคุณหมุนรอบผลิตภัณฑ์ของคุณคุณอาจต้องการคุยกับใครสักคนเกี่ยวกับการได้พื้นที่โฆษณาแทนที่จะโพสต์คำตอบ โปรดดูคำถามที่พบบ่อย
JNK

3

การจำลองแบบมาสเตอร์ - มาสเตอร์ไม่ดีอย่างที่คุณคิดว่าไปที่พร็อกซี round-robin และโซลูชัน 'ง่าย' ที่คล้ายกัน หากคุณส่งข้อมูลที่ขัดแย้งกันเพื่อแยกเซิร์ฟเวอร์ให้เร็วพอ (เร็วกว่าความล่าช้าระหว่างเซิร์ฟเวอร์ซึ่งบนเซิร์ฟเวอร์ที่ใช้งานจริงอาจมีความยาวไม่เกินวินาที*) ทั้งสองจะรับข้อมูล หากคุณมีเซิร์ฟเวอร์ประมูลคุณเพียงแค่ขายรถคันเดียวกันสองครั้ง ใครซื้อมัน ขึ้นอยู่กับว่าคุณจะถาม DB ใด!

แอปพลิเคชันจะต้องทราบว่ามีฐานข้อมูลจริง 2 ฐานและจำเป็นต้องรู้ทั้งที่อยู่ IP ของพวกเขา ถ้าคุณต้องการที่จะ "ขาย" คุณควรจะ fe

DB_number = `auction_number` % `number_of_databases`

( %สำหรับmodulo)

... และส่งไปยังฐานข้อมูล DB_number หากคุณได้รับข้อผิดพลาดในการเชื่อมต่ออาจทำกับอีกอันหนึ่ง (แต่ในกรณีของเซิร์ฟเวอร์ประมูลฉันจะแสดงข้อผิดพลาด)

นอกจากนี้ที่อยู่ IP ควรเป็นwackamole -d ระหว่างเซิร์ฟเวอร์ทั้งสอง ในสถานการณ์ภัยพิบัติที่เซิร์ฟเวอร์ฐานข้อมูลหนึ่งหยุดทำงานเป็นเวลาสองสามชั่วโมงในช่วงเวลาที่มีการใช้งานสูงสุดคุณจะพบว่าแอปพลิเคชันจะพยายามเชื่อมต่อกับเซิร์ฟเวอร์ที่ขาดไปและหยุดพักจนกระทั่ง TIMEOUT พูด 3 วินาที ทันใดนั้นครึ่งหนึ่งของการสืบค้นของคุณใช้เวลานานกว่า 3 วินาที (และพวกเขาทั้งหมดไปที่ฐานข้อมูลเดียวกันในที่สุด - ซึ่งไม่ได้ทำให้มันทำงานเร็วกว่าก่อนเกิดภัยพิบัติ) สิ่งนี้ไม่ทำให้ httpd ของคุณมีความสุขเนื่องจากอาจมีกลุ่มการเชื่อมต่อที่ จำกัด ของเธรดตัวจัดการคำขอพร้อมกัน ...

* ความล่าช้าในการจำลองแบบบนเซิร์ฟเวอร์ที่ใช้งานจริงอาจนานถึงสองวินาทีเต็ม - ฉันได้ทดสอบสิ่งนี้ใน colocation ระยะไกลและในดาต้าเซ็นเตอร์ของเราและประมาณ 99% ของเวลาที่เป็น 0 แต่บางครั้ง mysql แสดง 1s ในทราฟฟิกจำนวนมากฉันมีการชนกันมากมายเนื่องจากแอปพลิเคชันไคลเอนต์ทำการร้องขอสองครั้งทำให้เกิดแบบสอบถามสองรายการแทรกและเลือก สำหรับบางกรณีแถวก็ไม่ได้มีเลยดังนั้นเราใช้แฮชของหมายเลขผู้ใช้และแก้ไขปัญหา

ฉันหวังว่าคุณจะได้เรียนรู้จากความผิดพลาดของฉัน ;-)


สวัสดี ขอบคุณสำหรับการแบ่งปัน. ฉันคิดถึง Wackamole ซึ่งดีสำหรับ HA จริงๆ ปัญหาของฉันกับมันว่าการโหลดทั้งหมดจะอยู่ในเซิร์ฟเวอร์หลักตัวใดตัวหนึ่งเมื่อเซิร์ฟเวอร์ตัวที่สองไม่ได้ใช้งาน บางทีอาจจะดีกว่าถ้าวางโซลูชัน LB เบา ๆ บนไคลเอนต์แต่ละเครื่องเพื่อให้สามารถสลับการร้องขอระหว่างเซิร์ฟเวอร์ได้ ความคิดใด ๆ หากเครื่องมือดังกล่าวมีอยู่?

หากคุณต้องการความซ้ำซ้อนดังนั้น "การทำงานหนึ่งอันว่างเปล่า" เป็นสิ่งที่ดี สมมติว่าเซิร์ฟเวอร์ตัวใดตัวหนึ่งใน 2 ตัวตาย (ฉันเตือนคุณว่าคุณซื้ออีกตัวหนึ่งดังนั้นถ้าตัวแบ่งแรกคุณยังคงสามารถทำงานได้) หากเซิร์ฟเวอร์ตัวที่สองไม่สามารถรองรับปริมาณการใช้งานได้ทั้งหมดแสดงว่าเป็นมาตราส่วนไม่ใช่สำหรับ HA! นอกจากนี้: การพึ่ง Wackamole เป็นวิธีแก้ปัญหาที่ไม่ดี (ping ok! = mysqld ok)

3

คลัสเตอร์ฐานข้อมูล MySQL (หรืออื่น ๆ ) โหลดบาลานซ์ค่อนข้างไร้ประโยชน์ หากคุณกำลังเขียนไปยังเซิร์ฟเวอร์มากกว่าหนึ่งเครื่องคุณจะพบปัญหาหรือคุณใช้การเรพลิเคทแบบซิงโครนัส (ซึ่ง MySQL ไม่รองรับอยู่แล้ว) และนั่นทำให้ประสิทธิภาพในการทำงานแย่ลงเนื่องจากมันต้องการซิงโครไนซ์ล็อค

ฉันขอแนะนำให้คุณแบ่งโหลดการอ่าน / เขียนและโหลดการอ่านในหมู่ mysql และมีมาสเตอร์เพียงคนเดียวสำหรับการเขียนหรือใช้คู่ที่ล้มเหลว / พาสซีฟที่ใช้งานอยู่สำหรับมาสเตอร์ของคุณ

โดยพื้นฐานแล้วคุณไม่สามารถปรับขนาดการเขียนโดยการเพิ่มเซิร์ฟเวอร์ในฐานข้อมูลเป็นทาสเนื่องจากแต่ละเครื่องยังคงต้องเขียนภาระการเขียนทั้งหมดของแอปพลิเคชันของคุณ

ในการปรับขนาดการเขียนคุณต้องแยกข้อมูลของคุณอย่างมีเหตุผลในหลาย ๆ เซิร์ฟเวอร์โดยการแบ่งพาร์ติชันหรือ "การแบ่งส่วน" ฯลฯ โดยทั่วไปแล้วการเปลี่ยนแปลงนี้ต้องใช้การเปลี่ยนแปลงที่ไม่คิดเลข (คิดว่ายากมากที่จะทดสอบ) ต้องการมัน.


แน่นอนคุณสามารถใช้กลุ่ม MySQL ถ้าคุณต้องการ แต่มันเป็นเครื่องมือที่แตกต่างอย่างสิ้นเชิงกับคุณสมบัติและข้อเสียของตัวเอง - มันค่อนข้างซับซ้อนในการตั้งค่า มันยังคงมีปัญหาจากบทลงโทษด้านประสิทธิภาพการเขียนจากการใช้การเรพลิเคทแบบซิงโครนัส


3

คู่มือที่ยอดเยี่ยมอีกข้อเกี่ยวกับเรื่องนี้ฉันได้พบ ...

http://www.dancryer.com/2010/01/mysql-circular-replication

นี่คือส่วนที่ 1 จากสามโพสต์ซีรี่ส์:

  • คู่มือคลัสเตอร์โหลดบาลานซ์ MySQL - ส่วนที่ 1 - การตั้งค่าเซิร์ฟเวอร์ด้วยตนเองและกำหนดค่าการจำลองแบบ MySQL

  • คู่มือคลัสเตอร์โหลดบาลานซ์ MySQL - ส่วนที่ 2 - ตั้งค่าสคริปต์เพื่อตรวจสอบสถานะของโหนดคลัสเตอร์ MySQL ของคุณซึ่งเราจะใช้ในคู่มือถัดไปเพื่อตั้งค่าพร็อกซีของเรา

  • คู่มือคลัสเตอร์โหลดบาลานซ์ MySQL - ส่วนที่ 3 - การตั้งค่าตัวโหลดบาลานซ์ด้วย HAProxy โดยใช้สคริปต์การตรวจสอบ


2

โดยส่วนตัวแล้ววิธีที่ดีกว่าคือการใช้ตัวโหลดบาลานซ์!

ใช่มันเพิ่มอีกจุดของความล้มเหลว แต่รูทีนใด ๆ ที่คุณใส่หรือติดตั้งบนไคลเอนต์ทุกคนเพิ่มความซับซ้อนมากขึ้นกว่าตัวโหลดบาลานซ์มาตรฐาน ....


มันสมเหตุสมผลแล้ว แต่ปัญหาคือความล้มเหลวเพียงจุดเดียว - แม้จะมี 2 LB ของ ... ในกรณีที่ลูกค้ารายใดรายหนึ่งลดลงจะส่งผลกระทบเท่านั้นและไม่มีใครอีกเลย

ยากที่จะรักษา LB ในทุก ๆ โหนด หากคุณติดตั้ง LB บนเซิร์ฟเวอร์ 12 เครื่องและคุณต้องการเปลี่ยนบางสิ่ง (ที่อยู่ของหนึ่งในฐานข้อมูลหรือเพิ่มฐานข้อมูลหรือบางอย่าง) - คุณจะสังเกตเห็นปัญหา ฉันทำ.

1

ตัวเชื่อมต่อ / J มีความสามารถในการโหลดเคียวรีที่สมดุลในหลาย ๆ เซิร์ฟเวอร์ สิ่งนี้มีไว้สำหรับ MySQL NDB Cluster ซึ่งโหนด SQL ทั้งหมดจะมีมุมมองที่สอดคล้องกันของข้อมูล แต่ถ้าคุณมั่นใจได้ว่าฐานข้อมูลต้นแบบสองตัวนั้นจะมีความสอดคล้องกันอย่างสมเหตุสมผลระหว่างต้นแบบสองตัวนี้มันอาจจะปลอดภัยสำหรับแอพพลิเคชันของคุณ

สตริงที่เชื่อมต่อจะมีลักษณะดังนี้:

jdbc: mysql: loadbalance: // host-1, host-2, ... host-n / dbname? loadBalanceStrategy = "สุ่ม" & loadBalanceBlacklistTimeout = 5000


0

การแยกการเขียนจะไม่ใช้การโหลดของเซิร์ฟเวอร์เพราะการเขียนยังคงต้องทำซ้ำ

หากคุณใช้เซิร์ฟเวอร์เพียง 2 เครื่องให้ใช้ heartbeat กับ drbd และให้ drbd จัดการกับการจำลองแบบ หากเซิร์ฟเวอร์แรกล้มเหลวเซิร์ฟเวอร์ที่สองจะเข้าแทนที่ หากคุณต้องการให้เซิร์ฟเวอร์ที่สองใช้คุณสามารถใช้ gfs บน drbd แล้วเรียกใช้เซิร์ฟเวอร์ที่สองเป็นแบบอ่านอย่างเดียวและใช้เป็นเซิร์ฟเวอร์การอ่าน เมื่อเกิดความล้มเหลวให้เปลี่ยนเซิร์ฟเวอร์เป็นอ่าน / เขียน

Re: wackamole - wackamole ไม่ได้ จำกัด อยู่ที่ 2 เซิร์ฟเวอร์

ฉันกำลังทำงานเกี่ยวกับชุดการสอนที่ครอบคลุมเรื่องนี้ แต่มันง่ายมากที่จะติดตั้ง


ใช่ตามทฤษฎีแล้ว wackamole สามารถรองรับเซิร์ฟเวอร์ได้มากกว่า 2 เครื่อง แต่คุณเคยลองใช้งานจริงหรือไม่? เราทำ. ตอนนี้เราเสียใจ

เพื่อให้ห่างไกลที่ฉันเคยมีปัญหาใด ๆ นอกเหนือจากความจริงที่ฉันไม่สามารถได้รับมันจะรวบรวมภายใต้ CentOS 5 64 บิต

0

เพื่อที่จะให้คำตอบสำหรับคำถามนี้เมื่อเร็ว ๆ นี้ด้วยเวอร์ชัน 5.6 ของ MySQL ได้แนะนำGTID (Global Transaction Identifieres) ที่มีเป้าหมายเพื่อทำให้การจำลองแบบอะซิงโครนัสมีความแข็งแกร่งมากขึ้น

ส่วนนี้อธิบายการจำลองแบบตามธุรกรรมโดยใช้ตัวระบุธุรกรรมทั่วโลก (GTIDs) เมื่อใช้ GTIDs แต่ละธุรกรรมสามารถระบุและติดตามได้ตามที่กำหนดไว้ในเซิร์ฟเวอร์ต้นทางและใช้โดยทาสใด ๆ นี่หมายความว่าไม่จำเป็นเมื่อใช้ GTID เพื่ออ้างถึงล็อกไฟล์หรือตำแหน่งภายในไฟล์เหล่านั้นเมื่อเริ่มสลาฟใหม่หรือล้มเหลวไปยังมาสเตอร์ใหม่ซึ่งทำให้งานเหล่านี้ง่ายขึ้นมาก เนื่องจากการจำลองแบบที่ใช้ GTID นั้นเป็นไปตามธุรกรรมโดยสมบูรณ์จึงเป็นเรื่องง่ายที่จะตรวจสอบว่าต้นแบบและทาสนั้นสอดคล้องกันหรือไม่ ตราบใดที่การทำธุรกรรมทั้งหมดที่ทำไว้กับมาสเตอร์นั้นถูกส่งไปยังทาสก็จะรับประกันความสอดคล้องกันระหว่างทั้งสอง คุณสามารถใช้การจำลองแบบตามคำสั่งหรือแบบแถวกับ GTIDs (ดูหัวข้อ 16.2.1“ รูปแบบการจำลองแบบ”) อย่างไรก็ตามเพื่อผลลัพธ์ที่ดีที่สุด

อ้างอิง: 16.1.3 การจำลองแบบด้วยตัวบ่งชี้การทำธุรกรรมทั่วโลก (เอกสาร MySQL)

ฉันคิดว่าการใช้ HAProxy กับการค้นหาการโหลดบาลานซ์กำลังแนะนำ SPOF (Single Point Of Failure) และเพิ่มการเต้นของหัวใจทำให้การแก้ปัญหานี้ยุ่งยาก

วิธีแก้ปัญหาที่ง่ายกว่าคือการเชื่อมต่อผ่านตัวเชื่อมต่อ Java JConnectorซึ่งมีจุดมุ่งหมายเพื่อโหลดเคียวรีแบบสมดุลผ่าน jdbc url กับโหนด MySQL ทั้งหมด สามารถจัดการการตั้งค่าหลัก / ทาสหรือการตั้งค่าหลัก / ต้นแบบ

ซึ่งทำให้สามารถติดตั้งโซลูชันคลัสเตอร์ HA ได้นอกกรอบด้วย MySQL

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.