1. Trang chủ
  2. » Tất cả

(Tiểu luận) lập trình hướng đối tượng đề bài nghiên cứu cơ sở dữ liệu coakroachdb và xử lí bằng java 2

31 5 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Nội dung

BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC PHENIKAA BÀI TẬP LỚN KẾT THÚC HỌC PHẦN Lập trình hướng đối tượng Đề bài: Nghiên cứu sở liệu CoakroachDB xử lí java Lớp: Lập trình hướng đối tượng_1.2(14IT).2_LT Thành viên nhóm 8: Lại Tiến Đức Đỗ Minh Quân Trần Tâm Long Nguyễn Hoàng Anh MSV: 20010851 MSV: 20010879 MSV: 20010875 MSV: 20010840 Giảng viên: Trần Đăng Hoan = HÀ NỘI, 06/2022 h Mục Lục Lời mở đầu CoakroachDB ? .3 Khi CockroachDB lựa chọn tốt? .3 Mục tiêu CockroachDB Đề tài nghiên cứu: Serializable, Lockless, Distributed: Isolation in CockroachDB .5 Cung cấp thực thi nối tiếp hóa: Đồ thị khả hóa: Xung đột Write-Read Cơ sở liệu MVCC .11 Xung đột Read-Write Đọc nhớ cache dấu thời gian .12 Xung đột Write-Write ghi phiên khóa 13 Có thể phục hồi với lập lịch trình nghiêm ngặt 14 Thực thi lập lịch trình nghiêm ngặt 16 Cách cài đặt CockRoachDB window .19 Xây dựng ứng dụng Java với CockroachDB Xử lí Giao dịch 20 Kết luận 31 h Lời mở đầu CoakroachDB ? CockroachDB sở liệu SQL phân tán xây dựng kho khóa-giá trị giao dịch qn mạnh mẽ Nó có quy mơ theo chiều ngang; sống sót sau lỗi đĩa, máy, giá đỡ chí trung tâm liệu với gián đoạn độ trễ tối thiểu khơng có can thiệp thủ công; hỗ trợ giao dịch ACID quán mạnh mẽ ; cung cấp API SQL quen thuộc để cấu trúc, thao tác truy vấn liệu Khi CockroachDB lựa chọn tốt? CockroachDB phù hợp cho ứng dụng yêu cầu liệu đáng tin cậy, sẵn có xác thời gian phản hồi mili giây, quy mơ Nó xây dựng để tự động chép, cân lại phục hồi với cấu hình chi phí hoạt động tối thiểu Các trường hợp sử dụng cụ thể bao gồm:  OLTP phân phối chép  Triển khai nhiều trung tâm liệu  Triển khai đa vùng  Di chuyển đám mây  Các sáng kiến sở hạ tầng xây dựng cho đám mây h Mục tiêu CockroachDB CockroachDB thiết kế để đáp ứng mục tiêu sau: Làm cho sống người dễ dàng Điều có nghĩa chạm tự động hóa cao cho người vận hành đơn giản để giải thích cho nhà phát triển  Cung cấp tính quán hàng đầu ngành, triển khai quy mô lớn Điều có nghĩa cho phép giao dịch phân tán, loại bỏ nỗi đau vấn đề tính quán cuối lần đọc cũ  Tạo sở liệu bật chấp nhận đọc ghi tất nút mà không tạo xung đột  Cho phép triển khai linh hoạt môi trường, không ràng buộc bạn với tảng nhà cung cấp  Hỗ trợ công cụ quen thuộc để làm việc với liệu quan hệ (tức SQL) h Đề tài nghiên cứu: Serializable, Lockless, Distributed: Isolation in CockroachDB - CockroachDB hỗ trợ gói nhiều câu lệnh SQL vào giao dịch tất khơng có Mỗi giao dịch đảm bảo ngữ nghĩa ACID trải dài bảng hàng tùy ý, liệu phân phối Nếu giao dịch thành công, tất đột biến áp dụng với đồng thời ảo Nếu phần giao dịch khơng thành cơng, tồn giao dịch bị hủy bỏ sở liệu giữ nguyên CockroachDB đảm bảo giao dịch chờ xử lý, cách ly khỏi giao dịch đồng thời khác với cách ly hóa - Để có thảo luận chi tiết ngữ nghĩa giao dịch CockroachDB, xem cách CockroachDB thực giao dịch nguyên tử phân tán Serializable, Lockless, Distributed: Isolation CockroachDB - Vài tháng trước, có thảo luận cách giao dịch phân tán CockroachDB thực thi nguyên tử Tuy nhiên, thảo luận khơng đầy đủ; bỏ qua khái niệm đồng thời, nhiều giao dịch hoạt động tập liệu lúc CockroachDB, giống tất hệ thống sở liệu, cố gắng cho phép nhiều đồng thời để tối đa hóa quyền truy cập vào tập liệu h - Thật khơng may, đảm bảo tính nguyên tử không đủ để giữ cho sở liệu quán giới giao dịch đồng thời Nhắc lại đảm bảo đó: Đối với nhóm thao tác sở liệu, tất thao tác áp dụng khơng có thao tác áp dụng - Điều không giải cách mà giao dịch đồng thời xen kẽ Các thao tác riêng lẻ (đọc ghi) giao dịch không xảy đồng thời; có thời gian hoạt động riêng lẻ Trong hệ thống đồng thời, giao dịch cam kết thời gian thực giao dịch thứ hai; giao dịch (T1) cam kết nguyên tử, điều cho phép hoạt động sau giao dịch thứ hai (T2) xem kết T1, hoạt động trước T2 khơng thấy kết T1 Việc xen kẽ tạo số điểm bất thường không mong muốn , cuối phá vỡ tính quán sở liệu - Để bảo vệ khỏi dị thường này, yêu cầu đảm bảo Cách ly : Đối với nhóm giao dịch nguyên tử, đồng thời, cam kết giao dịch không xen kẽ với hoạt động giao dịch khác - Sự lập hồn hảo đạt cách đáng kể thông qua thực nối tiếp: thực tất giao dịch hệ thống thời điểm, khơng có đồng thời Điều có ý nghĩa hiệu suất khủng h khiếp; may mắn thay, khơng cần thiết để đạt lập hồn hảo Nhiều sở liệu đồng thời, bao gồm CockroachDB, thay vào cung cấp khả thực thi hóa , tương đương với thực thi nối tiếp cho phép mức độ giao dịch đồng thời đáng kể - Mức độ cách ly mặc định CockroachDB gọi Ảnh chụp hóa nối tiếp Đó hệ thống điều khiển đồng thời lạc quan, nhiều phiên bản, xếp theo dấu thời gian với thuộc tính sau: + Serializable: Trạng thái sở liệu kết tương đương với việc thực nối tiếp giao dịch thành phần + Recoverable: Một tập hợp giao dịch sở liệu coi khơi phục giao dịch bị hủy bỏ bị hủy bỏ không ảnh hưởng đến trạng thái sở liệu Hệ thống cam kết nguyên tử đảm bảo giao dịch riêng lẻ khôi phục được; hệ thống Cô lập sử dụng lập lịch nghiêm ngặt để đảm bảo kết hợp giao dịch khôi phục + Lockless: Các hoạt động thực thi mà khơng cần khóa tài ngun Tính đắn thực thi cách hủy bỏ giao dịch vi phạm khả hóa lập lịch nghiêm ngặt + Distributed: Khơng có nhà tiên tri trung tâm, điều phối viên dịch vụ liên quan đến hệ thống h Cung cấp thực thi nối tiếp hóa: - CockroachDB sử dụng thứ tự dấu thời gian nhiều phiên để đảm bảo lịch sử cam kết giao dịch hồn chỉnh hóa Kỹ thuật tài liệu sách giáo khoa ba thập kỷ, xem qua cách thức hoạt động nó: Đồ thị khả hóa: Để chứng minh tính đắn thứ tự dấu thời gian, xem xét lý thuyết khả hóa, cụ thể khái niệm cốt lõi nó, biểu đồ khả hóa Biểu đồ sử dụng để phân tích lịch sử giao dịch sở liệu xung đột hoạt động Về lý thuyết, xung đột xảy hai giao dịch khác thực thao tác phần liệu (lần lượt), trong thao tác ghi Hoạt động thứ hai cho xung đột với hoạt động Có ba loại xung đột:  Read-Write (RW) - Thao tác thứ hai ghi đè lên giá trị đọc thao tác  Write-Read (WR) - Thao tác thứ hai đọc giá trị ghi thao tác  Write-Write (WW) - Thao tác thứ hai ghi đè lên giá trị ghi thao tác h Đối với lịch sử giao dịch định nào, xung đột sử dụng để tạo biểu đồ hóa, biểu đồ có hướng liên kết tất giao dịch  Các giao dịch nút biểu đồ  Bất hoạt động xung đột với hoạt động từ giao dịch khác, vẽ cạnh trực tiếp từ hoạt động xung đột sang hoạt động bị xung đột Ví dụ biểu đồ khả hóa cho lịch sử giao dịch đơn giản Và đến tuyên bố quan trọng lý thuyết này: lịch sử đảm bảo hóa (và khi) đồ thị hóa dịng xoay chiều h Ví dụ lịch sử giao dịch với biểu đồ hóa theo chu kỳ Lịch sử khơng thể hóa Thứ tự dấu thời gian CockroachDB đảm bảo biểu đồ khả hóa xoay chiều điều dễ dàng chứng minh:  Mỗi giao dịch gán dấu thời gian (từ nút mà bắt đầu) bắt đầu Tất hoạt động giao dịch diễn dấu thời gian này, suốt thời gian giao dịch  Các hoạt động riêng lẻ xác định cục chúng xung đột với hoạt động khác dấu thời gian giao dịch hoạt động bị xung đột  Các hoạt động phép xung đột với dấu thời gian trước đó; giao dịch không phép cam kết làm tạo xung đột với dấu thời gian sau Bằng cách không cho phép xung đột ngược lại hướng theo thứ tự dấu thời gian, đồ thị khả hóa theo chu kỳ không h Là hệ thống lạc quan (không chờ đợi), CockroachDB chọn hủy bỏ giao dịch Quy trình xác định giao dịch sau:  Giao dịch thứ hai (đang gặp ý định) tra cứu ghi giao dịch giao dịch đầu tiên, vị trí diện ý định  Giao dịch thực “ cú hích ” ghi giao dịch phát Hoạt động đẩy sau: o Nếu giao dịch cam kết (ý định chưa làm sạch), giao dịch thứ hai xóa ý định tiến hành thể ý định giá trị bình thường o Tương tự vậy, giao dịch khác bị hủy bỏ, ý định bị xóa giao dịch thứ hai tiếp tục thể ý định khơng có o Nếu khơng, giao dịch cịn tồn xác định theo mức độ ưu tiên  Sẽ tối ưu luôn hủy bỏ người đẩy người đẩy; có trường hợp hai giao dịch cố gắng thúc đẩy giao dịch kia, “chiến thắng” phải mang tính xác định cặp giao dịch  Do đó, ghi giao dịch định mức độ ưu tiên ; ưu tiên số nguyên Trong hoạt động đẩy, giao dịch có mức độ ưu tiên thấp bị hủy h bỏ (nếu mức độ ưu tiên nhau, giao dịch có dấu thời gian cao bị hủy bỏ Trong trường hợp hai nhau, giao dịch đẩy bị hủy bỏ)  Các giao dịch có mức độ ưu tiên ngẫu nhiên Nếu giao dịch bị hủy bỏ hoạt động đẩy khởi động lại, mức độ ưu tiên max(randomInt(), [priority of transaction that caused the restart] - 1]);điều có tác dụng xác suất tăng mức độ ưu tiên giao dịch khởi động lại nhiều lần Bằng cách này, tất xung đột giao dịch không cam kết giải cách hủy bỏ giao dịch, thực thi lập lịch nghiêm ngặt đảm bảo tất lịch sử giao dịch khơi phục Lưu ý giao dịch bị bỏ qua: Như đề cập trước đó, mơi trường đồng thời, khơng cịn cho ý định ghi chưa giải thuộc giao dịch bị bỏ rơi; phải giải giao dịch bị bỏ rơi theo cách khác Hệ thống ưu tiên hủy bỏ giao dịch bị bỏ rơi cách xác suất - giao dịch bị chặn giao dịch bị bỏ rơi cuối có mức độ ưu tiên đủ cao để chiếm đoạt h Tuy nhiên, thêm dấu thời gian nhịp tim vào giao dịch Trong diễn ra, giao dịch hoạt động có trách nhiệm cập nhật định kỳ dấu thời gian nhịp tim ghi giao dịch trung tâm nó; hoạt động đẩy gặp giao dịch có dấu thời gian nhịp tim hết hạn, giao dịch coi bị bỏ qua bị hủy bỏ mức độ ưu tiên Cách cài đặt CockRoachDB window https://www.cockroachlabs.com/docs/v22.1/install-cockroachdbwindows.html h Xây dựng ứng dụng Java với CockroachDB Xử lí Giao dịch Tự động xử lý lần thử lại giao dịch cách gói giao dịch hàm thứ tự cao Nó bao gồm phương thức để kiểm tra logic xử lý thử lại public class Sample implements Serializable { private static final Random RAND = new Random(); private static final boolean FORCE_RETRY = false; private static final String RETRY_SQL_STATE = "40001"; private static final int MAX_ATTEMPT_COUNT = 6; // Tương ứng với bảng sở liệu "tài khoản" public static class Account { public long id; public long getId() { return id; } public BigDecimal balance; h public BigDecimal getBalance() { return balance; } public void setBalance(BigDecimal newBalance) { this.balance = newBalance; } // Hàm tạo tiện lợi public Account(int id, int balance) { this.id = id; this.balance = BigDecimal.valueOf(balance); } // Hibernate cần phương thức khởi tạo public Account() { } } private static Function addAccounts() throws JDBCException { Function f = s -> { BigDecimal rv = new BigDecimal(0); try { s.save(new Account(1, 1000)); h s.save(new Account(2, 250)); s.save(new Account(3, 314159)); rv = BigDecimal.valueOf(1); System.out.printf("APP: addAccounts() > %.2f\n", rv); } catch (JDBCException e) { throw e; } return rv; }; return f; } private static Function transferFunds(long fromId, long toId, BigDecimal amount) throws JDBCException { Function f = s -> { BigDecimal rv = new BigDecimal(0); try { Account fromAccount = (Account) s.get(Account.class, fromId); Account toAccount = (Account) s.get(Account.class, toId); if (!(amount.compareTo(fromAccount.getBalance()) > 0)) { fromAccount.balance = fromAccount.balance.subtract(amount); toAccount.balance = toAccount.balance.add(amount); h s.save(fromAccount); s.save(toAccount); rv = amount; System.out.printf("APP: transferFunds(%d, %d, %.2f) > %.2f\n", fromId, toId, amount, rv); } } catch (JDBCException e) { throw e; } return rv; }; return f; } private static Function forceRetryLogic() throws JDBCException { Function f = s -> { BigDecimal rv = new BigDecimal(-1); try { System.out.printf("APP: testRetryLogic: BEFORE EXCEPTION\n"); s.createNativeQuery("SELECT crdb_internal.force_retry('1s')").executeUpdate(); } catch (JDBCException e) { System.out.printf("APP: testRetryLogic: AFTER EXCEPTION\n"); h throw e; } return rv; }; return f; } private static Function getAccountBalance(long id) throws JDBCException { Function f = s -> { BigDecimal balance; try { Account account = s.get(Account.class, id); balance = account.getBalance(); System.out.printf("APP: getAccountBalance(%d) > %.2f\n", id, balance); } catch (JDBCException e) { throw e; } return balance; }; return f; } h // Chạy mã SQL theo cách tự động xử lý // giao dịch thử lại logic để chép private static BigDecimal runTransaction(Session session, Function fn) { BigDecimal rv = new BigDecimal(0); int attemptCount = 0; while (attemptCount < MAX_ATTEMPT_COUNT) { attemptCount++; if (attemptCount > 1) { System.out.printf("APP: Entering retry loop again, iteration %d\n", attemptCount); } Transaction txn = session.beginTransaction(); System.out.printf("APP: BEGIN;\n"); if (attemptCount == MAX_ATTEMPT_COUNT) { String err = String.format("hit max of %s attempts, aborting", MAX_ATTEMPT_COUNT); throw new RuntimeException(err); } h // Khối sử dụng để kiểm tra logic thử lại // phương thức 'testRetryLogic ()' if (FORCE_RETRY) { session.createNativeQuery("SELECT now()").list(); } try { rv = fn.apply(session); if (!rv.equals(-1)) { txn.commit(); System.out.printf("APP: COMMIT;\n"); break; } } catch (JDBCException e) { if (RETRY_SQL_STATE.equals(e.getSQLState())) { // Vì lỗi thử lại giao dịch // quay lại giao dịch ngủ chút // vòng lặp ngủ lâu chút so với vòng lặp cuối // thời gian (A.K.A lùi theo cấp số nhân) System.out.printf("APP: retryable exception occurred:\n sql state = [%s]\n message = [%s]\n retry counter = %s\n", e.getSQLState(), e.getMessage(), attemptCount); System.out.printf("APP: ROLLBACK;\n"); h txn.rollback(); int sleepMillis = (int) (Math.pow(2, attemptCount) * 100) + RAND.nextInt(100); System.out.printf("APP: Hit 40001 transaction retry error, sleeping %s milliseconds\n", sleepMillis); try { Thread.sleep(sleepMillis); } catch (InterruptedException ignored) { // no-op } rv = BigDecimal.valueOf(-1); } else { throw e; } } } return rv; } public static void main(String[] args) { // Tạo SessionFactory // Tệp, xác định cách kết nối với sở liệu SessionFactory sessionFactory = new Configuration() h .configure("hibernate.cfg.xml") addAnnotatedClass(Account.class) buildSessionFactory(); try (Session session = sessionFactory.openSession()) { long fromAccountId = 1; long toAccountId = 2; BigDecimal transferAmount = BigDecimal.valueOf(100); if (FORCE_RETRY) { System.out.printf("APP: About to test retry logic in 'runTransaction'\n"); runTransaction(session, forceRetryLogic()); } else { runTransaction(session, addAccounts()); BigDecimal fromBalance = runTransaction(session, getAccountBalance(fromAccountId)); BigDecimal toBalance = runTransaction(session, getAccountBalance(toAccountId)); if (!fromBalance.equals(-1) && !toBalance.equals(-1)) { // Thành công! System.out.printf("APP: getAccountBalance(%d) > %.2f\n", fromAccountId, fromBalance); h System.out.printf("APP: getAccountBalance(%d) > %.2f\n", toAccountId, toBalance); } // Chuyển $ 100 từ tài khoản sang tài khoản BigDecimal transferResult = runTransaction(session, transferFunds(fromAccountId, toAccountId, transferAmount)); if (!transferResult.equals(-1)) { // Thành công! System.out.printf("APP: transferFunds(%d, %d, %.2f) > %.2f \n", fromAccountId, toAccountId, transferAmount, transferResult); BigDecimal fromBalanceAfter = runTransaction(session, getAccountBalance(fromAccountId)); BigDecimal toBalanceAfter = runTransaction(session, getAccountBalance(toAccountId)); if (!fromBalanceAfter.equals(-1) && ! toBalanceAfter.equals(-1)) { // Thành công! System.out.printf("APP: getAccountBalance(%d) > %.2f\n", fromAccountId, fromBalanceAfter); System.out.printf("APP: getAccountBalance(%d) > %.2f\n", toAccountId, toBalanceAfter); } } h } } finally { sessionFactory.close(); } } } h Kết luận Bây chúng em chứng minh cách hệ thống Isolation CockroachDB cung cấp lịch sử giao dịch hóa khơi phục theo kiểu phân tán hồn tồn Nhóm em mơ tả hệ thống mạnh mẽ để thực giao dịch ACID đồng thời, phân tán Điều nói rằng, cịn nhiều khía cạnh hệ thống giao dịch CockroachDB mà nhóm chúng em chưa đề cập đến h

Ngày đăng: 04/04/2023, 09:15

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w