2012-08-06 51 views
16

Gần đây tôi đã thiết lập một bản sao đã đọc để thực hiện một số lần đọc tải xuống của cá thể Amazon RDS đa AZ của tôi. Tài liệu của Amazon nêu rõ rằng đó là "tùy thuộc vào ứng dụng của bạn để xác định lưu lượng đọc được phân phối trên các bản sao đã đọc của bạn".Có ai đã tìm ra cách để mở rộng bản sao của Amazon RDS?

Có ai đã tìm ra một cách có thể quản lý để mở rộng bản sao đã đọc không? Nó không có vẻ giống như một giải pháp rất mở rộng để có các phần khác nhau của ứng dụng của tôi được mã hóa cứng để đọc từ các bản sao cụ thể. Có cách nào để thiết lập này là tương tự như đặt EC2 trường hợp đằng sau một cân bằng tải?

Trả lời

7

Kỹ sư AWS đã cung cấp một số thông tin chi tiết về câu hỏi here.

Dưới đây là một đoạn trả lời của mình:

nói chung bạn có thể cân bằng tải giao thông tại 3 địa điểm logic sau:

  • lớp Application - tạo nhiều hồ kết nối và gửi tất cả các lần đọc để đọc bản sao.
  • Khuôn khổ web/phần mềm trung gian - một số khung công tác web có hỗ trợ trong xây dựng cho nhiều cơ sở dữ liệu [1].
  • Proxy bên ngoài - Bạn có thể sử dụng proxy bên ngoài như MySQLproxy [2].

[1] - https://docs.djangoproject.com/en/dev/topics/db/multi-db/

[2] - https://launchpad.net/mysql-proxy

6

Tôi nghĩ HAProxy sẽ là một lựa chọn tốt để cân bằng tải giữa nhiều bản sao đọc. Bạn có thể có cấu hình như sau:

listen mysql-cluster 0.0.0.0:3306 
    mode tcp 
    balance roundrobin 
    option mysql-check user root 

    server db01 x.x.x.x:3306 check 
    server db02 x.x.x.x:3306 check 
    server db03 x.x.x.x:3306 check 

trong đó x.x.x.x là điểm cuối bản sao.

3

Tôi đã rối tung với việc sử dụng Route 53 có trọng số CNAME để tải số dư bản sao RDS đã đọc (và nguồn). Hiện tại tôi có 3 bộ bản ghi CNAME cho readdb.example.com.

Các điểm đầu tiên vào db nguồn tại db.example.com. Đây là trong trường hợp có một lỗi nhân rộng. Ứng dụng có thể dự phòng cơ sở dữ liệu gốc để đọc. Hoặc nếu bạn muốn, bạn có thể có nguồn thực hiện một số tỷ lệ tải đọc, tùy thuộc vào cách bạn đặt trọng lượng. Chính sách định tuyến được đặt thành Trọng số. Tôi có trọng lượng cho nguồn được đặt thành 1, do đó, nó chịu gánh nặng rất nhỏ của tải đọc. TTL được đặt ở mức thấp. Tôi đã thử các giá trị từ 1 đến 10. Tôi đã để nó ở mức 10 ngay bây giờ. Bạn cũng phải nhập ID bộ là bất kỳ chuỗi duy nhất nào ("Cơ sở dữ liệu nguồn").

Bản ghi thứ hai được đặt thành một trong các bản sao đã đọc (readdb1.blahblah.rds.amazonaws.com). Chính sách định tuyến có trọng số và TTL là 10 như trước đây. Nó cũng cần một bộ ID duy nhất. Tôi đặt trọng lượng cho cái này từ 5 đến 50, tùy theo. Điều này, tôi liên kết với một kiểm tra sức khỏe, mà bạn phải tạo ra trước thời hạn. Bạn có thể sử dụng một kiểm tra sức khỏe đơn giản chỉ vào bản sao, nhưng tôi đã làm một cái gì đó một chút khác nhau.

tôi đặt một tập tin như thế này trên mỗi máy chủ ứng dụng của tôi (Tôi đang sử dụng PHP đàn hồi Beanstalk, nhưng bạn có thể làm điều gì đó tương tự như trong các thiết lập khác/ngôn ngữ tôi giả sử):

<?php if($instanceid = $_GET["id"]): ?> 
<?php 
exec("aws rds describe-db-instances --db-instance-identifier " . escapeshellarg($instanceid), $rdsinfo); 
$rdsinfo = implode(' ',$rdsinfo); 
$rdsinfo = json_decode($rdsinfo, true); 
if($rdsinfo["DBInstances"][0]["StatusInfos"][0]["Normal"] && $rdsinfo["DBInstances"][0]["DBInstanceStatus"] === "available"){ 
    echo "GOOD!"; 
    } 
else { 
    echo "BAD!"; 
    }; 
/* Then there's some other stuff in here that is a little unrelated to the question */ 
?> 
<?php endif ?> 

Tập tin này sử dụng giao diện dòng lệnh AWS được cài đặt trên các ứng dụng Beanstalk Elastic và chỉ yêu cầu các biến môi trường cho AWS_ACCESS_KEY_ID, AWS_DEFAULT_REGION và AWS_SECRET_KEY được chỉ định trước thời hạn. Vì vậy, sau đó bạn thực hiện kiểm tra sức khỏe Tuyến đường 53 trỏ đến http://www.example.com/rdshealthcheck/rdsshealthcheck.php?id=readdb1. Bạn đặt chuỗi tìm kiếm thành "TỐT!" Tôi nghĩ chuỗi tìm kiếm có giá $ 1/tháng/lần kiểm tra sức khỏe, điều này có vẻ hợp lý.

Nếu bạn có bản sao được đọc thứ hai, bạn có thể tạo một kiểm tra sức khỏe khác trỏ đến http://www.example.com/rdshealthcheck/rdsshealthcheck.php?id=readdb2 hoặc bất kỳ thứ gì được gọi.

Tôi thực sự chỉ sử dụng một bản sao đã đọc tại thời điểm này, nhưng nó lớn hơn đáng kể so với db nguồn của tôi. Đó là kinh tế hơn cho tôi, bởi vì DB nguồn của tôi là đa az. Tôi giữ bộ hồ sơ thứ ba và kiểm tra sức khỏe thứ hai xung quanh trong trường hợp bản sao đầu tiên cho tôi vấn đề. Bằng cách đó, tôi không phải chờ cho người đầu tiên xóa trước khi khởi chạy lại nó. Thay vào đó, tôi ngay lập tức xóa cái đầu tiên và khởi chạy cái thứ hai bằng tên được chỉ định trong bản ghi thứ ba (và kiểm tra sức khỏe thứ hai).

0

Tôi muốn đề xuất phương pháp tiếp cận nhiều hơn.
Đó là, DNS Round-robin với Amazon Route 53.

Như bạn có thể thấy trong số article,
Amazon Route 53 này có thể làm Round-robin với nhiều CNAME.

Sau đó, tất cả các bạn cần làm là

  1. "Tạo Sets Record" ở Route 53.
  2. Cập nhật tập tin cấu hình của bạn trong ứng dụng của bạn.

Trong trường hợp của tôi, phương pháp này hoạt động tốt.

+0

Một điều khiến tôi lo ngại về cách tiếp cận này là một số ngôn ngữ như Java lưu trữ các giải pháp DNS để cải thiện hiệu suất có thể dẫn đến việc lưu lượng truy cập của tôi không được cân đối với tất cả các bản sao đã đọc của tôi như được lưu ý tại đây: http://docs.aws. amazon.com/AWSSdkDocsJava/latest/DeveloperGuide/java-dg-jvm-ttl.html –

+0

Trừ khi bạn có nhiều phiên bản phụ trợ sẽ lưu địa chỉ khác nhau. –

+0

@PauloMiguelAlmeida Cảm ơn thông tin! – turutosiya