1. 程式人生 > 其它 >proxysql實現mysql讀寫分離

proxysql實現mysql讀寫分離

技術標籤:中介軟體mysql

ProxySQL

mysql實現讀寫分離的方式

mysql 實現讀寫分離的方式有以下幾種:

  • 程式修改mysql操作,直接和資料庫通訊,簡單快捷的讀寫分離和隨機的方式實現的負載均衡,許可權獨立分配,需要開發人員協助。
  • amoeba,直接實現讀寫分離和負載均衡,不用修改程式碼,有很靈活的資料解決方案,自己分配賬戶,和後端資料庫許可權管理獨立,許可權處理不夠靈活。
  • mysql-proxy,直接實現讀寫分離和負載均衡,不用修改程式碼,master和slave用一樣的帳號,效率低
    mycat中介軟體
  • proxysql中介軟體(推薦使用)

ProxySQL簡介

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

ProxySQL 是用 C++ 語言開發的,雖然也是一個輕量級產品,但效能很好(據測試,能處理千億級的資料),功能也足夠,能滿足中介軟體所需的絕大多數功能,包括:

最基本的讀/寫分離,且方式有多種

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

ProxySQL安裝

配置yum源
[[email protected] yum.repos.d]# cat proxysql.repo 
[proxysql_repo]
name= ProxySQL
baseurl=http://repo.proxysql.com/ProxySQL/proxysql-2.0.x/centos/8
gpgcheck=1
gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key
[[email protected] ~]# yum -y install proxysql

##由於下載速度過慢,採用另一種
[[email protected]
~]# rpm -ivh proxysql-2.0.15-1-centos8.x86_64.rpm warning: proxysql-2.0.15-1-centos8.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID 79953b49: NOKEY Verifying... ################################# [100%] Preparing... ################################# [100%] Updating / installing... 1:proxysql-2.0.15-1 warning: group proxysql does not exist - using root warning: group proxysql does not exist - using root ################################# [100%] Created symlink /etc/systemd/system/multi-user.target.wants/proxysql.service → /etc/systemd/system/proxysql.service. [[email protected] ~]# ls proxysql-2.0.15-1-centos8.x86_64.rpm ...

ProxySQL的Admin管理介面

當 ProxySQL 啟動後,將監聽兩個埠:

  • admin管理介面,預設埠為6032。該埠用於檢視、配置ProxySQL
  • 接收SQL語句的介面,預設埠為6033,這個介面類似於MySQL的3306埠
    在這裡插入圖片描述
    ProxySQL 的 admin 管理介面是一個使用 MySQL 協議的介面,所以,可以直接使用 mysql 客戶端、navicat 等工具去連線這個管理介面,其預設的使用者名稱和密碼均為 admin
使用 mysql 客戶端去連線 ProxySQL 的管理介面:
[[email protected] ~]# mysql -uadmin -padmin -P6032 -h127.0.0.1
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 database;
ERROR 1045 (28000): ProxySQL Admin Error: near "show": syntax error
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.000 sec)

MySQL [(none)]> 

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

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

和admin管理介面相關的變數

admin-admin_credentials

admin-admin_credentials 變數控制的是admin管理介面的管理員賬戶。預設的管理員賬戶和密碼為admin:admin,但是這個預設的使用者只能在本地使用。如果想要遠端連線到ProxySQL,例如用windows上的navicat連線Linux上的ProxySQL管理介面,必須自定義一個管理員賬戶。

檢視當前使用者名稱和密碼
MySQL [(none)]> select @@admin-admin_credentials;       
+---------------------------+
| @@admin-admin_credentials |
+---------------------------+
| admin:admin               |
+---------------------------+
1 row in set (0.01 sec)

設定管理員帳號myadmin,密碼123456
MySQL [(none)]> set admin-admin_credentials='admin:admin;proadmin:123456';
Query OK, 1 row affected (0.000 sec)

MySQL [(none)]> select @@admin-admin_credentials;
+-----------------------------+
| @@admin-admin_credentials   |
+-----------------------------+
| admin:admin;proadmin:123456 |
+-----------------------------+
1 row in set (0.001 sec)
使修改立即生效
MySQL [(none)]> load admin variables to runtime;
Query OK, 0 rows affected (0.000 sec)
使修改永久儲存到磁碟
MySQL [(none)]> save admin variables to disk;
Query OK, 35 rows affected (0.004 sec)
修改後,就可以使用該使用者名稱和密碼遠端連線管理介面
[[email protected] yum.repos.d]# mysql -uproadmin -p123456 -P6032 -h192.168.163.129
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
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)]> 


所有的配置操作都是在修改main庫中對應的表
MySQL [(none)]> select * from global_variables where variable_name='admin-admin_credentials';
+-------------------------+-----------------------------+
| variable_name           | variable_value              |
+-------------------------+-----------------------------+
| admin-admin_credentials | admin:admin;proadmin:123456 |
+-------------------------+-----------------------------+
1 row in set (0.006 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-stats_credentials 變數控制admin管理介面的普通使用者,這個變數中的使用者沒有超級管理員許可權,只能檢視monitor庫和main庫中關於統計的資料,其它庫都是不可見的,且沒有任何寫許可權

預設的普通使用者名稱和密碼均為 stats ,與admin一樣,它預設也只能用於本地登入,若想讓人遠端檢視則要新增檢視的專有使用者

[[email protected] ~]# mysql -ustats -pstats -P6032 -h127.0.0.1
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
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.
使用admin賬戶進行管理
[[email protected] ~]# mysql -uadmin -padmin -P6032 -h127.0.0.1
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)]> select @@admin-stats_credentials;
+---------------------------+
| @@admin-stats_credentials |
+---------------------------+
| stats:stats               |
+---------------------------+
1 row in set (0.001 sec)
新增專有的檢視使用者
MySQL [(none)]> set admin-stats_credentials='stats:stats;prostats:123456';
Query OK, 1 row affected (0.000 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, 35 rows affected (0.006 sec)

MySQL [(none)]> select @@admin-stats_credentials;
+-----------------------------+
| @@admin-stats_credentials   |
+-----------------------------+
| stats:stats;prostats:123456 |
+-----------------------------+
1 row in set (0.002 sec)
在遠端主機上驗證
[[email protected] ~]# mysql -uprostats -p123456 -P6032 -h192.168.163.129;
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
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)]> 

同樣,這個變數中的使用者必須不能存在於mysql_users表中

admin-mysql_ifaces

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

注意,允許使用UNIX的domain socket進行監聽,這樣本主機內的應用程式就可以直接被處理。
例如:

原埠資訊
MySQL [(none)]> select @@admin-mysql_ifaces;
+----------------------+
| @@admin-mysql_ifaces |
+----------------------+
| 0.0.0.0:6032         |
+----------------------+
1 row in set (0.001 sec)
修改為1030埠
MySQL [(none)]> set admin-mysql_ifaces='0.0.0.0:1030';
Query OK, 1 row affected (0.001 sec)

MySQL [(none)]> load admin variables to runtime;
Query OK, 0 rows affected (0.000 sec)
修改後只能用新埠號登
MySQL [(none)]> quit
Bye
[[email protected] ~]# mysql -uadmin -padmin -P1030 -h127.0.0.1
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
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)]>