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ảm ơn bạn đã trả lời.