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安裝
- 配置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-threads 和 mysql-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)]>