Tương tác với dữ liệu bằng nhiều cơ sở dữ liệu / máy chủ


18

Tất cả các dự án mà tôi đã phải xử lý cho đến nay chỉ yêu cầu một cơ sở dữ liệu duy nhất trên một máy chủ. Tôi muốn tìm hiểu thêm về cách các dự án cần mở rộng quy mô di chuyển đến nhiều cơ sở dữ liệu và / hoặc máy chủ để giúp quản lý tải. Tôi biết về Khả năng mở rộng cao , nhưng tôi đặc biệt quan tâm đến một số ví dụ mã hoặc tài nguyên bổ sung nơi tôi có thể đọc thêm về chủ đề này.

Ví dụ:

  • Làm thế nào các liên kết được xây dựng giữa hai bảng trên nhiều cơ sở dữ liệu? (Một ví dụ mã ở đây sẽ hữu ích).
  • Có chiến lược đặc biệt nào để theo dõi các bảng trong cơ sở dữ liệu nào không?
  • Có phải mã ứng dụng cần biết rằng một hoặc nhiều cơ sở dữ liệu được trải rộng trên nhiều máy chủ? Nếu không, các yêu cầu được lọc ở cấp độ nào?
  • Khi nào là thời gian để vượt ra ngoài thiết lập 1 cơ sở dữ liệu / 1 máy chủ? Làm thế nào phổ biến là nó cần phải làm điều này?

Câu hỏi này có thể được trả lời tốt hơn trên Quản trị viên cơ sở dữ liệu . Mặc dù vậy, không có gì thực sự sai ở đây cả, vì vậy tôi sẽ kiểm tra với các mod DBA. Nếu nó phù hợp ở đó, bạn có muốn nó di chuyển không?
Adam Lear

@AnnaLear - Tôi đoán nó phụ thuộc vào câu trả lời. Tại thời điểm này, tôi quan tâm nhiều hơn đến khía cạnh ứng dụng của vấn đề, vì vậy bây giờ, tôi nghĩ nó có thể tốt hơn ở đây.
VirtuosiMedia

@AnnaLear ack, đồng ý với OP sau đó nếu họ muốn mã cụ thể của ứng dụng.
jcolebrand

Câu trả lời:


13

Ok, hãy phá vỡ nó:

  • Làm thế nào các liên kết được xây dựng giữa hai bảng trên nhiều cơ sở dữ liệu? (Một ví dụ mã ở đây sẽ hữu ích).

Việc này thật thẳng thắn. Các đối tượng SQL có bất kỳ vị trí nào từ quy ước đặt tên một đến bốn phần:

Máy chủ tên.databasename.schemaname.tablename

Nếu tất cả các bảng của bạn nằm trên cùng một máy chủ trên cùng một cơ sở dữ liệu, với cùng một chủ sở hữu / lược đồ, bạn có thể bỏ qua ba phần đầu tiên và sử dụng những gì bạn sử dụng nhiều nhất để:

Select a.*,b.* from 
tableA a inner join 
tableB b on a.col1=b.col1

Nếu một trong các bảng của bạn nằm trong một cơ sở dữ liệu khác nhau và cả hai đều sử dụng lược đồ mặc định cho cơ sở dữ liệu của chúng, thì bạn chỉ cần thêm cơ sở dữ liệu vào bảng thứ hai:

Select a.*,b.* from 
tableA a inner join 
databaseC..tableB b on a.col1 = b.col1

Nếu bạn tình cờ ở trong cơ sở dữ liệu thứ ba khác với cơ sở dữ liệu bạn đang truy vấn, bạn sử dụng rõ ràng cả hai tên cơ sở dữ liệu:

Select a.*,b.* from 
databaseD..tableA a inner join 
databaseC..tableB b on a.col1 = b.col1

Nếu bạn kết thúc bằng cách sử dụng các lược đồ và / hoặc chủ sở hữu khác nhau, bạn có thể thêm các lược đồ đó vào:

Select a.*,b.* from 
databaseD.john.tableA a inner join 
databaseC.accounting.tableB b on a.col1 = b.col1

Và cuối cùng, nếu bạn rất cẩn thận về nó và có một lý do rất chính đáng, bạn có thể tham gia một bảng (thường là nhỏ) trên một máy chủ khác:

Select a.* from 
databaseD.john.TableA a inner join 
ATLANTA.databaseC.accounting.tableB b on a.col1 = b.col1
  • Khi nào là thời gian để vượt ra ngoài thiết lập 1 cơ sở dữ liệu / 1 máy chủ? Làm thế nào phổ biến là cần phải làm điều này? Có chiến lược đặc biệt nào để theo dõi các bảng trong cơ sở dữ liệu nào không?

Tôi sẽ kết hợp cả hai vì chúng đi cùng nhau. Bạn hầu như luôn luôn ổn để bắt đầu với giả định rằng một cơ sở dữ liệu một máy chủ là đủ cho đến khi các ràng buộc về thiết kế / kinh doanh / kỹ thuật của bạn buộc bạn phải sử dụng nhiều hơn.

Vì vậy, để trả lời câu hỏi thứ hai của bạn trước, vì bạn thường có lý do để có cơ sở dữ liệu riêng biệt, nên việc tìm hiểu thiết kế hệ thống của bạn ở đâu đó là điều khá rõ ràng.

Khi nào / tại sao cần phải vượt ra ngoài một cơ sở dữ liệu. Thông thường, đó là sự pha trộn của các quy tắc kinh doanh, chính trị và / hoặc lý do kỹ thuật.

Chẳng hạn, nơi tôi làm việc, chúng tôi có 16 cơ sở dữ liệu trải rộng trên 4 máy chủ. Chúng tôi có MainDB, ImageDB, ReferenceencetableDB, HighvolumeTransactionDB, ReportingDB, StagingDB, TreatmentDB, ArchiveDB, FinancialDB. Để đưa ra một số ví dụ về lý do tại sao chúng khác nhau:

  • FinancialDB, thông tin nhạy cảm
  • Hình ảnh DB, yêu cầu lưu trữ và phục hồi cụ thể khác nhau
  • ReferenceDB, giao dịch thấp, đọc cao
  • Báo cáoDB, đọc rất cao, cần được khôi phục / sao chép sang nhiều môi trường khác không giống như nhiều dữ liệu khác
  • StagingDB, không có gì là vĩnh viễn, chỉ là một tempdb được tăng cường mà chúng ta có quyền kiểm soát nhiều hơn
  • MainDB, giao diện với tất cả các DB khác nhưng cần sao lưu vi sai nên ... chúng tôi chia ra
  • Các bảng HighVolumeTransaction, (tương đối thoáng qua), đến DB riêng của chúng để giữ cho kích thước sao lưu hợp lý.
  • Lưu trữ, Rất nhiều dữ liệu giống nhau từ Chính và Báo cáo, nhưng với thời gian lưu giữ lâu hơn và các truy vấn khó truy cập sâu hơn vào dữ liệu. Nếu điều này vẫn được kết hợp với Chính / Báo cáo, nó sẽ làm hỏng hệ thống của chúng tôi.

Mã ứng dụng có cần biết rằng một hoặc nhiều cơ sở dữ liệu được trải rộng trên nhiều máy chủ không? Nếu không, các yêu cầu được lọc ở cấp độ nào?

Theo nghĩa rộng, họ có thể làm. Tối thiểu họ cần biết máy chủ nào họ đang trỏ đến trong chuỗi kết nối cơ sở dữ liệu. Xử lý, báo cáo, chính, vv

Từ đó, họ cần một bối cảnh cơ sở dữ liệu để thực thi theo. Nói chung, đó sẽ là cái được sử dụng nhiều nhất cho ứng dụng, thậm chí có thể là cái ban đầu từ một cơ sở dữ liệu / một ngày máy chủ của ứng dụng. Bạn CÓ THỂ có ứng dụng chuyển đổi rõ ràng bối cảnh cơ sở dữ liệu trên mỗi cuộc gọi nhưng điều đó khiến cho việc điều chỉnh cơ sở dữ liệu mà không thay đổi ứng dụng rất khó khăn.

Cách tiếp cận thông thường, (hoặc ít nhất, thông thường của tôi), là luôn luôn truy cập thông qua một hoặc có thể hai cơ sở dữ liệu chính.

Sau đó tạo các khung nhìn vào các cơ sở dữ liệu khác khi cần thiết kết hợp với giao tiếp với cơ sở dữ liệu thông qua các thủ tục được lưu trữ.

Vì vậy, để minh họa:

Giả sử bạn muốn lấy thông tin nhân khẩu học, Dữ liệu bán hàng và Số dư tín dụng của Khách hàng và điều đó trải đều trên ba bảng ban đầu đều có trong MainDB.

Vì vậy, bạn viết một cuộc gọi từ ứng dụng của bạn:

Select c.ClientName, c.ClientAddress, s.totalSales,f.CreditBlance from
Clients c join Sales s on c.clientid = s.clientid inner join AccountReceivable f on 
c.clientid=f.clientid where c.clientid = @clientid

Tuyệt vời. Tuy nhiên, bây giờ bất cứ khi nào chúng tôi thay đổi một cột, hoặc đổi tên / di chuyển bảng, bạn phải cập nhật mã ứng dụng. Vì vậy, thay vào đó chúng tôi thực hiện hai việc:
Tạo khách hàng, Bán hàng, Lượt xem tài khoản (bạn sẽ không sử dụng Chọn * nhưng tôi đang demo ở đây)

Use MainDB
GO
Create view v_Clients as select * from Clients
Create view v_Sales as select * from Sales
Create view v_AccountReceivable as select * from AccountReceivable
Go

Sau đó, chúng tôi cũng sẽ tạo một thủ tục được lưu trữ, spGetClientSalesAR

Create proc spGetClientSalesAR @clientID int
as
Select c.ClientName as ClientName, 
       c.ClientAddress as ClientAddress, 
       s.totalSales as TotalSales, 
       f.CreditBlance as CreditBalance 
from
v_Clients c join v_Sales s 
    on c.clientid = s.clientid 
inner join v_AccountReceivable f 
    on c.clientid=f.clientid 
where c.clientid = @clientid

Và có ứng dụng của bạn gọi đó.

Bây giờ miễn là tôi không thay đổi giao diện trên gói lưu trữ đó, tôi có thể làm bất cứ điều gì tôi cần làm với cơ sở dữ liệu phụ trợ để mở rộng hoặc mở rộng.

Cuối cùng, tôi thậm chí có thể làm cho MainDB cũ của mình chỉ là một loạt các thủ tục và khung nhìn được lưu trữ được bóc vỏ sao cho bên dưới các khung nhìn mà chúng ta tạo ra trông như thế này:

Create view v_Clients as select * from ServerX.DatabaseY.dbo.Clients
Create view v_Sales as select * from ServerQ.DatabaseP.dbo.Sales
Create view v_AccountReceivable as select * from ServerJ.DatabaseK.dbo.AccountReceivable

Và ứng dụng của bạn sẽ không bao giờ biết sự khác biệt, (giả sử các đường ống nhanh và dữ liệu được dàn dựng tốt trong số những thứ khác).

Rõ ràng đó là điều cực đoan và tôi sẽ nói dối nếu tôi nói mọi thứ được lên kế hoạch theo cách này, nhưng sử dụng các thủ tục / lượt xem được lưu trữ ngay cả khi bạn thực hiện trong khi tái cấu trúc sẽ cho phép bạn linh hoạt hơn khi ứng dụng của bạn phát triển từ một cơ sở dữ liệu / một máy chủ khiêm tốn của nó bắt đầu


TetonSig - Cảm ơn câu trả lời. Tôi đã không thể quay lại câu hỏi kịp thời để trao cho bạn toàn bộ tiền thưởng (tôi đang đi du lịch), nhưng tôi đã tạo ra một tiền thưởng mới cho câu hỏi và sẽ có thể trao giải cho bạn sau 24 giờ.
VirtuosiMedia

Ồ cảm ơn nhé. Tôi trân trọng điều đó. Đó là rất nhiều niềm vui khi trả lời câu hỏi.
TetonSig

5

Cách chính mà tôi gặp phải nhiều máy chủ cơ sở dữ liệu trong thế giới web (vì câu hỏi được gắn thẻ PHP) là các thiết lập trong đó có một cơ sở dữ liệu 'chính' (ghi) và sau đó một hoặc nhiều cơ sở dữ liệu 'nô lệ' (đọc) được sao chép . Việc ghi cơ sở dữ liệu được thực hiện đối với cơ sở dữ liệu 'chính chủ'. Nội dung của cơ sở dữ liệu đó được sao chép vào các máy chủ 'nô lệ' trong thời gian gần. Các truy vấn - báo cáo đặc biệt chuyên sâu - sau đó được chạy với một trong các cơ sở dữ liệu 'nô lệ' để chuyển tải sang các máy chủ đó. Hãy nhớ rằng, thiết lập cụ thể là tốt nhất cho các ứng dụng có nhiều lượt đọc, nhưng không có nhiều văn bản. Đó không phải là cách duy nhất để sắp xếp mọi thứ.


3

Làm thế nào các liên kết được xây dựng giữa hai bảng trên nhiều cơ sở dữ liệu? (Một ví dụ mã ở đây sẽ hữu ích).

Họ không phải. Cơ sở dữ liệu NoQuery hoàn toàn không "tham gia" và ngay cả khi bạn có thể tham gia SQL trên các máy chủ RDBMS, bạn sẽ không muốn nếu bạn coi trọng hiệu năng (cf ngụy biện của điện toán phân tán ).

Có chiến lược đặc biệt nào để theo dõi các bảng trong cơ sở dữ liệu nào không?

Trong cơ sở dữ liệu quan hệ / SQL, phân vùng thường được thực hiện trong giới hạn của một máy chủ / cơ sở dữ liệu, sử dụng các tệp khác nhau được đặt trên các đĩa khác nhau. Hầu như theo định nghĩa, một giải pháp mở rộng theo chiều ngang có nghĩa là tất cả các cơ sở dữ liệu đều có tất cả các bảng và bạn có một số loại giải pháp phản chiếu giao dịch, sao chép hoặc tùy chỉnh cuối cùng để đảm bảo tất cả dữ liệu được gửi đến nơi cần đến.

Nếu bạn thực sự phân tách cơ sở dữ liệu một cách hợp lý và không chỉ về mặt vật lý, thì ánh xạ được xác định trong DAL hoặc ORM của bạn sẽ khai báo các bảng nằm trong cơ sở dữ liệu nào.

Cơ sở dữ liệu NoQuery là một hỗn hợp các giải pháp phân vùng. Đôi khi, đó là "bảng" (hoặc phổ biến hơn là "bộ sưu tập") được phân vùng. Lần khác, đó là "hàng" (hoặc "tài liệu"). Trong một số trường hợp, đây thực sự là các cột , như trong cơ sở dữ liệu hướng theo cột như HBase. Nó hoàn toàn phụ thuộc vào công nghệ bạn đang sử dụng. Một điều mà tất cả đều có điểm chung là động cơ tự theo dõi tất cả, vì vậy tất cả những gì bạn phải làm là yêu cầu một tài liệu hoặc hàng.

Tất nhiên, đó là giả sử bạn thực sự sử dụng các tính năng shending và không chỉ tạo ra một loạt các cơ sở dữ liệu khác nhau. Nếu bạn đang làm sau, thì bạn là của riêng bạn.

Có phải mã ứng dụng cần biết rằng một hoặc nhiều cơ sở dữ liệu được trải rộng trên nhiều máy chủ? Nếu không, các yêu cầu được lọc ở cấp độ nào?

Nếu chúng là các cơ sở dữ liệu logic khác nhau , có. Nếu chúng chỉ được phân phối vật lý thì không - giả sử rằng cơ sở dữ liệu cụ thể của bạn thực sự hỗ trợ shending hoặc bạn sử dụng giải pháp cân bằng tải (cho cơ sở dữ liệu SQL). Cũng giả sử rằng tất cả các hoạt động của bạn là phi trạng thái; nếu bạn muốn mở rộng theo chiều ngang, bạn sẽ phải từ bỏ ACID.

Khi nào là thời gian để vượt ra ngoài thiết lập 1 cơ sở dữ liệu / 1 máy chủ? Làm thế nào phổ biến là nó cần phải làm điều này?

Đã đến lúc bạn tối ưu hóa mọi thứ bạn có thể có trên một máy chủ và vẫn không thể giảm đủ hiệu suất do các ràng buộc về tải I / O. Nếu bạn phải đặt câu hỏi, thì còn quá sớm.

Lưu ý rằng các vấn đề về hiệu năng trong một sản phẩm RDBMS phong nha (Oracle, SQL Server) thường xuyên hơn do thiết kế kém, lập chỉ mục kém, truy vấn kém, tranh chấp khóa, v.v. những sản phẩm này có thể mở rộng theo chiều dọc đến một mức độ vô lý. Vì vậy, một lần nữa, bạn nên xem xét "vượt ra ngoài 1 cơ sở dữ liệu / 1 thiết lập máy chủ" khi bạn hoàn toàn chắc chắn rằng các vấn đề về hiệu suất của bạn là do giới hạn phần cứng chứ không chỉ là thiết kế / triển khai phụ.

Hoặc, tôi đoán, một lý do khác khiến một số người chuyển sang cơ sở dữ liệu phân tán là khi họ không sẵn sàng trả nhiều (hoặc bất kỳ) tiền phí bản quyền nào và muốn bỏ SQL như một lựa chọn có ý thức để đánh đổi chi phí thấp để tăng độ phức tạp của ứng dụng. Lý do hoàn toàn hợp lệ nếu bạn là một phần mềm khởi động nhưng thường không áp dụng được trong khu vực công ty.


+1 - Tôi đã không thực sự xem xét NoQuery, nhưng điều này rất hữu ích. Cảm ơn.
VirtuosiMedia

1

Có ba loại cấu hình nhân rộng chính cho cơ sở dữ liệu:

  • Bậc thầy nô lệ
  • Ông chủ ông chủ
  • Đoàn kết

Ví dụ Master-Slave: MySQL master + nô lệ MySQL, MongoDB

Ví dụ Master-Master: CouchDB, Cassandra, Riak

Ví dụ đồng thuận: ScalienDB

...đến tên một vài.

Những có đặc điểm khác nhau. Cấu hình Master-Slave cho phép các nút nô lệ bắt kịp với tốc độ tối đa của chúng trong khi phục vụ các yêu cầu đọc rất nhanh, trong khi máy chủ chính chịu trách nhiệm về tính toàn vẹn dữ liệu. Bởi vì tất cả các bài viết đều thuộc về chủ, không bao giờ có sự tranh chấp vì một người viết tương đối chậm đang chặn nhiều độc giả, nhưng mặt khác, các máy chủ nô lệ cuối cùng nhất quán và bạn không nhận được sự đảm bảo cách ly giao dịch mà bạn sẽ có từ chỉ đọc từ chủ. (đọc thêm; ACID vs BASE, Mức cô lập giao dịch, sao chép cơ sở dữ liệu, MVCC / Cách ly: Ảnh chụp nhanh, Sao chép giao dịch)

Master-Master luôn cho phép viết, vì vậy bạn có nhiều quyền hạn về những gì là sự thật. Điều này có thể hoặc không phải là một vấn đề, tùy thuộc vào ứng dụng của bạn đang làm gì, nhưng nếu bạn viết dữ liệu xung đột, bạn có thể nhận được nhiều kết quả vào lần tới khi bạn đọc khóa / hàng / cột đó mà bạn sẽ phải hợp nhất với logic ứng dụng và lưu lại vào cơ sở dữ liệu. (đọc thêm: Định lý CAP, sao chép CouchDB, sao chép Rịa, băm nhất quán, Bitcask & StormDB, Quorum- w / MongoDB về phân chia mạng, hợp nhất các chiến lược phân giải)

Các cơ sở dữ liệu dựa trên sự đồng thuận với sự sao chép giữa các nút, chẳng hạn như Scalien sẽ luôn nhất quán trong việc ghi, nhưng với chi phí trao đổi nhiều tin nhắn trước khi ACKing ghi. Đây không phải là vấn đề lớn nếu bạn có ethernet nhanh và bạn không cần ghi vào đĩa trước khi ACKing, điều mà bạn sẽ không cần nếu tối thiểu ba máy chủ của bạn ở trên các giá đỡ máy chủ khác nhau với các bộ nguồn riêng biệt (một chết, hai người kia đảm bảo họ đã lưu trên đĩa). (đọc thêm; PAXOS, PAXOS CAMIT, cam kết hai pha với các giao dịch phân tán, cam kết ba pha)

Đọc thêm: (sách: 'Các yếu tố của máy tính phân tán', đồng hồ vectơ, vectơ phiên bản, vectơ ma trận, đồng hồ logic, thuật toán bánh, đồng hồ cây xen kẽ, diễn viên và lập trình phản ứng và bộ phản ứng, bộ nhớ giao dịch phần mềm, giao dịch viên, AKKA, Stact, sai lầm của điện toán phân tán, giao thức tin đồn, phần mở rộng giao thức tin đồn chống entropy của Cassandra, bảng băm phân tán, giấy tờ về hợp nhất dữ liệu trong một cài đặt phân tán, kiến ​​trúc ZooKeeper, trình bày InfoQ trên "giao thức không đồng bộ", kiến ​​trúc HBase, giấy MapReduce đã bắt đầu tất cả các công cụ NoQuery, xếp hàng, phân cụm sẵn sàng cao của rabbitmq)

Tôi hy vọng tôi đã cho một số thực phẩm cho suy nghĩ :). Bạn có thể theo dõi tôi trên twitter @henrikfeldt nếu bạn cũng muốn tweet về nội dung này.


1

OK, đây là một quan điểm khác về khả năng mở rộng.

Chúng ta hãy thảo luận về ý nghĩa của những thứ là dữ liệu, ý nghĩa của hành vi và ý nghĩa của việc có logic ứng dụng.

Thông thường, khi một người mạo hiểm vào vùng đất của các ứng dụng doanh nghiệp và tương tự, người ta sẽ tiếp xúc với ý tưởng xếp lớp. Tất nhiên, phân lớp là tất cả các vị trí trong máy tính, chẳng hạn như trong ngăn xếp mạng (mô hình ISO) hoặc trong đồ họa (Photoshop) hoặc trong SOA (các dịch vụ có thể gọi anh chị em hoặc trẻ em, nhưng không bao giờ là cha mẹ).

Tuy nhiên, loại phân lớp cụ thể đã bị lạm dụng mà không liên quan gì đến 'GUI', 'Lớp logic nghiệp vụ' và sau đó là 'Lớp truy cập dữ liệu'. Ý tôi là, vâng, ý tưởng là tốt về nguyên tắc, giống như chủ nghĩa cộng sản là tốt về nguyên tắc, nhưng trong thực tế thì không.

Chúng ta hãy xem tại sao. Đối số tôi sẽ sử dụng là về khớp nối; điểm từ một lớp chạm vào các điểm ở lớp khác. Bất cứ khi nào bạn bắt đầu tạo một ứng dụng n-tier aka lớp trong chế độ mặc định-enterprisey mà mọi người đi vào, họ sẽ tạo ra nhiều điểm tiếp xúc giữa các lớp.

Trong cốt lõi của nó, ý tưởng là các lớp có thể thay thế cho nhau; Nhưng họ thì không! Tại sao? Bởi vì tất cả các khớp nối trang web cuộc gọi.

Thay vào đó, hãy xem tại sao mạng bị tách rời! Bởi vì giao diện là một luồng byte trên một con trỏ tệp duy nhất trỏ đến một ổ cắm mở! Tất cả các lớp trong các mô hình ISO giống như mô hình thiết kế được gọi là 'chuỗi trách nhiệm' là hướng đối tượng! Mỗi lớp bao bọc lớp bên dưới, mà không biết ngữ nghĩa của dữ liệu trong lớp bên dưới.

Khi một gói dữ liệu đi về phía ethernet và tín hiệu điện thô ở phía dưới, nó sẽ được bọc liên tục bởi các lớp chỉ biết đường bao thông điệp cụ thể của riêng nó, 'lô byte' cụ thể mà nó có thể gửi; và không có gì khác. Nó không cần thay đổi đường dẫn cuộc gọi tùy thuộc vào nội dung của gói.

Tương phản điều này với tầng thứ n trong đó bạn sẽ phải thay đổi đường dẫn cuộc gọi trong các lớp ứng dụng của mình trên một 'cuộc gọi' đi ngang qua các lớp của bạn trên đường đến cơ sở dữ liệu - ví dụ: 'khách hàng vàng' là một dạng đa dạng của 'khách hàng bình thường' và vì vậy, vì chúng ta sử dụng 'bảng trên mỗi lớp con', chúng ta cần biết về điều này ngay bây giờ khi dữ liệu (thực thể) đang truyền qua các lớp; cả trong cái gọi là 'lớp logic nghiệp vụ' và trong lớp dữ liệu đang thực sự tiết kiệm.

Nó không thể mở rộng hay tối ưu từ góc độ điện toán.

Tại sao nó không thể mở rộng? Bởi vì kiến ​​trúc được ghép nối, và sau đó bạn vẫn ở trong cùng một DB cũ mà bạn đang cố gắng mở rộng ra nhiều nút! Nhưng, bởi vì bạn cần ACID cho điều này, và thực thể thứ ba (đối tượng dữ liệu), bạn cần có chúng trong một cơ sở dữ liệu duy nhất thực hiện giao dịch!

Đúng vậy, với những lời tán tỉnh đó ra khỏi đường đi; Có những cách nào khác?

Chà, có từ viết tắt đáng ghét gọi là 'SOA', tức là kiến ​​trúc hướng dịch vụ. Tất nhiên, các Erls của thế giới , sẽ yêu cầu bạn triển khai tất cả các lớp của mình nhưng thay vào đó bằng XML và SOAP.

Đối với tất cả các lý do trên, đây là cách đi sai, bởi vì bạn sẽ tự ghép mình với các proxy XML đó giống như bạn kết đôi với các lớp ứng dụng như đã giải thích ở trên.

Thay vào đó, hãy sử dụng tin nhắn và để bất cứ điều gì thực hiện chức năng cho họ, hãy lắng nghe họ. Bề mặt dịch vụ của bạn sau đó trở thành một danh sách các tin nhắn mà bạn có thể gửi và bạn chưa kết hợp các hoạt động của mình với mặt tiền dịch vụ của bạn; và bạn thậm chí không cần biết ứng dụng hoặc điểm cuối nào thực hiện các hoạt động này, bởi vì tất cả những gì bạn đang làm là xuất bản một thông báo rằng một số cơ chế định tuyến khác sẽ định tuyến đến đúng người tiêu dùng!

Vì bạn đã tách các mặt tiền dịch vụ khỏi các hoạt động thực tế mà bạn muốn thực hiện, giờ đây bạn có thể thêm nhiều dịch vụ; Trên thực tế, đây là cách Netflix làm điều đó. Hãy xem các bài thuyết trình sau: http://www.sl slideshoware.net/adrianco/global-netflix-pl platform . http://www.sl slideshoware.net/adrianco/global-netflix-pl platform . Họ tốt quá!


0

Có một cơ sở dữ liệu SQL (ACID) mới trong bản beta được tuyên bố là có các thuộc tính tỷ lệ co giãn. Hiện tại có một chương trình beta miễn phí đang diễn ra và tôi khuyên bạn nên xem, nó có tên là NuoDB.

Rõ ràng nó dễ dàng vượt trội hơn MySQL ngay cả trên một máy đơn luồng, nhưng có tỷ lệ hạnh phúc lên tới hơn 70 trường hợp trong một số điểm chuẩn nhất định.


Một chủ đề duy nhất? Làm thế nào là nó sau đó một điểm chuẩn có liên quan?
Henrik
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.