Skip to content

Commit

Permalink
update tutorial: distributed-system
Browse files Browse the repository at this point in the history
  • Loading branch information
vhnam committed Aug 10, 2018
1 parent e88b483 commit 421c814
Show file tree
Hide file tree
Showing 12 changed files with 382 additions and 2 deletions.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
192 changes: 191 additions & 1 deletion src/content/tutorials/distributed-system/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ <h3>Tại sao cần Distributed System?</h3>
Tin cậy, luôn sẵn sàng, downtime gần bằng 0
</li>
<li>
Độ trễ thấp
Độ trễ thấp. Độ trễ được xác định như sau: <code>result = query(all data in the system)</code>
</li>
</ul>
<p>
Expand All @@ -90,6 +90,7 @@ <h3>Tại sao cần Distributed System?</h3>
<p>
Có hai công việc cơ bản của một hệ thống máy tính đó là <strong>Lưu Trữ</strong><strong>Tính Toán</strong>. Distributed System là nghệ thuật giải quyết vấn đề của một máy tính trên nhiều máy tính.
</p>
<img src="img/dist-arch.png" alt="Distributed System - Architect">

<h3>Mục tiêu của Distributed System</h3>
<p>
Expand All @@ -103,6 +104,192 @@ <h4>Tính trong suốt</h4>
<p>
Ẩn giấu sự rời rạc của hệ thống đối với người dùng. Theo như Andrew S.Tanenbaum và Maarten Van Steen giới thiệu trong "Distributed Systems: Principles and Paradigms", tiêu chuẩn này được ghi rõ ràng trong đặc tả ISO, năm 1995. Cụ thể thì mình trong rõ phiên bản nào.
</p>
<ul>
<li>
<strong>Access transparency</strong> - che giấu sự khác biệt về cách biểu diễn và cách truy cập tài nguyên
</li>
<li>
<strong>Location transparency</strong> - che giấu vị trí của tài nguyên
</li>
<li>
<strong>Migration transparency</strong> - che giấu khả năng chuyển vị trí của tài nguyên
</li>
<li>
<strong>Relocation transparency</strong> - che giấu việc di chuyển của tài nguyên khi đang được sử dụng
</li>
<li>
<strong>Replication transparency</strong> - che giấu tình trạng tình trạng sử dụng bản sao của tài nguyên
</li>
<li>
<strong>Concurency transparency</strong> - che giấu sự chia sẻ tài nguyên đồng thời
</li>
<li>
<strong>Failure transparency</strong> - che giấu lỗi hệ thống nếu có
</li>
</ul>
<p>
Về mức độ của tính trong suốt, bạn nên cân nhắc thực hiện nhưng không phải hoàn toàn ẩn hết với người dùng.
</p>
<ul>
<li>
Người dùng ở các châu lục khác nhau, múi giờ sẽ khác nhau.
</li>
<li>
Hoàn toàn ẩn các lỗi mạng là không thể (về thực tế lẫn lý thuyết), do:
<ul>
<li>
Không phân biệt máy tính chậm hay bị lỗi
</li>
<li>
Không biết trước được máy tính có thực sự thực hiện xong một thao tác trước khi xảy ra sự cố
</li>
</ul>
</li>
<li>
Chi phí về hiệu năng nếu trong suốt hoàn toàn. Ví dụ, bạn muốn in tài liệu từ máy tính cá nhân. Máy tính của bạn kết nối với nhiều máy in. Nếu bạn biết máy in nào đang "rảnh" sẽ chọn để tiết kiệm thời gian hơn.
</li>
</ul>
<h4>Tính mở</h4>
<p>
<strong>Tính mở của Distributed System</strong> hiểu là có thể tương tác với các dịch vụ khác từ những hệ thống mở khác, bất kể môi trường nền tảng.
</p>
<ul>
<li>
Hệ thống phải phù hợp với giao diện được xác định rõ. Cụ thể là <a href="https://stackoverflow.com/questions/670630/what-is-idl">Interface Definition Language - IDL</a>.
</li>
<li>
Hệ thống nên hỗ trợ tính di động của ứng dụng
</li>
<li>
Hệ thống nên dễ dàng tương thích. Cụ thể hơn là dễ dàng cấu hình hệ thống ra khỏi các thành phần khác nhau (<em>should be easy to configure the system out of different components</em>). Cũng như là dễ dàng thêm vào hoặc thay thế một component bất kỳ mà không gián đoạn hệ thống.
</li>
</ul>
<p>
Để đạt được tính mở, ít nhất làm cho Distributed System độc lập với tính không đồng nhất của môi trường nền tảng.
</p>
<ul>
<li>
Phần cứng
</li>
<li>
Platform
</li>
<li>
Ngôn ngữ
</li>
</ul>
<h4>Tính mở rộng</h4>
<p>
Khi nói về tính mở rộng, ta sẽ ít nhất về 3 tiêu chí sau:
</p>
<ul>
<li>
<strong>Size scalability</strong> - thêm node vào hệ thống để tăng tốc độ xử lý nhưng không làm tăng độ trễ
</li>
<li>
<strong>Geographic scalability</strong> - sử dụng nhiều data center ở nhiều nơi khác nhau để giảm thời gian phải hồi đến người dùng, tuy nhiên bạn phải xử lý độ trễ cực kỳ hợp lý (khá giống tư tưởng của CDN)
</li>
<li>
<strong>Administrative scalability</strong> - thêm nhiều node, nhưng không làm tăng chi phí quản lý
</li>
</ul>
<h5>Những vấn đề khi mở rộng hệ thống</h5>
<ul>
<li>
<strong>Tập trung dịch vụ</strong> - Một server cho tất cả người dùng<br>
Sẽ gây nên tình trạng thắt cổ chai (<em>bottleneck</em>)
</li>
<li>
<strong>Tập trung dữ liệu</strong> - Một cuốn sổ điện thoại trực tuyến<br>
Giả sử bạn lưu tên miền của tất cả các trang web hiện nay vào một table trong database, sẽ như thế nào nếu bạn gửi 1 request đến truy vấn thông tin? Một phiên bản thắt cổ chai khác tại database.
</li>
<li>
<strong>Thuật toán tập trung</strong><br>
Đặc điểm của thuận toán trong Distributed System khác với các thuật toán trong Centralized System ở chỗ cần tập trung dữ liệu sẽ gây quá tải một phần mạng. Các đặc điểm đó bao gồm:
<ul>
<li>
Không có máy nào có thông tin đầy đủ về trạng thái của hệ thống
</li>
<li>
Máy móc đưa ra quyết định dựa trên thông tin cục bộ
</li>
<li>
Thất bại của một máy không ảnh hưởng đến thuật toán
</li>
<li>
Không có giả định ngầm rằng đồng hồ toàn cục tồn tại
</li>
</ul>
</li>
</ul>
<h5>Các kỹ thuật mở rộng</h5>
<p>
Có 3 kỹ thuật cơ bản trong việc mở rộng Distributed System đó là: ẩn thời gian chờ, phân tán và nhân bản.
</p>
<h6>Ẩn thời gian chờ (<em>hiding communication latencies</em>)</h6>
<p>
Tránh thời gian chờ phản hồi quá lâu. Minh hoạ cho việc này là kiểm tra dữ liệu của người dùng. Thay vì chờ phía server xử lý thì kiểm tra tại client bằng JavaScript sẽ tiết kiệm thời gian hơn.
</p>
<img src="img/scaling.png" alt="Hiding communication latencies" itemprop="image">
<p>
Hình (a) là kiểm tra tại phía server. Hình (b) là kiểm tra tại phía client.
</p>
<h6>Phân tán (<em>Distribution</em>)</h6>
<p>
Ta có thể hiểu cách này là <strong>partition</strong>, tức là chia để trị. Ví dụ về DNS là rõ ràng nhất về tính phân tán trên mạng Internet. Những nhóm <strong>domain</strong> được chia ra thành từng vùng. Chẳng hạn, tên miền <code>nl.vu.cs.flits</code>. Ban đầu nó được xử lý ở vùng Z1, sau đó chuyển sang vùng Z2 để còn <code>vu.cs.flits</code> rồi đến Z3 thành <code>cs.flits</code>.
</p>
<img src="img/scaling2.png" alt="Distribution" itemprop="image">
<h6>Nhân bản (<em>Replication</em>)</h6>
<p>
Tức là ta sẽ sao chép dữ liệu ra nhiều nơi để tăng tốc độ xử lý. Điển hình là <strong>caching</strong>.
</p>
<img src="img/part-repl.png" alt="Replication" itemprop="image">
<h4>Tính sẵn sàng</h4>
<p>
Phần này mình thấy Mikito Takada có nhắc đến khá thú vị, nên thêm vào luôn. Tính sẵn sàng thể hiện ở tỷ lệ thời gian hệ thống trong trạng thái hoạt động. Nếu người dùng không thể truy cập vào hệ thống, tức là nó không sẵn sàng. Distributed System cho phép ta đạt được những đặc tính mong muốn mà một máy lẻ không đáp ứng được. Vì nó là sự kết hợp từ nhiều máy nên có khả năng một máy trong hệ thống bị sập. Distributed System là sự kết hợp của nhiều mấy có thể sập bất cứ lúc nào và ta phải xây dựng một cơ đáng tin cậy bao quát chúng.
</p>
<p>
Tính sẵn sàng nhìn ở góc độ kỹ thuật, đó là khả năng chịu lỗi. Bởi vì xác suất xảy ra sự cố tỉ lệ thuận với số lượng thành phần. Ta có thể làm phép đo đơn giản về tính sẵn sàng của hệ thống.
</p>
<p>
Công thức: <code>Availability = uptime / (uptime + downtime)</code>
</p>
<img src="img/avaibility.jpg" alt="Availability" itemprop="image">
<h4>Cạm bẫy</h4>
<p>
Có một số giả định sai lầm khi phát triển Distributed System. Bạn hãy bỏ đi nhé.
</p>
<ul>
<li>
Mạng là đáng tin cậy
</li>
<li>
Mạng là bảo mật
</li>
<li>
Mạng là đồng nhất
</li>
<li>
Cấu trúc liên kết không thay đổi
</li>
<li>
Độ trễ bằng không
</li>
<li>
Băng thông là vô hạn
</li>
<li>
Chi phí vận chuyển bằng không
</li>
<li>
Chỉ có một quản trị viên
</li>
</ul>

<h3>Tổng kết</h3>
<p>
Ban đầu mình nghĩ Distributed System cũng chỉ là Scale Out hệ thống đơn thuần. Tuy nhiên, càng tìm hiểu thì càng rối nùi do để vận hành được hệ thống cần phải có một số tiêu chí nhất định. Mình tham khảo một số tài liệu để giản lược, tuy nhiên khó quá thì vẫn phải đọc <strong>"Distributed Systems: Principles and Paradigms"</strong> để khai sáng, và cuốn này khá khó nhai. Tuy nhiên, để dễ nắm được nội dung thì bạn có thể tham khảo <strong>"Distributed Systems for fun and profit"</strong><strong>"CSE 660 - An Introduction to Distributed Systems"</strong>.
</p>

<h3>Tham khảo</h3>
<ul class="reference">
Expand Down Expand Up @@ -133,4 +320,7 @@ <h3>Tham khảo</h3>
<li>
<a itemprop="url" href="https://text.123doc.org/document/2506400-tinh-trong-suot-cua-mot-he-thong-phan-tan.htm">Bài giảng Hệ phân tán</a>
</li>
<li>
California State University, San Bernardio, CSE 660, <a href="http://cse.csusb.edu/tongyu/courses/cs660/notes/chap1.php">An Introduction to Distributed Systems</a>
</li>
</ul>
Binary file added tutorials/distributed-system/img/avaibility.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added tutorials/distributed-system/img/dist-arch.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added tutorials/distributed-system/img/part-repl.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added tutorials/distributed-system/img/scaling.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added tutorials/distributed-system/img/scaling2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading

0 comments on commit 421c814

Please sign in to comment.