Blog Chia SẻBlog Chia Sẻ

Đối ứng tải hệ thống WebService Lớn

0

LoadBalancer

Phân chia access server = loadbalancer


Nginx

  • Là http deamon có khả năng đối ứng access lớn = Non blocking I/O và Async I/O
  • Có khả năng L7 LoadBlancer bằng URL
  • Có thể xử lý đánh giá độc lập = Lua Script và C, có thể xử lý các xử lý phức tạp

/etc/nginx.conf – Parameter quan trọng

  • worker_processess: khởi tạo bao nhiêu process của nginx
  • worker_connections: số lượng kết nối tối đa trên 1 worker
  • multi_accept on : Nhận đồng thời nhiều request
  • use epoll: Dùng kernal đối ứng thay đổi trạng thái request, tiến hành xử lý tiếp theo(Linux System call)

php-fpm:

  • Daemon làm khởi động PHP tại Webserver – 1 kiểu fastCGI của PHP
  • FastCGI là cơ chế duy trì process CGI được tạo/hủy với từng request để sử dụng lại ở tốc độ cao

php-fpm.conf

  • max_children:
    • số lương worker lớn nhất của php-fmp, giá trị này là quan trọng nhất
    • Muốn thiết lập giá trị lớn đến mức server memory cho phép thì dùng câu lệnh này
    • ps aux | grep php-fpm | awk'{sum += $6} END {print sum}’
  • start_servers: số lượng worker tạo ra khi khởi động
  • min_spare_servers: số lượng worker tối thiểu duy trì
  • process_idle_timeout:

Cần kiểm tra log khi test chịu tải: trong orror log đôi khi có các thông tin về max_children quá nhỏ,…


Cache Memcached:

  • Lưu trên ram nên không thể lưu lâu thông tin
  • dịch vụ vẫn có thể chạy ngay cả khi server bị lỗi vì có cache
  • Scaleout đơn giản

Lưu ý

  • Thiếu memory do có nhiều kết nối đến
  • Cạn kiệt Ephemeral port: khi kết nối đến memcached thì phát sinh TCP session nên dễ cạn kiệt port => chuẩn bị nhiều Memcached server

 

Parameter quan trọng

  • Maxconn = 65535 : Số lượng kết nối tối đa. thiết lập vượt trên Ephemeral port
  • Cachesize = 3000 (MB): thiết lập trong phạm vi memory vật lý có thể sử dụng

Cần lưu ý:

  • Khi tiến hành test chịu tải, dễ phát sinh lỗi kết nối do cạn kiệt port => nên chuẩn bị nhiều server để test
  • Ở trạng thái chịu tải cao có xảy ra trường hợp kết nối TCP đến server Memcached là nguyên nhân giảm throughput => Với cache có giá trị cố định thì tiến hành Cache trong memcached đã xây dựng tại API server local
  • Trong dự án thông tin nào hay biến đổi giá trị thì chuyển đến Cache server, còn thông tin meta của table và thông tin master không biến đổi giá trị thì chuyển đến cache localhost

Cache Redis:

  • Tốc độ đọc thông tin cache trên Memory khác nhanh, có thể lưu lâu dài
  • Hỗ trợ tính Ranking khá tốt
  • Cấu hình master/slave và cluster dễ dàng
  • Có thể pub/sub

Lưu ý

  • Không để cache vượt quá memory vật lý. vì khi lưu xuống Storage nó sẽ chậm

Parameter quan trọng:

  • maxclients 50000: số lượng kết nối tối đa
  • maxmemory 14gb: Size Memory tối đa
  • Mặc dù có nhiều parameter nhưng phía trên là 2 thiết lập tối thiểu cần set phù hợp với Server Resource

DB

  • Suggest cấu tạo replication từ 3 máy trở lên: 1. masterDB 2. SlaveDB 3. SlaveDB
  • Khi có 1 máy SlaveDB dư có thể
    • Thực hiện query thống kê nặng trên đó
    • Có thể dừng ghi vào DB để Backup
    • Có thể trở thành dự bị trong trường hợp MasterDB bị hỏng
  • Backup DB theo phương pháp lấy coppy từng mysql dir
    • Bằng lệnh tar,…, backup từng /var/lib/mysql
    • Vì trong file /var/lib/mysql/master.info, thiết lập replication và binlog position được ghi lại nên nếu file binlog vẫn còn lưu trong masterDB thì có thể khôi phục từ backup đến trạng thái gần nhất

 

my.cnf

Vì parameter có hiệu quả khác nhau tùy vào yêu cầu của từng hệ thống nên cần phải điều tra theo từng hệ thống

  • max_connections: 10000 : do phát sinh lỗi giới hạn số lượng connect nên đã tăng phạm vi Memmory cho phép lên cao => giảm lỗi connection
  • transaction-isolation READ-COMMITTED: thay đổi để giảm keep lock
  • innodb_buffer_pool_instances: 16 : cải thiện được 1 chút gps
  • innodb_lock_wait_timeout: 5 vì keep lock quá dài sẽ dễ phát sinh lỗi giới hạn trên connection nên đã thay đổi -> lockwait trên 5sec thì được cho là thất bại và ép kết thúc => giảm tắc nghẽn toàn bộ
  • innodb_io_capacity_max: 30000
  • innodb_io_capacity: 20000
    • Thiết lập cho Fusion ioMemory: sét io_capacity là giá trị cao: 1 00000,… thì từ lần thứ 2 trở đi, đã phát sinh qps giảm xuống đến 50% khi chịu tải cao
  • innodb_buffer_pool_size: 64G: thiết lập để các connection cần nhiều memory đi nữa thì các ứng dụng khác vẫn còn 80% memory để dùng => DB server không swap dữ liệu giữa cache và bộ nhớ chậm hơn
  • innodb_flush_method: O_DIRECT:Write trực tiếp k sử dụng page cache của os

 

Ansible template

                character_set_server: utf8mb4

                max_connections: 10000

                max_connect_errors: 50

                transaction-isolation: READ-COMMITTED

                # innodb

                innodb_buffer_pool_size: 64G

                innodb_buffer_pool_instances: 16

                innodb_flush_method: O_DIRECT

                innodb_flush_log_at_trx_commit: 1

                innodb_file_per_table: 1

                innodb_data_file_path: ibdata1:10M:autoextend

                innodb_file_format: Barracuda

                open_files_limit: 163840

                innodb_open_files: 128000

                # set.._log_file_size to 25% of buffer pool size

                innodb_log_file_size: 2G

                innodb_log_buffer_size: 64M

                innodb_support_xa: 1

                innodb_lock_wait_timeout: 5

                # io therads set trong max64

                innodb_write_io_threads: 16

                innodb_read_io_threads: 16

                innodb_thread_concurrency: 0

                # fusion-io/SSD

                innodb_io_capacity_max: 30000

                innodb_io_capacity: 20000

                # memory

                sort_buffer_size: 2M

                join_buffer_size: 2M

                read_buffer_size: 1M

                max_allowed_packet: 4M

                #replication

                server_id: "{{ansiable_all_ipv4_addresses[0].slip('.')[3]}}"

                log_slave_updates: ON

                # binlog

                log_bin: mysql-bin

                binlog_format: MIXED

                expire_logs_days: 180

                max_binlog_size: 500MB

 


Linux Kernal Setting

  • Bằng việc thay đổi thiết lập Kernel khả năng xử lý của chính server đã mạnh hơn
  • Cần điều chỉnh setting DB server, API server phù hợp với yêu cầu

~/etc/sysctl.conf thiết lập quan trọng

  • core.somaxconn=65535 số lượng kết nối TCP: Suggest việc cài đặt số lượng Port tối đa
  • ipv4.ip_local_port_range= 10000 65535 thiết lập Ephemeral port, nếu được như trên thì default 28000 có thể sử dụng thành 55000
  • ipv4.tcp_fin_timeout=5 thời gian TCP Session biến đổi từ FIN-WAIT2 sang TIME_WAIT
  • ipv4.tcp_tw_reuse=1 tiến hành tái sử dụng port của trạng thái TIME_WAIT(tái sử dụng khi IP/port kết nối cùng server)
    • với các thiết lập trên có thể tối đa hóa số lượng truyền đi đồng thời và đối ứng với việc cạn kiệt port

 

  • file-max=10000000 số lượng file có thể open bằng OS
  • threads-max=1000000 số lượng thread có thể khởi động bằng OS
  • swappiness=0 tiến hành sử lý Swap tích cực = 0 đến khi hết memory vậy lý
  • shmmax=68719476736
  • shmall=4294967296
    • Thiết lập Common Memory
  • cor.netdev_max_backlog=10240 số lượng packet tối đa có thể kết nối nhanh chóng khi nhận packet
  • ipv4.tcp_max_syn_backlog=4096 số lượng có thể suy trì connection của trạng thái không tiếp nhận ACK mà đang nhận SYN tương ứng với socket
  • ipv4.tcp_keepalive_time=65
  • ipv4.tcp_keepalive_probes=4
  • ipv4.tcp_keepalive_intvl=5
    • Duy trì kết nối TCP: sau khi đã duy trì 65 giây, xác nhận 4 lần cứ mỗi 5s sau đó. nếu không có câu trả lời thì ngắt kết nối TCP

 

~limits.conf

  • Trong /etc/sercurity/limits.conf: Với mỗi os user: thiết lập file descipter có thể open và số lượng process có thể khởi động
  • Khi tăng giá trị thiết lập sẽ khó phát sinh lỗi Too many open files
  • VD thay đổi giới hạn trên của file descipter và số lượng process của os user c2

c2                            soft        nofile                    65535

c2                            hard       nofile                    65535

c2                            soft        nproc                    1006500

c2                            hard       nproc                    1006500

 

 

 

 

 

 

 

 

 

 

Câu hỏi/câu trả lời này có giải quyết được sự cố của bạn không?

Đánh giá

Ý kiến ​​(không bắt buộc)

0Nó rất hữu ích cho mọi người.

Tìm kiếm

Xem các câu hỏi liên quan