Tidak dapat terhubung ke ProxySQL: alasan dan solusi

Database


Posting ProxySQL ini berasal dari kesalahan yang saya temui baru-baru ini

handler___status_CONNECTING_CLIENT___STATE_SERVER_HANDSHAKE(): [ERROR] ProxySQL Error: Access denied for user

ProxySQL telah menjadi pilihan populer sebagai “proxy” untuk database MySQL. Posting ini akan memandu Anda untuk men-debug masalah koneksi dan sekitarnya untuk kasus tertentu.

Konektivitas ProxySQL

Tentu saja, saat menghubungkan ke ProxySQL kami memiliki dua pilihan untuk apa yang ingin kami lakukan: Antarmuka Manajemen dan MySQL.

  • Antarmuka administrasi memungkinkan kita untuk mengonfigurasi dan mengelola ProxySQL.
  • Antarmuka MySQL pada dasarnya adalah koneksi “proxy” ke database MySQL yang dikonfigurasi dalam ProxySQL.

Untuk menghubungkan antarmuka manajemen:

mysql -uADMIN_USER -pADMIN_PASSWORD -h127.0.0.1 -P6032

ADMIN_USER dan ADMIN_PASSWORD diambil dari konfigurasi admin-admin_credentials. Port 6032 didefinisikan dalam opsi konfigurasi mysql_ifaces dan dapat dikonfigurasi dengan beberapa port.

Dikonfigurasi untuk terhubung ke database MySQL

mysql -uUSER -pPASSWORD -h127.0.0.1 -P6033

Di sini, USER dan PASSWORD didefinisikan dalam tabel mysql_users (dan tentu saja dimuat saat runtime). Port 6033 ditentukan dalam opsi pengaturan antarmuka dan dapat dikonfigurasi.

Sekarang setelah kita membangun pemahaman yang sangat mendasar tentang konektivitas, mari kita buat topik konektivitas yang ingin kita diskusikan lebih lanjut bersama dengan resolusi.

Mulailah dengan membuat pengguna “admin” agar aplikasi kita dapat terhubung ke database. Tentu saja, pengguna ini hadir di server MySQL. Perhatikan bahwa meskipun kata sandi disimpan dalam teks biasa di sini, kami juga dapat menggunakan kata sandi terenkripsi dari tabel pengguna MySQL.

[root@kedar ~]# mysql -uadmin -padmin -P6032 -h127.0.0.1

mysql> insert into mysql_users (username, password,default_hostgroup) values ('admin','admin',0);
Query OK, 1 row affected (0.00 sec)
mysql> load mysql users to runtime; save mysql users to disk;
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.01 sec)

Mari coba sambungkan ke antarmuka manajemen lagi

[root@kedar ~]# mysql -uadmin -padmin -P6032 -h127.0.0.1
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): ProxySQL Error: Access denied for user 'admin'@'127.0.0.1' (using password: YES)
[root@kedar ~]#
# note that you can still connect to MySQL port though (6033)

Lihat log kesalahan

[root@kedar ~]# tail -1 /var/lib/proxysql/proxysql.log
2022-10-08 10:41:16 MySQL_Session.cpp:5439:handler___status_CONNECTING_CLIENT___STATE_SERVER_HANDSHAKE(): [ERROR] ProxySQL Error: Access denied for user 'admin'@'127.0.0.1' (using password: YES)
[root@kedar ~]#

Kami tidak dapat melihat apa pun di log kesalahan yang memberi tahu kami apa pun tentang kesalahan tersebut. Tetapi kami tahu bahwa aksesnya kacau sejak kami membuat pengguna itu! Mari kita singkirkan itu, oke? Benar-benar tidak ada koneksi ke ProxySQL?
Secara teknis kita bisa. ProxySQL menggunakan SQLite sebagai penyimpanan data default untuk menyimpan data pada disk, dan kita dapat memanipulasinya secara diam-diam.

Edit database ProxySQL

# Stop ProxySQL
[root@kedar ~]# systemctl stop proxysql

# Backup the db file
[root@kedar ~]# cd /var/lib/proxysql/
[root@kedar ~]# cp proxysql.db proxysql.db.1

# Open db file with sqlite3
[root@kedar proxysql]# sqlite3 proxysql.db
SQLite version 3.7.17 2013-05-20 00:56:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .tables
global_variables
mysql_aws_aurora_hostgroups
mysql_collations
mysql_firewall_whitelist_rules
mysql_firewall_whitelist_sqli_fingerprints
mysql_firewall_whitelist_users
mysql_galera_hostgroups
mysql_group_replication_hostgroups
mysql_query_rules
mysql_query_rules_fast_routing
mysql_replication_hostgroups
mysql_servers
mysql_users
proxysql_servers
restapi_routes
scheduler

sqlite> .headers on
sqlite> .schema mysql_users
CREATE TABLE mysql_users (username VARCHAR NOT NULL , password VARCHAR , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , use_ssl INT CHECK (use_ssl IN (0,1)) NOT NULL DEFAULT 0 , default_hostgroup INT NOT NULL DEFAULT 0 , default_schema VARCHAR , schema_locked INT CHECK (schema_locked IN (0,1)) NOT NULL DEFAULT 0 , transaction_persistent INT CHECK (transaction_persistent IN (0,1)) NOT NULL DEFAULT 1 , fast_forward INT CHECK (fast_forward IN (0,1)) NOT NULL DEFAULT 0 , backend INT CHECK (backend IN (0,1)) NOT NULL DEFAULT 1 , frontend INT CHECK (frontend IN (0,1)) NOT NULL DEFAULT 1 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 10000 , attributes VARCHAR CHECK (JSON_VALID(attributes) OR attributes="") NOT NULL DEFAULT '' , comment VARCHAR NOT NULL DEFAULT '' , PRIMARY KEY (username, backend) , UNIQUE (username, frontend));
sqlite> select * from mysql_users;
username|password|active|use_ssl|default_hostgroup|default_schema|schema_locked|transaction_persistent|fast_forward|backend|frontend|max_connections|attributes|comment
kedar|*8D39C185A69E3453E27F96FBDBFFC701DE027750|1|0|10|test|0|1|0|0|1|10000||
kedar|*8D39C185A69E3453E27F96FBDBFFC701DE027750|1|0|10|test|0|1|0|1|0|10000||
admin|*4ACFE3202A5FF5CF467898FC58AAB1D615029441|1|0|10|test|0|1|0|1|1|10000||

# Delete the user we created and verify it is gone
sqlite> delete from mysql_users where username="admin";
sqlite> select * from mysql_users;
username|password|active|use_ssl|default_hostgroup|default_schema|schema_locked|transaction_persistent|fast_forward|backend|frontend|max_connections|attributes|comment
kedar|*8D39C185A69E3453E27F96FBDBFFC701DE027750|1|0|10|test|0|1|0|0|1|10000||
kedar|*8D39C185A69E3453E27F96FBDBFFC701DE027750|1|0|10|test|0|1|0|1|0|10000||
sqlite> .quit

# Start ProxySQL
[root@kedar proxysql]# systemctl start proxysql

# Attempt connectivity (Voila!)
[root@kedar proxysql]# mysql -uadmin -padmin -P6032 -h127.0.0.1
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.30 (ProxySQL Admin Module)

Copyright (c) 2009-2021 Percona LLC and/or its affiliates
Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> \s
--------------
mysql  Ver 14.14 Distrib 5.7.36-39, for Linux (x86_64) using  6.2

Connection id:		1
Current database:	admin
Current user:		percona
SSL:			Not in use
Current pager:		stdout
Using outfile:		''
Using delimiter:	;
Server version:		5.5.30 (ProxySQL Admin Module)
Protocol version:	10
Connection:		127.0.0.1 via TCP/IP
Server characterset:	utf8
Db     characterset:	utf8
Client characterset:	utf8
Conn.  characterset:	utf8
TCP port:		6032
Uptime:			2 sec

Threads: 0  Questions: 0  Slow queries: 0
--------------

Sekali lagi, pastikan Anda memiliki cadangan sebelum bermain dengan database backend ProxySQL.

Tapi kenapa kami diblokir? Kami mengalami masalah ini karena dokumentasi dengan jelas menyebutkan batasan nama pengguna.

Pengguna yang ditentukan dalam admin-admin_credentials atau admin-stats_credentials juga tidak dapat digunakan di tabel mysql_users.

Jadi ini terbatas tidak hanya untuk pengguna “admin”, tetapi untuk nama pengguna lain yang dipilih untuk dua peran ini. Dan jika Anda melakukannya, ProxySQL tidak akan memperingatkan Anda atau memberi tahu Anda melalui log kesalahan, itu hanya akan memblokir akses Anda ke sana!

Ada satu hal lagi yang bisa kita lakukan di sini, tapi ini seperti hard reset. Kami juga dapat mengatur ulang pengaturan ProxySQL untuk menginisialisasi database cadangan dari konfigurasi.

[root@kedar ~]# proxysql --initial
… [INFO] Using config file /etc/proxysql.cnf
Renaming database file /var/lib/proxysql/proxysql.db

Bendera awal di sini mengatur ulang file database SQLite ke keadaan awal dan memuatnya dari konfigurasi, mengganti nama file database SQLite yang ada jika diperlukan.

Inilah yang Anda lihat di direktori data ProxySQL:

[root@kedar ~]# ls proxysql.db*
proxysql.db proxysql.db.bak

Catatan pendek: Anda dapat menggunakan pernyataan penyisipan berikut dalam database untuk menyiapkan perintah penyisipan mysql_users. Di sini saya menganggap Host default adalah 10.

select concat('INSERT INTO mysql_users(username,password,default_hostgroup) VALUES (',user,',',authentication_string,',10);') from mysql.user group by user;

Semoga ini membantu! Selamat ProxySQLing.





Source link

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *