1. 程式人生 > 其它 >ProxySQL實現讀寫分離與讀負載均衡

ProxySQL實現讀寫分離與讀負載均衡

MySQL配置主從同步文章地址:https://www.cnblogs.com/sanduzxcvbnm/p/16295369.html
ProxySQL實現讀寫分離與讀負載均衡參考文件:https://www.cnblogs.com/gered/p/12856263.html

架構

IP server-id 資料庫版本 備註
192.168.20.200 200 MySQL 8.0.29 Master(主庫)
192.168.20.201 201 MySQL 8.0.18 Slave(從庫)
192.168.20.202 2.4.1 ProxySQL

下載並安裝

# wget https://github.com/sysown/proxysql/releases/download/v2.4.1/proxysql-2.4.1-1-centos7.x86_64.rpm
# rpm -ivh proxysql-2.4.1-1-centos7.x86_64.rpm 
警告:proxysql-2.4.1-1-centos7.x86_64.rpm: 頭V4 RSA/SHA512 Signature, 金鑰 ID 8217c97e: NOKEY
錯誤:依賴檢測失敗:
        gnutls 被 proxysql-2.4.1-1.x86_64 需要
        libgnutls.so.28()(64bit) 被 proxysql-2.4.1-1.x86_64 需要
        libgnutls.so.28(GNUTLS_1_4)(64bit) 被 proxysql-2.4.1-1.x86_64 需要
        libgnutls.so.28(GNUTLS_3_0_0)(64bit) 被 proxysql-2.4.1-1.x86_64 需要
        libgnutls.so.28(GNUTLS_3_1_0)(64bit) 被 proxysql-2.4.1-1.x86_64 需要
        perl(DBD::mysql) 被 proxysql-2.4.1-1.x86_64 需要
        perl(DBI) 被 proxysql-2.4.1-1.x86_64 需要

建議採用yum方式安裝

檢視相應安裝檔案路徑,有哪些檔案

# rpm -ql proxysql
/etc/logrotate.d/proxysql
/etc/proxysql.cnf
/etc/systemd/system/proxysql.service
/usr/bin/proxysql
/usr/share/proxysql/tools/proxysql_galera_checker.sh
/usr/share/proxysql/tools/proxysql_galera_writer.pl

/etc/proxysql.cnf 是 ProxySQL 的配置檔案

yum方式安裝

# cat <<EOF | tee /etc/yum.repos.d/proxysql.repo
[proxysql_repo]
name= ProxySQL YUM repository
baseurl=https://repo.proxysql.com/ProxySQL/proxysql-2.4.x/centos/\$releasever
gpgcheck=1
gpgkey=https://repo.proxysql.com/ProxySQL/repo_pub_key
EOF

# yum -y install proxysql

ProxySQL常用命令

systemctl start proxysql.service
systemctl stop proxysql.service
systemctl enable proxysql.service

# 檢視是否啟動
# netstat -anlp | grep proxysql
tcp        0      0 0.0.0.0:6032            0.0.0.0:*               LISTEN      2989/proxysql      
tcp        0      0 0.0.0.0:6033            0.0.0.0:*               LISTEN      2989/proxysql

6032 是 ProxySQL 的管理埠號,6033是對外服務的埠號

檢視 ProxySQL 的版本: proxysql --version

管理員登入 ProxySQL

ProxySQL 的使用者名稱和密碼都是預設的 admin

# /usr/local/mysql/bin/mysql -uadmin -padmin -h 127.0.0.1 -P 6032

可見有五個庫: main、disk、stats 、monitor 和 stats_history

main: 記憶體配置資料庫,即 MEMORY,表裡存放後端 db 例項、使用者驗證、路由規則等資訊。main 庫中有如下資訊:

庫下的主要表:
mysql_servers: 後端可以連線 MySQL 伺服器的列表
mysql_users: 配置後端資料庫的賬號和監控的賬號。
mysql_query_rules: 指定 Query 路由到後端不同伺服器的規則列表。

注: 表名以 runtime_開頭的表示 ProxySQL 當前執行的配置內容,不能通過 DML 語句修改。

只能修改對應的不以 runtime 開頭的表,然後 “LOAD” 使其生效,“SAVE” 使其存到硬碟以供下次重啟載入。

disk :持久化的磁碟的配置
stats: 統計資訊的彙總
monitor:一些監控的收集資訊,比如資料庫的健康狀態等
stats_history: 這個庫是 ProxySQL 收集的有關其內部功能的歷史指標

配置 ProxySQL 所需賬戶

在 master (192.168.20.200) 的 MySQL 上建立 ProxySQL 的監控賬戶和對外訪問賬戶, 8.0.x 使用者認證的方式需要修改為 mysql_native_password 

#proxysql 的監控賬戶
mysql> create user 'monitor'@'192.168.20.201' identified with mysql_native_password by 'vxRDX$v%XXuz^v!m';
mysql> grant all privileges on *.* to 'monitor'@'192.168.20.201' with grant option;
 
#proxysql 的對外訪問賬戶
mysql> create user 'proxysql'@'192.168.20.201' identified with mysql_native_passwordby 'vxRDX$v%XXuz^v!m';
mysql> grant all privileges on *.* to 'proxysql'@'192.168.20.201' with grant option;
 
mysql> flush privileges;

或者先在配置檔案中新增如下內容,並重啟MySQL,然後在建立有關使用者

# cat /etc/my.cnf
[mysqld]
default_authentication_plugin=mysql_native_password

#proxysql 的監控賬戶
mysql> create user 'monitor'@'192.168.20.201' identified by 'vxRDX$v%XXuz^v!m';
mysql> grant all privileges on *.* to 'monitor'@'192.168.20.201' with grant option;
 
#proxysql 的對外訪問賬戶
mysql> create user 'proxysql'@'192.168.20.201' identified by 'vxRDX$v%XXuz^v!m';
mysql> grant all privileges on *.* to 'proxysql'@'192.168.20.201' with grant option;
 
mysql> flush privileges;

ProxySQL 的多層配置系統

配置結構如下:

https://github.com/sysown/proxysql/wiki/Configuring-ProxySQL

整套配置系統分為三層:頂層為 RUNTIME ,中間層為 MEMORY , 底層也就是持久層 DISK 和 CONFIG FILE 。

RUNTIME : 代表 ProxySQL 當前生效的正在使用的配置,無法直接修改這裡的配置,必須要從下一層 “load” 進來。
MEMORY: MEMORY 層上面連線 RUNTIME 層,下面連線持久層。這層可以正常操作 ProxySQL 配置,隨便修改,不會影響生產環境。修改一個配置一般都是現在 MEMORY 層完成的,確認正常之後在載入達到 RUNTIME 和 持久化的磁碟上。

DISK 和 CONFIG FILE:持久化配置資訊,重啟後記憶體中的配置資訊會丟失,所需要將配置資訊保留在磁碟中。重啟時,可以從磁碟快速載入回來。

在不同層次間移動配置

為了將配置持久化到磁碟或者應用到 runtime,在管理介面下有一系列管理命令來實現它們。

1.要重新配置 MySQL 使用者,可執行下面的其中一個命令:


1、LOAD MYSQL USERS FROM MEMORY / LOAD MYSQL USERS TO RUNTIME
 將記憶體資料庫中的配置載入到 runtime 資料結構,反之亦然。
2、SAVE MYSQL USERS TO MEMORY / SAVE MYSQL USERS FROM RUNTIME
 將 MySQL 使用者從 runtime 持久化到記憶體資料庫。
3、LOAD MYSQL USERS TO MEMORY / LOAD MYSQL USERS FROM DISK
 從磁碟資料庫中載入 MySQL 使用者到記憶體資料庫中。
4、SAVE MYSQL USERS FROM MEMORY / SAVE MYSQL USERS TO DISK
 將記憶體資料庫中的 MySQL 使用者持久化到磁碟資料庫中。
5、LOAD MYSQL USERS FROM CONFIG
 從配置檔案中載入 MySQL 使用者到記憶體資料庫中。

2.要處理 MySQL server:


1、LOAD MYSQL SERVERS FROM MEMORY / LOAD MYSQL SERVERS TO RUNTIME
 將 MySQL server 從記憶體資料庫中載入到 runtime。
2、SAVE MYSQL SERVERS TO MEMORY / SAVE MYSQL SERVERS FROM RUNTIME
 將 MySQL server 從 runtime 持久化到記憶體資料庫中。
3、LOAD MYSQL SERVERS TO MEMORY / LOAD MYSQL SERVERS FROM DISK
 從磁碟資料庫中載入 MySQL server 到記憶體資料庫。
4、SAVE MYSQL SERVERS FROM MEMORY / SAVE MYSQL SERVERS TO DISK
 從記憶體資料庫中將 MySQL server 持久化到磁碟資料庫中。
5、LOAD MYSQL SERVERS FROM CONFIG
 從配置檔案中載入 MySQL server 到記憶體資料庫中

3.要處理 MySQL 的查詢規則(mysql query rules):


1、 LOAD MYSQL QUERY RULES FROM MEMORY / LOAD MYSQL QUERY RULES TO RUNTIME
 將 MySQL query rules 從記憶體資料庫載入到 runtime 資料結構。
2、 SAVE MYSQL QUERY RULES TO MEMORY / SAVE MYSQL QUERY RULES FROM RUNTIME
 將 MySQL query rules 從 runtime 資料結構中持久化到記憶體資料庫。
3、 LOAD MYSQL QUERY RULES TO MEMORY / LOAD MYSQL QUERY RULES FROM DISK
 從磁碟資料庫中載入 MySQL query rules 到記憶體資料庫中。
4、 SAVE MYSQL QUERY RULES FROM MEMORY / SAVE MYSQL QUERY RULES TO DISK
 將 MySQL query rules 從記憶體資料庫中持久化到磁碟資料庫中。
5、 LOAD MYSQL QUERY RULES FROM CONFIG
 從配置檔案中載入 MySQL query rules 到記憶體資料庫中。

4.要處理 MySQL 變數(MySQL variables):


1、 LOAD MYSQL VARIABLES FROM MEMORY / LOAD MYSQL VARIABLES TO RUNTIME
 將 MySQL variables 從記憶體資料庫載入到 runtime 資料結構。
2、 SAVE MYSQL VARIABLES TO MEMORY / SAVE MYSQL VARIABLES FROM RUNTIME
 將 MySQL variables 從 runtime 資料結構中持久化到記憶體資料中。
3、 LOAD MYSQL VARIABLES TO MEMORY / LOAD MYSQL VARIABLES FROM DISK
 從磁碟資料庫中載入 MySQL variables 到記憶體資料庫中。
4、 SAVE MYSQL VARIABLES FROM MEMORY / SAVE MYSQL VARIABLES TO DISK
 將 MySQL variables 從記憶體資料庫中持久化到磁碟資料庫中。
5、 LOAD MYSQL VARIABLES FROM CONFIG
 從配置檔案中載入 MySQL variables 到記憶體資料庫中。

5.要處理管理變數(admin variables):


1、 LOAD ADMIN VARIABLES FROM MEMORY / LOAD ADMIN VARIABLES TO RUNTIME
 將 admin variables 從記憶體資料庫載入到 runtime 資料結構。
2、 SAVE ADMIN VARIABLES TO MEMORY / SAVE ADMIN VARIABLES FROM RUNTIME
 將 admin variables 從 runtime 持久化到記憶體資料庫中。
3、 LOAD ADMIN VARIABLES TO MEMORY / LOAD ADMIN VARIABLES FROM DISK
 從磁碟資料庫中載入 admin variables 到記憶體資料庫中。
4、 SAVE ADMIN VARIABLES FROM MEMORY / SAVE ADMIN VARIABLES TO DISK
 將 admin variables 從記憶體資料庫中持久化到磁碟資料庫。
5、 LOAD ADMIN VARIABLES FROM CONFIG
 從配置檔案中載入 admin variables 到記憶體資料庫中。

一般在記憶體那層修改 ,然後儲存到執行系統,儲存到磁碟資料庫系統

load xxx to runtime;
save xxx to disk;

管理配置

  • disk and config file 持久化配置檔案
disk -> 是sqlite3 資料庫 ,預設位置是$DATADIR/proxysql.db( /var/lib/proxysql/proxysql.db)
config file 是一個傳統配置檔案:一般不更改
  • 在記憶體中動態更改配置,如果重啟,沒進行持久化(save) 則會丟失。

三則之間關係:

  • proxysql 啟動時,首先去找/etc/proxysql.cnf 找到它的datadir,如果datadir下有proxysql.db 就載入proxysql.db的配置
  • 如果啟動proxysql時帶有--init標誌,會用/etc/proxsql.cnf的配置,把Runtime,disk全部初始化一下
  • 在呼叫是呼叫--reload 會把/etc/proxysql.cnf 和disk 中配置進行合併。如果衝突需要使用者干預。disk會覆蓋config file。

關於傳統的配置檔案
傳統配置檔案預設路徑為/etc/proxysql.cnf,也可以在二進位制程式proxysql上使用-c或–config來手動指定配置檔案。
預設情況下:幾乎不需要手動去配置proxysql.cnf。埠號,管理proxysql使用者明嗎,可以在這裡修改

小結

這裡有幾個最常用的命令:如何讓修改的配置生效(runtime),以及如何持久化到磁碟上(disk)。記住,只要不是載入到 runtime,修改的配置就不會生效。


LOAD MYSQL USERS TO RUNTIME;  將記憶體資料庫中的配置載入到 runtime 資料結構
SAVE MYSQL USERS TO DISK;   將記憶體資料庫中的 MySQL 使用者持久化到磁碟資料庫中。
LOAD MYSQL SERVERS TO RUNTIME;  將 MySQL server 從記憶體資料庫中載入到 runtime。
SAVE MYSQL SERVERS TO DISK;   從記憶體資料庫中將 MySQL server 持久化到磁碟資料庫中。
LOAD MYSQL QUERY RULES TO RUNTIME;  將 MySQL query rules 從記憶體資料庫載入到 runtime 資料結構。
SAVE MYSQL QUERY RULES TO DISK;  將 MySQL query rules 從記憶體資料庫中持久化到磁碟資料庫中。
LOAD MYSQL VARIABLES TO RUNTIME;  將 MySQL variables 從記憶體資料庫載入到 runtime 資料結構。
SAVE MYSQL VARIABLES TO DISK;   將 MySQL variables 從記憶體資料庫中持久化到磁碟資料庫中。
LOAD ADMIN VARIABLES TO RUNTIME;   將 admin variables 從記憶體資料庫載入到 runtime 資料結構。
SAVE ADMIN VARIABLES TO DISK;  將 admin variables 從記憶體資料庫中持久化到磁碟資料庫。

注意:只有載入到 runtime 狀態時才會去做最後的有效性驗證。在儲存到記憶體資料庫或持久化到磁碟上時,都不會發生任何警告或錯誤。當載入到 runtime 時,如果出現錯誤,將恢復為之前儲存得狀態,這時可以去檢查錯誤日誌。  

配置 ProxySQL 主從分組資訊

用到 這個表 mysql_replication_hostgroup,表結構資訊如下:


[email protected] [main]>show create table mysql_replication_hostgroups\G;
*************************** 1. row ***************************
       table: mysql_replication_hostgroups
Create Table: CREATE TABLE mysql_replication_hostgroups (
    writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY,
    reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND reader_hostgroup>=0),
    check_type VARCHAR CHECK (LOWER(check_type) IN ('read_only','innodb_read_only','super_read_only','read_only|innodb_read_only','read_only&innodb_read_only')) NOT NULL DEFAULT 'read_only',
    comment VARCHAR NOT NULL DEFAULT '', UNIQUE (reader_hostgroup))
1 row in set (0.00 sec)

writer_hostgroup 和reader_hostgroup 寫組和讀組都要大於0且不能相同,我的環境下,寫組定義為10,讀組定義為20

建立組

insert into mysql_replication_hostgroups ( writer_hostgroup, reader_hostgroup, comment) values (10,20,'proxy');
 
load mysql servers to runtime;
save mysql servers to disk;

確定三種配置系統是否都已經寫入了資料

ProxySQL 會根據server 的 read _only 的取值將伺服器進行分組。 read_only=0 的server,master被分到編號為10的寫組,read_only=1 的server,slave則被分到編號20的讀組

新增主從伺服器節點

用到mysql_servers 這個表


insert into mysql_servers(hostgroup_id,hostname,port) values (10,'192.168.20.200',3306);
insert into mysql_servers(hostgroup_id,hostname,port) values (20,'192.168.20.201',3306);

注:嚴格需要寫明comment
load mysql servers to runtime;
save mysql servers to disk;

添加了節點,二臺機器都是online 狀態