CHƢƠNG 1 : TỔNG QUAN MÔ HÌNH XỬ LÝ GIAO TÁC H-STORE
2.7. Mô hình sẵn sàng
2.7.1. Mô hình K-Safety
K-safety liên quan đến việc nhân bản phân vùng vì vậy nếu một phân vùng mất (hoặc do phần cứng hoặc phần mềm) thì cơ sở dữ liệu vẫn có thể tiếp tục với các
phân cùng còn lại. Trong trường hợp VoltDB, các phân vùng sao có đầy đủ các thành phần và mọi thao tác đọc/ghi như các phân vùng khác.
K=1, cần phải nhân bản tất cả các phân vùng. K=2 yêu cầu nhân bản 2 lần cho mỗi phần vùng …v..v…
Trong mô hình bình thường, nếu một node mất, cơ sở dữ liệu tiếp tục chức năng gửi công việc tới bản sao của phân vùng.
Hình 2.5 Hoạt động với thông số K-Safety
2.7.2. Kích hoạt K-Safety
Chỉ ra giá trị K-safety trong cấu hình Cluster (file cấu hình triển khai).: <?xml version="1.0"?>
<deployment>
<cluster hostcount="6" sitesperhost="4" leader="voltserver" kfactor="2"/> </deployment>
Khi khởi động cơ sở dữ liệu với K-safety > 0, số lượng phân vùng phù hợp sẽ được gán như bản sao. Ví dụ : trong trường hợp trên, 6 node và 4 phân vùng cho 1 node, vậy tổng số là 24 phân vùng. Với K = 1, thì một nửa phân vùng (=12) sẽ được coi như bản sao. Nếu K = 2, Cluster sẽ chia thành 3 cụm bản sao (nghĩa là 8 phân vùng cho mỗi cụm).
Một điều quan trọng khi sử dụng giá trị K là, nếu chúng ta không thay đổi cấu hình phần cứng, hiệu năng sẽ giảm khi K tăng. Vì vậy đang chạy với K = 1 trên 6 node sẽ bằng với K=0 chạy trên 3 node.
Nếu muốn tăng độ tin cậy mà không ảnh hưởng đến hiệu năng, chúng ta phải tăng kích thước của cluster để cung cấp công suất phù hợp với giá trị K-safety.
2.7.2.1. Điều gì xảy ra khi kích hoạt K-Safety
Tất nhiên, để đảm bảo hệ thống lỗi không ảnh hưởng đến cơ sở dữ liệu, không chỉ duy nhất các phân vùng được nhân bản, nhưng VoltDB phải đảm bảo các bản sao được giữ riêng rẽ ở các nodes trên Cluster. Để đạt được điều đó, VoltDB tính toán số lượng tối đa của các phân vùng duy nhất có thể được tạo ra, đưa vào số Nodes, số phân vùng trên node và giá trị K-safety mong muốn.
Khi số lượng nodes là bội số của số cần nhân bản, việc tính toán sẽ dễ dàng. Ví dụ, nếu có 6 node và chọn K = 1, VoltDB sẽ tạo 2 thể hiện trên mỗi node. Nếu K = 2, VoltDB sẽ tạo 3 thể hiện trên mỗi node …
Nếu số lượng nodes không là bội của số cần nhân bản, Voltdb sẽ phân bố đều cho các phân vùng một cách tốt nhất. Ví dụ, nếu bạn có 3 nodes với 2 phân vùng trên một node. Khi bạn yêu cầu K = 1, VoltDB sẽ nhân bản 3 phân vùng, phân bố 6 phân vùng dọc theo 3 node.
2.7.2.2. Tính toán số lƣợng Nodes phù hợp cho K-Safety
Sẽ làm rõ ràng hơn việc liên quan giữa giá trị K và số lượng nodes và phân vùng trên Cluster. Lý tưởng, số lượng nodes là bội số của số bản cần copy. Tuy nhiên, nếu số lượng nodes không là bội số, VoltDB phân bố số phân vùng nhân bản dọ theo Cluster bằng cách sử dụng số lượng phân vùng duy nhất với số lượng lớn nhất có thể:
Unique partitions <= (nodes * partitions/node) / (K + 1)
Do đó, có thể chỉ ra kích thước của Cluster mà không cần là bội của K + 1, nhưng tổng số phân vùng thỏa mãn thì VoltDB sẽ sử dụng tất cả các phân vùng để tính giá trị K-safety theo yêu cầu.
Nếu hoặc số nodes hoặc tổng số phân vùng chia hết cho K+1, thì VoltDB sẽ gán các bản sao đầy đủ để đạt giá trị K-safety như mong muốn và sau đó gán các phân vùng còn lại thành các bản sao. Ví dụ, nếu xác định kích thước Cluster là 4 node với 4 phần vùng trên một node và yêu cầu K = 2. VoltDB sẽ tạo 3 bộ với 5 phân vùng duy nhất. Tuy nhiên, có 16 phân vùng. VoltDB sẽ tạo bản sao thứ 4 của một trong các phân vùng để sử dụng khe cắm có sẵn.
Cách tiếp cận này sẽ đạt được giá trị K-safety như mong muốn. Tuy nhiên, phân vùng có thể ―lãng phí‖. Do đó, tối đa hóa đầu tư thiết bị và khuyến cáo rằng khi chỉ ra giá trị K, phải đảm bảo số phân vùng là bội của K + 1.
Cuối cùng, nếu chỉ ra giá trị K lớn hơn số lượng nodes, thì sẽ không đạt được giá trị như mong muốn. Thậm chí nếu đủ số phân vùng được tạo bản sao theo yêu cầu, VoltDB không thể phân bố các bản sao tới cùng một node. Ví dụ, nếu chúng ta có 3 node với 4 phân vùng trên node (tổng là 12 phân vùng). Có đủ số phân vùng cho giá trị K = 3, nhưng không đủ node độc lập cho các bản sao. Trong trường hợp này, VoltDB sẽ gửi ra một thông báo lỗi, chúng ta hoặc phải giảm giá trị K-safety hoặc tăng số nodes .
2.7.3. Khôi phục hệ thống khi bị lỗi
Để thay thế node bị hỏng, chúng ta phải khởi động lại tiến chính VoltDB server như làm bình thường và thêm tham số "rejoinhost" với địa chỉ một node bất kỳ.
$ java -Djava.library.path=/opt/voltdb org.voltdb.VoltDB \ catalog mycatalog.jar deployment mydeployment.xml \ rejoinhost operator@voltserver2
2.7.4. Tránh phân vùng mạng (Network Partitions)
2.7.4.1. K-Safety và phân vùng mạng
Khi chạy VoltDB mà không có K-safety thì sự nguy hiểm của phân mảnh mạng là đơn giản : mất dữ liệu. Tuy nhiên, nếu chạy với K-safety, có thể xuất hiện phân mảnh mạng, hai mạng tách rời và các phân mảnh rời rạc đó của cluster vẫn đủ số phân vùng để tiếp tục hoạt động.
Ví dụ, nếu chúng ta có 3 node với 2 phân vùng trên mỗi node và K-safety = 2. Nếu phân mảnh mạng chia rẽ node A và B khởi node C, mỗi phân mảnh vẫn đủ phân vùng để chống chọi. Nodes A và B nghĩ C lỗi và C nghĩa node A và B lỗi.
Hình 2.6 Phân mảnh mạng
2.7.4.2. Sử dụng bảo vệ lỗi mạng
VoltDB cung cấp cơ chế đảm bảo phân vùng mạng không tạo ra 2 vùng copies của cơ sở dữ liệu. Đặc tính này được gọi là bảo vệ lỗi mạng.
Kích hoạt chế độ bảo vệ lỗi mạng trong deployment file, bằng cách thêm thẻ <partition-detection>. Thẻ <partition-detection> là thẻ con của <deployment> và ngang hàng thẻ <cluster>. Ví dụ :
<deployment>
<cluster hostcount="4" sitesperhost="2" leader="myvoltdbserver1" kfactor="1" />
<partition-detection enabled="true"> <snapshot prefix="netfaultsave"/> </partition-detection>
</deployment>
Chú ý, phải chỉ ra thẻ <snapshot> và thuộc tính của nó như là phần tử con <partition-detection>. Nếu phân mảnh được phát hiện, các node bị ảnh hưởng tự động snapshot và shutdown.
Khi kích hoạt bảo bệ lỗi mạng, và lỗi được phát hiện, thì bất cứ phân mảnh khả thi của cluster sẽ thực hiện các bước sau:
1. Xác định nodes nào thiếu
2. Xác định liệu nodes thiếu có là cụm cluster khả thi. Nếu đúng …
• Nếu phân mảnh hiện hành lớn hơn thì nó tiếp tục hoạt động và coi như các nodes trong phân mảnh bé hơn là bị lỗi.
• Nếu phân mảnh khác to hơn, nó thực hiện snapshot và shutdown.
Ví dụ : Phân mảnh của A và B sẽ tiếp tục chạy và C sẽ snaphost và shutdown.
Hình 2.7 Hoạt động bảo vệ lỗi mạng
Nếu 2 phân mảnh cùng kích thước, dựa trên chỉ số nội tại của các nodes để chọn ra một phân mảnh duy nhất tiếp tục hoạt động.