ProxySQL - alat untuk koneksi demultiplexing

Halo, nama saya Alexander Yakovlev, saya bekerja untuk Citimobil dan beroperasi. Hari ini saya akan memberi tahu Anda tentang produk ProxySQL yang sangat menarik - ini adalah Proxy MySQL kinerja tinggi yang dapat melakukan banyak hal - menangkap dan membunuh permintaan dengan mask, dengan itu Anda dapat mencari injeksi sql, menduplikasi beban dan banyak lagi. Saya akan berbicara tentang pengalaman kami dengannya.
Cepat atau lambat, setiap proyek TI besar, pengembangan yang dimulai dengan sepasang server, akan menghadapi situasi yang dijelaskan di bawah ini. Bayangkan proyek awalnya hanya memiliki satu database - server master. Perlahan-lahan, sekelompok budak ditambahkan ke dalamnya. Kemudian mereka memperkenalkan sharding.

Dan suatu hari, beban tiba-tiba meningkat 10 kali lipat. Misalnya, karena pesaing utama Anda telah jatuh, dan pelanggan bergegas ke Anda. Pada titik ini, tampaknya bagi Anda bahwa Anda dapat dengan mudah mengukur beban dengan menambahkan server web. Tetapi setelah Anda melakukan ini, muncul situasi yang tidak menyenangkan.

Perhatikan contoh satu master. Katakanlah Anda memiliki 50 server web dan pada setiap 200 proses php-fpm. Kemudian 50 * 200 koneksi akan tiba di master, dan pada saat itu 50 * 200 / jumlah budak akan datang ke masing-masing budak (jika, tentu saja, roundrobin dikonfigurasi dalam haproxy) - lihat gambar di bawah ini. Tentu saja, 10 ribu koneksi ke master sangat banyak, tetapi masih dapat diterima, dan jika ada 200 situs web, jumlah koneksi akan lebih banyak lagi, dan satu koneksi = satu utas.
Dalam kemacetan inilah kami bertemu.

gambar

Kemudian kami mulai berdebat: koneksi ke wizard selalu diinstal dalam kode, tetapi apakah itu perlu untuk semua proses fpm? Mungkin tidak. Kami memperhatikan bahwa sejumlah besar koneksi yang bertahan dengan master cukup menggantung. Dan mereka memutuskan bahwa kita perlu demultiplexing.

gambar

Untuk melakukan ini, kami menarik perhatian ke produk yang disebut ProxySQL. Ini bekerja seperti proxy terbalik normal: koneksi dibuat untuk itu, dan itu mendistribusikan kembali lalu lintas sesuai dengan aturan tertentu yang ditentukan dalam konfigurasi.

Kami menginstal ProxySQL di semua server web kami, dan dalam konfigurasi aplikasi, kami menetapkan bahwa panggilan ke master database dilakukan di alamat 127.0.0.1. Jika sebelum 200 pekerja FPM di setiap server web berarti 200 koneksi ke pangkalan utama dari mesin ini, sekarang situasinya telah berubah. 200 koneksi ini datang dalam ProxySQL, dan 50-70 keluar pada waktu yang berbeda. Artinya, ProxySQL dapat menggunakan kembali koneksi yang ada.

Berkat demultiplexing, kami mengurangi jumlah koneksi sebanyak 3-10 kali pada semua master, lihat grafik koneksi saat ini dari salah satu master di bawah ini.

gambar

Berkat ProxySQL, kami menyingkirkan hambatan di atas. Tetapi ini bukan satu-satunya alur kerja yang telah kami tingkatkan dengan alat ini.
Kami belum menyelesaikan proses kedua, tetapi sangat dekat dengan penyelesaian. Menggunakan ProxySQL, kami berencana untuk menduplikasi beban nyata di lingkungan pengujian. Ini diperlukan untuk memeriksa fitur-fitur baru dengan traffic tempur.

Bagaimana ini akan diterapkan? Aplikasi masuk ke ProxySQL, dan mengirimkan lalu lintas di sepanjang dua rute: ke database pertempuran agar aplikasi berfungsi, dan ke lingkungan pengujian untuk memeriksa fitur-fitur baru yang sedang dimuat.

Fitur ProxySQL adalah bahwa ada konfigurasi, yang dalam kasus kami diluncurkan melalui boneka (untuk boneka ada modul ProxySQL), tetapi ada juga konsep zona runtime ketika, untuk melakukan perubahan (menambah server, menambah pengguna, menghapus server dan pengguna ), Anda tidak perlu restart / reload., Semuanya dilakukan melalui konsol ProxySQL, misalnya seperti ini.

mysql -ulogin -ppassword -h 127.0.0.1 -P6032 -e "INSERT INTO mysql_users(username,password,default_hostgroup) VALUES ('sm_username','pass',1);;LOAD MYSQL USERS TO RUNTIME;SAVE MYSQL USERS TO DISK;"

Lebih detail, tentu saja, di dokumentasi resmi proxysql.com/documentation

Terima kasih atas perhatian Anda.

Konfigurasi kami, yang dengannya kami memecahkan masalah yang dijelaskan di atas, lihat di bawah.

Konfigurasi kami

datadir="/var/lib/proxysql"

admin_variables=
{
    admin_credentials="user:pass"
    mysql_ifaces="0.0.0.0:6032"
    refresh_interval=2000
    web_enabled=true
    web_port=6080
    stats_credentials="stats:admin"
}

mysql_variables =
{
    threads = 1000
    max_connections = 2000
    default_query_delay= 0
    default_query_timeout=1
    have_compress=true
    poll_timeout=2000
    interfaces="0.0.0.0:6033;/tmp/proxysql.sock"
    default_schema="information_schema"
    stacksize=1048576
    server_version="5.7.22"
    connect_timeout_server=10000
    monitor_history=60000
    monitor_connect_interval=200000
    monitor_ping_interval=200000
    ping_interval_server_msec=5000
    ping_timeout_server=200
    commands_stats=true
    sessions_sort=true
    monitor_username="root"
    monitor_password="password"
    monitor_galera_healthcheck_interval=200
    monitor_galera_healthcheck_timeout=80
}

mysql_servers =
(
  {
    address = "ip_real_mysql_server",
    port = 3306,
    max_connections = 10000,
    host_group = 1,
  })
mysql_users =
(
  {
    username = "user",
    password = "pass",
    default_hostgroup = 1,
    transaction_persistent = 0,
    active = 1,
  })

All Articles