🥬
FreshForFresh
  • ✌️Xin chào!
  • Overview
    • 💡Data structures and Algorithms
    • 👀Programming
    • 🧠Database
    • 🦴Back-End
    • ✨Front-End
    • 💐Spring Framework
    • 🛠️Tool
  • Data structures and Algorithms
    • 🎰Data Type
    • 🗑️Garbage collection
    • 🧩Data structures
    • 🎲Algorithms
  • Programming
    • 🧮Compiler
      • 🤖Tại sao phải cần compiler?
      • 📠Java Virtual Machine
  • 📈Thread
  • 🔐Lock & Deadlock
  • 🏇Race condition & Data Race
  • 🧯Synchronized
  • 🗜️Blocking IO và Non Blocking IO Client Server Socket
  • 🌐Languages
    • 🎛️Programming Language
    • 📑Client-Side & Server-Side
    • ⁉️Why java? Why javascript?
  • 🗼Design pattern
    • 🎨Front-End Design Pattern
    • 🏗️Back End Design Pattern
      • 🐴with Java
      • 🦄with Spring Boot
      • 🐖with Modern Backend Development
      • 🐁with Microservice
  • 🍀Clean Code
    • 🌊Chương 1: Code sạch
    • 📐Chương 2: Quy tắc đặt tên rõ nghĩa
    • 🚧Chương 3: Cách viết hàm
    • 👻Chương 4: Comments thế nào cho chuẩn?
    • 🥳Chương 5: Định dạng code.
    • 😈Chương 6: Đối tượng và cấu trúc dữ liệu
    • 🐛Chương 7: Xử lí lỗi
    • ☦️Chương 8: Ranh giới code
    • 🧪Chương 9: Unit test
    • 🥂Chương 10: Lớp đối tượng
    • 🥡Chương 11: Code sạch cấp hệ thống
  • Database
    • 🐔Giới thiệu
    • 📰Các loại cơ sở dữ liệu
    • 🐘Các loại DBMS phổ biến
    • 🕵️‍♀️SQL và cách sử dụng với relational database
      • 👺Lệnh SQL
      • 🛢️JOIN trong SQL
      • 🛕GROUP BY trong SQL
      • 🐼ORDER BY trong SQL
      • 🐣Truy vấn con SUBQUERY trong SQL Server
      • 🏦Transaction Trong SQL
      • 🇲🇰ACID
    • ☢️Thiết kế cơ sở dữ liệu
    • 🕍Consistency and concurrency handling
      • 🔒Database locking
      • 🎮Concurrency Control
      • 🙀Isolation Level
    • 🎨Performance & Scability
      • ☝️Indexing
      • 👯‍♂️Partitioning
      • 💅Các tips tăng hiệu suất SQL
      • 🇲🇬Kiểm tra và Xác thực việc Sao lưu và Phục hồi CSDL
      • 🌠Database sharding
      • 🧘‍♂️REPLICATION
      • 😁Các vấn đề ảnh hưởng đến performance.
  • Back-End
    • 🔫API?
    • 🐕‍🦺Web Services
    • 💾Phân biệt API và web service
    • 🙆‍♂️Tìm hiểu về RestAPI
    • 🧦SOAP
    • ✈️GraphQL API
    • 📊Compared GraphQL & REST
    • 📄Phân biệt HTTP & HTTPS
    • 🚵Client & Server
    • 🇩🇲DOM
  • Front-End
    • 🦑User Interface (UI)
    • 🛰️State Management
  • Spring Framework
    • 🔐Spring Security
      • 🌅Đơn giản hoá Spring Security
      • 🌸Spring Security: Authentication and Authorization In-Depth
      • 🚻OAuth2 Basic
      • 🀄JWT + Spring Security Oauth
      • 📤Logout trong ứng dụng sử dụng bảo mật Oauth
      • 🔂Reset Password
      • 🎗️OAuth2 Remember Me với Refresh Token
      • ⛓️OAuth2 cho một Spring REST API
  • Network
    • 💸Mạng máy tính căn bản
  • Tool
    • 🦏Các câu lệnh Docker cơ bản
    • 🦧Github
      • 🐰Các lệnh Git cơ bản
      • 🐇Một số trường hợp khi sử dụng Git
    • 🏚️WebServer
      • 🪂Tổng quan về kiến trúc hệ thống
      • 🔃Cơ bản về WebServer Nginx
  • Tài nguyên
    • 👨‍🏫Course
    • 📖Docs
Powered by GitBook
On this page
  • Nội dung:
  • 1, Database.
  • 2, Loadbalancer.
  • Lời kết
  1. Database
  2. Performance & Scability

Các vấn đề ảnh hưởng đến performance.

PreviousREPLICATIONNextAPI?

Last updated 1 year ago

Dạo này mình đang nghiên cứu về loadbalancing cho các website , mình đã có 1 vài bài trình bày về những gì mình hiểu về loadbalacing với nginx (ở những link bên trên ai có hứng thú có thể đọc qua ). Tuy nhiên đào sâu vào tìm hiểu mình là thấy có 1 vài vấn đề có liên quan đến performance của hệ thống loadbalacing nên hôm nay mình sẽ trình bày thêm về các vấn đề mình tìm hiểu được. Bài tìm hiểu này dựa trên kiến thức hạn hẹp của mình nên nếu có gì sai hay có vấn đề gì mong các bạn comment để mình biết thêm nhé. Thank you

Nội dung:

Hình ảnh bên trên là một mô hình của một hệ thống loadbalacing. Về cơ bản thì mọi hệ thống loadbalancing đều có mô hình như thế này.

Như các bạn đã biết (hoặc chưa rõ) , các loadbalancer có 2 kiểu phân tải :

  • Layer 4: TCP (layer transport - mô hình OSI) ==> Vơi hình thức phân tải này , tất cả các traffic đi vào loadbalancer sẽ sẽ được chuyển tiếp đến từng server phân tải và theo các chiến lược đã config trong loadbalacer (round-robin, ip_hash, hash) . Như vậy, các server con cần chứa các nội dung code hoàn toàn giống nhau và đều connect với cùng 1 datatabase

  • Layer 7: HTTP (layer application - mô hình OSI) ==> Hình thức phân tải này , cho phép cân bằng tải để chuyển tiếp các request tới những server backend tương ứng dựa trên nội dung của request từ người dùng. Như vậy, hiểu đơn giản thì các server con sẽ chứa các phần code khác nhau để xử lý những nội dung khác nhau. Tuy nhiên vẫn cần connect đến 1 database giống nhau.

Ok, nhìn một cách tổng quát thì mô hình trên không hề có vấn đề gì, việc phân tải sẽ giúp hệ thống được tăng cường . Tuy nhiên với mô hình mình đã trình bày bên trên mình thì thực sự là nó còn một vài điểm yếu chết người nữa mà chúng ta cần quan tâm để hệ thống vận hành một cách trơn mượt . Đó là :

1, Database.

Nhìn trên mô hình bên trên không khó để bạn nhận ra rằng, tất cả các server con đều cần connect đến 1 database thống nhất để bảo toàn dữ liệu .

Tuy nhiên , chính việc bảo toàn dữ liệu này lại gây ra nhược điểm chết người. Nếu database của bạn tự nhiên lăn ra chết thì loadbalacing sẽ không còn ý nghĩa gì nữa đúng không.

Tuy nhiên, đến đây mình lại gặp 1 vấn đề lớn nữa, nếu sử dụng loadbalacing cho database thì làm thế nào đảm bảo tính thống nhất của dữ liệu. Và thật tuyêt vời chỉ sau một vài đường search cơ bản mình đẫ tìm ra phương án giải quyết vấn đề . Thật tuyệt vời vì Mysql có cơ chế replication database.

Về replication database bạn có thể tìm hiểu nó trên mạng vì có rất nhiều tài liêu liên quàn. Tuy nhiên nói ngắn gọn thì nó là cơ chế backup database tự động của mysql. Chia ra làm Master và Slave . Mỗi khi Master làm gì thì Slave sẽ làm y hệt chinh vì thế đảm bảo tính toàn vẹn của dữ liệu.

Để có thể thực hiện được các kĩ thuật mình nói bên trên các bạn có thể tìm hiểu thêm về những thứ sau :

  • HAProxy

  • Replication Mysql

2, Loadbalancer.

Cũng giống như database thôi , ta đều dùng chung 1 Loadbalancer để phân tải cho tất cả các server con thì việc gì sẽ diễn ra nếu 1 ngày đẹp trời nhà cung cấp server Loadbalancer báo chuột cắn server và mọi thứ đều tèo hoặc 1 ngày nào đó site của bạn tăng traffic lên một cách đột ngột và Loadbalancer của bạn tèo vì đã bị quá tải .

Cho dù kịch bản nào đi chăng nữa thì mọi việc cũng không phải là điều tốt đẹp cho hệ thống, mọi thứ sẽ công dã tràng khi mà Loadbalancer của bạn ra đi.

Keepalived là một kĩ thuât kiểm tra trạng thái giữa 2 thiết bị bằng cách kết nối với nhau. Với bài toán của chúng ta , hiểu đơn giải thì Keepalived sẽ tạo ra 1 vitrual IP , sẽ có 1 serever làm master (Đánh priority cao hơn) và còn lại Keepalived sẽ check xem master có hẹo hay ko, nếu master hẹo thì chuyển master cho server khác đang avaiable

Để có thể thực hiện được các kĩ thuật mình nói bên trên các bạn có thể tìm hiểu thêm về những thứ sau :

  • HAProxy

Lời kết

All rights reserved

Khi nghĩ đến vấn đề này mình đã cảm thấy cực kì khó giải quyết và không tìm ra phương hướng. Tuy nhiên, mình lại cảm thấy nó quen quen với bài toán loadbalacing . Các website có thể loadbalacing được thì tại sao các database không loadbalacing được. Chỉ cần loadbalacing được database thì đó không còn là vấn đề nữa.

Đừng lo vì các tiền bối đi trước đã cho chúng ta phương án để giải quyết nỗi lo này. Đó chính là kĩ thuật . Nghe quen quen phải không, tuy nhiên bạn đường hiểu nhầm đây là keepalived trong HTTP keep-alive nhé vì nó hoàn toàn khác đấy .

.

Bài viết trên mình tổng kết lại những vấn đề mình tìm ra và các giải pháp có thể sử dụng để giải quyết vấn đề. Tuy nhiên, mình cũng chưa đi vào giải quyết vấn đề một cách cụ thể. Nếu mọi người có hứng thú thì mình sẽ trình bày về từng vấn đề cụ thể . Thank you for reading !

🎨
😁
keepalived
keepalived
😄
😄
😄
😄