ฉันไม่ได้ใช้ Elastic Beanstalk - แต่คำแนะนำที่คุณกำลังติดตามคือสำหรับ EC2 (ซึ่งฉันช่วยได้แน่นอน) ปัญหาแรกที่คุณมีคือคำแนะนำที่คุณใช้สำหรับ Ubuntu 9.10; Linux ของ Amazon นั้นใช้ CentOS/RHEL ดังนั้น คุณจะมีเวลามากขึ้นหากคุณสามารถหาคู่มือ CentOS 6 ได้
ต้นตอของปัญหาของคุณน่าจะมาจาก 'การแนบโวลุ่ม EBS' บน EC2 คุณสามารถแนบวอลุ่ม EBS หลายรายการกับอินสแตนซ์เดียวได้ อินสแตนซ์ทั้งหมดมีวอลุ่มรูท - สามารถสนับสนุน S3 หรือ EBS ได้ จนถึงตอนนี้ แนวทางที่ต้องการคือการใช้ไดรฟ์ข้อมูลรากที่ได้รับการสนับสนุนโดย EBS (มีค่าใช้จ่ายเพิ่มขึ้นเล็กน้อย แต่ชดเชยด้วยความยืดหยุ่นและความทนทาน) อินสแตนซ์ที่มีไดรฟ์ข้อมูลราก EBS มักจะมีไดรฟ์ข้อมูลนี้แนบเป็น /dev/sda1 - ในระบบ Linux สมัยใหม่ อุปกรณ์จะแสดงเป็น /dev/xvda1 (และเป็นรุ่นหลังที่ควรส่งผ่านไปยังคำสั่งใดๆ) (นอกเหนือจากการพยายามฟอร์แมตวอลุ่มที่เมาท์ - คุณกำลังพยายามฟอร์แมตระบบไฟล์รูทของคุณด้วยอินสแตนซ์ที่ทำงานอยู่ - เช่น คุณกำลังพยายามลบระบบปฏิบัติการของคุณ ซึ่งไม่ใช่ความคิดที่ดีเลย หากเป็นไปได้)
ในกรณีนี้ คำแนะนำคือให้เพิ่มโวลุ่ม EBS ที่สอง - แนบไปกับอินสแตนซ์ของคุณ (เช่น /dev/sdh แต่ใช้ /dev/xvdh สำหรับคำสั่ง) และใช้สำหรับจัดเก็บข้อมูล MySQL ของคุณ (แม้จะไม่ได้ใช้ Elastic Beanstalk) ฉันพบว่ามันยากที่จะเชื่อว่า Elastic Beanstalk จะไม่อนุญาตให้คุณแนบวอลุ่มที่สอง เนื่องจากฟังก์ชันนี้ค่อนข้างเป็นศูนย์กลางของ EC2
คุณควรจะสามารถรับรายการอุปกรณ์ EBS ได้โดยการเรียกใช้cat /proc/partitions
(หรือใช้fdisk -l
)
คุณจะสังเกตได้ว่าในขั้นตอนที่ 5 ของสิ่งที่คุณทำ คุณกำลังติดตั้งไดรฟ์ข้อมูลรูทในตัวมันเอง (เช่น /dev/sda1 ติดตั้งเป็น / และคุณกำลังติดตั้ง /dev/sda1 เป็น /ebsvol) - ทางที่ดีควร หลีกเลี่ยงการทำอย่างนั้น
นอกจากนี้ในขณะที่/etc/init.d/mysql stop
ไม่ทำงาน/etc/init.d/mysqld stop
อาจจะได้ทำงาน (อีกครั้ง คุณสามารถรับรายการสคริปต์ init.d ได้ด้วยการรันls /etc/init.d
และควรจะใช้เส้นทางเหล่านั้นได้ เช่นเดียวกับคุณ ฉันมักจะใช้service
คำสั่งนี้)
ฐานข้อมูล MySQL ควรอยู่ใน /var/lib/mysql - อย่างไรก็ตาม จุดเชื่อมต่อของคุณใน /etc/fstab อาจไม่ถูกต้อง (เนื่องจาก ebsvol ภายใน /ebsvol ปัญหา) เมื่อคุณcd /var/lib/mysql
ควรจะสามารถเห็นฐานข้อมูลของคุณ - ถ้าไม่ใช่การเมานท์ของคุณก็ทำงานไม่ถูกต้อง (ตรวจสอบว่า /var/lib/mysql ติดตั้งบนอุปกรณ์อื่นโดยmountpoint -d /var/lib/mysql
และเปรียบเทียบอุปกรณ์กับcat /proc/partitions
)
แนวคิดพื้นฐานของคำแนะนำที่คุณกำลังติดตามนั้นค่อนข้างใช้ได้ - เป็นเรื่องปกติที่จะใส่ข้อมูลและฐานข้อมูลของคุณบนโวลุ่ม EBS ที่แตกต่างจากโวลุ่มรูทของคุณ เนื่องจากมีข้อดีมากมาย (ประสิทธิภาพ การทำสแนปชอตที่ง่าย ง่ายต่อการย้ายระหว่างอินสแตนซ์ ฯลฯ) และคำสั่งพื้นฐานสำหรับ Linux ไม่ได้เปลี่ยนแปลง - คำสั่งเหล่านี้มีไว้สำหรับ Ubuntu เท่านั้น
เลิกทำการเมานต์ของคุณด้วยumount /path
- แน่นอน คุณจะต้องแน่ใจว่าอุปกรณ์ไม่ยุ่ง (ซึ่งอาจไม่ใช่ปัญหาหากคุณยังไม่ได้เริ่ม MySQL) umount เป็นเพียงชั่วคราว - ดังนั้นคุณจะต้องแก้ไข/etc/fstab
และลบการอ้างอิงใด ๆ ไปยังจุดเชื่อมต่อออกจากที่นั่นด้วย หากคุณไม่มีค่าอะไรในอินสแตนซ์ คุณอาจจะเริ่มต้นใหม่ได้ดีกว่า (ไม่ใช่เพราะเป็นการยากที่จะเลิกเมาต์วอลุ่มบางรายการ แต่เนื่องจากมันง่ายกว่าเสมอที่จะรู้ว่าคุณผิดพลาดจากจุดใดเมื่อเริ่มต้นจาก สถานะที่ทราบ)
สุดท้าย เกี่ยวกับ MySQL บน Elastic Beanstalk: ประเด็นของ Elastic Beanstalk ควรจะเป็นการจัดการการจัดเตรียมทรัพยากรและการปรับขนาดโดยอัตโนมัติ - ยังคงอิงตามส่วนประกอบหลักของ AWS (เช่น EC2, S3, ELB เป็นต้น) แต่ จะทำบางสิ่งให้คุณ Elastic Beanstalk มักใช้ RDS เพื่อจัดการฐานข้อมูล MySQL RDS คือ MySQL เวอร์ชันที่ได้รับการจัดการของ Amazon ซึ่งทำให้การจัดเตรียมและการปรับขนาดของอินสแตนซ์ MySQL ง่ายขึ้น โปรดทราบว่า MySQL นั้นไม่สามารถให้การปรับขนาดอัตโนมัติได้ดีหากไม่มีการตั้งค่าจำนวนมาก คุณไม่สามารถเปิดอินสแตนซ์ MySQL ตัวที่สองและแบ่งโหลดระหว่างสองอินสแตนซ์ได้ - คุณต้องตั้งค่าการจำลองแบบ ซึ่งอาจไม่ใช่งานง่าย)
โดยพื้นฐานแล้ว หากคุณสามารถตั้งค่า MySQL ในลักษณะที่รันจากอินสแตนซ์เว็บเซิร์ฟเวอร์ของคุณ และสามารถปรับขนาดอัตโนมัติได้อย่างลงตัว คุณเกือบจะดีกว่าแน่นอนถ้าใช้ EC2 โดยตรงและไม่ต้องกังวลกับ Elastic Beanstalk ฉันขอแนะนำว่าคนส่วนใหญ่ไม่ได้ตั้งค่า MySQL บน Elastic Beanstalk (สิ่งที่คุณทำได้คือตั้งค่าอินสแตนซ์ MySQL แยกต่างหาก แต่ถ้าคุณใช้ Beanstalk RDS น่าจะเป็นแนวทางที่ง่ายกว่า)
แก้ไข:
ต่างจากบริการอื่นๆ มากมายที่ทำงานเป็นกล่องดำเป็นส่วนใหญ่ Elastic Beanstalk ให้คุณเข้าถึงส่วนประกอบพื้นฐานได้ ที่กล่าวว่า หากคุณกำลังจะใช้ความพยายามในการตั้งค่าอินสแตนซ์ EC2 ของคุณด้วยตนเอง แสดงว่าคุณได้ลบล้างประเด็นของ Elastic Beanstalk แล้ว
หากคุณกำลังใช้ EC2 มีวิธีสองสามอย่างสำหรับ PHP/MySQL:
- คุณสามารถโฮสต์ทั้งเว็บเซิร์ฟเวอร์และฐานข้อมูลของคุณในอินสแตนซ์เดียว - เมื่อคุณเริ่มต้น วิธีนี้อาจเป็นวิธีที่สมเหตุสมผล อย่างไรก็ตาม มันไม่สามารถปรับขนาดในแนวนอนได้ดีมาก (แต่คุณยังสามารถปรับขนาดในแนวตั้งได้ โดยใช้อินสแตนซ์ที่ใหญ่ขึ้น) หวังว่าเมื่อถึงเวลาที่คุณใช้อินสแตนซ์ x-large เกินความจุ คุณจะอยู่ในตำแหน่งที่จะตั้งค่าการตั้งค่าที่ซับซ้อนยิ่งขึ้นได้ ที่กล่าวมาไม่ดีสำหรับความซ้ำซ้อน - ทุกอย่างอยู่ในอินสแตนซ์เดียวและความล้มเหลวของส่วนประกอบใด ๆ จะทำลายการตั้งค่าทั้งหมดของคุณ
- คุณสามารถโฮสต์เว็บเซิร์ฟเวอร์ของคุณในอินสแตนซ์เดียว และใช้ RDS สำหรับฐานข้อมูลของคุณ แอปพลิเคชั่นที่ออกแบบมาอย่างดีส่วนใหญ่จะเก็บภาษีเว็บเซิร์ฟเวอร์มากกว่าฐานข้อมูล ในสถานการณ์เช่นนี้ คุณสามารถปรับขนาดอินสแตนซ์ของเว็บเซิร์ฟเวอร์ได้ค่อนข้างง่าย (เช่น โดยวางไว้หลัง ELB โดยใช้ความพยายามเพียงเล็กน้อยเพื่อให้แน่ใจว่าทั้งหมดให้บริการเนื้อหาเดียวกัน) RDS คือ MySQL ที่จัดการโดย AWS ซึ่งไม่ใช่ระบบอัตโนมัติทั้งหมด แต่ใช้งานได้ยาวนานในการปรับขนาดอัตโนมัติ โดยพื้นฐานแล้ว RDS จะจัดเตรียมสเลฟแบบอ่านอย่างเดียวหลายตัว และไรท์มาสเตอร์ตัวเดียว พร้อมการสำรองข้อมูลแบบด่วนหลายรายการที่สามารถเข้าควบคุมได้หากคุณต้องการ ข้อเสียคือคุณจ่ายเงินสำหรับอินสแตนซ์ทั้งหมดที่ทำงานอยู่ (และคุณไม่สามารถควบคุมการตั้งค่าที่ซับซ้อนบางอย่างของ MySQL ได้อย่างเต็มที่)
- แนวทางสุดท้ายคือการใช้คลัสเตอร์เว็บเซิร์ฟเวอร์และคลัสเตอร์ MySQL ของคุณเอง โดยพื้นฐานแล้ว คุณสามารถปรับขนาดอินสแตนซ์เว็บของคุณ (ดังด้านบน) จากนั้นคุณจะตั้งค่าอินสแตนซ์ MySQL ที่จะปรับขนาดแยกต่างหาก คุณจะต้องพิจารณาการจำลองแบบ MySQL (หรืออาจใช้คลัสเตอร์ MySQL หากคุณสามารถปรับแอปพลิเคชันของคุณให้เข้ากับโครงสร้างข้อมูลได้)
คำตอบอื่น ๆ ในหัวข้อเดียวกัน:
มุมมองของฉันมักจะแก้ปัญหาด้วยการคลิกเพียงครั้งเดียวไม่ใช่วิธีที่ดีที่สุด ฉันชอบการควบคุมที่นำเสนอโดยการทำบางสิ่งด้วยตนเอง ฉันพบว่าไม่เพียงแต่ฉันมักจะได้ผลลัพธ์ที่เหมาะสมและมีประสิทธิภาพมากขึ้นเท่านั้น แต่ฉันยังมีความเข้าใจที่ดีขึ้นมากเกี่ยวกับวิธีการทำงานของระบบ ซึ่งทำให้การค้นหาว่าอะไรผิดพลาดได้ง่ายขึ้นมาก คุณสามารถทำให้การตั้งค่าของคุณเป็นแบบอัตโนมัติได้เสมอเมื่อคุณมีความเข้าใจที่ดีเกี่ยวกับความซับซ้อนของมันแล้ว
สิ่งหนึ่งที่ควรคำนึงถึงเกี่ยวกับ RDS - ได้รับการสนับสนุน EBS แล้ว RDS คือ MySQL - ไม่ใช่สิ่งที่คล้ายคลึงกันหรือฐานข้อมูลเชิงสัมพันธ์อื่น เป็นอินสแตนซ์ที่มีการจัดการของ MySQL ที่ทำงานบนอินสแตนซ์ EC2 ที่ได้รับการสนับสนุน EBS AWS จะคอยอัปเดตซอฟต์แวร์ให้ทันสมัยอยู่เสมอ และคุณสามารถทำสแนปชอต EBS ปกติของข้อมูลของคุณได้ ฯลฯ คุณไม่มีสิทธิ์เข้าถึงซอฟต์แวร์พื้นฐานที่ทำงานบนอินสแตนซ์โดยตรง
สำหรับทางเลือกของระบบปฏิบัติการ ฉันเป็นส่วนหนึ่งของ Linux ของ Amazon AWS รองรับเป็นอย่างดีและใช้ทรัพยากรขั้นต่ำ - เข้ากันได้กับ CentOS อย่างสมบูรณ์ (ตามจริงแล้วจะรวมที่เก็บ EPEL ตามค่าเริ่มต้นในเวอร์ชันล่าสุด) มุมมองปกติคือการใช้ลีนุกซ์รุ่นใดก็ตามที่คุณพอใจ เนื่องจากความแตกต่างมักจะเล็กน้อย (CentOS จะทำงานเช่นเดียวกับอูบุนตูสำหรับคำแนะนำที่คุณใช้ - คำสั่งส่วนใหญ่ (ยกเว้น apt-get) เหมือนกันบน CentOS เนื่องจากการตั้งค่าของฉันเองมีฐานข้อมูลในไดรฟ์ข้อมูล EBS แยกต่างหากโดยใช้ Linux ของ Amazon ฉันจึงรับรองได้ว่าทำได้ไม่ยาก)
ฉันขอแนะนำว่ามีข้อควรพิจารณาหลักบางประการ:
- ความสบายพร้อม/เต็มใจที่จะเรียนรู้ระบบ Linux - ถ้าคุณไม่รังเกียจที่จะตั้งค่าเซิร์ฟเวอร์ของคุณเองและต้องการทำความเข้าใจระบบเหล่านี้ให้ดีขึ้น ฉันจะไปที่เส้นทาง EC2 อย่างแน่นอน คุณจะลงเอยด้วยผลลัพธ์ที่ดีขึ้นหากคุณทำถูกต้องและจะมีความเก่งกาจมากขึ้นในระยะยาว ฉันจะพูดถึงว่าถ้าคุณใช้วิธีนี้ คุณต้องการที่จะเข้าใจจริงๆ ว่าคำสั่งที่คุณกำลังเรียกใช้ทำ - เพียงแค่ทำตามคำแนะนำจะไม่เพียงพอหากคุณต้องการยอมรับจริง ๆ
- งบประมาณ - จำไว้ว่าด้วย AWS ทุกอย่างมีราคา ยิ่ง AWS ทำเพื่อคุณมากเท่าไหร่ พวกเขาก็ยิ่งเรียกเก็บเงินคุณมากเท่านั้น อินสแตนซ์ RDS มีค่าใช้จ่ายมากกว่าอินสแตนซ์ EC2 ที่เทียบเท่ากันประมาณ 30% (และไม่มีอินสแตนซ์ขนาดเล็ก) และหากคุณต้องการความซ้ำซ้อนที่มีให้ คุณจะต้องใช้งานอินสแตนซ์ RDS หลายรายการ (และชำระเงินสำหรับแต่ละรายการ) Elastic Beanstalk จะจัดเตรียมอินสแตนซ์ ตัวจัดสรรภาระงาน อินสแตนซ์ RDS ฯลฯ ให้คุณ - ค่าใช้จ่ายจะเพิ่มขึ้นอย่างรวดเร็ว
- เวลา - หากคุณไม่มีเวลา ต้องการกดปุ่มสองสามปุ่มและมีบางอย่างที่ใช้งานได้ Elastic Beanstalk น่าจะเป็นแนวทางที่ดีที่สุดสำหรับคุณ
ฉันขอแนะนำว่าอย่าใช้ Elastic Beanstalk กับ MySQL ที่ฝังอยู่ใน AMI ของคุณ - มันอาจจะค่อนข้างไม่เสถียร ถ้ามันใช้งานได้เลย (ลองคิดดูว่าเกิดอะไรขึ้นเมื่อเพิ่มและลบอินสแตนซ์ไปยังคลัสเตอร์ของคุณ หรือเมื่อข้อมูลไปที่อินสแตนซ์หนึ่งแทนที่จะเป็นอีกอินสแตนซ์...)
เป็นการดีที่จะคำนึงถึงความสามารถในการปรับขนาด - แต่อย่าเพิ่มประสิทธิภาพสิ่งต่าง ๆ เร็วเกินไป มิฉะนั้นคุณจะไม่ทำอะไรเลย พึงระลึกไว้เสมอว่า แต่ถ้าต้นทุน (เวลา เงิน ฯลฯ) ในการทำส่วนประกอบเฉพาะที่ไม่สามารถปรับขนาดได้ในขณะนี้ อย่ากังวลมากเกินไปกับมัน - เมื่อถึงเวลาที่จะต้องปรับขนาด คุณ' จะคิดออก (เว็บไซต์ยอดนิยมส่วนใหญ่เริ่มต้นแบบนั้น)
ฉันขอแนะนำว่าหากแอปพลิเคชันของคุณได้รับการออกแบบมาเพื่อให้สามารถใช้ประโยชน์จากการแคชได้ แอปพลิเคชันของคุณจะใช้งานได้ไกล
โดยปกติ ใน EC2 จะดีกว่าที่จะปรับขนาดในแนวตั้ง (เป็นอินสแตนซ์ที่ใหญ่กว่า) มากกว่าในแนวนอน (เป็นอินสแตนซ์จำนวนมากขึ้น) อย่างไรก็ตาม ในการเริ่มต้น คุณต้องปรับขนาดเป็นสองอินสแตนซ์ เพื่อให้คุณมีความซ้ำซ้อนและลดจุดล้มเหลวเพียงจุดเดียว แนวทางที่เป็นไปได้อาจเป็นดังนี้:
- เริ่มต้นด้วยอินสแตนซ์ขนาดเล็ก - มีทั้งฐานข้อมูลและแอปพลิเคชันของคุณ (คุณไม่สามารถเล็กกว่านี้ได้อีก ซึ่งทำให้เป็นจุดเริ่มต้นที่ดี)
- แน่นอนว่าการปรับขนาดในแนวตั้งทำได้ง่ายมาก เพียงอัปเกรดอินสแตนซ์ของคุณต่อไปจนกว่าคุณจะใช้อินสแตนซ์ขนาดใหญ่ x ปัญหาเกิดจากความซ้ำซ้อน หากมีปัญหากับอินสแตนซ์ แอปพลิเคชันของคุณออฟไลน์
- ในตอนนี้ คุณมักจะต้องการแยกฐานข้อมูลของคุณไปยังอินสแตนซ์อื่น (เนื่องจาก a) ฐานข้อมูลจะเห็นการโหลดที่แตกต่างจากแอปพลิเคชันของคุณ และ b) คุณไม่สามารถปรับขนาดอัตโนมัติของ MySQL ในลักษณะเดียวกับเว็บเซิร์ฟเวอร์) แต่อินสแตนซ์ขนาดเล็กก็ทำไม่ได้ รองรับการโหลดได้ไม่ดี ดังนั้นฉันขอแนะนำให้อัปเกรดเป็นอินสแตนซ์ที่ใหญ่กว่าก่อน อย่างน้อยก็ขนาดเล็ก และอาจเป็นสื่อ (โดยพื้นฐานแล้ว แนวคิดก็คือเมื่อคุณต้องการประเภทอินสแตนซ์ที่ใหญ่ขึ้น เอฟเฟกต์น่าจะมากกว่า)
- แยกฐานข้อมูลของคุณออกจากเว็บเซิร์ฟเวอร์ของคุณ สิ่งนี้จะช่วยให้คุณสามารถตอบสนองความต้องการที่แตกต่างกันสำหรับฐานข้อมูล (เช่น หน่วยความจำสูง) กับเว็บเซิร์ฟเวอร์ (เช่น cpu ที่สูงกว่า) และความแตกต่างระหว่างวิธีการปรับขนาดแต่ละฐานข้อมูล ( Recommend reading ) ณ จุดนี้ คุณอาจตัดสินใจใช้ RDS แทนการเรียกใช้อินสแตนซ์ MySQL ของคุณเอง
- เมื่อคุณให้แอปพลิเคชันของคุณทำงานบนอินสแตนซ์เฉพาะแล้ว คุณสามารถปรับขนาดได้และไม่ต้องกังวลกับฐานข้อมูลของคุณ - ตั้งค่าการปรับขนาดอัตโนมัติเพื่อให้คุณมีความซ้ำซ้อน สิ่งนี้ควรเพิ่มโหนดของแอปพลิเคชันโดยอัตโนมัติ เนื่องจากโหนดใดโหนดหนึ่งล้มเหลวหรือเมื่อโหลดเกินขีดจำกัดที่คุณระบุ
- เพิ่มโหนดฐานข้อมูลที่สองและกำหนดค่าการจำลองแบบระหว่างโหนดของคุณ (หากคุณเลือกใช้คลัสเตอร์ MySQL หรือโซลูชัน NoSQL คุณควรตั้งค่าการปรับขนาดอัตโนมัติได้เช่นกัน) ณ จุดนี้ทุกอย่างควรมีความซ้ำซ้อน และแม้ว่าโหนดจะล้มเหลว คุณก็ยังควรออนไลน์อยู่
- อัปเกรดครั้งละหนึ่งอินสแตนซ์เป็นขนาดอินสแตนซ์ที่ใหญ่ขึ้นตามความต้องการ