Một số kỹ thuật để cập nhật lược đồ cơ sở dữ liệu / cơ sở dữ liệu của máy chủ sản xuất mà không gây ra bất kỳ thời gian chết nào?
Một số kỹ thuật để cập nhật lược đồ cơ sở dữ liệu / cơ sở dữ liệu của máy chủ sản xuất mà không gây ra bất kỳ thời gian chết nào?
Câu trả lời:
Nói chung, các trang web tôi đã làm việc có loại yêu cầu này đều nằm sau bộ cân bằng tải hoặc có các vị trí chuyển đổi dự phòng riêng biệt. Trong mẫu này, tôi sẽ cho rằng bạn đã có một bộ cân bằng tải, 2 máy chủ web (A & B) và 2 máy chủ cơ sở dữ liệu (M & N - thường là các máy chủ DB được liên kết thông qua logshipping - ít nhất là trong thế giới Máy chủ SQL ).
Trong một ứng dụng web rất phức tạp, những gì được mô tả là các bước 1-5 có thể mất cả đêm và là bảng tính Excel 50 trang với thời gian và số liên lạc khẩn cấp. Trong các tình huống như vậy, việc cập nhật một nửa hệ thống được lên kế hoạch từ 6 giờ tối đến 6 giờ sáng trong khi hệ thống có sẵn cho người dùng. Xử lý cập nhật cho trang web DR thường được lên kế hoạch cho đêm tiếp theo - chỉ hy vọng không có gì phá vỡ vào ngày đầu tiên.
Trong đó thời gian hoạt động là một yêu cầu, các bản vá được thử nghiệm đầu tiên trên môi trường QA, lý tưởng là phần cứng giống như sản xuất. Nếu họ cho thấy không có sự gián đoạn, sau đó họ có thể được áp dụng trên lịch trình thường xuyên, thường là vào cuối tuần.
Đối với cơ sở dữ liệu điển hình (ví dụ: Oracle) có thể thay đổi lược đồ cơ sở dữ liệu trong khi vẫn chạy các truy vấn song song. Nó đòi hỏi một số kế hoạch về phía trước mặc dù.
Chúng là một số hạn chế cho sự thay đổi được áp dụng:
CREATE INDEX
)Để lược đồ tương thích ngược, bạn thường có thể THÊM hoặc SỬA ĐỔI một cột, bạn chỉ có thể DROP một cái gì đó nếu mã hiện tại không sử dụng nó nữa.
Nếu mã của bạn không thể xử lý thay đổi trong suốt, thì hãy thay đổi mã trước khi thay đổi cơ sở dữ liệu.
Lời khuyên đơn giản về lập kế hoạch chuyển tiếp: luôn luôn rõ ràng các tên cột trong các yêu cầu DB của bạn (không sử dụng SELECT * FROM
). Bằng cách này, bạn sẽ không có các cột mới hiển thị trong các yêu cầu cũ.
select *
có nghĩa là mã bị hỏng nếu a cột mới được thêm vào (vì thiếu một biến để ghi nó vào). Tất nhiên, đây có thể là kết quả của việc sử dụng ngôn ngữ được gõ mạnh.
select *
đáng tin cậy và an toàn hơn. Nếu bạn đã từng có select one, two from ...
thì bạn chỉ sử dụng one
và two
; nếu third
được thêm vào bảng, thì bạn không có sử dụng cho nó (ở đây), vì vậy không có lý do gì để lấy nó. Và nếu bạn cần sử dụng nó đột ngột, thì bạn sẽ sửa đổi mã, vì vậy bạn cũng có thể sửa đổi truy vấn vào thời điểm này!
select
cần phải chọn lọc nhất có thể (và được bao phủ bởi một chỉ mục) nếu không tôi sẽ nướng (ngay cả trước khi bắt buộc tham gia). Tôi rất tiếc phải nói, nhưng cách tiếp cận mà bạn đang mô tả là một thất bại hoàn toàn trên các sản phẩm đó.
Không phải tất cả các hệ thống đều có thể, nó phải được thiết lập theo cách hỗ trợ nó.
Ví dụ: một trong những hệ thống chính của chúng tôi mà tôi đã giúp nâng cấp vài năm trước sẽ có sẵn 24/7. Nó bao gồm nhiều tầng, bao gồm một tầng giao tiếp thuần túy giữa lớp Giao diện người dùng và lớp nghiệp vụ ngoài trang web. Do cách thức lớp giao tiếp được mã hóa, mọi thay đổi trong tương lai đối với lược đồ DB hoặc lớp nghiệp vụ có thể được thực hiện mà không bị ngừng hoạt động thực sự. Trong trường hợp xấu nhất, người dùng sẽ bị tạm dừng 10-30 giây khi các thay đổi có hiệu lực.
Nếu các thay đổi hoàn toàn là mã thay đổi cho lớp doanh nghiệp, chúng có thể được xếp hàng và 'đạp xe' chỉ với độ trễ mili giây.
Nó có thể làm điều này bởi vì:
Các kỹ thuật khác liên quan đến việc nhân rộng các giao dịch sang một tấm gương khác của hệ thống hiện có. Bằng cách áp dụng bản cập nhật cho một, chuyển đổi và phát lại tất cả các giao dịch được thực hiện giữa cập nhật và chuyển đổi. YMMV tùy thuộc vào hệ thống của bạn mặc dù.
Đây là một quan điểm khác nhau, từ thế giới của các hệ thống cơ sở dữ liệu nhúng và các hệ thống nhúng. Các hệ thống nhúng bao gồm nhiều thiết bị hạ tầng mạng / viễn thông khác nhau và trong lĩnh vực này, họ thường nói về thời gian hoạt động 99,999% (năm 9 giây).
Chúng tôi (McObject) là nhà cung cấp của dòng sản phẩm hệ thống cơ sở dữ liệu nhúng eXtremeDB, bao gồm cả tính sẵn sàng cao của eXtremeDB.
Trước tiên, hãy hiểu rằng "cơ sở dữ liệu nhúng" có nghĩa là hệ thống cơ sở dữ liệu là một thư viện được biên dịch và liên kết với mã ứng dụng của bạn; theo nghĩa đó, nó được "nhúng" vào ứng dụng của bạn.
Với tính khả dụng cao của eXtremeDB, có một phiên bản MASTER của ứng dụng của bạn (có thể là một hoặc một số quy trình) và một hoặc nhiều phiên bản REPLICA của ứng dụng của bạn. Khi một bản sao thiết lập kết nối với chủ, nó sẽ nhận được một bản sao của cơ sở dữ liệu của chủ thông qua một quá trình gọi là "đồng bộ hóa ban đầu". Điều này có thể được thực hiện trong khi ứng dụng chủ tiếp tục công việc của nó. Sau khi đồng bộ hóa, nó nhận được các giao dịch của chủ thông qua nhân rộng. Do đó, một bản sao luôn có dữ liệu hiện tại và có thể tiếp quản (thông qua một quá trình được gọi là failover) trong trường hợp chủ bị lỗi.
Một tính năng của đồng bộ hóa ban đầu được gọi là "tiến hóa lược đồ nhị phân." Nói một cách dễ hiểu, điều này có nghĩa là quá trình điền vào cơ sở dữ liệu của bản sao sẽ chứa các khác biệt giữa lược đồ cơ sở dữ liệu của bản sao và lược đồ cơ sở dữ liệu của chủ.
Trong thực tế, điều này có nghĩa là bạn có thể xây dựng một phiên bản mới hơn của ứng dụng của mình (với các bảng mới / bị hủy, các trường mới / bị giảm / thay đổi, chỉ mục mới / bị hủy), đính kèm phiên bản mới của ứng dụng của bạn với một bản gốc, và sau đó gây ra điều đó bản sao mới hơn để trở thành chủ nhân mới (tức là buộc chuyển đổi dự phòng sang bản sao mới để nó trở thành chủ nhân và chủ cũ tự tắt). Voila, bạn đã di chuyển ứng dụng của mình từ phiên bản N sang N + 1, mà không làm gián đoạn tính khả dụng của hệ thống. Bây giờ bạn có thể tiến hành nâng cấp bản cũ và mọi bản sao khác lên phiên bản N + 1.