1. 程式人生 > 實用技巧 >mysql讀寫分離-proxysql

mysql讀寫分離-proxysql

mysql讀寫分離方式

1.開發人員修改mysql操作,直接和資料庫通訊,實現簡單快捷的讀寫分離和負載均衡,但是權則限獨立分配。
2.amoeba,直接實現讀寫分離和負載均衡,不用修改程式碼,有很靈活的資料解決方案,自己分配賬戶,和後端資料庫許可權管理獨立,許可權處理不夠靈活。
3.mysql-proxy,直接實現讀寫分離和負載均衡,不用修改程式碼,master和slave用一樣的帳號,效率低
4.mycat中介軟體
5.proxysql中介軟體

proxysql

簡介

ProxySQL 是一款可以實際用於生產環境的 MySQL 中介軟體,它有官方版和 percona 版兩種。percona版是在官方版的基礎上修改的,添加了幾個比較實用的工具。生產環境建議用官方版。

ProxySQL 是用 C++ 語言開發的,能滿足中介軟體所需的絕大多數功能功能:

1.最基本的讀/寫分離
2.可定製基於使用者、基於schema、基於語句的規則對SQL語句進行路由。換句話說,規則很靈活。基於schema和與語句級的規則,可以實現簡單的sharding(分庫分表)
3.可快取查詢結果。雖然ProxySQL的快取策略比較簡陋,但實現了基本的快取功能,絕大多數時候也夠用了。
4.監控後端節點。ProxySQL可以監控後端節點的多個指標,包括:ProxySQL和後端的心跳資訊,後端節點的read-only/read-write,slave和master的資料同步延遲性(replication lag).

proxysql安裝

[root@vm3 ~]# vim /etc/yum.repos.d/proxysql.repo
[proxysql_repo]
name=ProxySQL
baseurl=http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/centos/7
gpgcheck=1
gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key
[root@vm3 ~]# yum clean all 
[root@vm3 ~]# yum makecache
CentOS-8 - AppStream                            1.5 MB/s | 6.3 MB     00:04    
CentOS-8 - Base                                 1.0 MB/s | 2.3 MB     00:02    
CentOS-8 - Extras                               5.6 kB/s | 8.6 kB     00:01    
ProxySQL                                        2.8 kB/s | 4.4 kB     00:01    
Last metadata expiration chec

  • 安裝proxysql
[root@vm3 ~]# yum -y install proxysql mariadb

proxysql偵聽埠

[root@vm3 ~]# systemctl start proxysql
[root@vm3 ~]# ss -antl 
State     Recv-Q    Send-Q       Local Address:Port        Peer Address:Port    
LISTEN    0         128                0.0.0.0:6032             0.0.0.0:*       
LISTEN    0         128                0.0.0.0:6033             0.0.0.0:*       
LISTEN    0         128                0.0.0.0:6033             0.0.0.0:*       
LISTEN    0         128                0.0.0.0:6033             0.0.0.0:*       
LISTEN    0         128                0.0.0.0:6033             0.0.0.0:*       
LISTEN    0         128                0.0.0.0:22               0.0.0.0:*       
LISTEN    0         128                   [::]:22                  [::]:*    

admin管理介面

預設埠為6032。該埠用於檢視、配置ProxySQL,該介面使用MySQL協議所以,可以直接使用mysql客戶端、navicat等工具去連線這個管理介面,其預設的使用者名稱和密碼均為 admin。

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

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

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

MySQL [(none)]> show databases;
+-----+---------------+-------------------------------------+
| seq | name          | file                                |
+-----+---------------+-------------------------------------+
| 0   | main          |                                     |
| 2   | disk          | /var/lib/proxysql/proxysql.db       |
| 3   | stats         |                                     |
| 4   | monitor       |                                     |
| 5   | stats_history | /var/lib/proxysql/proxysql_stats.db |
+-----+---------------+-------------------------------------+
5 rows in set (0.001 sec)

MySQL [(none)]> 

ProxySQL 的配置全部儲存在幾個自帶的庫中,所以通過管理介面,ProxySQL會解析某些對ProxySQL有效的特定命令,並將其合理轉換後傳送給內嵌的SQLite3 資料庫引擎去執行,從而可以非常方便地修改 ProxySQL 的配置。

ProxySQL 的配置幾乎都是通過管理介面來操作的,通過 Admin 管理介面,可以線上修改幾乎所有的配置並使其生效。只有兩個變數的配置是必須重啟 ProxySQL 才能生效的,它們是:
mysql-threadsmysql-stacksize

接收SQL語句的介面

  • 預設埠為6033,這個介面類似於MySQL的3306埠

admin管理介面的相關變數

admin-admin_credentials

該變數控制的是admin管理介面的管理員賬戶。預設的管理員賬戶和密碼為admin:admin,但是這個預設的使用者只能在本地使用。若需要遠端連線則必須自定義一個管理員使用者。

  • 新增管理員賬戶
##檢視當前管理員賬戶資訊
MySQL [(none)]> select @@admin-admin_credentials;
+---------------------------+
| @@admin-admin_credentials |
+---------------------------+
| admin:admin               |
+---------------------------+
1 row in set (0.003 sec)

##設定新的管理員賬戶
MySQL [(none)]> set admin-admin_credentials='admin:admin;wisan:wisan';
Query OK, 1 row affected (0.001 sec)

MySQL [(none)]> select @@admin-admin_credentials;
+---------------------------+
| @@admin-admin_credentials |
+---------------------------+
| admin:admin;wisan:wisan   |
+---------------------------+
1 row in set (0.003 sec)

##載入生效
MySQL [(none)]> load admin variables to runtime;
Query OK, 0 rows affected (0.001 sec)

##儲存到磁碟,否則重啟賬戶消失
MySQL [(none)]> save admin variables to disk;
Query OK, 31 rows affected (0.006 sec)
  • 遠端登入驗證
[root@vm5 ~]# mysql -uadmin -padmin -h192.168.225.130 -P6032
ERROR 2002 (HY000): Can't connect to MySQL server on '192.168.225.130' (115)
[root@vm5 ~]# mysql -uwisan -pwisan -h192.168.225.130 -P6032
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.5.30 (ProxySQL Admin Module)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

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

MySQL [(none)]> 

  • 修改main庫中對應的表即位配置proxysql
MySQL [(none)]> show databases;
+-----+---------------+-------------------------------------+
| seq | name          | file                                |
+-----+---------------+-------------------------------------+
| 0   | main          |                                     |
| 2   | disk          | /var/lib/proxysql/proxysql.db       |
| 3   | stats         |                                     |
| 4   | monitor       |                                     |
| 5   | stats_history | /var/lib/proxysql/proxysql_stats.db |
+-----+---------------+-------------------------------------+
5 rows in set (0.002 sec)

MySQL [(none)]> use main;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MySQL [main]> show tables;
+--------------------------------------------+
| tables                                     |
+--------------------------------------------+
| global_variables                           |
| mysql_collations                           |
| mysql_group_replication_hostgroups         |
| mysql_query_rules                          |
| mysql_query_rules_fast_routing             |
| mysql_replication_hostgroups               |
| mysql_servers                              |
| mysql_users                                |
| proxysql_servers                           |
| runtime_checksums_values                   |
| runtime_global_variables                   |
| runtime_mysql_group_replication_hostgroups |
| runtime_mysql_query_rules                  |
| runtime_mysql_query_rules_fast_routing     |
| runtime_mysql_replication_hostgroups       |
| runtime_mysql_servers                      |
| runtime_mysql_users                        |
| runtime_proxysql_servers                   |
| runtime_scheduler                          |
| scheduler                                  |
+--------------------------------------------+
20 rows in set (0.002 sec)

  • 注意:區分admin管理介面的使用者名稱和mysql_users中的使用者名稱

admin管理介面的使用者是連線到管理介面(預設埠6032)上用來管理、配置ProxySQL的

mysql_users表中的使用者名稱是應用程式連線ProxySQL(預設埠6033),以及ProxySQL連線後端MySQL Servers使用的使用者。它的作用是傳送、路由SQL語句,類似於MySQL Server的3306埠。所以,這個表中的使用者必須已經在後端MySQL Server上存在且授權了

admin管理介面的使用者必須不能存在於mysql_users中,這是出於安全的考慮,防止通過admin管理介面使用者猜出mysql_users中的使用者

admin-stats_credentials

該變數控制admin管理介面的普通使用者,這個變數中的使用者沒只能檢視monitor庫和main庫中關於統計的資料,其它庫都是不可見的,且沒有任何寫許可權

預設的普通使用者名稱和密碼均為stats,與admin一樣,它預設也只能用於本地登入,若想讓人遠端檢視則要新增檢視的專有使用者。同樣,這個變數中的使用者必須不能存在於mysql_users表中

  • 新增檢視使用者
MySQL [(none)]> select @@admin-stats_credentials;
+---------------------------+
| @@admin-stats_credentials |
+---------------------------+
| stats:stats               |
+---------------------------+
1 row in set (0.003 sec)

MySQL [(none)]> set admin-stats_credentials='stats:stats;mystats:mystats';
Query OK, 1 row affected (0.001 sec)

MySQL [(none)]> select @@admin-stats_credentials;
+---------------------------+
| @@admin-stats_credentials |
+---------------------------+
| stats:stats;mystats:mystats   |
+---------------------------+
1 row in set (0.002 sec)

MySQL [(none)]> load admin variables to runtime;
Query OK, 0 rows affected (0.001 sec)

MySQL [(none)]> save admin variables to disk;
Query OK, 31 rows affected (0.005 sec)

MySQL [(none)]> 

  • 驗證
[root@vm5 ~]# mysql -umystats -pmystats -h192.168.225.130 -P6032
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.5.30 (ProxySQL Admin Module)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

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

MySQL [(none)]> show databases;
+-----+---------------+-------------------------------------+
| seq | name          | file                                |
+-----+---------------+-------------------------------------+
| 0   | main          |                                     |
| 2   | monitor       |                                     |
| 3   | stats_history | /var/lib/proxysql/proxysql_stats.db |
+-----+---------------+-------------------------------------+
3 rows in set (0.001 sec)

MySQL [(none)]> show tables from main;
+--------------------------------------+
| tables                               |
+--------------------------------------+
| global_variables                     |
| stats_memory_metrics                 |
| stats_mysql_commands_counters        |
| stats_mysql_connection_pool          |
| stats_mysql_connection_pool_reset    |
| stats_mysql_global                   |
| stats_mysql_prepared_statements_info |
| stats_mysql_processlist              |
| stats_mysql_query_digest             |
| stats_mysql_query_digest_reset       |
| stats_mysql_query_rules              |
| stats_mysql_users                    |
| stats_proxysql_servers_checksums     |
| stats_proxysql_servers_metrics       |
| stats_proxysql_servers_status        |
+--------------------------------------+
15 rows in set (0.002 sec)

MySQL [(none)]> 

admin-mysql_ifaces

admin-mysql_ifaces變數指定admin介面的監聽地址,格式為冒號分隔的hostname:port列表。預設監聽在 0.0.0.0:6032

  • 修改admin介面的監聽埠為6666
MySQL [(none)]> select @@admin-mysql_ifaces;
+----------------------+
| @@admin-mysql_ifaces |
+----------------------+
| 0.0.0.0:6032         |
+----------------------+
1 row in set (0.002 sec)

MySQL [(none)]> set admin-mysql_ifaces='0.0.0.0:6666';
Query OK, 1 row affected (0.001 sec)

MySQL [(none)]> select @@admin-mysql_ifaces;
+----------------------+
| @@admin-mysql_ifaces |
+----------------------+
| 0.0.0.0:6666         |
+----------------------+
1 row in set (0.002 sec)

MySQL [(none)]> load admin variables to runtime;
Query OK, 0 rows affected (0.001 sec)

MySQL [(none)]> save admin variables to disk;
Query OK, 31 rows affected (0.029 sec)

MySQL [(none)]> quit

  • 檢視埠
[root@vm3 ~]# ss -antl 
State     Recv-Q    Send-Q       Local Address:Port        Peer Address:Port    
LISTEN    0         128                0.0.0.0:6666             0.0.0.0:*       
LISTEN    0         128                0.0.0.0:6033             0.0.0.0:*       
LISTEN    0         128                0.0.0.0:6033             0.0.0.0:*       
LISTEN    0         128                0.0.0.0:6033             0.0.0.0:*       
LISTEN    0         128                0.0.0.0:6033             0.0.0.0:*       
LISTEN    0         128                0.0.0.0:22               0.0.0.0:*       
LISTEN    0         128                   [::]:22                  [::]:*       
[root@vm3 ~]# 

同時還允許使用UNIX的domain socket進行監聽,這樣本主機內的應用程式就可以直接被處理。

  • 使用socket監聽
MySQL [(none)]> set admin-mysql_ifaces='0.0.0.0:6666;/tmp/proxysql_admin.sock';
Query OK, 1 row affected (0.001 sec)

MySQL [(none)]> load admin variables to runtime;
Query OK, 0 rows affected (0.001 sec)

MySQL [(none)]> save admin variables to disk;
Query OK, 31 rows affected (0.006 sec)

MySQL [(none)]> select @@admin-mysql_ifaces;
+---------------------------------------+
| @@admin-mysql_ifaces                  |
+---------------------------------------+
| 0.0.0.0:6666;/tmp/proxysql_admin.sock |
+---------------------------------------+
1 row in set (0.003 sec)

  • 驗證
[root@vm3 ~]# cd /tmp/
[root@vm3 tmp]# ls
proxysql_admin.sock
[root@vm3 tmp]# ll
total 0
srwxrwxrwx. 1 root root 0 Dec 28 20:57 proxysql_admin.sock

##套接字登入
[root@vm3 tmp]# mysql -uadmin -padmin  -S proxysql_admin.sock 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.5.30 (ProxySQL Admin Module)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

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

MySQL [(none)]>