Professional Documents
Culture Documents
DATN Nguyen Minh Quang 20184303
DATN Nguyen Minh Quang 20184303
DATN Nguyen Minh Quang 20184303
ĐỒ ÁN TỐT NGHIỆP
Một số mô hình khuyến nghị sản phẩm cho người
dùng trên trang Thương mại điện tử Shopee sử dụng
Graph Database
NGUYỄN MINH QUANG
quag.nm184303@sis.hust.edu.vn
Chữ kí GVHD
HÀ NỘI, 01/2024
LỜI CẢM ƠN
Lời đầu tiên, em xin gửi lời cảm ơn sâu sắc đến PGS.TS. Cao Tuấn Dũng. Thầy
là người đã hướng dẫn, định hướng cho giúp em vượt qua khoảng thời gian khó
khăn ban đầu để xác định mục tiêu ĐATN, thầy giúp đỡ em rất nhiều trong quá
trình nghiên cứu, thực hiện và hoàn thiện ĐATN này. Em cũng xin cảm ơn tới tất
cả thầy cô đã chỉ dạy cho em những kiến thức quý báu trong suốt quá trình học tập
tại Đại học Bách khoa Hà Nội, cung cấp một hành trang kiến thức thiết thực cho
tương lai sắp tới. Em cũng xin cảm ơn tới tất cả các anh đồng nghiệp trong công ty
BNH - những người luôn tận tình giúp đỡ, chỉ dạy em từ những ngày đầu vào công
ty và trong quá trình thực hiện ĐATN, các anh cũng giúp đỡ em rất nhiều về phần
kiến thức cũng như hỗ trợ phần hạ tầng server để em thực hiện Đồ án. Cuối cùng,
em xin cảm ơn tới người thân, gia đình, bạn bè - những người luôn ở bên cạnh, tin
tưởng, động viên tinh thần, giúp em vượt qua những khó khăn trong suốt quá trình
học tập tại đại học Bách Khoa Hà Nội. Do thời gian có hạn, cũng như kiến thức
chuyên môn còn cần cải thiện, ĐATN của em sẽ không tránh khỏi những thiết sót
và hạn chế. Em rất mong nhận được những đánh giá, nhận xét, góp ý từ thầy cô,
để bản thân có thể hoàn thiện hơn, rút ra những bài học quý giá, là hành trang giúp
em vững vàng hơn cho hành trình tương lai. Em xin chân thành cảm ơn!
i
TÓM TẮT NỘI DUNG ĐỒ ÁN
Mua sắm trực tuyến là một ngày càng len lỏi trong cuộc sống và là một phần thiết
yếu không thể thiếu trong cuộc sống hàng ngày. Truy cập một trang web mua sắm
trưc tuyến như Shopee hoặc Lazada để mua hàng hóa cần thiết - đã trở thành một
thực tế mà không khó có thể bắt gặp.
Thật vậy, thương mại điện tử đã đi một chặng đường dài từ khái niệm mới lạ đến
người khổng lồ thay đổi toàn bộ cách thức mua bán trên toàn thế giới. Sự kết hợp
giữa sự tiện lợi và hiệu quả về mặt chi phí của nó đã cách mạng hóa cách chúng ta
nghĩ về các giao dịch bán lẻ và tiền tệ. Cục điều tra dân số Hoa Kỳ (U.S. Census
Bureau ) tiến hành ước tính doanh số thương mại điện tử bán lẻ tại Hoa Kỳ, trong
quý I/2023, thương mại điện tử bán lẻ chiếm 15,1 % tổng doanh thu cả nước, tổng
cộng khoảng 272,6 tỷ USD cho thấy phần nào sự phát triển của ngành thương mại
điện tử là xu hướng tất yếu, đặc biệt trong những năm Thế giới chịu ảnh hưởng bởi
đại dịch Covid-19, việc hạn chế ra đường làm cho nhu cầu mua hàng online phát
triển chóng mặt, và sau khi đại dịch đã được kiểm soát, thói quen của người tiêu
dùng dường như vẫn không đổi, số lượng giao dịch thương mại điện tử vẫn không
có dấu hiệu suy giảm.
Ngành thương mại điện tử đã có sự tăng trưởng vượt bậc trong những năm gần
đây, với việc mua sắm trực tuyến trở thành phương thức mua hàng hóa và dịch vụ
ưa thích của hàng triệu người tiêu dùng trên toàn thế giới. Sự tăng trưởng này được
thúc đẩy bởi những tiến bộ trong công nghệ, cho phép các nhà bán lẻ cung cấp trải
nghiệm mua sắm liền mạch và cá nhân hóa cho từng khách hàng của mình. Một
trong những công nghệ đang làm thay đổi bối cảnh thương mại điện tử là cơ sở dữ
liệu đồ thị (Graph Database). Cơ sở dữ liệu đồ thị là một loại cơ sở dữ liệu NoSQL
lưu trữ dữ liệu dưới định dạng đồ thị, với các nút (node) biểu thị các thực thể và
các cạnh (edge) biểu thị mối quan hệ giữa các thực thể đó. Cấu trúc dữ liệu này
cho phép truy vấn và phân tích hiệu quả các mối quan hệ phức tạp, khiến nó đặc
biệt phù hợp với các ứng dụng yêu cầu hiểu biết sâu sắc về dữ liệu được kết nối với
nhau. Trong bối cảnh thương mại điện tử, điều này có nghĩa là cơ sở dữ liệu đồ thị
có thể được sử dụng để lập mô hình và phân tích mạng lưới phức tạp về mối quan
hệ giữa khách hàng, sản phẩm và các thuộc tính khác nhau của chúng.
Một trong những lợi ích chính của việc sử dụng cơ sở dữ liệu đồ thị trong thương
mại điện tử là khả năng cung cấp các đề xuất và cá nhân hóa nâng cao cho khách
hàng. Cơ sở dữ liệu quan hệ truyền thống gặp khó khăn trong việc xử lý hiệu quả
ii
các mối quan hệ phức tạp đang tồn tại giữa khách hàng và sản phẩm, gây khó khăn
cho việc đưa ra các đề xuất chính xác và kịp thời. Ngược lại, cơ sở dữ liệu đồ thị
vượt trội trong việc quản lý các mối quan hệ này, cho phép các nhà bán lẻ hiểu rõ
hơn về sở thích của khách hàng và đưa ra các đề xuất sản phẩm phù hợp.
Tuy nhiên, trong thực tế, các tổ chức thương mại điện tử vẫn hầu hết vẫn đang sử
dụng hệ thống các cơ sở dữ liệu quan hệ (RDBMS) để xử lý các giao dịch thương
mại điện tử. Việc chuyển đổi từ Hệ quản trị cơ sở dữ liệu quan hệ sang Cơ sở dữ
liệu Đồ thị là một bài toán lâu dài, không thể thực hiện trong một sớm một chiều.
Việc bỏ đi các hệ thống đã chạy ổn định và lâu dài trong một tổ chức doanh nghiệp
là không thể xảy ra. Mặt khác, do đặc thù lưu trữ dữ liệu, Cơ sở dữ liệu quan hệ
từ lâu đã chứng minh được khả năng xử lý các giao dịch với số lượng lớn OLTP
(Online Transaction Processing) hơn hẳn Cơ sở dữ liệu Đồ thị do trong quá trình
Insert, các RDBMS sẽ ghi liên tục các bản ghi thành các dòng (row), còn Graph
Database phải kiểm tra xem các node đã có chưa rồi tạo cách edge nối giữa các
node đó nên Graph Database sẽ phù hợp để xử lý phân tích dữ liệu OLAP (Online
Transaction Processing). Chính vì những lý do trên, các doanh nghiệp thường sẽ
xây dựng cả 2 hệ thống cơ sở dữ liệu RDBMS và Graph Database chạy song song,
từ đó phát sinh nhu cầu cần có một hệ thống trung gian, chuyên biệt để thực hiện
nhiệm vụ đồng bộ dữ liệu liên tục, tự động giữa 2 hệ thống, và hiện nay, Kafka
đang là một trong những nền tảng stream dữ liệu phân tán (Distributed Streaming
Platform) giúp hỗ trợ giải quyết vấn đề đồng bộ này.
iii
MỤC LỤC
4.1 Đồng bộ realtime, tự động từ MariaDB sang Neo4j thông qua Confluent
Platform .................................................................................................... 51
4.2 Các mô hình khuyến nghị thời gian thực sử dụng Neo4j ........................... 67
CHƯƠNG 5. CÁC GIẢI PHÁP VÀ ĐÓNG GÓP NỔI BẬT...................... 69
vi
Hình 3.13 Thư mục đã được trao quyền thành công . . . . . . . . . . . . 39
Hình 3.14 Cấu hình thư mục Log đã được thay đổi . . . . . . . . . . . . . 39
Hình 3.15 Service Broker đã khởi động thành công . . . . . . . . . . . . 40
Hình 3.16 Thư mục đã được trao quyền thành công . . . . . . . . . . . . 41
Hình 3.17 Cấu hình thư mục Log đã được thay đổi . . . . . . . . . . . . . 41
Hình 3.18 Service Schema Registry đã khởi động thành công . . . . . . . 42
Hình 3.19 Thư mục đã được trao quyền thành công . . . . . . . . . . . . 43
Hình 3.20 Thư mục lưu log đã được thay đổi . . . . . . . . . . . . . . . . 43
Hình 3.21 Service Kafka Connect đã khởi động thành công . . . . . . . . 44
Hình 3.22 Debezium MySQL Connector đã có trong danh sách plugin
của Kafka Connect . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Hình 3.23 Neo4j Sink Connector đã có trong danh sách plugin của Kafka
Connect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Hình 3.24 Thư mục đã được trao quyền thành công . . . . . . . . . . . . 45
Hình 3.25 Thư mục lưu log đã được thay đổi . . . . . . . . . . . . . . . . 46
Hình 3.26 Service Confluent Control Center đã khởi động thành công . . 47
Hình 3.27 Giao diện màn hình đăng nhập của Confluent Control Center . 48
Hình 3.28 Giao diện trang chủ của Control Center - Số broker là 3 . . . . 48
Hình 3.29 Control Center đã kết nối tới ZooKeeper . . . . . . . . . . . . 49
Hình 3.30 Control Center đã kết nối tới Kafka Connect . . . . . . . . . . 49
Hình 3.31 Giao diện quản lý Topic trên Control Center . . . . . . . . . . 50
Hình 3.32 Giao diện schema của Topic trên Control Center . . . . . . . . 50
vii
Hình 4.13 Tổng số message trên Topic tăng lên bằng so với số bản ghi
trên MariaDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
Hình 4.14 Metric của Topic khi cập nhật bảng trên MariaDB . . . . . . . 58
Hình 4.15 Giao diện tab Connector . . . . . . . . . . . . . . . . . . . . . 59
Hình 4.16 Chọn Sink Connector . . . . . . . . . . . . . . . . . . . . . . . 59
Hình 4.17 Cấu hình Sink Connector . . . . . . . . . . . . . . . . . . . . . 60
Hình 4.18 Khởi chạy Sink Connector . . . . . . . . . . . . . . . . . . . . 60
Hình 4.19 Cấu hình Connector . . . . . . . . . . . . . . . . . . . . . . . . 61
Hình 4.20 Tổng số node trên Neo4j . . . . . . . . . . . . . . . . . . . . . 63
Hình 4.21 Tổng số node không ngừng tăng trong quá trình chạy Connector 63
Hình 4.22 Tổng số cạnh trên Neo4j . . . . . . . . . . . . . . . . . . . . . 64
Hình 4.23 Tổng số cạnh tăng lên trong quá trình chạy Connector . . . . . 64
Hình 4.24 Dữ liệu đỉnh User . . . . . . . . . . . . . . . . . . . . . . . . . 65
Hình 4.25 Dữ liệu đỉnh Product . . . . . . . . . . . . . . . . . . . . . . . 65
Hình 4.26 Dữ liệu đỉnh Category . . . . . . . . . . . . . . . . . . . . . . 66
Hình 4.27 Dữ liệu cạnh ACTION . . . . . . . . . . . . . . . . . . . . . . 66
Hình 4.28 Dữ liệu cạnh BELONG_TO . . . . . . . . . . . . . . . . . . . 67
viii
DANH MỤC BẢNG BIỂU
ix
DANH MỤC TỪ VIẾT TẮT
x
DANH MỤC THUẬT NGỮ
xi
CHƯƠNG 1. GIỚI THIỆU ĐỀ TÀI ĐỒ ÁN
Chương này giới thiệu các vấn đề dẫn tới việc em lựa chọn đề tài, tổng quan về
hệ thống và nêu ra mục tiêu và phạm vi đề tài, định hướng giải pháp và bố cục của
đồ án.
1.1 Đặt vấn đề
Cơ sở dữ liệu đồ thị đang đóng một vai trò ngày càng quan trọng trong ngành
thương mại điện tử, cho phép các nhà bán lẻ hiểu rõ hơn và đem lại dịch vụ tốt hơn
cho khách hàng của họ thông qua các đề xuất mang tính cá nhân hóa cao. Bằng
cách tận dụng sức mạnh của cơ sở dữ liệu đồ thị, các doanh nghiệp thương mại điện
tử có thể đạt được lợi thế cạnh tranh trên thị trường trực tuyến đông đúc, mang lại
trải nghiệm mua sắm vượt trội giúp thu hút khách hàng quay trở lại nhiều hơn.
Tuy nhiên, việc phát triển cần phải gắn liền với những cái đã có, từ lâu cơ sở
dữ liệu quan hệ đã và đang chiếm một phần không hề nhỏ trong hệ thống cơ sở dữ
liệu, chính vì vậy cần có một hệ thống trung gian chịu trách nhiệm đồng bộ dữ liệu
truyền thống sang hệ thống cơ sở dữ liệu mới
Từ những nhu cầu thực tế và tiềm năng của việc phát triển một Hệ khuyến nghị
sử dụng Graph Database, en đã thực hiện đề tài “Một số mô hình khuyến nghị
sản phẩm cho người dùng trên trang Thương mại điện tử Shopee sử dụng Graph
Database”. Mục đích của đề tài là phát triển hệ thống có thể giúp đồng bộ dữ liệu
thời gian thực từ cơ sở dữ liệu quan hệ sang cơ sở dữ liệu đồ thị và trên cơ sở dữ
liệu đồ thị, xây dựng một số khuyến nghị sản phẩm dựa trên dữ liệu lịch sử thao tác
của người dùng.
1.2 Mục tiêu và phạm vi đề tài
Với những vấn đề đã trình bày trong mục 1.1, trong đồ án này, em đặt ra mục
tiêu trong ĐATN là cài đặt một cơ sở dữ liệu quan hệ, một cơ sở dữ liệu đồ thị, cài
đặt và tích hợp các component cần thiết trong nền tảng streaming dữ liệu; sau khi
cài đặt xong các thành phần, em sử dụng nền tảng streaming dữ liệu để đồng bộ
dữ liệu từ Cơ sở dữ liệu quan hệ sang Cơ sở dữ liệu Đồ thị. Khi dữ liệu đã được
đồng bộ sang Cơ sở dữ liệu Đồ thị, thực hiện xây dựng một số câu lệnh để gợi ý sản
phẩm cho người dùng dựa theo dữ liệu lịch sử thao tác của người dùng trên trang
thương mại điện tử. Dữ liệu trên sàn thương mại điện tử bao gồm nhiều sản phẩm
thuộc nhiều lĩnh vực khác nhau như Đồ điện tử,...
Phần cơ sở dữ liệu quan hệ, em sẽ sử dụng cơ sở dữ liệu miễn phí và phổ biến
là MariaDB để xây dụng một cơ sở dữ liệu đơn giản giúp lưu trữ lịch sử thao tác
1
CHƯƠNG 1. GIỚI THIỆU ĐỀ TÀI ĐỒ ÁN
2
CHƯƠNG 2. CÁC CÔNG NGHỆ SỬ DỤNG
Chương 3 em sẽ mô tả các công nghệ sẽ được sử dụng trong ĐATN này, một số
công nghệ sẽ được mô tả cách rõ cách thức hoạt động.
2.1 Cơ sở dữ liệu MariaDB
Giới thiệu
MariaDB là một nhánh do cộng đồng phát triển, được hỗ trợ về mặt thương mại
của hệ quản trị cơ sở dữ liệu quan hệ MySQL (RDBMS) nhằm duy trì phần mềm
nguồn mở và miễn phí theo Giấy phép Công cộng GNU (General Public License).
Nhà phát triển dự định nó sẽ là một sự thay thế cho MySQL và thường được coi là
DB đi kèm cho các bản phân phối Linux phổ biến như CentOS. API và các giao
thức được sử dụng trong MySQL cũng có trong MariaDB. MariaDB thường được
sử dụng cho những việc như quản lý giao dịch, thông tin khách hàng,...
MariaDB có nhiều tính năng và lợi ích khác biệt với MySQL và RDBMS nguồn
mở khác, năm tính năng sau khiến MariaDB trở nên nổi bật.
• InnoDB: InnoDB là một công cụ lưu trữ (storage engine) được biết đến với
3
CHƯƠNG 2. CÁC CÔNG NGHỆ SỬ DỤNG
khả năng cân bằng giữa độ tin cậy và hiệu suất. Đây là công cụ lưu trữ mặc
định trong MySQL và là lựa chọn phổ biến để sử dụng với MariaDB. Nó cung
cấp các tính năng giao dịch tuân thủ ACID tiêu chuẩn và có hỗ trợ khóa ngoại
(foreign key). ACID là viết tắt của tính nguyên tử (atomicity), tính nhất quán
(consistency), sự cô lập (isolation) và duy trì (durability). Điều đó đảm bảo
rằng mỗi giao dịch trong MariaDB được coi là một đơn vị duy nhất. Nếu một
phần của giao dịch đó không hoàn thành thì toàn bộ giao dịch sẽ không thành
công và cơ sở dữ liệu không bị ảnh hưởng. Trong phạm vi ĐATN, InnoDB sẽ
được lựa chọn là Storage Engine của MariaDB.
• XtraDB: Từng là lựa chọn phổ biến hơn InnoDB, XtraDB được thiết kế như
một công cụ lưu trữ cho MariaDB. XtraDB là sự kết hợp tuân thủ tính ACID
của InnoDB và kiến trúc MVCC (Multiversion concurrency control). MVCC
nhằm mục đích giải quyết vấn đề bằng cách giữ nhiều bản sao của dữ liệu.
Bằng cách này, mỗi người dùng được kết nối với cơ sở dữ liệu sẽ thấy snapshot
của cơ sở dữ liệu tại một thời điểm cụ thể. Bất kỳ thay đổi nào do người thực
hiện sẽ không được người dùng cơ sở dữ liệu khác nhìn thấy cho đến khi các
thay đổi đó được hoàn thành. MVCC đảm bảo tính nhất quán của dữ liệu khi
triển trên các hệ phân tán. Tính năng XtraDB này đã có trong các phiên bản
trước 10.1. Kể từ phiên bản 10.2 của MariaDB, InnoDB đã trở thành công cụ
lưu trữ mặc định cho MariaDB.
• MyRocks / RocksDB: MyRocks là một phần mềm nguồn mở được phát triển
bởi nhóm kỹ sư cơ sở dữ liệu tại Facebook và hiện tại vẫn được duy trì. Được
coi là công cụ lưu trữ đang giai đoạn alpha, nó được tối ưu hóa để lưu trữ
nhanh, độ trễ thấp. Mục tiêu chính là giúp tiết kiệm dung lượng lưu trữ một
cách hiệu quả. Bằng cách tập trung vào hiệu suất, RocksDB giúp tiết kiệm
dung lượng ổ SSD, dung lượng lưu trữ thực tế được sử dụng và giảm lượng
IO để quản lý truy vấn. RocksDB được hỗ trợ chính thức trên CentOS 6.8 và
7.2.X.
• Galera Cluster: Cụm Galera là “Multi-Master Cluster” (nhiều các server database
đóng vai trò là Master có vai trò đọc và ghi, phân biệt với Slave - là server
database chỉ có chức năng đọc) dựa trên tính năng synchronous replication.
Mục đích chính là cung cấp tính sẵn sàng cao, hạn chế thời gian dừng dịch
vụ (downtime), ngăn ngừa mất dữ liệu và có thể mở rộng để phát triển. Syn-
chronous replication có nghĩa là server Slave không có độ trễ và không bị mất
dữ liệu nếu nút (server) gặp sự cố. Nó có khả năng đọc và ghi vào bất kỳ nút
nào vào bất kỳ lúc nào và xử lý đa luồng cho Slave để có hiệu suất tốt hơn.
4
CHƯƠNG 2. CÁC CÔNG NGHỆ SỬ DỤNG
Nó có một tính năng được gọi là Chế độ Hot Standby, nghĩa là không có thời
gian ngừng hoạt động trong quá trình failover giữa các node Master (quá trình
một node Master khi bị dừng dịch vụ, một node Slave sẽ được bầu và thay thế
node Master đó).
• Sequence Storage Engine: cho phép tạo các chuỗi số tăng dần hoặc giảm dần
so với giá trị bắt đầu, giá trị kết thúc và giá trị gia tăng nhất định. Điều này tạo
ra các bảng tạm thời ảo khi cần thiết. Không có cách nào để tạo bảng tuần tự
một cách rõ ràng và chúng không được ghi vào đĩa hoặc tạo tệp .frm.
Binary log (Binlog) Binlog là một tính năng của MariaDB, nó là bản ghi chứa
tất cả, ghi lại các thay đổi đối với cơ sở dữ liệu, kể cả dữ liệu và cấu trúc dữ liệu,
cũng như thời gian thực hiện mỗi câu lệnh. Nó bao gồm một tập hợp các tệp file
log lưu dưới dạng nhị phân và một chỉ mục (index).
Điều này có nghĩa là khi thực thi các câu lệnh như CREATE, ALTER, IN-
SERT, UPDATE và DELETE, các câu lệnh sẽ được ghi lại, nhưng các câu lệnh
không làm thay đổi đến dữ liệu, chẳng hạn như SELECT và SHOW, sẽ không
được binlog ghi lại.
Hình 2.2: Dữ liệu được ghi trong binlog sau khi sử dụng công cụ của MariaDB để đọc
Mục đích của binlog là cho phép sao chép, trong đó dữ liệu được gửi từ một hoặc
nhiều máy chủ đến một hoặc nhiều máy chủ Slave dựa trên nội dung của binary
log, cũng như hỗ trợ các hoạt động sao lưu. Máy chủ MariaDB sử dụng binary log
sẽ làm ảnh hưởng đôi chút tới hiệu năng của Database.
2.2 Cơ sở dữ liệu Neo4j
Giới thiệu
5
CHƯƠNG 2. CÁC CÔNG NGHỆ SỬ DỤNG
Neo4J là hệ quản trị cơ sở dữ liệu đồ thị được giới thiệu đầu tiên vào năm 2007
và công bố phiên bản 1.0 vào năm 2010. Neo4J là một trong những hệ quản trị cơ
sở dữ liệu đồ thị được sử dụng nhiều nhất trên thế giới hiện nay, trong suốt nhiều
năm, Neo4j luôn đứng đầu trong danh sách các Cơ sở dữ liệu Đồ thị phổ biến nhất.
6
CHƯƠNG 2. CÁC CÔNG NGHỆ SỬ DỤNG
Title RDF PG
Concept Cốt lõi của RDF là khái niệm bộ Trong Property Graph, các đỉnh
ba, bao gồm ba phần tử đại diện được gọi là các node, có ID có
cho hai đỉnh được nối với nhau thể nhận dạng duy nhất và một
bằng một cạnh. Nó được gọi tập hợp các cặp key-value hoặc
là chủ subject-predicate-object. thuộc tính đặc trưng cho chúng.
Subject sẽ là một nguồn, hoặc Theo cùng một cách, các cạnh
một nút trong biểu đồ, predicate hoặc kết nối giữa các node cũng
sẽ đại diện cho một cạnh - một có ID. Điều quan trọng là chúng
mối quan hệ - và object sẽ là ta có thể xác định chúng một
một nút khác. Điều này có nghĩa cách duy nhất và chúng cũng có
là cả nút và cạnh đều không có một loại và một tập hợp các giá
cấu trúc bên trong, mỗi đỉnh hoặc trị chính của các cặp - hoặc các
cạnh được xác định bởi 1 URI, thuộc tính đặc trưng cho các kết
mỗi URI là 1 giá trị độc nhất. nối. Điểm khác biệt của PG so
với RDF là thay vì các cạnh hoặc
các node chỉ có các giá trị URI,
chúng có các cấu trúc bên trong
gồm các thuộc tính, điều này sẽ
giúp đồ thị được gọn gàng hơn,
không phải sinh thêm các node
cho mỗi thuộc tính.
Truy vấn liên Với đặc trưng về cấu trúc, do Việc thay thế các node và cạnh
kết giữa các số lượng các node lớn việc tìm bằng các thuộc tính sẽ giúp giảm
node kiếm mối quan hệ giữa 2 node là lượng lớn số lượng node.
vô cùng khó khăn: khi muốn tìm
kiếm 2 node có mối quan hệ với
nhau hay không thì cần phải quét
số lượng node và cạnh khổng lồ.
7
CHƯƠNG 2. CÁC CÔNG NGHỆ SỬ DỤNG
Các mối quan RDF không thể xác định cùng Để xác định các mối quan hệ lặp
hệ trùng lặp mối quan hệ. Không thể có các lại nhiều lần giữa 2 node, trong
kết nối cùng loại giữa cùng một PG, giữa 2 node sẽ có thêm các
cặp node vì điều đó sẽ đại diện cạnh để biểu diễn số lần mối
chính xác cho cùng một bộ ba và quan hệ đó được xảy ra. Ngoài
không có thông tin bổ sung. Điều ra nếu không muốn sinh thêm
này sẽ gây ra sự hạn chế ví dụ: các cạnh, có thể thêm thuộc tính
nếu node A với B có cùng mối count trên mối quan hệ đó, với
quan hệ C và mối quan hệ C giữa mỗi lần thay đổi số lượng mối
node A và B xuất hiện nhiều lần quan hệ chỉ cần cập nhật giá trị
thì ở RDF chỉ xác định được giữa thuộc tính count, việc này sẽ làm
A và B chỉ có duy nhất 1 liên kết giảm số lượng các cạnh của đồ
C do đặc tính mỗi định và cạnh thị.
chỉ được xác định bởi 1 URI duy
nhất, bên cạnh đó không có thuộc
tính nên sẽ không biểu diễn được
liên kết C được lặp lại 3 lần.
Hiệu suất - Gặp khó khăn với những tệp dữ - PG được tối ưu hóa cho hiệu
liệu có quy mô lớn do sự phức tạp suất và có thể xử lý các đồ thị có
của truy vấn và phân tích dữ liệu quy mô lớn.
được liên kết. - PG sử dụng các kỹ thuật in-
- RDF sử dụng kỹ thuật indexing dexing và caching để tăng tốc độ
để tăng tốc độ truy vấn và giảm truy vấn và giảm thời gian phản
thời gian phản hồi truy vấn. hồi truy vấn.
- RDF không được thiết kế cho - PG được thiết kế cho môi
môi trường high-concurrency và trường high-concurrency và có
có thể gặp khó khăn với nhiều thể xử lý nhiều truy vấn đồng
truy vấn đồng thời. thời.
8
CHƯƠNG 2. CÁC CÔNG NGHỆ SỬ DỤNG
Ưu điểm - Tiêu chuẩn hóa: tất cả các biểu - Đơn giản: Property graph được
đồ RDF đều sử dụng cùng một thiết lập và sử dụng đơn giản và
khung tiêu chuẩn và ngữ nghĩa nhanh chóng. Dễ dàng sử dụng
chính thức để lưu trữ và biểu diễn với hầu hết các người dùng.
dữ liệu cùng với một ngôn ngữ - Điều hướng dễ dàng: LPG dễ
truy vấn tiêu chuẩn. dàng duyệt qua mà không có giới
- Khả năng tương tác: RDF hạn hoặc ngôn ngữ truy vấn tiêu
Triple Store tuân theo tiêu chuẩn chuẩn.
được W3C hỗ trợ cho phép khả - Chi tiết: Các thuộc tính được
năng tương tác giữa các knowl- liên kết với các mối quan hệ
edge graph. Khả năng tương tác trong property graph cung cấp
này cho phép các biểu đồ dựa thêm nhiều thông tin chi tiết về
trên RDF tích hợp và trao đổi các thực thể dữ liệu và mối quan
thông tin với nhau. hệ của chúng mà không cần phải
- Khả năng mở rộng: đồ thị RDF tạo thêm các node bổ sung cho
cho phép người dùng thêm các từng chi tiết. Cho phép người
node và mối quan hệ mới hoặc dùng lưu bất kỳ thuộc tính nào
thậm chí các substructure mà trên các node và cạnh.
không yêu cầu xây dựng lại mô
hình.
Hạn chế - Độ phức tạp của tìm kiếm sâu - Thiếu khả năng tương tác: việc
(deep search): thực hiện tìm kiếm Thiếu tiêu chuẩn hóa trong PG
sâu trong các biểu đồ RDF lớn là khiến cho việc chia sẻ hoặc trao
một nhiệm vụ phức tạp vì nó yêu đổi dữ liệu trở nên khó khăn.
cầu duyệt qua mọi mối quan hệ.
- Tuân thủ nghiêm ngặt các tiêu
chuẩn: tất cả thông tin được lưu
trữ trong RDF phải ở dạng bộ ba,
nghĩa là chỉ có 2 đối tượng có thể
được liên kết tại một thời điểm,
điều này có thể hạn chế đối với
nhiều usecase.
Native Graph
Có hai yếu tố chính giúp phân biệt công nghệ native graph: xử lý và lưu trữ. Cơ
sở dữ liệu đồ thị native được thiết kế để vừa lưu trữ vừa xử lý dữ liệu dưới dạng
biểu đồ, đảm nhiệm việc biểu diễn các phần tử đồ thị giống với định dạng lưu trữ
9
CHƯƠNG 2. CÁC CÔNG NGHỆ SỬ DỤNG
và truy cập chúng một cách hiệu quả trong quá trình xử lý.
Cơ sở dữ liệu đồ thị non-native sử dụng một số mô hình khác để lưu trữ và xử
lý. Thông thường, chúng là các cơ sở dữ liệu đang cố gắng thêm một lớp API lên
trên một mô hình như NoSQL, RDBMS,... điều này có thể gây ảnh hưởng đến hiệu
suất của Graph Database.
Native Graph Processing để nói đến cách cơ sở dữ liệu đồ thị native xử lý các
hoạt động của cơ sở dữ liệu, bao gồm cả lưu trữ và truy vấn. Khả năng chính của cơ
sở dữ liệu đồ thị navtive là khả năng điều hướng nhanh chóng các liên kết trong dữ
liệu mà không cần phải tra cứu chỉ mục (index) hoặc các chiến lược liên kết khác.
Non-native Grap Processing thường cần phải sử dụng chỉ mục để tra cứu đến
phần tử tiếp theo trong chuỗi nhằm hoàn thành một giao dịch đọc hoặc ghi; điều
này có thể không nảy sinh vấn để với chỉ một hoặc hai mối quan hệ, nhưng trong
các trường hợp sử dụng graph database ngày nay với hàng trăm hoặc hàng nghìn
mối quan hệ, việc truy vấn sẽ gặp khó khăn. Độ phức tạp của việc tra cứu chỉ mục
thường là O(log(n)), trong khi đó để theo dõi con trỏ trực tiếp của mối quan hệ tới
nút mục tiêu chỉ mất O(1).
Graph Storage đề cập đến cấu trúc lưu trữ dữ liệu của cơ sở dữ liệu đồ thị.
Database được xây dựng để lưu trữ dữ liệu dưới dạng đồ thị được gọi là bộ lưu trữ
đồ thị native. Cơ sở dữ liệu đồ thị với bộ lưu trữ đồ thị native được tối ưu hóa cho
đồ thị, đảm bảo dữ liệu được lưu trữ hiệu quả bằng cách sử dụng bố cục lưu trữ
cũng như đặt các nút và mối quan hệ gần nhau. Cũng giống như quá trình xử lý, bộ
lưu trữ đồ thị không phải native không đáp ứng được nhu cầu về hiệu suất và quy
mô của các ứng dụng hiện đại do trong quá trình lưu trữ, database không lưu các
node và các mối quan hệ một cách rời rạc.
Neo4j là một Native Graph Database sử dụng index-free adjacency, mỗi nút
tham chiếu trực tiếp đến các nút liền kề của nó, nghĩa là việc truy cập các mối quan
hệ liên quan giữa các node chỉ đơn giản là tra cứu con trỏ. Điều này làm cho thời
gian xử lý biểu đồ native tỷ lệ thuận với lượng dữ liệu được xử lý, không tăng theo
cấp số nhân với số lượng mối quan hệ được duyệt qua và số bước nhảy. Nếu không
có index-free adjacency, một tập dữ liệu lớn sẽ không thể đáp ứng vì các truy vấn
ngày càng mất nhiều thời gian hơn khi tập dữ liệu phát triển. Mặt khác, các truy
vấn biểu đồ native thực hiện ở tốc độ không đổi dựa trên lượng dữ liệu duyệt qua
bất kể tổng kích thước dữ liệu ngày càng tăng.
Hình ảnh dưới đây là ví dụ về truy vấn trên native graph dữ liệu mạng xã hội mà
không cần sử dụng bất kỳ index nào để hỗ trợ:
10
CHƯƠNG 2. CÁC CÔNG NGHỆ SỬ DỤNG
Còn hình ảnh bên dưới minh họa một ví dụ về truy vấn trên non-native graph
chỉ tìm kiếm một cặp quan hệ trực tiếp (trong mối quan hệ nhiều-nhiều), khi muốn
tìm kiếm mối quan hệ, cần phải duyệt qua 2 index, việc này sẽ tiêu tốn rất nhiều tài
nguyên, đặc biệt khi giữa 2 node không có mối quan hệ trực tiếp:
11
CHƯƠNG 2. CÁC CÔNG NGHỆ SỬ DỤNG
12
CHƯƠNG 2. CÁC CÔNG NGHỆ SỬ DỤNG
• Xử lý thanh toán và giao dịch tài chính trong thời gian thực, chẳng hạn như
trên sàn giao dịch chứng khoán, ngân hàng và bảo hiểm.
• Để theo dõi và giám sát ô tô, xe tải, đội xe và lô hàng trong thời gian thực,
chẳng hạn như trong ngành hậu cần và ngành ô tô.
• Để liên tục thu thập và phân tích dữ liệu cảm biến từ các thiết bị IoT hoặc thiết
bị khác, chẳng hạn như trong các nhà máy.
• Để thu thập và phản hồi ngay lập tức các tương tác và đơn đặt hàng của khách
hàng, chẳng hạn như trong ngành bán lẻ, khách sạn và du lịch, các ứng dụng
di động.
• Để lưu trữ và cung cấp dữ liệu có sẵn do các bộ phận khác nhau của công ty
tạo ra.
Các thao tác xử lý các luồng sự kiện bao gồm:
• Publish (Ghi) và Subcribe (Đọc) các dòng sự kiện,
• Các luồng sự kiện được lưu trữ với tính chịu lỗi cao và lâu dài.
• Xử lý dữ liệu được sinh ra trong thời gian thực
Commit Log:
• Một yếu tố trung tâm cho phép Kafka và xử lý luồng được gọi là "log"; trong
Kafka, nó còn được gọi là "Log Commit".
• Log là một cấu trúc dữ liệu giống như một stack các phần tử. Các phần tử mới
luôn được thêm vào cuối ngăn xếp và sau khi được ghi, chúng sẽ không bao
giờ bị thay đổi.
• Các phần tử mới thêm vào log được sắp xếp theo thứ tự thời gian. Phần tử đầu
13
CHƯƠNG 2. CÁC CÔNG NGHỆ SỬ DỤNG
tiên được thêm vào ngăn xếp cũ hơn phần tử thứ hai, phần tử này cũ hơn phần
tử thứ ba.
• Nhiều hệ thống đích có thể sử dụng log một cách độc lập, mỗi hệ thống có thể
đọc dữ liệu từ các vị trí khác nhau cùng một lúc.
• Để đảm bảo tính sẵn sàng cao, Kafka giữ nhiều hơn một bản sao của log.
• Một bản sao log sẽ được bầu làm leader, các bản sao còn lại được gọi là
14
CHƯƠNG 2. CÁC CÔNG NGHỆ SỬ DỤNG
follower.
• Leader sẽ chịu trách nhiệm ghi và giữ bản sao chính của log. Các follower đọc
dữ liệu log từ leader và cập nhật bản sao cục bộ của mình.
• Nhiều hệ thống đích có thể sử dụng log một cách độc lập, mỗi hệ thống có thể
đọc dữ liệu từ các vị trí khác nhau cùng một lúc.
Các khái niệm Topic, Partition và Segment:
• Topic: Một Topic là đơn vị logic của Kafka, đại diện cho tất cả các message
(đơn vị lưu trữ nhỏ nhất trong Kafka). Ví dụ topic "Mariadb_data" bao gồm
các message, mỗi message là một bản ghi trong một bảng nào đó của Cơ sở
dữ liệu MariaDB.
• Partition: Để song song hoá việc đọc, ghi dữ liệu vào topic và tăng thông
lượng, Kafka có thể chia một Topic thành nhiều Partition. Các message của
Topic sau đó sẽ được phân bổ trên nhiều Partition. Thuật toán mặc định được
sử dụng để quyết định một message sẽ nằm trong Partiton của Topic nào là sử
dụng hàm băm key của message. Một Partition nằm hoàn toàn trên một Kafka
Broker (tức là toàn bộ message của một Partition sẽ nằm cùng trên một server
Kafka Broker).
15
CHƯƠNG 2. CÁC CÔNG NGHỆ SỬ DỤNG
Hình 2.11: Dữ liệu được lưu trên broker - các folder có định dạng Topic-Parition
• Segment: Các server Kafka Broker lưu trữ các message trong một tệp vật
lý. Các Broker sử dụng chiến lược "rolling-file". Các file lưu trữ được gọi là
segment. Khi segment đã đầy (hoặc thời gian của mỗi segment đã hết hạn),
segment tiếp theo sẽ được Broker sinh ra và các message tiếp theo sẽ được lưu
trữ tiếp tục trên segment mới.
16
CHƯƠNG 2. CÁC CÔNG NGHỆ SỬ DỤNG
• Producer: Các ứng dụng ghi dữ liệu vào một hoặc nhiều topic.
• Consumer và Consumer Group: Các Consumer là các ứng dụng dùng để
đọc dữ liệu từ Topic, các Consumer sẽ được tổ chức lại thành các Consumer
Group. Các Consumer trong Consumer Group phối hợp để đọc dữ liệu một
cách song song.
• Nói cách khác, Kafka là một hệ thống pub-sub message với các Producer có
nhiệm vụ bắt các event, các event được gửi và lưu trữ trên các máy chủ Broker.
Các Consumer subcribe các topic và khai thác các dữ liệu. Việc Produce và
Consume được thực hiện liên tục, liền mạch và realtime.
Confluent Kafka Broker
Confluent Kafka Broker là các máy chủ, container chạy tiến trình của Kafka.
Các Broker có vai trò là lưu trữ và xử lý các topic, partition, message. Nó là thành
phần cốt lõi của cụm Confluent Platform. Để đảm bảo tránh single point failure,
các Broker thường được cài đặt thành Cluster (cụm) gồm nhiều Broker khác nhau.
Số lượng các broker thường là số lẻ và số lượng lớn hay nhỏ tuỳ thuộc vào khối
lượng công việc cần xử lý.
Để giải quyết vấn đề single point failure, các Partition sẽ có các bản replication
nằm trên các Broker khác nhau, khi đó nếu một server Broker down, các bản sao
Partition sẵn sàng để thay thế.
Các Parition Replication sẽ có một Leader và các Follower, các ứng dụng muốn
đọc hay ghi dữ liệu của Partition sẽ thực hiện trên Partition Leader. Các Parition
Follower sẽ đọc dữ liệu từ Partition Leader và ghi vào bản ghi cục bộ của mình.
17
CHƯƠNG 2. CÁC CÔNG NGHỆ SỬ DỤNG
Khi một Partition Leader bị lỗi, một Parition Follower sẽ được bầu làm Leader, các
Client đọc và ghi sẽ chuyển sang làm việc với Partition Leader mới.
Với topic có nhiều partition có các bản replication, mỗi partition sẽ có leader
partition riêng. Partition Leader phải phục vụ lưu lượng truy cập lớn hơn rất nhiều
so với các Follower vì nó phải xử lý tất cả các yêu cầu produce và consume). Để
cân bằng tải, Kafka sẽ chia các Leader trên khắp các Broker.
Hình 2.15: Các Partition Leader được phân bổ trên các Broker khác nhau
Cả Producer và Consumer đều cần phải biết Broker nào đang nắm giữ Partition
Leader cần, chính vì vậy cần có một tiến trình có nhiệm vụ lưu trữ và cung cấp
18
CHƯƠNG 2. CÁC CÔNG NGHỆ SỬ DỤNG
metadata thông tin về các Broker và Partition, Partition Leader nằm trên Broker
nào. Khi Client khởi chạy, Client không biết Broker nào chứa Partition Leader nào
nên nó đưa ra yêu cầu để lấy metadata với Broker bất kỳ. Chín vì vậy metadata
thông tin các Partition được cache trên toàn bộ các Brokerm bất kỳ Broker nào
cũng có thể phản hồi yêu cầu lấy metadata. Sau khi nhận được thông tin metadata,
Client sẽ biết và giao tiếp với Broker thích hợp. Một Broker trong Cluster sẽ được
bầu làm Controller, có nhiệm vụ duy trì và gửi thông tin cập nhật metadata đến các
Broker còn lại, khi có một Partition Leader bị lỗi, Controller có nhiệm vụ bầu một
Partition khác lên làm Partition Leader.
Confluent ZooKeeper
Confluent ZooKeeper là tiến trình gắn liền với Confluent Kafka Broker, quản lý
chung tất cả các thông tin. ZooKeeper lưu trữ tất cả các thông tin về Broker, Topic,
Partition, Partition Leader,... Đối với một hệ thống phân tán, cần có tiến trình điều
phối các task đến các thành phần, ZooKeeper được thiết kế để làm công việc điều
phối này.
19
CHƯƠNG 2. CÁC CÔNG NGHỆ SỬ DỤNG
Schema Registry cung cấp một kho lưu trữ tập trung để quản lý và xác thực các
schema cho dữ liệu message của topic để serialization và deserialization dữ liệu.
Producer và Consumer tương tác với Kafka Topic có thể sử schema để đảm bảo
tính nhất quán và tương thích của dữ liệu kể cả khi schema được thay đổi. Schema
Registry là thành phần quan trọng để quản trị dữ liệu, giúp đảm bảo chất lượng dữ
liệu, tuân thủ các tiêu chuẩn, khả năng hiển thị dữ liệu, khả năng kiểm tra.
20
CHƯƠNG 2. CÁC CÔNG NGHỆ SỬ DỤNG
21
CHƯƠNG 2. CÁC CÔNG NGHỆ SỬ DỤNG
22
CHƯƠNG 2. CÁC CÔNG NGHỆ SỬ DỤNG
edge trong Neo4j bằng các câu lệnh được viết bằng Cypher (Ngôn ngữ truy
vấn dữ liệu của Neo4j).
23
CHƯƠNG 3. CÀI ĐẶT
Ở chương 3, em sẽ mô tả kiến trúc tích hợp các công nghệ và cách cài đặt các
component.
3.1 Thiết kế kiến trúc
3.1.1 Sơ đồ Logic hệ thống
Sơ đồ logic hệ thống thể hiện tầng logic của hệ thống, các vật thể thể hiện các
thành phần service mang chức năng riêng.
24
CHƯƠNG 3. CÀI ĐẶT
25
CHƯƠNG 3. CÀI ĐẶT
26
CHƯƠNG 3. CÀI ĐẶT
Chi tiết cơ sở dữ liệu trong MariaDB trong được trình bày trong bảng sau:
Chi tiết cơ sở dữ liệu trong Neo4j trong được trình bày trong bảng sau:
27
CHƯƠNG 3. CÀI ĐẶT
28
CHƯƠNG 3. CÀI ĐẶT
$ s u d o yum c l e a n a l l
4 [mysqld]
5 skip-networking=0
6 # System variables
7 session_track_system_variables=last_gtid,
autocommit,character_set_client,
character_set_connection,character_set_results,
time_zone
8 port=3306
9 max_connections = 500
29
CHƯƠNG 3. CÀI ĐẶT
10 bind-address=0.0.0.0
11 server_id=1
12 skip-external-locking
13 lower_case_table_names = 1
14 autocommit=1
15 interactive_timeout = 3600
16 wait_timeout = 3600
17 max_statement_time=300
18 symbolic-links=0
19
27 # Binlog Configuration
28 log_bin = mariadb-bin
29 log_bin_index = /data/log/binlog/mariadb-bin.index
30 gtid_strict_mode = 1
31 binlog_format = ROW
32 binlog_row_image = FULL
33 log_slave_updates=1
34 binlog-annotate-row-events=OFF
35 log-bin=/data/log/mariadb-binlog
36 binlog_ignore_db=testDB
30
CHƯƠNG 3. CÀI ĐẶT
31
CHƯƠNG 3. CÀI ĐẶT
$ s u d o yum i n s t a l l h t t p s : / / d i s t . n e o 4 j . o r g / n e o 4 j −
j a v a 1 7 − a d a p t e r . n o a r c h . rpm
$ s u d o rpm −− i m p o r t h t t p s : / / d e b i a n . n e o 4 j . com /
n e o t e c h n o l o g y . gpg . key
$ s u d o c a t << EOF > / e t c / yum . r e p o s . d / n e o 4 j . r e p o
[ neo4j ]
name= Neo4j RPM R e p o s i t o r y
b a s e u r l = h t t p s : / / yum . n e o 4 j . com / s t a b l e / 5
e n a b l e d =1
g p g c h e c k =1
EOF
$ s u d o yum c l e a n a l l
$ s u d o yum i n s t a l l n e o 4 j − 5 . 1 5 . 0
$ sudo m k d i r −p / d a t a / n e o 4 j / d a t a
$ sudo chown −R n e o 4 j . / d a t a / n e o 4 j / d a t a
$ sudo m k d i r −p / d a t a / n e o 4 j / l o g
$ sudo chown −R n e o 4 j . / d a t a / n e o 4 j / l o g
$ sudo vi / etc / neo4j / neo4j . conf
32
CHƯƠNG 3. CÀI ĐẶT
8 server.default_listen_address=0.0.0.0
9 server.bolt.listen_address=:7687
10 server.bolt.advertised_address=:7687
11 server.https.enabled=false
12 server.windows_service_name=neo4j
13
$ s u d o yum s t a r t n e o 4 j
$ s u d o yum s t a t u s n e o 4 j
33
CHƯƠNG 3. CÀI ĐẶT
Hình 3.8: Cypher Shell của Neo4J khởi chạy thành công
Hình 3.9: Giao diện web Neo4j sau khi khởi động
34
CHƯƠNG 3. CÀI ĐẶT
35
CHƯƠNG 3. CÀI ĐẶT
16 confluent-schema-registry-plugins-7.5.0-1.noarch.rpm
17 confluent-security-7.5.0-1.noarch.rpm
18 confluent-server-7.5.0-1.noarch.rpm
19 confluent-server-rest-7.5.0-1.noarch.rpm
20 confluent-telemetry-7.5.0-1.noarch.rpm
21 confluent-control-center-fe-7.5.0-1.noarch.rpm
Tạo thư mục lưu trữ và chuyển tất cả các gói cài đặt trên vào thư mục đó:
$ m k d i r −p / d a t a / s o f t w a r e / c o n f l u e n t
Chuẩn bị các thư mục lưu dữ liệu và log cho ZooKeeper, thực hiện thay đổi
quyền cho user cp-kafka (user chạy tiến trình ZooKeeper) với những thư mục này:
$ m k d i r −p $ZOOKEEPER_ROOT_DIR / d a t a
$ m k d i r −p $ZOOKEEPER_ROOT_DIR / l o g
$ chown −R cp − k a f k a : $ZOOKEEPER_ROOT_DIR
Tạo file myid trong phân vùng chứa dữ liệu của Zookeeper để ZooKeeper xác
định được id của mình trong cụm, trong file chứa id của ZooKeeper, có 3 server
ZooKeeper, id của các server sẽ lần lượt là 1, 2, 3. Câu lệnh dưới đây dùng để ghi
giá trị id=1 với node ZooKeeper 1.
$ echo 1 > $ZOOKEEPER_ROOT_DIR / d a t a / myid
36
CHƯƠNG 3. CÀI ĐẶT
Cấu hình Log4j cho ZooKeeper để ghi mọi hoạt động của ZooKeeper trong thư
mục log, giúp thuận tiện hơn cho việc kiểm tra và xử lý lỗi:
$ echo " l o g 4 j . r o o t L o g g e r =INFO , z k A p p e n d e r
l o g 4 j . appender . zkAppender= org . apache . l o g 4 j .
DailyRollingFileAppender
l o g 4 j . a p p e n d e r . z k A p p e n d e r . D a t e P a t t e r n = ’ . ’ yyyy −MM−dd −HH
l o g 4 j . a p p e n d e r . z k A p p e n d e r . F i l e = "$ZOOKEEPER_ROOT_DIR" /
logs / zookeeper . log
l o g 4 j . appender . zkAppender . l a y o u t = org . apache . l o g 4 j .
PatternLayout
l o g 4 j . a p p e n d e r . z k A p p e n d e r . l a y o u t . C o n v e r s i o n P a t t e r n =[%d
] %p %m (%c )%n " > $ZOOKEEPR_CONFIG_ROOT_DIR /
zookeeper − l o g 4 j . p r o p e r t i e s
$ c a t / b i n / k a f k a − run − c l a s s | g r e p KAFKA_LOG4J_OPTS
Hình 3.11: Cấu hình thư mục Log đã được thay đổi
4 # System Configs
5 clientPort=2181
37
CHƯƠNG 3. CÀI ĐẶT
6 maxClientCnxns=0
7 admin.enableServer=false
8 initLimit=5
9 syncLimit=2
10 autopurge.snapRetainCount=3
11 autopurge.purgeInterval=24
12
13 # ZooKeeper Servers
14 server.1=10.10.12.61:2888:3888
15 server.2=10.10.12.62:2888:3888
16 server.3=10.10.12.63:2888:3888
$ BROKER_ROOT_DIR= / d a t a / a p p s / k a f k a
$ BROKER_ROOT_CONFIG_DIR= / e t c / k a f k a
$ BASE_DIR = / b i n
Chuẩn bị các thư mục lưu dữ liệu và log cho Broker, thực hiện thay đổi quyền
cho user cp-kafka (user chạy tiến trình Broker) với những thư mục này:
$ m k d i r −p $BROKER_ROOT_DIR / d a t a
$ m k d i r −p $BROKER_ROOT_DIR / l o g
$ chown −R cp − k a f k a : $BROKER_ROOT_DIR
38
CHƯƠNG 3. CÀI ĐẶT
Cấu hình Log4j cho Broker để ghi mọi hoạt động của Broker trong thư mục log,
giúp thuận tiện hơn cho việc kiểm tra và xử lý lỗi. Chỉnh sửa tham số LOG_DIR
trong file kafka-run-class (File dùng để khởi chạy của Broker và ZooKeeper) để
khi chạy, tiến trình Broker sẽ trỏ tới thư mục chỉ định để lưu log.
$ s e d − i ’ s | LOG_DIR = . * | LOG_DIR=" ’$BROKER_ROOT_DIR ’ /
l o g s " | ’ $BASE_DIR / k a f k a − run − c l a s s
$ c a t / b i n / k a f k a − run − c l a s s | g r e p ’LOG_DIR ’
Hình 3.14: Cấu hình thư mục Log đã được thay đổi
Cấu hình file config của Broker, cấu hình broker.id là id của broker trong Cluster,
cấu hình dưới đây là cấu hình của Broker 1:
$ v i $BROKER_ROOT_DIR / s e r v e r . p r o p e r t i e s
4 # config default
5 num.network.threads=3
6 num.io.threads=8
7 socket.send.buffer.bytes=102400
8 socket.receive.buffer.bytes=102400
9 socket.request.max.bytes=104857600
10 log.dirs=/data/apps/kafka/data
11 num.partitions=3
39
CHƯƠNG 3. CÀI ĐẶT
12 num.recovery.threads.per.data.dir=3
13 offsets.topic.replication.factor=3
14 transaction.state.log.replication.factor=3
15 transaction.state.log.min.isr=2
16 log.retention.hours=1680
17 log.segment.bytes=1073741824
18 log.retention.check.interval.ms=300000
19 default.replication.factor=3
20
40
CHƯƠNG 3. CÀI ĐẶT
$ BASE_DIR = / b i n
Chuẩn bị các thư mục lưu dữ liệu và log cho Schema Registry, thực hiện thay
đổi quyền cho user cp-schema-registry (user chạy tiến trình Schema Registry) với
những thư mục này:
$ m k d i r −p $SCHEMA_ROOT_DIR / l o g s
$ chown −R cp −schema − r e g i s t r y : $SCHEMA_ROOT_DIR
$ c a t / b i n / schema − r e g i s t r y − run − c l a s s | g r e p l o g s
Hình 3.17: Cấu hình thư mục Log đã được thay đổi
4 # Connect to broker
41
CHƯƠNG 3. CÀI ĐẶT
5 kafkastore.bootstrap.servers=confluent-broker-01:9091,
confluent-broker-02:9091,confluent-broker-03:9091
6 confluent.metadata.bootstrap.server.urls=http://
confluent-broker-01:8091,http://confluent-broker
-02:8091,http://confluent-broker-03:8091
7
$ CONNECT_ROOT_DIR= / d a t a / a p p s / c o n n e c t
$ CONNECT_ROOT_CONFIG_DIR= / e t c / k a f k a
$ BASE_DIR = / b i n
Chuẩn bị các thư mục lưu connector và log cho Kafka Connect, thực hiện thay
đổi quyền cho user cp-kafka-connect (user chạy tiến trình Kafka Connect) với
những thư mục này:
$ m k d i r −p $CONNECT_ROOT_DIR / c o n n e c t o r
$ m k d i r −p $CONNECT_ROOT_DIR / l o g s
$ chown −R cp − k a f k a − c o n n e c t : $CONNECT_ROOT_DIR
42
CHƯƠNG 3. CÀI ĐẶT
Chỉnh sửa tham số LOG_DIR trong file kafka-run-class (File dùng để khởi chạy
của Kafka Connect) để lưu log trong thư mục chỉ định
$ v i $CONNECT_ROOT_CONFIG_DIR / c o n n e c t − d i s t r i b u t e d .
properties
7 # Default configs
8 key.converter=org.apache.kafka.connect.json.
JsonConverter
9 value.converter=org.apache.kafka.connect.json.
JsonConverter
10 key.converter.schemas.enable=true value.converter.
schemas.enable=true
11 offset.storage.topic=connect-offsets
43
CHƯƠNG 3. CÀI ĐẶT
12 offset.storage.replication.factor=3
13 config.storage.topic=connect-configs
14 config.storage.replication.factor=3
15 status.storage.topic=connect-status
16 status.storage.replication.factor=3 offset.flush.
interval.ms=10000
17 plugin.path=/usr/share/java,/data/apps/connect/
connectors
Hình 3.22: Debezium MySQL Connector đã có trong danh sách plugin của Kafka Connect
44
CHƯƠNG 3. CÀI ĐẶT
$ c o n f l u e n t −hub i n s t a l l n e o 4 j / k a f k a − c o n n e c t − n e o 4 j
:5.0.3
Hình 3.23: Neo4j Sink Connector đã có trong danh sách plugin của Kafka Connect
$ C3_ROOT_DIR = / d a t a / a p p s / c o n t r o l − c e n t e r
$ C3_ROOT_CONFIG_DIR = / e t c / c o n f l u e n t − c o n t r o l − c e n t e r
$ BASE_DIR = / b i n
Chuẩn bị các thư mục lưu connector và log cho Control Center, thực hiện thay
đổi quyền cho user cp-control-center (user chạy tiến trình Control Center) với
những thư mục này:
$ m k d i r −p $C3_ROOT_DIR / d a t a
$ m k d i r −p $C3_ROOT_DIR / l o g s
$ chown −R cp − k a f k a − c o n n e c t : $C3_ROOT_DIR
45
CHƯƠNG 3. CÀI ĐẶT
8 # Configure to ZooKeeper
9 zookeeper.connect=confluent-broker-01:2181,confluent-
broker-02:2181,confluent-broker-03:2181
10
46
CHƯƠNG 3. CÀI ĐẶT
15 confluent.controlcenter.schema.registry.url=http://
monitoring:8081
16
17
18 # Default configs
19 confluent.controlcenter.command.topic.partitions=3
20 confluent.controlcenter.command.topic.replication=3
21 confluent.controlcenter.data.dir=/data/apps/control-
center/data
22 confluent.controlcenter.internal.topics.partitions=3
23 confluent.controlcenter.internal.topics.replication=3
24 confluent.metrics.topic.partitions=3
25 confluent.metrics.topic.replication=3
26 confluent.metrics.topic=_confluent-metrics
27 confluent.telemetry.enabled=false
28 confluent.controlcenter.ui.autoupdate.enable=false
29 confluent.controlcenter.usage.data.collection.enable=
false
Hình 3.26: Service Confluent Control Center đã khởi động thành công
47
CHƯƠNG 3. CÀI ĐẶT
Hình 3.27: Giao diện màn hình đăng nhập của Confluent Control Center
Confluent Control Center đã kết nối thành công tới các Broker, trên giao diện
có thể thấy số Broker được hiển thị là 3:
Hình 3.28: Giao diện trang chủ của Control Center - Số broker là 3
Confluent Control Center đã kết nối thành công tới các ZooKeeper, trên giao
diện hiển thị đã kết nối tới ZooKeeper:
48
CHƯƠNG 3. CÀI ĐẶT
Confluent Control Center đã kết nối thành công tới Kafka Connect, trên Control
Center có thể quản lý các Connector:
Confluent Control Center có thể hiển thị các thông tin của một topic:
49
CHƯƠNG 3. CÀI ĐẶT
Confluent Control Center có thể hiển thị thông tin schema của Schema Registry:
Hình 3.32: Giao diện schema của Topic trên Control Center
50
CHƯƠNG 4. KẾT QUẢ THỰC NGHIỆM
Trong chương này, em sẽ trình bày cách thức thực hiện và những kết quả đã đạt
được trong trong quá trình thực hiện Đồ án.
4.1 Đồng bộ realtime, tự động từ MariaDB sang Neo4j thông qua Confluent
Platform
a, Kiểm tra dữ liệu trên MariaDB
Để thực hiện lấy dữ liệu từ MariaDB, kiểm tra dữ liệu cần lấy nằm trong bảng
ecommerce.
51
CHƯƠNG 4. KẾT QUẢ THỰC NGHIỆM
52
CHƯƠNG 4. KẾT QUẢ THỰC NGHIỆM
• Thực hiện khởi chạy Source Connector MySQLConnector, khi các task của
Connector hiển thị running tức là Connector đã chạy thành công:
53
CHƯƠNG 4. KẾT QUẢ THỰC NGHIỆM
54
CHƯƠNG 4. KẾT QUẢ THỰC NGHIỆM
Kiểm tra dữ liệu được tạo ra trên Topic, dữ liệu đường đồng bộ với dữ liệu trên
MariaDB:
55
CHƯƠNG 4. KẾT QUẢ THỰC NGHIỆM
Hình 4.9: Các trường của topic tương ứng với 12 trường trong bảng trên MariaDB
56
CHƯƠNG 4. KẾT QUẢ THỰC NGHIỆM
Hình 4.11: Tổng số message trên Topic bằng so với số bản ghi trên MariaDB
Sau khi thực hiện INSERT một số bản ghi trên MariaDB, thực hiện kiểm tra lại
trên Confluent:
Hình 4.12: Tổng số row trên MariaDB sau khi cập nhật
57
CHƯƠNG 4. KẾT QUẢ THỰC NGHIỆM
Hình 4.13: Tổng số message trên Topic tăng lên bằng so với số bản ghi trên MariaDB
Trên Confluent cho phép theo dõi lượng dữ liệu được Produce vào Topic, có thể
thấy dữ liệu đã được đẩy vào Topic trong quá trình thực hiện TNSERT dữ liệu vào
MariaDB.
Hình 4.14: Metric của Topic khi cập nhật bảng trên MariaDB
Nhận xét: Sử dụng Debezium MySQL Connector hoàn toàn có thể đồng bộ dữ
liệu từ MariaDB sang Confluent, dữ liệu được cập nhật trên MariaDB cũng sẽ được
tự động được sinh ra trên Confluent, đảm bảo dữ liệu trên Confluent và MariaDB
là như nhau, qua đó có thể đảm bảo dữ liệu đồng bộ từ MariaDB sang Neo4j có thể
sử dụng qua Confluent.
d, Tạo Connector Sink Neo4j
Các bước tạo Neo4j Connector Sink trên Control Center
58
CHƯƠNG 4. KẾT QUẢ THỰC NGHIỆM
59
CHƯƠNG 4. KẾT QUẢ THỰC NGHIỆM
• Thực hiện khởi chạy Sink Connector Neo4j, khi các task của Connector hiển
thị running tức là Connector đã chạy thành công:
60
CHƯƠNG 4. KẾT QUẢ THỰC NGHIỆM
61
CHƯƠNG 4. KẾT QUẢ THỰC NGHIỆM
62
CHƯƠNG 4. KẾT QUẢ THỰC NGHIỆM
Hình 4.21: Tổng số node không ngừng tăng trong quá trình chạy Connector
Tổng số Cạnh tăng trong quá trình chạy Connector Sink Neo4j:
63
CHƯƠNG 4. KẾT QUẢ THỰC NGHIỆM
Hình 4.23: Tổng số cạnh tăng lên trong quá trình chạy Connector
64
CHƯƠNG 4. KẾT QUẢ THỰC NGHIỆM
65
CHƯƠNG 4. KẾT QUẢ THỰC NGHIỆM
66
CHƯƠNG 4. KẾT QUẢ THỰC NGHIỆM
Nhận xét: Sử dụng Connector Sink Neo4j hoàn toàn có thể đồng bộ dữ liệu từ
Confluent sang Neo4j, khi có dữ liệu mới được ghi vào trong Topic, dữ liệu đó
cũng sẽ được tự động cập nhật vào trong Neo4j.
e, Kết luận
Confluent Platform là công cụ chuyên biệt, hoàn toàn có thể xử lý bài toán
streaming dữ liệu realtime từ MariaDB sang Confluent, dữ liệu đồng bộ hoàn toàn
được tự động một cách chuyên nghiệp.
4.2 Các mô hình khuyến nghị thời gian thực sử dụng Neo4j
a, Kỹ thuật Content-based Filtering
Kỹ thuật Content-based filtering được sử dụng để phân tích một tập hợp các item
được người dùng hoặc những người dùng khác quan tâm xếp hạng trước đó để đưa
ra dự đoán. Kỹ thuật này thường được ứng dụng trong trang web, tin tức để đưa ra
một số khuyến nghị cho người dùng. Những khuyến nghị này được thực hiện dựa
trên đánh giá của người dùng với một số mặt hàng trong quá khứ. Để tạo ra một đề
xuất đầy đủ có ý nghĩa sẽ sử dụng các loại mô hình khác nhau để tìm ra điểm tương
đồng giữa các tài liệu như Mô hình không gian vectơ, mô hình xác suất và Mạng
thần kinh (Neural Network). Khi sử dụng đề xuất dựa trên kỹ thuật này, không cần
hồ sơ người dùng vì nó được thực hiện bằng cách sử dụng học mát hoặc phân tích
thống kê. Ưu điểm của kỹ thuật này là:
• 1. Đảm bảo quyền riêng tư vì không cần chia sẻ hồ sơ người dùng
• 2. Các khuyến nghị đã được thực hiện trong một thời gian ngắn do chỉ cần
thực hiện các câu truy vấn bằng ngôn ngữ truy vấn.
67
CHƯƠNG 4. KẾT QUẢ THỰC NGHIỆM
• 3. Có thể đề xuất các mặt hàng mới ngay cả khi không có tỷ lệ nào trong đó.
Đối với tập dữ liệu em đang sử dụng trên Neo4j, đầu vào để ứng dụng kỹ thuật
Content-based filtering bao gồm User (Người dùng), Product (Các sản phẩm
người dùng tương tác trên sàn thương mại điện tử) và các ACTION (tương ứng
với phản hồi của người dùng, người dùng thực hiện các thao tác xem, đặt vào
giỏ hàng và mua sản phẩm).
1. Đảm bảo quyền riêng tư nghĩa là không cần chia sẻ hồ sơ người dùng. 2. Khuyến
nghị đã được thực hiện trong một thời gian ngắn. 3. Đề xuất các mặt hàng mới ngay
cả khi không có tỷ lệ nào trong đó.
68
CHƯƠNG 5. CÁC GIẢI PHÁP VÀ ĐÓNG GÓP NỔI BẬT
Như hình bên trên ta thấy 1 cụm MariaDB có 4 Node (1 Node Master và 3 Node
Slave). Dữ liệu chỉ được ghi bởi Node Master, các Node Slave sẽ đọc binlog của
Node Master và sao chép dữ liệu về ổ đĩa cục bộ. Dữ liệu hoàn toàn có thể được
truy vấn trên toàn bộ các Node, tuy nhiên Node Master là Node duy nhất thực hiện
ghi dữ liệu và duy trì các tiến trình đọc binlog của các Node Slave, chính vì vậy để
giảm tải cũng như tránh rủi ro quá tải dẫn đến dừng dịch vụ, Node Master chỉ nên
làm nhiệm vụ ghi dữ liệu, khi muốn truy vấn thì các ứng dụng/người dùng truy vấn
trên các node Slave.
69
CHƯƠNG 5. CÁC GIẢI PHÁP VÀ ĐÓNG GÓP NỔI BẬT
Đối với quy mô doanh nghiệp, việc có một lớp Proxy ở phía trước các node
MariaDB để điều hướng các yêu cầu từ ứng dụng tới các Node là vô cùng cần thiết.
Khi có một Node down, lớp Proxy đó có nhiệm vụ điều hướng các request sang các
Node còn lại.
MariaDB phát triển công cụ để giải quyết vấn đề đó là Maxscale.
Maxscale là công cụ tối ưu giúp điều hướng các hàng ngàn request từ các ứng
dụng. Maxscale cũng là một bộ cân bằng tải, giúp điều hướng một cách cân bằng
số lượng request tới đều tất cả các node, qua đó làm giảm hiện tượng quá tải của
các Node.
5.2 Vấn đề bảo mật của Confluent
5.2.1 Vấn đề
Bảo mật dữ liệu luôn là vấn đề ưu tiên của doanh nghiệp, việc rò rỉ thông tin
cũng là một thảm hoạ đối với doanh nghiệp.
Với thời gian thực hiện Đồ án còn hạn chế, em chưa tích hợp được các tính năng
bảo mật đối với Confluent, dữ liệu hoàn toàn có thể đọc được từ bất kỳ server nào
mà không có biện pháp bảo mật.
5.2.2 Giải pháp
Confluent là sản phẩm thương mại, chính vì vậy Confluent hiện tại đang có
những tính năng bảo mật.
70
CHƯƠNG 5. CÁC GIẢI PHÁP VÀ ĐÓNG GÓP NỔI BẬT
• Confluent hỗ trợ các biện pháp xác thực như SSL, SASL.
• Confluent hỗ trợ các biện pháp uỷ quyền như tích hợp với Lightweight Direc-
tory Access Protoco - LDAP (Tính năng độc quyền của Confluent) và Access
Control List - ACL.
71
CHƯƠNG 5. CÁC GIẢI PHÁP VÀ ĐÓNG GÓP NỔI BẬT
• Trên đường truyền mạng, Confluent cũng hỗ trợ bảo mật SSL trên đường
truyền,
72
CHƯƠNG 6. KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN TƯƠNG LAI
73