Sử dụng gem Makara cho cơ sở dữ liệu nhân rộng
Hầu hết các trang web lớn hiện giờ, để tăng tốc độ truy xuất cơ sở dữ liệu, đều có sử dụng mô hình cơ sở dữ liệu nhân rộng _ database replication. Bao gồm một cơ sở dữ liệu master và nhiều cơ sở dữ liệu mở rộng gọi là slave. Master và slave cùng chia sẻ data và schema và luôn giữ trạng thái thống ...
Hầu hết các trang web lớn hiện giờ, để tăng tốc độ truy xuất cơ sở dữ liệu, đều có sử dụng mô hình cơ sở dữ liệu nhân rộng _ database replication.
Bao gồm một cơ sở dữ liệu master và nhiều cơ sở dữ liệu mở rộng gọi là slave. Master và slave cùng chia sẻ data và schema và luôn giữ trạng thái thống nhất. Với kiến trúc này, tất cả các quá trình ghi và cập nhật data đều được thực hiện ở master và đọc được thực hiện ở một hoặc nhiều slave từ đó cải thiện hiệu năng ứng dụng. Ngoài ra, còn đảm bảo tính tin cậy nếu database master bị hỏng thì truy vấn đọc dữ liệu vẫn được thực hiện ở slave.
Trong Rails app, ActiveRecord là nền tảng ORM dùng để kết nối các đối tượng của ứng dụng với các bảng database. ActiveRecord cung cấp các adapter cho hầu như tất cả hệ thống cơ sở dữ liệu quan hệ. Tuy nhiên, ActiveRecord không hỗ trợ nhân rộng, cho nên nếu ta sử dụng ActiveRecord MySQL adapter thì dù MySQL hỗ trợ nhân rộng, nhưng ứng dụng vẫn không thể đọc từ database slave.
Có nhiều gem hỗ trợ khả năng replication trong ActiveRecord, đó là MultiDB, Octopus và Makara. MultiDB đã rất lâu rồi không được cập nhật, trong bài viết này sẽ sử dụng Makara cho replication, mặc dụ Octopus được sử dụng rất rộng rãi, nhưng Makara cũng đã gần theo kịp với các tính năng hữu ích.
-
Khi một database slave bị down, Makara cho phép truy vấn đọc được chuyển đến slave khác hay về master, bằng cách lưu trữ một blacklist. Octopus không hỗ trợ tính năng chuyển hướng này mà sẽ đưa ra thông báo lỗi.
-
Nếu dữ liệu được ghi ở master, thì cần một khoảng thời gian để được cập nhật ở slave, vậy nên truy vấn đọc có thể không chính xác. Để đảm bảo toàn vẹn thì truy vấn đọc này cần được thực hiện ở master, octopus và makara đều có thể thực hiện được, nhưng Makara có thể thực hiện tự động, ta không cần phải tự cài đặt.
-
Mắc định là truy vấn đọc được thực hiện ở slave, truy vấn ghi được thực hiện ở master, tuy nhiên Octupus có thể linh hoạt thay đổi slave với master cho từng truy vấn. Makara thì không thể, nhưng cộng đồng đã cung cấp một phần mở rộng để giải quyết trường hợp này.
-
Khả năng bắt lỗi và hiển thị lỗi của Makara tốt hơn Octopus.
-
Makara cho phép truy vấn đọc được thực hiện ở nhiều database.
Thêm vào trong Gemfile và chạy bundle instal
gem 'makara'
Cấu hình trong file database.yml
production: adapter: '#{db_type}_makara' # db_type là kiểu database được sử dụng: mysql, postgresql, .... database: 'MyAppProduction' # thêm vài config database # thêm config cho makara makara: # cung cấp các giá trị mặc định blacklist_duration: 5 master_ttl: 5 master_strategy: round_robin sticky: true # danh sách các kết nối connections: - role: master host: master.sql.host - role: slave host: slave1.sql.host - role: slave host: slave2.sql.host
Nếu sử dụng biến môi trường cho các host thì phải đặt trong thẻ ERB
connections: - role: master blacklist_duration: 0 url: <%= ENV['DATABASE_URL_MASTER'] %> - role: slave url: <%= ENV['DATABASE_URL_SLAVE'] %>
Một vài cấu hình option:
- blacklist_duration: số giây một node nằm trong blacklist khi một kết nối bị lỗi.
- disable_blacklist: không sử dụng blacklist note khi xảy ra lỗi, nên dùng cho master.
- stickey: một node được gắn với một bối cảnh cụ thể.
- master_ttl: thời gian để bối cảnh master được tồn tại, trong trường hợp cần thực hiện truy vấn đọc ở master.
- master_strategy: sử dụng một cách thức khác để lựa chọn node thực hiện
Để biết câu truy vấn gọi đến master hay slave nào thì ta có thể kiểm tra trong log server hay trong rails console.
Trên đây là cách sử dụng Makara cho như một ActiveRecord database adapter để cấu hình database replication. Link tham khảo:
- OCTOPUS VS MAKARA : READ-WRITE ADAPTERS FOR ACTIVERECORD
- Gem Makara
- Gem Octopus