ProxySQL 配置详解及读写分离(+GTID)等功能说明 (完整篇)1
ProxySQL是靈活強大的MySQL代理層, 是一個能實實在在用在生產環境的MySQL中間件,可以實現讀寫分離,支持 Query 路由功能,支持動態指定某個 SQL 進行 cache,支持動態加載配置、故障切換和一些 SQL的過濾功能。還有一些同類產品比如 DBproxy、MyCAT、OneProxy 等。但經過反復對比和測試之后,還是覺得ProxySQL是一款性能不諳,靠譜穩定的MySQL 中間件產品 !
ProxySQL的亮點所在
-? 幾乎所有的配置均可在線更改(其配置數據基于SQLite存儲),無需重啟proxysql
-? 基于正則和client_addr的強大和靈活的路由規則
-? 詳細的狀態統計,統計結果和pt-query-digest對慢日志的分析結果類似,相當于有了統一的查看sql性能和sql語句統計的入口(Designed by a DBA for DBAs)
-? 自動重連和重新執行機制(auto-reconnect and automatic re-execution of queries using it’s Connections Pool ):?若一個請求在鏈接或執行過程中意外中斷,proxysql會根據其內部機制重新執行該操作
-? query cache功能:比mysql自帶QC更靈活,可在mysql_query_rules表中依據digest,match_pattern,client_addr等維度控制哪類語句可以緩存
-? 支持連接池(connection pool)并且支持multiplexing,區別于atlas之流的連接池實現。
ProxySQL的特點
ProxySQL是一個高性能的MySQL中間件,擁有強大的規則引擎。具有以下特性:
-? 連接池,而且是 multiplexing;
-? 主機和用戶的最大連接數限制;
-? 自動下線后端DB;
? ? -? 延遲超過閥值
? ? -? ping 延遲超過閥值
? ? -? 網絡不通或宕機
-? 強大的規則路由引擎;
? ?-? 實現讀寫分離
? ?-? 查詢重寫
? ?-? sql流量鏡像
-? 支持prepared statement;
-? 支持Query Cache;
-? 支持負載均衡,與gelera結合自動failover;
-? 將所有配置保存寫入到SQLit表中。
-? 支持動態加載配置,即一般可以在線修改配置,但有少部分參數還是需要重啟來生效。
-? 支持query cache。
-? 支持對query的路由,可以針對某個語句進行分配去哪個實例執行。
-? 不支持分表,可以分庫,但是利用規則配置實現分表。
如上可知,ProxySQL集合了很多優秀特性于一身,那么它的缺點呢就是項目不夠成熟,好在官方網站一直在及時更新,并且受到 Percona 官方的支持。
ProxySQL多層管理配置設計 (有三層配置)
-??runtime:運行中使用的配置文件
-??memory:提供用戶動態修改配置文件
-??disk:將修改的配置保存到磁盤SQLit表中(即:proxysql.db)
-??config:一般不使用它(即:proxysql.cnf)
ProxySQL運行機制草圖如下:
ProxySQL有一個完備的配置系統,配置ProxySQL是基于sql命令的方式完成的。ProxySQL支持配置修改之后的在線保存、應用,不需要重啟即可生效。整個配置系統分三層設計。
整個配置系統分為三層,如下圖所示:
ProxySQL配置系統分為三層的目的:
1) 自動更新;
2) 盡可能的不重啟proxysql就可以修改配置;
3) 方便回滾錯誤配置;
簡單說就是配置proxysql分為三個級別,RUNTIME是即時生效的,MEMORY是保存在內存中但并不立即生效的,DISK|CONFIG FILE是持久化或寫在配置文件中的。
這三個級別的配置文件互不干擾,在某個層級修改了配置文件,想要加載或保存到另一個層級,需要額外的LOAD或SAVE操作:"LOAD xx_config FROM xx_level | LOAD xx_config TO xx_level | SAVE xx_config TO xx_level | SAVE xx_config FROM xx_level",達到加載配置或者持久化配置的目的。這三層中每層的功能與含義如下:
-??RUNTIME層
代表的是ProxySQL當前生效的配置,包括 global_variables, mysql_servers, mysql_users, mysql_query_rules。無法直接修改這里的配置,必須要從下一層load進來。該層級的配置時在proxysql管理庫(sqlite)的main庫中以runtime_開頭的表,這些表的數據庫無法直接修改,只能從其他層級加載;該層代表的是ProxySQL當前生效的正在使用的配置,包括global_variables, mysql_servers, mysql_users, mysql_query_rules表。無法直接修改這里的配置,必須要從下一層load進來。也就是說RUNTIME這個頂級層,是proxysql運行過程中實際使用的那一份配置,這一份配置會直接影響到生產環境的,所以要將配置加載進RUNTIME層時需要三思而行。
-??MEMORY層
是平時在mysql命令行修改的 main 里頭配置,可以認為是SQLite數據庫在內存的鏡像。該層級的配置在main庫中以mysql_開頭的表以及global_variables表,這些表的數據可以直接修改;用戶可以通過MySQL客戶端連接到此接口(admin接口),然后可以在mysql命令行查詢不同的表和數據庫,并修改各種配置,可以認為是SQLite數據庫在內存的鏡像。也就是說MEMORY這個中間層,上面接著生產環境層RUNTIME,下面接著持久化層DISK和CONFIG FILE。MEMORY層是我們修改proxysql的唯一正常入口。一般來說在修改一個配置時,首先修改Memory層,確認無誤后再接入RUNTIME層,最后持久化到DISK和CONFIG FILE層。也就是說memeory層里面的配置隨便改,不影響生產,也不影響磁盤中保存的數據。通過admin接口可以修改mysql_servers、mysql_users、mysql_query_rules、global_variables等表的數據。
-??DISK|CONFIG FILR層
持久存儲的那份配置,一般在$(DATADIR)/proxysql.db,在重啟的時候會從硬盤里加載。 /etc/proxysql.cnf文件只在第一次初始化的時候用到,完了后,如果要修改監聽端口,還是需要在管理命令行里修改,再 save 到硬盤。該層級的配置在磁盤上的sqlite庫或配置文件里。DISK/CONFIG FILE層表示持久存儲的那份配置,持久層對應的磁盤文件是$(DATADIR)/proxysql.db,在重啟ProxySQL的時候,會從proxysql.db文件中加載信息。而 /etc/proxysql.cnf文件只在第一次初始化的時候使用,之后如果要修改配置,就需要在管理端口的SQL命令行里進行修改,然后再save到硬盤。 也就是說DISK和CONFIG FILE這一層是持久化層,我們做的任何配置更改,如果不持久化下來,重啟后,配置都將丟失。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 需要注意? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
1) ProxySQL每一個配置項在三層中都存在,但是這三層是互相獨立的,也就是說proxysql可以同時擁有三份配置,每層都是獨立的,可能三份配置都不一樣,也可能三份都一樣。
2) RUNTIME層代表 ProxySQL 當前生效的正在使用的配置,無法直接修改這里的配置,必須要從下一層 "load" 進來。
3) MEMORY這一層上面連接 RUNTIME 層,下面連接持久化層。在這層可以正常操作 ProxySQL 配置,隨便修改,不會影響生產環境。修改一個配置一般都是先在 MEMORY 層完成,然后確認正常之后再加載到 RUNTIME 和持久化到磁盤上。
4) DISK 和 CONFIG FILE層持久化配置信息,重啟后內存中的配置信息會丟失,所以需要將配置信息保留在磁盤中。重啟時,可以從磁盤快速加載回來。
ProxySQL配置文件的修改流程一般是:
- 啟動時:先修改必要的CONFIG FILE配置,比如管理端口,然后啟動;
- 其他配置:修改MEMORY中的表,然后加載到RUNTIME并持久化。
ProxySQL具有一個復雜但易于使用的配置系統,可以滿足以下需求:
-? 允許輕松動態更新配置(這是為了讓ProxySQL用戶可以在需要零宕機時間配置的大型基礎架構中使用它)。與MySQL兼容的管理界面可用于此目的。
-? 允許盡可能多的配置項目動態修改,而不需要重新啟動ProxySQL進程
-? 可以毫不費力地回滾無效配置
-? 這是通過多級配置系統實現的,其中設置從運行時移到內存,并根據需要持久保存到磁盤。
一般,修改的配置都是在memory層。可以load到runtime,使配置在不用重啟proxysql的情況下也可以生效,也可以save到disk,將對配置的修改持久化!
需要修改配置時,直接操作的是 MEMORAY,以下命令可用于加載或保存 users (mysql_users):??(序號對應上圖“運行機制”草圖)
| 1 2 3 4 5 | [1]: LOAD MYSQL USERS TO RUNTIME / LOAD MYSQL USERS FROM MEMORY???#常用。將修改后的配置(在memory層)用到實際生產 [2]: SAVE MYSQL USERS TO MEMORY / SAVE MYSQL USERS FROM RUNTIME????????#將生產配置拉一份到memory中 [3]: LOAD MYSQL USERS TO MEMORY / LOAD MYSQL USERS FROM DISK???????????#將磁盤中持久化的配置拉一份到memory中來 [4]: SAVE MYSQL USERS TO DISK /? SAVE MYSQL USERS FROM MEMORY?????#常用。將memoery中的配置保存到磁盤中去 [5]: LOAD MYSQL USERS FROM CONFIG??????????????????????????????????????#將配置文件中的配置加載到memeory中 |
個人還是比較習慣用 TO,記住往上層是 LOAD,往下層是 SAVE。以下命令加載或保存servers (mysql_servers):
| 1 2 3 4 5 | [1]: LOAD MYSQL SERVERS TO RUNTIME??#常用,讓修改的配置生效 [2]: SAVE MYSQL SERVERS TO MEMORY [3]: LOAD MYSQL SERVERS TO MEMORY [4]: SAVE MYSQL SERVERS TO DISK?????#常用,將修改的配置持久化 [5]: LOAD MYSQL SERVERS FROM CONFIG |
后面的使用方法也基本相同,一并列出。以下命令加載或保存query rules (mysql_query_rules):
| 1 2 3 4 5 | [1]: load mysql query rules to run????#常用 [2]: save mysql query rules to mem [3]: load mysql query rules to mem [4]: save mysql query rules to disk???#常用 [5]: load mysql query rules from config |
以下命令加載或保存 mysql variables (global_variables):
| 1 2 3 4 5 | [1]: load mysql variables to runtime [2]: save mysql variables to memory [3]: load mysql variables to memory [4]: save mysql variables to disk [5]: load mysql variables from config |
以下命令加載或保存admin variables (select * from global_variables where variable_name like 'admin-%'):
| 1 2 3 4 5 | [1]: load admin variables to runtime [2]: save admin variables to memory [3]: load admin variables to memory [4]: save admin variables to disk [5]: load admin variables from config |
ProxySQL啟動過程總結:
當proxysql啟動時,首先讀取配置文件CONFIG FILE(/etc/proxysql.cnf),然后從該配置文件中獲取datadir,datadir中配置的是sqlite的數據目錄。如果該目錄存在,且sqlite數據文件存在,那么正常啟動,將sqlite中的配置項讀進內存,并且加載進RUNTIME,用于初始化proxysql的運行。如果datadir目錄下沒有sqlite的數據文件,proxysql就會使用config file中的配置來初始化proxysql,并且將這些配置保存至數據庫。sqlite數據文件可以不存在,/etc/proxysql.cnf文件也可以為空,但/etc/proxysql.cnf配置文件必須存在,否則,proxysql無法啟動。
一、 ProxySQL 安裝 (兩種方式)
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | 1) 采用yum方式安裝 [root@mysql-proxy ~]# vim /etc/yum.repos.d/proxysql.repo [proxysql_repo] name= ProxySQL YUM repository baseurl=http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/centos/\$releasever gpgcheck=1 gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key ? 執行安裝 [root@mysql-proxy ~]# yum clean all [root@mysql-proxy ~]# yum makecache [root@mysql-proxy ~]# yum -y install proxysql ?? [root@mysql-proxy ~]# proxysql --version ProxySQL version 1.4.13-15-g69d4207, codename Truls ?? 啟動ProxySQL [root@mysql-proxy ~]# chkconfig proxysql on [root@mysql-proxy ~]# systemctl start proxysql?????? [root@mysql-proxy ~]# systemctl status proxysql ? 啟動后會監聽兩個端口, 默認為6032和6033。6032端口是ProxySQL的管理端口,6033是ProxySQL對外提供服務的端口 (即連接到轉發后端的真正數據庫的轉發端口)。 [root@mysql-proxy ~]# netstat -tunlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address?????????? Foreign Address???????? State?????? PID/Program?name?? tcp??????? 0????? 0 0.0.0.0:6032??????????? 0.0.0.0:*?????????????? LISTEN????? 23940/proxysql???? tcp??????? 0????? 0 0.0.0.0:6033??????????? 0.0.0.0:*?????????????? LISTEN????? 23940/proxysql ? 2)采用rpm包方式安裝 proxysql的rpm包下載地址: https://pan.baidu.com/s/1S1_b5DKVCpZSOUNmtCXrrg 提取密碼: 5t1c ?? [root@mysql-proxy ~]# wget https://github.com/sysown/proxysql/releases/download/v1.4.8/proxysql-1.4.8-1-centos7.x86_64.rpm [root@mysql-proxy ~]# rpm -ivh proxysql-1.4.8-1-centos7.x86_64.rpm --force ? [root@mysql-proxy ~]# /etc/init.d/proxysql start Starting ProxySQL: DONE! ? [root@mysql-proxy ~]# ss -lntup|grep proxy tcp??? LISTEN???? 0????? 128?????? *:6032????????????????? *:*???????????????????users:(("proxysql",pid=2943,fd=24)) tcp??? LISTEN???? 0????? 128?????? *:6033????????????????? *:*???????????????????users:(("proxysql",pid=2943,fd=22)) tcp??? LISTEN???? 0????? 128?????? *:6033????????????????? *:*???????????????????users:(("proxysql",pid=2943,fd=21)) tcp??? LISTEN???? 0????? 128?????? *:6033????????????????? *:*???????????????????users:(("proxysql",pid=2943,fd=20)) tcp??? LISTEN???? 0????? 128?????? *:6033????????????????? *:*???????????????????users:(("proxysql",pid=2943,fd=19)) ? 如上可以看出轉發端口6033是啟動了四個線程 ? ============================================================== 以上兩種方式采用任何一種都可以順利安裝proxysql插件。 ? 另外,記得在proxysql服務器上安裝mysql客戶端,用于在本機連接到ProxySQL的管理接口 [root@mysql-proxy ~]# vim /etc/yum.repos.d/mariadb.repo [mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.3.5/centos6-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1 ??? 安裝mysql-clinet客戶端 [root@mysql-proxy ~]# yum install -y MariaDB-client ?? -------------------------------------------------------------------------------------------------------------------------------------------------------- 如果遇到報錯: Error: MariaDB-compat conflicts with 1:mariadb-libs-5.5.60-1.el7_5.x86_64 ?You could try using --skip-broken to work around the problem ?You could try running: rpm -Va --nofiles --nodigest ??? 解決辦法: [root@mysql-proxy ~]# rpm -qa|grep mariadb* mariadb-libs-5.5.56-2.el7.x86_64 [root@mysql-proxy ~]# rpm -e mariadb-libs-5.5.56-2.el7.x86_64 --nodeps [root@mysql-proxy ~]# yum install -y MariaDB-client |
ProxySQL配置
ProxySQL有配置文件/etc/proxysql.cnf和配置數據庫文件/var/lib/proxysql/proxysql.db。這里需要特別注意:如果存在如果存在"proxysql.db"文件(在/var/lib/proxysql目錄下),則ProxySQL服務只有在第一次啟動時才會去讀取proxysql.cnf文件并解析;后面啟動會就不會讀取proxysql.cnf文件了!如果想要讓proxysql.cnf文件里的配置在重啟proxysql服務后生效(即想要讓proxysql重啟時讀取并解析proxysql.cnf配置文件),則需要先刪除/var/lib/proxysql/proxysql.db數據庫文件,然后再重啟proxysql服務。這樣就相當于初始化啟動proxysql服務了,會再次生產一個純凈的proxysql.db數據庫文件(如果之前配置了proxysql相關路由規則等,則就會被抹掉)。?官方推薦用admin interface方式!(即在proxysql本機使用mysql客戶端連接管理端口)
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 | [root@mysql-proxy ~]# egrep -v "^#|^$" /etc/proxysql.cnf datadir="/var/lib/proxysql"???????????????????????????????????#數據目錄 admin_variables= { ????????admin_credentials="admin:admin"???????????????????????#連接管理端的用戶名與密碼 ????????mysql_ifaces="0.0.0.0:6032"???????????????????????????#管理端口,用來連接proxysql的管理數據庫 } mysql_variables= { ????????threads=4?????????????????????????????????????????????#指定轉發端口開啟的線程數量 ????????max_connections=2048 ????????default_query_delay=0 ????????default_query_timeout=36000000 ????????have_compress=true ????????poll_timeout=2000 ????????interfaces="0.0.0.0:6033"?????????????????????????????#指定轉發端口,用于連接后端mysql數據庫的,相當于代理作用 ????????default_schema="information_schema" ????????stacksize=1048576 ????????server_version="5.5.30"???????????????????????????????#指定后端mysql的版本 ????????connect_timeout_server=3000 ????????monitor_username="monitor" ????????monitor_password="monitor" ????????monitor_history=600000 ????????monitor_connect_interval=60000 ????????monitor_ping_interval=10000 ????????monitor_read_only_interval=1500 ????????monitor_read_only_timeout=500 ????????ping_interval_server_msec=120000 ????????ping_timeout_server=500 ????????commands_stats=true ????????sessions_sort=true ????????connect_retries_on_failure=10 } mysql_servers = ( ) mysql_users: ( ) mysql_query_rules: ( ) scheduler= ( ) mysql_replication_hostgroups= ( ) ? ? proxysql的數據目錄 [root@mysql-proxy ~]# ll /var/lib/proxysql/ total 1014052 -rw------- 1 root root???? 122880 Jan 25 14:33 proxysql.db -rw------- 1 root root 1023288179 Jan 28 12:30 proxysql.log -rw-r--r-- 1 root root????????? 6 Jan 25 14:20 proxysql.pid -rw------- 1 root root??? 1736704 Jan 28 12:29 proxysql_stats.db ? 查看main庫(默認登陸后即在此庫)的global_variables表信息 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)]> 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.000 sec) ? MySQL [main]>?select?* from global_variables; +-----------------------------------------------------+---------------------------+ | variable_name?????????????????????????????????????? | variable_value??????????? | +-----------------------------------------------------+---------------------------+ | mysql-shun_on_failures????????????????????????????? | 5???????????????????????? | | mysql-shun_recovery_time_sec??????????????????????? | 10??????????????????????? | | mysql-query_retries_on_failure????????????????????? | 1???????????????????????? | | mysql-connect_retries_delay???????????????????????? | 1???????????????????????? | | mysql-connection_delay_multiplex_ms???????????????? | 0???????????????????????? | | mysql-connection_max_age_ms???????????????????????? | 0???????????????????????? | | mysql-connect_timeout_server_max??????????????????? | 10000???????????????????? | | mysql-eventslog_filename??????????????????????????? |?????????????????????????? | | mysql-eventslog_filesize??????????????????????????? | 104857600???????????????? | | mysql-default_charset?????????????????????????????? | utf8????????????????????? | | mysql-free_connections_pct????????????????????????? | 10??????????????????????? | | mysql-session_idle_ms?????????????????????????????? | 1000????????????????????? | | mysql-client_found_rows???????????????????????????? |?true??????????????????????| | mysql-monitor_enabled?????????????????????????????? |?true??????????????????????| | mysql-monitor_connect_timeout?????????????????????? | 600?????????????????????? | | mysql-monitor_ping_max_failures???????????????????? | 3???????????????????????? | | mysql-monitor_ping_timeout????????????????????????? | 1000????????????????????? | | mysql-monitor_read_only_max_timeout_count?????????? | 3???????????????????????? | | mysql-monitor_replication_lag_interval????????????? | 10000???????????????????? | | mysql-monitor_replication_lag_timeout?????????????? | 1000????????????????????? | | mysql-monitor_groupreplication_healthcheck_interval | 5000????????????????????? | | mysql-monitor_groupreplication_healthcheck_timeout? | 800?????????????????????? | | mysql-monitor_replication_lag_use_percona_heartbeat |?????????????????????????? | | mysql-monitor_query_interval??????????????????????? | 60000???????????????????? | | mysql-monitor_query_timeout???????????????????????? | 100?????????????????????? | | mysql-monitor_slave_lag_when_null?????????????????? | 60??????????????????????? | | mysql-monitor_wait_timeout????????????????????????? |?true??????????????????????| | mysql-monitor_writer_is_also_reader???????????????? |?true??????????????????????| | mysql-max_allowed_packet??????????????????????????? | 4194304?????????????????? | | mysql-throttle_connections_per_sec_to_hostgroup???? | 1000000?????????????????? | | mysql-max_transaction_time????????????????????????? | 14400000????????????????? | | mysql-multiplexing????????????????????????????????? |?true??????????????????????| | mysql-forward_autocommit??????????????????????????? |?false?????????????????????| | mysql-enforce_autocommit_on_reads?????????????????? |?false?????????????????????| | mysql-autocommit_false_not_reusable???????????????? |?false?????????????????????| | mysql-autocommit_false_is_transaction?????????????? |?false?????????????????????| | mysql-verbose_query_error?????????????????????????? |?false?????????????????????| | mysql-hostgroup_manager_verbose???????????????????? | 1???????????????????????? | | mysql-threshold_query_length??????????????????????? | 524288??????????????????? | | mysql-threshold_resultset_size????????????????????? | 4194304?????????????????? | | mysql-query_digests_max_digest_length?????????????? | 2048????????????????????? | | mysql-query_digests_max_query_length??????????????? | 65000???????????????????? | | mysql-wait_timeout????????????????????????????????? | 28800000????????????????? | | mysql-throttle_max_bytes_per_second_to_client?????? | 2147483647??????????????? | | mysql-throttle_ratio_server_to_client?????????????? | 0???????????????????????? | | mysql-max_stmts_per_connection????????????????????? | 20??????????????????????? | | mysql-max_stmts_cache?????????????????????????????? | 10000???????????????????? | | mysql-mirror_max_concurrency??????????????????????? | 16??????????????????????? | | mysql-mirror_max_queue_length?????????????????????? | 32000???????????????????? | | mysql-default_max_latency_ms??????????????????????? | 1000????????????????????? | | mysql-query_processor_iterations??????????????????? | 0???????????????????????? | | mysql-query_processor_regex???????????????????????? | 1???????????????????????? | | mysql-long_query_time?????????????????????????????? | 1000????????????????????? | | mysql-query_cache_size_MB?????????????????????????? | 256?????????????????????? | | mysql-poll_timeout_on_failure?????????????????????? | 100?????????????????????? | | mysql-server_capabilities?????????????????????????? | 45578???????????????????? | | mysql-session_idle_show_processlist???????????????? |?true??????????????????????| | mysql-query_digests???????????????????????????????? |?true??????????????????????| | mysql-query_digests_lowercase?????????????????????? |?false?????????????????????| | mysql-servers_stats???????????????????????????????? |?true??????????????????????| | mysql-default_reconnect???????????????????????????? |?true??????????????????????| | mysql-ssl_p2s_ca??????????????????????????????????? |?????????????????????????? | | mysql-ssl_p2s_cert????????????????????????????????? |?????????????????????????? | | mysql-ssl_p2s_key?????????????????????????????????? |?????????????????????????? | | mysql-ssl_p2s_cipher??????????????????????????????? |?????????????????????????? | | mysql-init_connect????????????????????????????????? |?????????????????????????? | | mysql-default_sql_mode????????????????????????????? |?????????????????????????? | | mysql-default_time_zone???????????????????????????? | SYSTEM??????????????????? | | mysql-connpoll_reset_queue_length?????????????????? | 50??????????????????????? | | mysql-stats_time_backend_query????????????????????? |?false?????????????????????| | mysql-stats_time_query_processor??????????????????? |?false?????????????????????| | mysql-threads?????????????????????????????????????? | 4???????????????????????? | | mysql-max_connections?????????????????????????????? | 2048????????????????????? | | mysql-default_query_delay?????????????????????????? | 0???????????????????????? | | mysql-default_query_timeout???????????????????????? | 36000000????????????????? | | mysql-have_compress???????????????????????????????? |?true??????????????????????| | mysql-poll_timeout????????????????????????????????? | 2000????????????????????? | | mysql-interfaces??????????????????????????????????? | 0.0.0.0:6033????????????? | | mysql-default_schema??????????????????????????????? | information_schema??????? | | mysql-stacksize???????????????????????????????????? | 1048576?????????????????? | | mysql-server_version??????????????????????????????? | 5.5.30??????????????????? | | mysql-connect_timeout_server??????????????????????? | 3000????????????????????? | | mysql-monitor_username????????????????????????????? | proxysql????????????????? | | mysql-monitor_password????????????????????????????? | proxysql????????????????? | | mysql-monitor_history?????????????????????????????? | 600000??????????????????? | | mysql-monitor_connect_interval????????????????????? | 60000???????????????????? | | mysql-monitor_ping_interval???????????????????????? | 10000???????????????????? | | mysql-monitor_read_only_interval??????????????????? | 1500????????????????????? | | mysql-monitor_read_only_timeout???????????????????? | 500?????????????????????? | | mysql-ping_interval_server_msec???????????????????? | 120000??????????????????? | | mysql-ping_timeout_server?????????????????????????? | 500?????????????????????? | | mysql-commands_stats??????????????????????????????? |?true??????????????????????| | mysql-sessions_sort???????????????????????????????? |?true??????????????????????| | mysql-connect_retries_on_failure??????????????????? | 10??????????????????????? | | admin-stats_credentials???????????????????????????? | stats:stats?????????????? | | admin-stats_mysql_connections?????????????????????? | 60??????????????????????? | | admin-stats_mysql_connection_pool?????????????????? | 60??????????????????????? | | admin-stats_mysql_query_cache?????????????????????? | 60??????????????????????? | | admin-stats_system_cpu????????????????????????????? | 60??????????????????????? | | admin-stats_system_memory?????????????????????????? | 60??????????????????????? | | admin-telnet_admin_ifaces?????????????????????????? | (null)??????????????????? | | admin-telnet_stats_ifaces?????????????????????????? | (null)??????????????????? | | admin-refresh_interval????????????????????????????? | 2000????????????????????? | | admin-read_only???????????????????????????????????? |?false?????????????????????| | admin-hash_passwords??????????????????????????????? |?true??????????????????????| | admin-cluster_username????????????????????????????? |?????????????????????????? | | admin-cluster_password????????????????????????????? |?????????????????????????? | | admin-cluster_check_interval_ms???????????????????? | 1000????????????????????? | | admin-cluster_check_status_frequency??????????????? | 10??????????????????????? | | admin-cluster_mysql_query_rules_diffs_before_sync?? | 3???????????????????????? | | admin-cluster_mysql_servers_diffs_before_sync?????? | 3???????????????????????? | | admin-cluster_mysql_users_diffs_before_sync???????? | 3???????????????????????? | | admin-cluster_proxysql_servers_diffs_before_sync??? | 3???????????????????????? | | admin-cluster_mysql_query_rules_save_to_disk??????? |?true??????????????????????| | admin-cluster_mysql_servers_save_to_disk??????????? |?true??????????????????????| | admin-cluster_mysql_users_save_to_disk????????????? |?true??????????????????????| | admin-cluster_proxysql_servers_save_to_disk???????? |?true??????????????????????| | admin-checksum_mysql_query_rules??????????????????? |?true??????????????????????| | admin-checksum_mysql_servers??????????????????????? |?true??????????????????????| | admin-checksum_mysql_users????????????????????????? |?true??????????????????????| | admin-web_enabled?????????????????????????????????? |?false?????????????????????| | admin-web_port????????????????????????????????????? | 6080????????????????????? | | admin-admin_credentials???????????????????????????? | admin:admin| | admin-mysql_ifaces????????????????????????????????? | 0.0.0.0:6032????????????? | | admin-version?????????????????????????????????????? | 1.4.8-32-g669c149???????? | +-----------------------------------------------------+---------------------------+ 125 rows?in?set?(0.003 sec) ? 登陸成功后,可通過對main庫(默認登陸后即在此庫)的global_variables表中的"admin-admin_credentials"?和?"admin-mysql_ifaces" 兩個變量進行更改來修改登錄認證! 比如說修改密碼或定義一個非admin的用戶用于遠程登錄(下面會說到)。 |
proxysql的6032端口是管理入口,賬號密碼是admin(可以動態修改),允許客戶端連接;6033端口就是客戶端入口,賬號密碼通過管理接口去設置。在proxysql本機使用mysql客戶端連接到ProxySQL的管理接口(admin interface),?該接口的默認管理員用戶和密碼都是admin。
mysql_ifaces
也就是說proxysql有一個admin接口專門來做配置,相當于一個mysql shell可以通過sql來讓配置實時生效。
mysql_ifaces配置了允許連接proxysql的ip和port
| 1 2 3 4 5 | [root@mysql-proxy ~]# vim /etc/proxysql.cnf ........ # 將admin_variables中的mysql_ifaces修改成允許遠程訪問 #????? mysql_ifaces="127.0.0.1:6032;/tmp/proxysql_admin.sock" ???????mysql_ifaces="0.0.0.0:6032" |
如果ip配置為0.0.0.0表示不限制ip,但是出于安全考慮,admin用戶無論怎么設置都只能在本機登錄!!!
admin_credentials
這個key保存所有可以操作proxysql的用戶名和密碼,格式為:user:pass;user1:pass1,這里可以修改密碼或定義一個非admin的用戶用于遠程登錄。 前提是保證想要管理proxysql的機器安裝有mysql client客戶端!
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | 先在proxysql本機登錄 (因為初始賬號密碼是admin:admin,只能在本機登錄), 這里的proxysql本機地址是172.16.60.214 ? 修改遠程連接proxysql管理端口的賬號和密碼radmin:radmin. [root@mysql-proxy ~]# mysql -uadmin -padmin -h127.0.0.1 -P6032??????? Welcome to the MariaDB monitor.? Commands end with ; or \g. Your MySQL connection?id?is 34 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)]> update global_variables?set?variable_value =?'admin:admin;radmin:radmin'?where variable_name =?'admin-admin_credentials'; Query OK, 1 row affected (0.002 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, 31 rows affected (0.077 sec) ? ? 這樣就可以使用下面的命令在其他機器上使用radmin用戶登錄(其他機器上需要有mysql client) [root@MGR-node3 ~]# mysql -uradmin -pradmin -h172.16.60.214 -P6032???????? mysql: [Warning] Using a password on the?command?line interface can be insecure. Welcome to the MySQL monitor.? Commands end with ; or \g. Your MySQL connection?id?is 35 Server version: 5.5.30 (ProxySQL Admin Module) ? Copyright (c) 2000, 2018, Oracle and/or?its affiliates. All rights reserved. ? Oracle is a registered trademark of Oracle Corporation and/or?its affiliates. Other names may be trademarks of their respective owners. ? Type?'help;'?or?'\h'?for?help. Type?'\c'?to?clear?the current input statement. ? mysql> 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.00 sec) |
ProxySQL的庫、表說明?(默認管理端口是6032,客戶端服務端口是6033。默認的用戶名密碼都是 admin)
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 | 通過管理端口6032去連接的 (注意, 下面連接命令中后面的--prompt?'admin'字段可以不加,也是可以登錄進去的) ?? [root@mysql-proxy ~]# mysql -uadmin -padmin -P6032 -h127.0.0.1 或者 [root@mysql-proxy ~]# mysql -uadmin -padmin -P6032 -h127.0.0.1 --prompt 'admin> ' Welcome to the MariaDB monitor.? Commands end with ; or \g. Your MySQL connection?id?is 33 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> 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) ?? ProxySQL提供了幾個庫,每個庫都有各自的意義; -? main 內存配置數據庫,表里存放后端db實例、用戶驗證、路由規則等信息。表名以 runtime_開頭的表示proxysql當前運行的配置內容, 不能通過dml語句修改,只能修改對應的不以 runtime_ 開頭的(在內存)里的表,然后 LOAD 使其生效, SAVE 使其存到硬盤以供下次重啟加載。 -? disk 是持久化到硬盤的配置,sqlite數據文件。 -? stats 是proxysql運行抓取的統計信息,包括到后端各命令的執行次數、流量、processlist、查詢種類匯總/執行時間等等。 -? monitor 庫存儲 monitor 模塊收集的信息,主要是對后端db的健康/延遲檢查。 ?? 1) main 庫 (disk庫的表字段和main一樣) admin> show tables from main; +--------------------------------------------+ | 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.001 sec) ? 常用的幾個表介紹 =============================================== global_variables?????? 設置變量,包括監聽的端口、管理賬號等。 ? mysql_collations?????? 相關字符集和校驗規則。 ? mysql_query_rules????? 定義查詢路由規則。 ? mysql_replication_hostgroups?? 監視指定主機組中所有服務器的read_only值,并且根據read_only的值將服務器分配給寫入器或讀取器主機組。ProxySQL monitor模塊會監控hostgroups 后端所有servers 的read_only 變量,如果發現從庫的read_only變為0、主庫變為1,則認為角色互換了,自動改寫mysql_servers表里面 hostgroup關系, 達到自動 Failover 效果。 ? mysql_servers 設置后端MySQL的表 ? mysql_users 配置后端數據庫的程序賬號和監控賬號。 ? scheduler 調度器是一個類似于cron的實現,集成在ProxySQL中,具有毫秒的粒度。通過腳本檢測來設置ProxySQL。 ? 2)stats庫 MySQL [(none)]> show tables from stats; +--------------------------------------+ | 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.001 sec) ? 常用的幾個表介紹 =============================================== stats_mysql_commands_counters 統計各種SQL類型的執行次數和時間,通過參數mysql-commands_stats控制開關,默認是ture。 ? stats_mysql_connection_pool 連接后端MySQL的連接信息。 ? stats_mysql_processlist 類似MySQL的show processlist的命令,查看各線程的狀態。 ? stats_mysql_query_digest 表示SQL的執行次數、時間消耗等。通過變量mysql-query_digests控制開關,默認是開。 ? stats_mysql_query_rules 路由命中次數統計。 ? 3)monitor庫 MySQL [(none)]> show tables from monitor;???????????? +------------------------------------+ | tables???????????????????????????? | +------------------------------------+ | mysql_server_connect_log?????????? | | mysql_server_group_replication_log | | mysql_server_ping_log????????????? | | mysql_server_read_only_log???????? | | mysql_server_replication_lag_log?? | +------------------------------------+ 5 rows?in?set?(0.000 sec) ? 常用的幾個表介紹 =============================================== mysql_server_connect_log 連接到所有MySQL服務器以檢查它們是否可用,該表用來存放檢測連接的日志。 ? mysql_server_ping_log 使用mysql_ping API?ping后端MySQL服務器,檢查它們是否可用,該表用來存放ping的日志。 ? mysql_server_replication_lag_log 后端MySQL服務主從延遲的檢測。 ? runtime_開頭的是運行時的配置,這些是不能修改的。要修改ProxySQL的配置,需要修改了非runtime_表, 修改后必須執行"LOAD ... TO RUNTIME"才能加載到RUNTIME生效,執行save ... to disk才能將配置持久化保存到磁盤。 |
global_variables 有80多個變量可以設置,其中就包括監聽的端口、管理賬號、禁用monitor等
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | (admin@127.0.0.1:6032) [(none)]> 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.001 sec) ?? (admin@127.0.0.1:6032) [(none)]> show tables from stats; +--------------------------------------+ | 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.000 sec) ?? (admin@127.0.0.1:6032) [(none)]> show create table mysql_servers\G; *************************** 1. row *************************** ???????table: mysql_servers Create Table: CREATE TABLE mysql_servers ( ????hostgroup_id INT CHECK (hostgroup_id>=0) NOT NULL DEFAULT 0, ????hostname?VARCHAR NOT NULL, ????port INT NOT NULL DEFAULT 3306, ????status VARCHAR CHECK (UPPER(status) IN ('ONLINE','SHUNNED','OFFLINE_SOFT',?'OFFLINE_HARD')) NOT NULL DEFAULT?'ONLINE', ????weight INT CHECK (weight >= 0) NOT NULL DEFAULT 1, ????compression INT CHECK (compression >=0 AND compression <= 102400) NOT NULL DEFAULT 0, ????max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 1000, ????max_replication_lag INT CHECK (max_replication_lag >= 0 AND max_replication_lag <= 126144000) NOT NULL DEFAULT 0, ????use_ssl INT CHECK (use_ssl IN(0,1)) NOT NULL DEFAULT 0, ????max_latency_ms INT UNSIGNED CHECK (max_latency_ms>=0) NOT NULL DEFAULT 0, ????comment VARCHAR NOT NULL DEFAULT?'', ????PRIMARY KEY (hostgroup_id,?hostname, port) ) 1 row?in?set?(0.000 sec) ?? ERROR: No query specified ?? (admin@127.0.0.1:6032) [(none)]>?select?* from mysql_servers; +--------------+---------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+ | hostgroup_id |?hostname??????| port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment | +--------------+---------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+ | 10?????????? | 172.16.60.211 | 3306 | ONLINE | 1????? | 0?????????? | 1000??????????? | 0?????????????????? | 0?????? | 0????????????? |???????? | | 20?????????? | 172.16.60.212 | 3306 | ONLINE | 1????? | 0?????????? | 1000??????????? | 0?????????????????? | 0?????? | 0????????????? |???????? | | 20?????????? | 172.16.60.213 | 3306 | ONLINE | 1????? | 0?????????? | 1000??????????? | 0?????????????????? | 0?????? | 0????????????? |???????? | +--------------+---------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+ 3 rows?in?set?(0.000 sec) |
-??hostgroup_id: ProxySQL通過 hostgroup?(下稱HG)?的形式組織后端db實例。一個 HG 代表同屬于一個角色
-??該表的主鍵是 (hostgroup_id, hostname, port),可以看到一個 hostname:port 可以在多個hostgroup里面,如上面的 10.0.100.100:3307,這樣可以避免 HG 1000 的從庫全都不可用時,依然可以把讀請求發到主庫上。
-? 一個 HG 可以有多個實例,即多個從庫,可以通過 weight 分配權重
-??hostgroup_id 0 是一個特殊的HG,路由查詢的時候,沒有匹配到規則則默認選擇 HG 0
-??status:
-? ONLINE: 當前后端實例狀態正常
? ?-??SHUNNED: 臨時被剔除,可能因為后端 too many connections error,或者超過了可容忍延遲閥值 max_replication_lag
? ?-??OFFLINE_SOFT: “軟離線”狀態,不再接受新的連接,但已建立的連接會等待活躍事務完成。
? ?-? OFFLINE_HARD: “硬離線”狀態,不再接受新的連接,已建立的連接或被強制中斷。當后端實例宕機或網絡不可達,會出現。
-? max_connections: 允許連接到該后端mysql實例的最大連接數。不要大于MySQL設置的 max_connections,如果后端實例 hostname:port 在多個 hostgroup 里,以較大者為準,而不是各自獨立允許的最大連接數。
-??max_replication_lag: 允許的最大延遲,主庫不受這個影響,默認0。如果 > 0, monitor 模塊監控主從延遲大于閥值時,會臨時把它變為 SHUNNED 。
-??max_latency_ms: mysql_ping 響應時間,大于這個閥值會把它從連接池剔除(即使是ONLINE)
-??comment: 備注,不建議留空。可以通過它的內容如json格式的數據,配合自己寫的check腳本,完成一些自動化的工作。
表 mysql_users
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | MySQL [(none)]> show create table mysql_users\G; *************************** 1. row *************************** ???????table: mysql_users Create Table: CREATE TABLE mysql_users ( ????username VARCHAR NOT NULL, ????password VARCHAR, ????active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1, ????use_ssl INT CHECK (use_ssl IN (0,1)) NOT NULL DEFAULT 0, ????default_hostgroup INT NOT NULL DEFAULT 0, ????default_schema VARCHAR, ????schema_locked INT CHECK (schema_locked IN (0,1)) NOT NULL DEFAULT 0, ????transaction_persistent INT CHECK (transaction_persistent IN (0,1)) NOT NULL DEFAULT 1, ????fast_forward INT CHECK (fast_forward IN (0,1)) NOT NULL DEFAULT 0, ????backend INT CHECK (backend IN (0,1)) NOT NULL DEFAULT 1, ????frontend INT CHECK (frontend IN (0,1)) NOT NULL DEFAULT 1, ????max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 10000, ????PRIMARY KEY (username, backend), ????UNIQUE (username, frontend)) 1 row?in?set?(0.000 sec) ?? ERROR: No query specified ?? MySQL [(none)]>?select?* from mysql_users; +-----------+------------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+ | username? | password?? | active | use_ssl | default_hostgroup | default_schema | schema_locked | transaction_persistent | fast_forward | backend | frontend | max_connections | +-----------+------------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+ | proxysql? | proxysql?? | 1????? | 0?????? | 2???????????????? | NULL?????????? | 0???????????? | 1????????????????????? | 0??????????? | 1?????? | 1??????? | 10000?????????? | | root????? |?passwd?????| 1????? | 0?????? | 10??????????????? | NULL?????????? | 0???????????? | 1????????????????????? | 0??????????? | 1?????? | 1??????? | 10000?????????? | | sqlsender | P@ssword1! | 1????? | 0?????? | 10??????????????? | NULL?????????? | 0???????????? | 1????????????????????? | 0??????????? | 1?????? | 1??????? | 10000?????????? | +-----------+------------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+ 3 rows?in?set?(0.000 sec) ?? MySQL [(none)]>?select?username,password,transaction_persistent,active,backend,frontend,max_connections from runtime_mysql_users; +-----------+-------------------------------------------+------------------------+--------+---------+----------+-----------------+ | username? | password????????????????????????????????? | transaction_persistent | active | backend | frontend | max_connections | +-----------+-------------------------------------------+------------------------+--------+---------+----------+-----------------+ | proxysql? | *BF27B4C7AAD278126E228AA8427806E870F64F39 | 1????????????????????? | 1????? | 0?????? | 1??????? | 10000?????????? | | root????? | *59C70DA2F3E3A5BDF46B68F5C8B8F25762BCCEF0 | 1????????????????????? | 1????? | 0?????? | 1??????? | 10000?????????? | | sqlsender | *50572A5FABC7DA9CEE5EB5977EDDE59E38967422 | 1????????????????????? | 1????? | 0?????? | 1??????? | 10000?????????? | | proxysql? | *BF27B4C7AAD278126E228AA8427806E870F64F39 | 1????????????????????? | 1????? | 1?????? | 0??????? | 10000?????????? | | root????? | *59C70DA2F3E3A5BDF46B68F5C8B8F25762BCCEF0 | 1????????????????????? | 1????? | 1?????? | 0??????? | 10000?????????? | | sqlsender | *50572A5FABC7DA9CEE5EB5977EDDE59E38967422 | 1????????????????????? | 1????? | 1?????? | 0??????? | 10000?????????? | +-----------+-------------------------------------------+------------------------+--------+---------+----------+-----------------+ 6 rows?in?set?(0.001 sec) |
-? username, password: 連接后端db的用戶密碼。
這個密碼你可以插入明文,也可以插入hash加密后的密文,proxysql會檢查你插入的時候密碼是否以 * 開頭來判斷,而且密文要在其它地方使用 PASSWORD()生成。但到 runtime_mysql_users 里,都統一變成了密文,所以可以明文插入,再 SAVE MYSQL USERS TO MEM,此時看到的也是HASH密文。
-? active: 是否生效該用戶。
-??default_hostgroup: 這個用戶的請求沒有匹配到規則時,默認發到這個 hostgroup,默認0
-??default_schema: 這個用戶連接時沒有指定 database name 時,默認使用的schema
注意表面上看默認為NULL,但實際上受到變量 mysql-default_schema 的影響,默認為 information_schema。關于這個參考我所提的 issue #988
-??transaction_persistent: 如果設置為1,連接上ProxySQL的會話后,如果在一個hostgroup上開啟了事務,那么后續的sql都繼續維持在這個hostgroup上,不倫是否會匹配上其它路由規則,直到事務結束。
雖然默認是0,但我建議還是設成1,雖然一般來說由于前段應用的空值,為0出問題的情況幾乎很小。作者也在考慮默認設成 1,refer this issue #793
-? frontend, backend: 目前版本這兩個都需要使用默認的1,將來有可能會把 Client -> ProxySQL (frontend) 與 ProxySQL -> BackendDB (backend)的認證分開。從 runtime_mysql_users 表內容看到,記錄數比 mysql_users 多了一倍,就是把前端認證與后端認證獨立出來的結果。
-??fast_forward: 忽略查詢重寫/緩存層,直接把這個用戶的請求透傳到后端DB。相當于只用它的連接池功能,一般不用,路由規則 .* 就行了。
表 mysql_replication_hostgroups
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | MySQL [(none)]> 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), ????comment VARCHAR NOT NULL DEFAULT?'', UNIQUE (reader_hostgroup)) 1 row?in?set?(0.001 sec) ?? ERROR: No query specified ?? MySQL [(none)]>?select?* from mysql_replication_hostgroups; +------------------+------------------+---------+ | writer_hostgroup | reader_hostgroup | comment | +------------------+------------------+---------+ | 10?????????????? | 20?????????????? | 1?????? | +------------------+------------------+---------+ 1 row?in?set?(0.000 sec) |
定義 hostgroup 的主從關系。ProxySQL monitor 模塊會監控 HG 后端所有servers 的?read_only?變量,如果發現從庫的 read_only 變為0、主庫變為1,則認為角色互換了,自動改寫 mysql_servers 表里面 hostgroup 關系,達到自動 Failover 效果。
表 mysql_query_rules
mysql_query_rules 是ProxySQL非常核心一個表,定義查詢路由規則
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | MySQL [(none)]> show create table mysql_query_rules\G; *************************** 1. row *************************** ???????table: mysql_query_rules Create Table: CREATE TABLE mysql_query_rules ( ????rule_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, ????active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 0, ????username VARCHAR, ????schemaname VARCHAR, ????flagIN INT NOT NULL DEFAULT 0, ????client_addr VARCHAR, ????proxy_addr VARCHAR, ????proxy_port INT, ????digest VARCHAR, ????match_digest VARCHAR, ????match_pattern VARCHAR, ????negate_match_pattern INT CHECK (negate_match_pattern IN (0,1)) NOT NULL DEFAULT 0, ????re_modifiers VARCHAR DEFAULT?'CASELESS', ????flagOUT INT, ????replace_pattern VARCHAR, ????destination_hostgroup INT DEFAULT NULL, ????cache_ttl INT CHECK(cache_ttl > 0), ????reconnect INT CHECK (reconnect IN (0,1)) DEFAULT NULL, ????timeout INT UNSIGNED, ????retries INT CHECK (retries>=0 AND retries <=1000), ????delay INT UNSIGNED, ????next_query_flagIN INT UNSIGNED, ????mirror_flagOUT INT UNSIGNED, ????mirror_hostgroup INT UNSIGNED, ????error_msg VARCHAR, ????OK_msg VARCHAR, ????sticky_conn INT CHECK (sticky_conn IN (0,1)), ????multiplex INT CHECK (multiplex IN (0,1,2)), ????log INT CHECK (log IN (0,1)), ????apply INT CHECK(apply IN (0,1)) NOT NULL DEFAULT 0, ????comment VARCHAR) 1 row?in?set?(0.001 sec) ?? ERROR: No query specified ?? MySQL [(none)]>?select?* from mysql_query_rules; +---------+--------+----------+------------+--------+-------------+------------+------------+--------+----------------------+---------------+----------------------+--------------+---------+-----------------+-----------------------+-----------+-----------+---------+---------+-------+-------------------+----------------+------------------+-----------+--------+-------------+-----------+-----+-------+---------+ | rule_id | active | username | schemaname | flagIN | client_addr | proxy_addr | proxy_port | digest | match_digest???????? | match_pattern | negate_match_pattern | re_modifiers | flagOUT | replace_pattern | destination_hostgroup | cache_ttl | reconnect | timeout | retries | delay | next_query_flagIN | mirror_flagOUT | mirror_hostgroup | error_msg | OK_msg | sticky_conn | multiplex | log | apply | comment | +---------+--------+----------+------------+--------+-------------+------------+------------+--------+----------------------+---------------+----------------------+--------------+---------+-----------------+-----------------------+-----------+-----------+---------+---------+-------+-------------------+----------------+------------------+-----------+--------+-------------+-----------+-----+-------+---------+ | 1?????? | 1????? | NULL???? | NULL?????? | 0????? | NULL??????? | NULL?????? | NULL?????? | NULL?? | ^SELECT.*FOR UPDATE$ | NULL????????? | 0??????????????????? | CASELESS???? | NULL??? | NULL??????????? | 10??????????????????? | NULL????? | NULL????? | NULL??? | NULL??? | NULL? | NULL????????????? | NULL?????????? | NULL???????????? | NULL????? | NULL?? | NULL??????? | NULL????? | NULL | 1???? | NULL??? | | 2?????? | 1????? | NULL???? | NULL?????? | 0????? | NULL??????? | NULL?????? | NULL?????? | NULL?? | ^SELECT????????????? | NULL????????? | 0??????????????????? | CASELESS???? | NULL??? | NULL??????????? | 20??????????????????? | NULL????? | NULL????? | NULL??? | NULL??? | NULL? | NULL????????????? | NULL?????????? | NULL???????????? | NULL????? | NULL?? | NULL??????? | NULL????? | NULL | 1???? | NULL??? | +---------+--------+----------+------------+--------+-------------+------------+------------+--------+----------------------+---------------+----------------------+--------------+---------+-----------------+-----------------------+-----------+-----------+---------+---------+-------+-------------------+----------------+------------------+-----------+--------+-------------+-----------+-----+-------+---------+ 2 rows?in?set?(0.000 sec) |
-??rule_id: 表主鍵,自增。規則處理是以 rule_id 的順序進行。
-??active: 只有 active=1 的規則才會參與匹配。
-? username: 如果非 NULL,只有連接用戶是 username 的值才會匹配。
-??schemaname: 如果非 NULL,只有查詢連接使用的db是 schemaname 的值才會匹配。
? ?注意如果是 NULL,不代表連接沒有使用schema,而是不倫任何schema都進一步匹配。
-??flagIN, flagOUT, apply: 用來定義路由鏈 chains of rules。
? ?-??首先會檢查 flagIN=0 的規則,以rule_id的順序;如果都沒匹配上,則走這個用戶的 default_hostgroup。
? ?-??當匹配一條規則后,會檢查 flagOUT。
? ? ??-? 如果不為NULL,并且 flagIN != flagOUT ,則進入以flagIN為上一個flagOUT值的新規則鏈。
? ? ??-??如果不為NULL,并且 flagIN = flagOUT,則應用這條規則。
? ? ??-? 如果為NULL,或者 apply=1,則結束,應用這條規則。
? ? ??-? 如果最終沒有匹配到,則找到這個用戶的 default_hostgroup。
-? client_addr: 匹配客戶端來源IP
-? proxy_addr, proxy_port: 匹配本地proxysql的IP、端口。我目前沒有想到它的應用場景,可能是把proxysql監聽在多個接口上,分發到不同的業務?
-??digest: 精確的匹配一類查詢。
-??match_digest: 正則匹配一類查詢。query digest 是指對查詢去掉具體值后進行“模糊化”后的查詢,類似 pt-fingerprint / pt-query-digest 的效果。
-? match_pattern: 正則匹配查詢。
以上都是匹配查詢的規則,1.3.5版本使用的正則引擎只有 RE2 ,1.4版本可以通過變量 mysql-query_processor_regex 設置 RE2 或者 PCRE,且1.4開始默認是PCRE。
推薦用 match_digest 。關于每條查詢都會計算digest對性能的影響,計算query digest確實會有性能損失,但是這卻是proxysql里面非常重要的特性,主要是兩點:
???-??proxysql無法知道連接復用(multipexing)是否必須被自動禁用,比如連接里面有variables/tmp tables/lock table等特殊命令,是不能復用的。
? ?-??完整的查詢去匹配正則的效率,一般沒有參數化后的查詢匹配效率高,因為有很長的字符串內容需要處理。再者,SELECT * FROM randomtable WHERE comment LIKE ‘%INTO sbtest1 %? ? ? ? ? ? ? ? FROM sbtest2 %’字符串里有類似這樣的語句,很難排除誤匹配。
-??negate_match_pattern: 反向匹配,相當于對 match_digest/match_pattern 的匹配取反。
-? re_modifiers: 修改正則匹配的參數,比如默認的:忽略大小寫CASELESS、禁用GLOBAL.
上面都是匹配規則,下面是匹配后的行為
-??replace_pattern: 查詢重寫,默認為空,不rewrite。
-? rewrite規則要遵守 RE2::Replace 。
destination_hostgroup: 路由查詢到這個 hostgroup。當然如果用戶顯式 start transaction 且 transaction_persistent=1,那么即使匹配到了,也依然按照事務里第一條sql的路由規則去走。
-? cache_ttl: 查詢結果緩存的毫秒數。
proxysql這個 Query Cache 與 MySQL 自帶的query cache不是同一個。proxysql query cache也不會關心后端數據是否被修改,它所做的就是針對某些特定種類的查詢結果進行緩存,比如一些歷史數據的count結果。一般不設。
-??timeout: 這一類查詢執行的最大時間(毫秒),超時則自動kill。
這是對后端DB的保護機制,相當于阿里云RDS loose_max_statement_time 變量的功能,但是注意不同的是,阿里云這個變量的時間時不包括DML操作出現InnoDB行鎖等待的時間,而ProxySQL的這個 timeout 是計算從發送sql到等待響應的時間。默認mysql-default_query_timeout給的是 10h .
-??retries: 語句在執行時失敗時,重試次數。默認由 mysql-query_retries_on_failure變量指定,為1 。
? ?個人建議把它設成0,即不重試。因為執行失敗,對select而言很少見,主要是dml,但自己重試對數據不放心。
-? delay: 查詢延遲執行,這是ProxySQL提供的限流機制,會讓其它的查詢優先執行。
? ?默認值 mysql-default_query_delay,為0。我們一般不用,其實還是要配合應用端使用,比如這邊延遲執行,但上層等待你返回,那前端不就堵住了,沒準出現雪崩效應。
-??mirror_flagOUT,mirror_hostgroup
這兩個高級了,目前這部分文檔不全,功能是SQL鏡像。顧名思義,就是把匹配到的SQL除了發送到 destination_hostgroup,同時鏡像一份到這里的hostgroup,比如我們的測試庫。比如這種場景,數據庫要從5.6升級到5.7,要驗證現有查詢語句對5.7的適用情況,就可以把生產流量鏡像到5.7新庫上驗證。
-? error_msg: 默認為NULL,如果指定了則這個查詢直接被 block 掉,馬上返回這個錯誤信息。
這個功能也很實用,比如線上突然冒出一個 “壞查詢”,應用端不方便馬上發版解決,我們就可以在這配置一個規則,把查詢屏蔽掉,想正常的mysql報錯那樣拋異常。下一篇文章有演示。
-??multiplex: 連接是否復用。
-??log: 是否記錄查詢日志。可以看到log是否記錄的對象是根據規則。
要開啟日志記錄,需要設置變量 mysql-eventslog_filename 來指定文件名,然后這個 log 標記為1。但是目前proxysql記錄的日志是二進制格式,需要特定的工具才能讀取: eventslog_reader_sample 。這個工具在源碼目錄 tools下面。
proxysql對后端server健康檢查
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | MySQL [monitor]> show variables like?"mysql-monitor%"; +-----------------------------------------------------+------------+ | Variable_name?????????????????????????????????????? | Value????? | +-----------------------------------------------------+------------+ | mysql-monitor_enabled?????????????????????????????? |?true???????| | mysql-monitor_connect_timeout?????????????????????? | 600??????? | | mysql-monitor_ping_max_failures???????????????????? | 3????????? | | mysql-monitor_ping_timeout????????????????????????? | 1000?????? | | mysql-monitor_read_only_max_timeout_count?????????? | 3????????? | | mysql-monitor_replication_lag_interval????????????? | 10000????? | | mysql-monitor_replication_lag_timeout?????????????? | 1000?????? | | mysql-monitor_groupreplication_healthcheck_interval | 5000?????? | | mysql-monitor_groupreplication_healthcheck_timeout? | 800??????? | | mysql-monitor_replication_lag_use_percona_heartbeat |??????????? | | mysql-monitor_query_interval??????????????????????? | 60000????? | | mysql-monitor_query_timeout???????????????????????? | 100??????? | | mysql-monitor_slave_lag_when_null?????????????????? | 60???????? | | mysql-monitor_wait_timeout????????????????????????? |?true???????| | mysql-monitor_writer_is_also_reader???????????????? |?true???????| | mysql-monitor_username????????????????????????????? | monitor??? | | mysql-monitor_password????????????????????????????? | P@ssword1! | | mysql-monitor_history?????????????????????????????? | 600000???? | | mysql-monitor_connect_interval????????????????????? | 60000????? | | mysql-monitor_ping_interval???????????????????????? | 10000????? | | mysql-monitor_read_only_interval??????????????????? | 1500?????? | | mysql-monitor_read_only_timeout???????????????????? | 500??????? | +-----------------------------------------------------+------------+ 22 rows?in?set?(0.001 sec) |
ProxySQL配置后端DB server
兩種方式,區別在于
1)? 一種是在往mysql_servers表中添加server時就為其劃分好hostgroup_id(例如0表示寫組,1表示讀組)
2)? 另一種往mysql_servers表中添加server時不區分hostgroup_id(例如全部設為0),然后通過mysql_replication_hostgroups表中的值,
根據proxysql檢測到的各server的read_only變量值來自動為后端server設置hostgroup_id
這里強烈推薦用第一種方式
因為第一種是完全由我們控制的;而第二種假如我們誤將讀server的read_only屬性設置為0,則proxysql會將其重新分配到寫組,這絕對是不期望的。
ProxySQL下添加與修改配置
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | 1) 添加配置 需要添加配置時,直接操作的是MEMORAY,例如:添加一個程序用戶,在mysql_users表中執行一個插入操作: MySQL [(none)]> insert into mysql_users(username,password,active,default_hostgroup,transaction_persistent) values('myadmin','mypass',1,0,1); ?? 這樣就完成了一個用戶的添加。要讓這個insert生效,還需要執行如下操作: MySQL [(none)]>load mysql?users?to runtime; 表示將修改后的配置(MEMORY層)用到實際生產環境(RUNTIME層) ?? 如果想保存這個設置永久生效,還需要執行如下操作: MySQL [(none)]>save mysql?users?to disk; 表示將memoery中的配置保存到磁盤中去。 ?? 除了上面兩個操作,還可以執行如下操作: MySQL [(none)]>load mysql?users?to memory; 表示將磁盤中持久化的配置拉一份到memory中來。 ?? MySQL [(none)]>load mysql?users?from config; 表示將配置文件中的配置加載到memeory中。 ?? 2) 持久化配置 以上SQL命令是對mysql_users進行的操作,同理,還可以對mysql_servers表、mysql_query_rules表、global_variables表等執行類似的操作。 如對mysql_servers表插入完成數據后,要執行保存和加載操作,可執行如下SQL命令: MySQL [(none)]> load mysql servers to runtime; MySQL [(none)]> save mysql servers to disk; ?? 對mysql_query_rules表插入完成數據后,要執行保存和加載操作,可執行如下SQL命令: MySQL [(none)]> load mysql query rules to runtime; MySQL [(none)]> save mysql query rules to disk; ?? 對global_variables表插入完成數據后,要執行保存和加載操作,可執行如下SQL命令: ?? 以下命令加載或保存mysql variables(global_variables): MySQL [(none)]>load mysql variables to runtime; MySQL [(none)]>save mysql variables to disk; ?? 以下命令加載或保存admin variables(select?* from global_variables where variable_name like?'admin-%'): MySQL [(none)]> load admin variables to runtime; MySQL [(none)]>save admin variables to disk; |
二、ProxySQL功能驗證 (針對GTID模式的主從同步,另兩個從庫都要設置read_only=on)
接下來通過實戰操作來全面了解一下 ProxySQL 的特性和使用場景。
1. 實驗環境
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | 172.16.60.211??? mysql-master?????? 安裝Mysql5.7 172.16.60.212??? mysql-slave1?????? 安裝Mysql5.7 172.16.60.213??? mysql-slave2?????? 安裝Mysql5.7 172.16.60.214??? mysql-proxy??????? 安裝ProxySQL,Mysql-client ? 系統都是CentOS7.5,MySQL版本是5.7,準備一主兩從架構(基于GTID的同步,兩個從庫都要開啟read_only=on)來配合ProxySQL。 [root@mysql-master ~]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) ? 1) 三個節點各自設置主機名 [root@mysql-master ~]# hostnamectl --static set-hostname mysql-master [root@mysql-master ~]# hostname mysql-master ?? [root@mysql-slave1 ~]# hostnamectl --static set-hostname mysql-slave1 [root@mysql-slave1 ~]# hostname mysql-slave ? [root@mysql-slave2 ~]# hostnamectl --static set-hostname mysql-slave2 [root@mysql-slave2 ~]# hostname mysql-slave ? [root@mysql-proxy ~]# hostnamectl --static set-hostname mysql-proxy [root@mysql-proxy ~]# hostname mysql-proxy ?? 2) 所有節點關閉selinux和iptables防火墻 [root@mysql-master ~]# setenforce 0 [root@mysql-master ~]# cat /etc/sysconfig/selinux |grep "SELINUX=disabled" SELINUX=disabled ?? [root@mysql-master ~]# iptables -F [root@mysql-master ~]# systemctl disable firewalld [root@mysql-master ~]# systemctl stop firewalld? [root@mysql-master ~]# firewall-cmd --state not running |
2. 安裝Mysql 5.7? (在三個mysql節點上安裝)
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | 在三個mysql節點機上使用yum方式安裝Mysql5.7,參考:https://www.cnblogs.com/kevingrace/p/8340690.html ????? 安裝MySQL yum資源庫 [root@mysql-master ~]# yum localinstall https://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm ????? 安裝MySQL 5.7 [root@mysql-master ~]# yum install -y mysql-community-server ????? 啟動MySQL服務器和MySQL的自動啟動 [root@mysql-master ~]# systemctl start mysqld.service [root@mysql-master ~]# systemctl enable mysqld.service ????? 設置登錄密碼 由于MySQL從5.7開始不允許首次安裝后使用空密碼進行登錄!為了加強安全性,系統會隨機生成一個密碼以供管理員首次登錄使用, 這個密碼記錄在/var/log/mysqld.log文件中,使用下面的命令可以查看此密碼: [root@mysql-master ~]# cat /var/log/mysqld.log|grep 'A temporary password' 2019-01-11T05:53:17.824073Z 1 [Note] A temporary password is generated?for?root@localhost: TaN.k:*Qw2xs ????? 使用上面查看的密碼TaN.k:*Qw2xs 登錄mysql,并重置密碼為123456 [root@mysql-master ~]# mysql -p???????????????? #輸入默認的密碼:TaN.k:*Qw2xs ............. mysql>?set?global validate_password_policy=0; Query OK, 0 rows affected (0.00 sec) ????? mysql>?set?global validate_password_length=1; Query OK, 0 rows affected (0.00 sec) ????? mysql>?set?password=password("123456"); Query OK, 0 rows affected, 1 warning (0.00 sec) ????? mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) ????? 查看mysql版本 [root@mysql-master ~]# mysql -p123456 ........ mysql>?select?version(); +-----------+ | version() | +-----------+ | 5.7.24??? | +-----------+ 1 row?in?set?(0.00 sec) ???? ===================================================================== 溫馨提示 mysql5.7通過上面默認安裝后,執行語句可能會報錯: ERROR 1819 (HY000): Your password does not satisfy the current policy requirements ???? 這個報錯與Mysql 密碼安全策略validate_password_policy的值有關,validate_password_policy可以取0、1、2三個值: 解決辦法: set?global validate_password_policy=0; set?global validate_password_length=1; |
3. 配置Mysql基于GTID的主從同步? (在mysql-master 和 mysql-slave1、mysql-slave2節點上)
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 | 1) 主數據庫mysql-master (172.16.60.211)的配置操作 [root@mysql-master ~]# >/etc/my.cnf [root@mysql-master ~]# vim /etc/my.cnf [mysqld] datadir =?/var/lib/mysql socket =?/var/lib/mysql/mysql.sock ???????? symbolic-links = 0 ???????? log-error =?/var/log/mysqld.log pid-file?=?/var/run/mysqld/mysqld.pid ???? #GTID: server_id = 1 gtid_mode = on enforce_gtid_consistency = on ?????? #binlog log_bin = master-bin log-slave-updates = 1 binlog_format = row sync-master-info = 1???? sync_binlog = 1???????? ????? #relay log skip_slave_start = 1 ? 配置完成之后,別忘了重啟Mysql [root@mysql-master ~]# systemctl restart mysqld ? 登錄mysql,查看一下master狀態, 發現多了一項"Executed_Gtid_Set " [root@mysql-master ~]# mysql -p123456 ......... mysql> show master status; +-------------------+----------+--------------+------------------+------------------------------------------+ | File????????????? | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set??????????????????????? | +-------------------+----------+--------------+------------------+------------------------------------------+ | master-bin.000002 |????? 550 |????????????? |????????????????? | fc39b161-22ca-11e9-a638-005056ac6820:1-2 | +-------------------+----------+--------------+------------------+------------------------------------------+ 1 row?in?set?(0.00 sec) ? mysql> show global variables like?'%uuid%'; +---------------+--------------------------------------+ | Variable_name | Value??????????????????????????????? | +---------------+--------------------------------------+ | server_uuid?? | fc39b161-22ca-11e9-a638-005056ac6820 | +---------------+--------------------------------------+ 1 row?in?set?(0.00 sec) ? mysql> show global variables like?'%gtid%'; +----------------------------------+------------------------------------------+ | Variable_name??????????????????? | Value??????????????????????????????????? | +----------------------------------+------------------------------------------+ | binlog_gtid_simple_recovery????? | ON?????????????????????????????????????? | | enforce_gtid_consistency???????? | ON?????????????????????????????????????? | | gtid_executed??????????????????? | fc39b161-22ca-11e9-a638-005056ac6820:1-2 | | gtid_executed_compression_period | 1000???????????????????????????????????? | | gtid_mode??????????????????????? | ON?????????????????????????????????????? | | gtid_owned?????????????????????? |????????????????????????????????????????? | | gtid_purged????????????????????? |????????????????????????????????????????? | | session_track_gtids????????????? | OFF????????????????????????????????????? | +----------------------------------+------------------------------------------+ 8 rows?in?set?(0.00 sec) ? 主庫執行從庫復制授權 mysql> grant replication slave,replication client on *.* to slave@'172.16.60.212'?identified by?"slave@123"; Query OK, 0 rows affected, 1 warning (0.09 sec) ? mysql> grant replication slave,replication client on *.* to slave@'172.16.60.213'?identified by?"slave@123"; Query OK, 0 rows affected, 1 warning (0.03 sec) ? mysql> flush privileges; Query OK, 0 rows affected (0.03 sec) ? ? mysql> show grants?for?slave@'172.16.60.212'; +-------------------------------------------------------------------------------+ | Grants?for?slave@172.16.60.212??????????????????????????????????????????????? | +-------------------------------------------------------------------------------+ | GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO?'slave'@'172.16.60.212'?| +-------------------------------------------------------------------------------+ 1 row?in?set?(0.00 sec) ? mysql> show grants?for?slave@'172.16.60.213'; +-------------------------------------------------------------------------------+ | Grants?for?slave@172.16.60.213??????????????????????????????????????????????? | +-------------------------------------------------------------------------------+ | GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO?'slave'@'172.16.60.213'?| +-------------------------------------------------------------------------------+ 1 row?in?set?(0.00 sec) ? 在主數據庫機器上創建一個測試庫kevin(為了測試效果) mysql> show databases; +--------------------+ | Database?????????? | +--------------------+ | information_schema | | mysql????????????? | | performance_schema | | sys??????????????? | +--------------------+ 4 rows?in?set?(0.00 sec) ? mysql> CREATE DATABASE kevin CHARACTER SET utf8 COLLATE utf8_general_ci;? Query OK, 1 row affected (0.02 sec) ? mysql> use kevin; Database changed mysql> create table?if?not exists haha (id?int(10) PRIMARY KEY AUTO_INCREMENT,name varchar(50) NOT NULL); Query OK, 0 rows affected (0.17 sec) ? mysql> insert into kevin.haha values(1,"congcong"),(2,"huihui"),(3,"grace");? Query OK, 3 rows affected (0.16 sec) Records: 3? Duplicates: 0? Warnings: 0 ? mysql>?select?* from kevin.haha; +----+----------+ |?id?| name???? | +----+----------+ |? 1 | congcong | |? 2 | huihui?? | |? 3 | grace??? | +----+----------+ 3 rows?in?set?(0.00 sec) ? ? |
?
總結
以上是生活随笔為你收集整理的ProxySQL 配置详解及读写分离(+GTID)等功能说明 (完整篇)1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中倒背如流_倒背如流100首
- 下一篇: threejs 特效 自定义发光围栏,发