1. 程式人生 > >ProxySQL 的一些內容

ProxySQL 的一些內容

官方文件地址:
https://github.com/sysown/proxysql/wiki/ProxySQL-Cluster

ProxySQL中配置後端Mysql伺服器
mysql_servers
mysql_replication_hostgroups
更改這兩張表,將視為編輯配置檔案而不儲存,只有使用save mysql servers to disk 儲存到磁碟才行
load mysql servers to runtime:此語句執行時才會生效
save mysql servers to disk:此語局執行後才會被儲存到配置檔案中
下面這兩條語句暫時無用
SAVE MYSQL SERVERS TO MEMORY
LOAD MYSQL SERVERS FROM MEMORY

將mysql服務從memory中複製到runtime

Admin> LOAD MYSQL SERVERS TO RUNTIME;

其它寫法:

LOAD MYSQL SERVERS TO RUN
LOAD MYSQL SERVERS FROM MEM
LOAD MYSQL SERVERS FROM MEMORY

將mysql服務從memory中複製到disk

Admin> SAVE MYSQL SERVERS TO DISK;

其它寫法:
SAVE MYSQL SERVERS FROM MEM
SAVE MYSQL SERVERS FROM MEMORY

將mysql服務從runtime中複製到 memory

Admin> SAVE MYSQL SERVERS TO MEMORY;

其它寫法:
SAVE MYSQL SERVERS TO MEM
SAVE MYSQL SERVERS FROM RUN
SAVE MYSQL SERVERS FROM RUNTIME

將mysql服務從disk中複製到memory
Admin> LOAD MYSQL SERVERS TO MEMORY;

其它方法:
LOAD MYSQL SERVERS TO MEM
LOAD MYSQL SERVERS FROM DISK

新增新伺服器跟新增到主機組:必須在mysql_servers 表中插入新行。
限制與後端的連結數:max_connections
權重僅與主機組相關:weight (改變權重來確定流量的優先順序,值越大,則負載越大)
對特定的後端使用SSL連線:SSL
自動避開具有複製滯後的從站:max_replication_lag(非零值時,Monitor模組會定期檢查複製延遲)
當max_replication設定為30時,表明30秒檢查一次!此值僅適用於slave
在後端伺服器上啟用壓縮:compression。啟用非零值則啟用壓縮。但是注意只有在新連線載入到runtime時進行壓縮。
status狀態:
OFFLINE_SOFT狀態:任然會繼續進行活動事務的連線,但是不會再向該節點發送新流量!
OFFLINE_HARD狀態:將會立即停止流量,也不會再有新流量被髮送!
online狀態:更改為online狀態後,可以重新啟用此狀態

使用者配置:
使用者在mysql_users中配置
在mysql_users中進行更改後,執行LOAD MYSQL USERS TO RUNTIME才會生效!
而且:SAVE MYSQL USERS TO DISK沒有執行,重啟/崩潰後,mysql_users表中的更改將會失效!

將mysql USERS 從 memory中複製到runtime
Admin> load mysql user to runtime;

其它方法:
LOAD MYSQL USERS TO RUN
LOAD MYSQL USERS FROM MEM
LOAD MYSQL USERS FROM MEMORY

將mysql Users 從 memory中複製到 disk
Admin> SAVE MYSQL USERS TO DISK

其它方法:
SAVE MYSQL USERS FROM MEM
SAVE MYSQL USERS FROM MEMORY

將mysql USERS 從RUNTIME中複製到MEMORY
Admin> SAVE MYSQL USERS TO MEMORY

其它方法:
SAVE MYSQL USERS TO MEM
SAVE MYSQL USERS FROM RUN
SAVE MYSQL USERS FROM RUNTIME

將mysql users 從disk 中複製到memory中
Admin> LOAD MYSQL USERS TO MEMORY;

其它方法:
LOAD MYSQL USERS TO MEM
LOAD MYSQL USERS FROM DISK

總結:
所有的資料載入寫入的軌跡為:
RUNTIME 》 MEMORY 》 DISK
語句:SAVE … FROM … 解釋為從上一個結構中將資料載入到下一個結構中
語句:SAVE … TO … 解釋為將資料載入到一個結構中
語句:LOAD … FROM … 解釋為從下層結構中將資料載入到上一層結構中
語句:LOAD … TO … 解釋為將資料載入到一個結構中

mysql_user表的預設值
max_connections :限制使用者建立proxysql的連線數
transaction_persistent:啟動事務後,可能會根據查詢規則將某些查詢傳送到其他主機組,為了防止這總情況發生,可以啟用transaction_persistent.
將值設定為 1 表示啟用此規則!

雜湊密碼和身份驗證:
select SHA1(‘password’)
select password(‘password’)

在mysql 和Proxysql中,雜湊密碼是SHA1(SHA1(‘password’));
從雜湊密碼無法獲取純文字密碼;

ProxySQL的Admin介面沒有任何PASSWORD()功能:
可以使用select password(‘password’)在Mysql伺服器中執行並複製貼上結果!

新方式:
變數admin-hash_passwords
此變數可以在執行完成load mysql users to runtime
然後執行:save mysql user to disk 密碼便會變成SHA1型別!
然後儲存到磁碟上執行:save mysql users to disk!

日誌:
需要先執行globally 日誌:
SET mysql-eventslog_filename=‘queries.log’;
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;

記錄所有的查詢
INSERT INTO mysql_query_rules (rule_id, active, match_digest, log,apply) VALUES (1,1,’.’,1,0);
記錄所有的BLOB的查詢
INSERT INTO mysql_query_rules (rule_id, active, username, match_pattern, log,apply) VALUES (1, 1, ‘Bob’, ‘.’, 1, 0);
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;

可以通過工具eventslog_reader_sample 對日誌進行轉化為純文字以便檢視
https://github.com/sysown/proxysql/tree/v1.4.4/tools 可以下載此工具!

此外,使用兩種型別的使用者使用這些預設憑據完成對admin資料庫的訪問:

user:admin / password:admin - 具有對所有表的讀寫訪問許可權
user:stats / password:stats - 具有對統計表的只讀訪問許可權。

多組複製 的表
SHOW CREATE TABLE mysql_servers \G

show create table mysql_group_replication_hostgroups\G

writer_hostgroup:將寫的資料分化到這個組,且read_only = 0的狀態下

backup_writer_hostgroup:將超過msx_writes並且read_only = 0的主機存入到備用寫入標記組!

reader_hostgroup:只讀的組,read_only = 1的狀態下!

offline_hostgroup:狀態在離線狀態

active:啟用後,ProxySQL監視主機組並在適當的主機組之間移動節點

max_writers:組複製最大的寫入數量!

writer_is_also_reader - determines if a node should be added to the reader_hostgroup as well as the writer_hostgroup after it is promoted.

max_transactions_behind 確定最大的迴避,在事件寫完之前的事務數,以防止過髒寫髒讀!

mysql_galera_hostgroups
表mysql_galera_hostgroups定義了與Galera Cluster / Percona XtraDB Cluster一起使用的主機組

mysql_users中:
frontend
backend
都需要將其設定為1!

其中傳統MASTER/SLAVE複製:
show create table mysql_replication_hostgroups\G

ProxySQL 配置:
連線方式:
$mysql -u admin -padmin -h127.0.0.1 -P6032

首先,讓我們驗證沒有配置任何內容,
mysql> \R Admin >
進入到Admin模式
Admin>
UPDATE global_variables SET variable_value=‘monitor’ WHERE variable_name=‘mysql-monitor_username’;
UPDATE global_variables SET variable_value=‘monitor’ WHERE variable_name=‘mysql-monitor_password’;
UPDATE global_variables SET variable_value=‘2000’ WHERE variable_name IN (‘mysql-monitor_connect_interval’,‘mysql-monitor_ping_interval’,‘mysql-monitor_read_only_interval’);

當表中:mysql_replication_hostgorups設定插入欄位(writer_hostgroup,reader_hostgroup)(1,2)的時候。
Admin> LOAD MYSQL SERVERS TO RUNTIME;
那麼在monitor.mysql_server_read_only_log 的read_only欄位中會顯示便會區分出誰為寫,哪兩個為讀主機!

   Admin>SAVE MYSQL SERVERS TO DISK;
   Admin>SAVE MYSQL VARIABLES TO DISK;

對於定製查詢語句可以通過 mysql_query_rules表定義是通過寫組進行查詢,還是通過讀組進行查詢!

然後Admin> LOAD MYSQL QUERY RULES TO RUNTIME;
LOAD MYSQL QUERY RULES TO DISK;

可以通過stats_mysql_query_digest 表來檢查規則是否正確的應用了!並能顯示聚合的結果!

PRoxySQL可以充當查詢快取,預設情況下,查詢不會被快取,但可以啟用它cache_ttl = 5000(毫秒)5000也就是5秒鐘!
在mysql_query_rules中進行設定!
例如:UPDATE mysql_query_rules set cache_ttl = 5000 WHERE active = 1 AND destination_hostgroup = 2 ;

Admin> LOAD MYSQL QUERY RULES TO RUNTIME;

mysql_query_rules中的
match_digest:它指定將要匹配的查詢規則!
match_pattern:它將再次匹配表示式查詢的原始文字(速度比match_digest慢)!
注意:查詢重寫,就必須要與match_pattern同時使用!

*********Query Rewrite *********
看不懂??????????????

基於埠的讀/寫分割限制

最好的讀寫分離部署的方式遵循以下幾點:
1,將PRoxySQL所產生的所有流量資料傳送到MYSQL node中。也就是MASTER中(both writes and reads)!
2,然後在stats_mysql_query_digest中檢視哪條SELECT語句時最消耗時間的!
3,確定這些最消耗時間的SELECT語句執行在那個組ID 的主機上面!
4,然後再進行mysql_query_rules規則的制定!

通過stats_mysql_query_digest表查詢消耗資源的語句!
根據表中sum_time欄位進行排序檢視做靠前的語句。

PROXYSQL 執行緒
主執行緒:該執行緒僅負責引導核心模組並啟動其他核心執行緒
libmicrohttpd的內建HTTP伺服器。
MHD_USE_INTERNAL_POLLING_THREAD,因此可以使用多個執行緒!

WatchDog
:使用來監視Mysql執行緒和Mysql輔助執行緒(如果啟用)的監視程式,如果監視程式檢測到任何這些執行緒都丟失了心跳

WatchDog預設是啟用的:
執行緒組撒 超過mysql-poll_timeout 單位:毫秒(2000/2秒),
它是用來檢查心跳的,如果restart_on_missing_hearbeats缺少心跳,則watchdog將會觸發斷連線

restart_on_missing_heartbeats只能在配置檔案的全域性部分配置,其預設值為10.
如果restart_on_missing_heartbeats設定為0,則Watchdog會檢查並在錯誤日誌中生成條目,但不會產生斷開,也不會重啟proxysql!

生成環境需要設定為0

Multiplex 多路複用的作用:是用來分化表查詢路徑?,還是根路由有關?

ProxySQL存在在線上快取:
因為mysql的機制,使用查詢快取時可能導致寫負載問題。
需要外面的快取機制進行優化,當前ProxySQL 有線上(wire)快取的機制!

注意:mysql_query_rules表中的cache_ttl表示快取多少毫秒的查詢資料,用來分化查詢的負載!
相當於實現了ProxySQL外面快取機制的步驟! 而當stats_mysql_query_digest表中的hostgroup = -1時。則表示是線上快取是正在執行的!

stats_mysql_global中檢視到快取的大小 :‘Query_Cache%’

查詢快取的調整:
mysql> SHOW VARIABLES LIKE ‘mysql-query_cache%’;

mysql> SET mysql-query_cache_size_MB=128; LOAD MYSQL VARIABLES TO RUNTIME;

相關限制:
與查詢快取不嚴格相關但影響其行為的變數是mysql-threshold_resultset_size。
mysql-threshold_resultset_size定義ProxySQL在開始將其傳送到客戶端之前將緩衝的最大結果集大小。
將此變數設定得太低將阻止在從後端檢索結果集時重試查詢失敗。
將此變數設定得太高可能會增加記憶體佔用,因為ProxySQL將嘗試緩衝更多資料。
因為mysql-threshold_resultset_size定義了可以緩衝的最大結果集大小,所以它還定義了可以儲存在查詢快取中的最大結果集大小。

執行緒的清除是由系統自動進行的!

查詢快取不支援預準備語句!

read_only=1表示只讀!

記憶體洩漏檢測:

–enable-prof:預設情況下是禁用記憶體分析的
配置環境變數:
MALLOC_CONF=“xmalloc:true,lg_tcache_max:16,purge:decay,prof:true,prof_leak:true,lg_prof_sample:18,lg_prof_interval:30”

可以通過init指令碼:
/etc/init.d/proxysql來進行啟動PRoxySQL,執行記憶體分析檢測!
export MALLOC_CONF=“xmalloc:true,lg_tcache_max:16,purge:decay,prof:true,prof_leak:true,lg_prof_sample:18,lg_prof_interval:30”

如果沒有init指令碼:則需要使用如下語句:
MALLOC_CONF=“xmalloc:true,lg_tcache_max:16,purge:decay,prof:true,prof_leak:true,lg_prof_sample:18,lg_prof_interval:30” proxysql -f -c /etc/proxysql.cnf

記憶體溢位檢測問題會出現在/var/lib/proxysql中!

取消profiling 檢查,需要在沒有malloc_conf中進行設定!

ProxySQL 的叢集問題?

單機多例項中,啟動proxysql需要以-r或啟動–reuseport
這樣就可以使用SO_REUSEPORT套接字選項。預設情況下,此專案前處於禁用狀態!
為避免在同一個主機上執行的兩個(或多個)proxysql例項之間發生干擾,建議使用不同的配置檔案(使用-c標誌)和不同的datadir(使用-D標誌)。