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 狀態