日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

ProxySQL 配置详解及读写分离(+GTID)等功能说明 (完整篇)1

發(fā)布時間:2024/1/8 数据库 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ProxySQL 配置详解及读写分离(+GTID)等功能说明 (完整篇)1 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

ProxySQL是靈活強大的MySQL代理層, 是一個能實實在在用在生產環(huán)境的MySQL中間件,可以實現(xiàn)讀寫分離,支持 Query 路由功能,支持動態(tài)指定某個 SQL 進行 cache,支持動態(tài)加載配置、故障切換和一些 SQL的過濾功能。還有一些同類產品比如 DBproxy、MyCAT、OneProxy 等。但經(jīng)過反復對比和測試之后,還是覺得ProxySQL是一款性能不諳,靠譜穩(wěn)定的MySQL 中間件產品 !

ProxySQL的亮點所在

-? 幾乎所有的配置均可在線更改(其配置數(shù)據(jù)基于SQLite存儲),無需重啟proxysql
-? 基于正則和client_addr的強大和靈活的路由規(guī)則
-? 詳細的狀態(tài)統(tǒng)計,統(tǒng)計結果和pt-query-digest對慢日志的分析結果類似,相當于有了統(tǒng)一的查看sql性能和sql語句統(tǒng)計的入口(Designed by a DBA for DBAs)
-? 自動重連和重新執(zhí)行機制(auto-reconnect and automatic re-execution of queries using it’s Connections Pool ):?若一個請求在鏈接或執(zhí)行過程中意外中斷,proxysql會根據(jù)其內部機制重新執(zhí)行該操作
-? query cache功能:比mysql自帶QC更靈活,可在mysql_query_rules表中依據(jù)digest,match_pattern,client_addr等維度控制哪類語句可以緩存
-? 支持連接池(connection pool)并且支持multiplexing,區(qū)別于atlas之流的連接池實現(xiàn)。

ProxySQL的特點

ProxySQL是一個高性能的MySQL中間件,擁有強大的規(guī)則引擎。具有以下特性:
-? 連接池,而且是 multiplexing;
-? 主機和用戶的最大連接數(shù)限制;
-? 自動下線后端DB;
? ? -? 延遲超過閥值
? ? -? ping 延遲超過閥值
? ? -? 網(wǎng)絡不通或宕機
-? 強大的規(guī)則路由引擎;
? ?-? 實現(xiàn)讀寫分離
? ?-? 查詢重寫
? ?-? sql流量鏡像
-? 支持prepared statement;
-? 支持Query Cache;
-? 支持負載均衡,與gelera結合自動failover;
-? 將所有配置保存寫入到SQLit表中。
-? 支持動態(tài)加載配置,即一般可以在線修改配置,但有少部分參數(shù)還是需要重啟來生效。
-? 支持query cache。
-? 支持對query的路由,可以針對某個語句進行分配去哪個實例執(zhí)行。
-? 不支持分表,可以分庫,但是利用規(guī)則配置實現(xiàn)分表。

如上可知,ProxySQL集合了很多優(yōu)秀特性于一身,那么它的缺點呢就是項目不夠成熟,好在官方網(wǎng)站一直在及時更新,并且受到 Percona 官方的支持。

ProxySQL多層管理配置設計 (有三層配置)

-??runtime:運行中使用的配置文件
-??memory:提供用戶動態(tài)修改配置文件
-??disk:將修改的配置保存到磁盤SQLit表中(即:proxysql.db)
-??config:一般不使用它(即:proxysql.cnf)

ProxySQL運行機制草圖如下:
ProxySQL有一個完備的配置系統(tǒng),配置ProxySQL是基于sql命令的方式完成的。ProxySQL支持配置修改之后的在線保存、應用,不需要重啟即可生效。整個配置系統(tǒng)分三層設計。
整個配置系統(tǒng)分為三層,如下圖所示:

ProxySQL配置系統(tǒng)分為三層的目的:
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_開頭的表,這些表的數(shù)據(jù)庫無法直接修改,只能從其他層級加載;該層代表的是ProxySQL當前生效的正在使用的配置,包括global_variables, mysql_servers, mysql_users, mysql_query_rules表。無法直接修改這里的配置,必須要從下一層load進來。也就是說RUNTIME這個頂級層,是proxysql運行過程中實際使用的那一份配置,這一份配置會直接影響到生產環(huán)境的,所以要將配置加載進RUNTIME層時需要三思而行。

-??MEMORY層
是平時在mysql命令行修改的 main 里頭配置,可以認為是SQLite數(shù)據(jù)庫在內存的鏡像。該層級的配置在main庫中以mysql_開頭的表以及global_variables表,這些表的數(shù)據(jù)可以直接修改;用戶可以通過MySQL客戶端連接到此接口(admin接口),然后可以在mysql命令行查詢不同的表和數(shù)據(jù)庫,并修改各種配置,可以認為是SQLite數(shù)據(jù)庫在內存的鏡像。也就是說MEMORY這個中間層,上面接著生產環(huán)境層RUNTIME,下面接著持久化層DISK和CONFIG FILE。MEMORY層是我們修改proxysql的唯一正常入口。一般來說在修改一個配置時,首先修改Memory層,確認無誤后再接入RUNTIME層,最后持久化到DISK和CONFIG FILE層。也就是說memeory層里面的配置隨便改,不影響生產,也不影響磁盤中保存的數(shù)據(jù)。通過admin接口可以修改mysql_servers、mysql_users、mysql_query_rules、global_variables等表的數(shù)據(jù)。

-??DISK|CONFIG FILR層
持久存儲的那份配置,一般在$(DATADIR)/proxysql.db,在重啟的時候會從硬盤里加載。 /etc/proxysql.cnf文件只在第一次初始化的時候用到,完了后,如果要修改監(jiān)聽端口,還是需要在管理命令行里修改,再 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 配置,隨便修改,不會影響生產環(huán)境。修改一個配置一般都是先在 MEMORY 層完成,然后確認正常之后再加載到 RUNTIME 和持久化到磁盤上。
4) DISK 和 CONFIG FILE層持久化配置信息,重啟后內存中的配置信息會丟失,所以需要將配置信息保留在磁盤中。重啟時,可以從磁盤快速加載回來。

ProxySQL配置文件的修改流程一般是:
- 啟動時:先修改必要的CONFIG FILE配置,比如管理端口,然后啟動;
- 其他配置:修改MEMORY中的表,然后加載到RUNTIME并持久化。

ProxySQL具有一個復雜但易于使用的配置系統(tǒng),可以滿足以下需求:
-? 允許輕松動態(tài)更新配置(這是為了讓ProxySQL用戶可以在需要零宕機時間配置的大型基礎架構中使用它)。與MySQL兼容的管理界面可用于此目的。
-? 允許盡可能多的配置項目動態(tài)修改,而不需要重新啟動ProxySQL進程
-? 可以毫不費力地回滾無效配置
-? 這是通過多級配置系統(tǒng)實現(xiàn)的,其中設置從運行時移到內存,并根據(jù)需要持久保存到磁盤。

一般,修改的配置都是在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的數(shù)據(jù)目錄。如果該目錄存在,且sqlite數(shù)據(jù)文件存在,那么正常啟動,將sqlite中的配置項讀進內存,并且加載進RUNTIME,用于初始化proxysql的運行。如果datadir目錄下沒有sqlite的數(shù)據(jù)文件,proxysql就會使用config file中的配置來初始化proxysql,并且將這些配置保存至數(shù)據(jù)庫。sqlite數(shù)據(jù)文件可以不存在,/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

?

執(zhí)行安裝

[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

?

啟動后會監(jiān)聽兩個端口,

默認為6032和6033。6032端口是ProxySQL的管理端口,6033是ProxySQL對外提供服務的端口 (即連接到轉發(fā)后端的真正數(shù)據(jù)庫的轉發(fā)端口)。

[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))

?

如上可以看出轉發(fā)端口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和配置數(shù)據(jù)庫文件/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數(shù)據(jù)庫文件,然后再重啟proxysql服務。這樣就相當于初始化啟動proxysql服務了,會再次生產一個純凈的proxysql.db數(shù)據(jù)庫文件(如果之前配置了proxysql相關路由規(guī)則等,則就會被抹掉)。?官方推薦用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"???????????????????????????????????#數(shù)據(jù)目錄

admin_variables=

{

????????admin_credentials="admin:admin"???????????????????????#連接管理端的用戶名與密碼

????????mysql_ifaces="0.0.0.0:6032"???????????????????????????#管理端口,用來連接proxysql的管理數(shù)據(jù)庫

}

mysql_variables=

{

????????threads=4?????????????????????????????????????????????#指定轉發(fā)端口開啟的線程數(shù)量

????????max_connections=2048

????????default_query_delay=0

????????default_query_timeout=36000000

????????have_compress=true

????????poll_timeout=2000

????????interfaces="0.0.0.0:6033"?????????????????????????????#指定轉發(fā)端口,用于連接后端mysql數(shù)據(jù)庫的,相當于代理作用

????????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的數(shù)據(jù)目錄

[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(可以動態(tài)修改),允許客戶端連接;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 內存配置數(shù)據(jù)庫,表里存放后端db實例、用戶驗證、路由規(guī)則等信息。表名以 runtime_開頭的表示proxysql當前運行的配置內容,

不能通過dml語句修改,只能修改對應的不以 runtime_ 開頭的(在內存)里的表,然后 LOAD 使其生效, SAVE 使其存到硬盤以供下次重啟加載。

-? disk 是持久化到硬盤的配置,sqlite數(shù)據(jù)文件。

-? stats 是proxysql運行抓取的統(tǒng)計信息,包括到后端各命令的執(zhí)行次數(shù)、流量、processlist、查詢種類匯總/執(zhí)行時間等等。

-? 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??????

設置變量,包括監(jiān)聽的端口、管理賬號等。

?

mysql_collations??????

相關字符集和校驗規(guī)則。

?

mysql_query_rules?????

定義查詢路由規(guī)則。

?

mysql_replication_hostgroups??

監(jiān)視指定主機組中所有服務器的read_only值,并且根據(jù)read_only的值將服務器分配給寫入器或讀取器主機組。ProxySQL monitor模塊會監(jiān)控hostgroups

后端所有servers 的read_only 變量,如果發(fā)現(xiàn)從庫的read_only變?yōu)?、主庫變?yōu)?,則認為角色互換了,自動改寫mysql_servers表里面 hostgroup關系,

達到自動 Failover 效果。

?

mysql_servers

設置后端MySQL的表

?

mysql_users

配置后端數(shù)據(jù)庫的程序賬號和監(jiān)控賬號。

?

scheduler

調度器是一個類似于cron的實現(xiàn),集成在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

統(tǒng)計各種SQL類型的執(zhí)行次數(shù)和時間,通過參數(shù)mysql-commands_stats控制開關,默認是ture。

?

stats_mysql_connection_pool

連接后端MySQL的連接信息。

?

stats_mysql_processlist

類似MySQL的show processlist的命令,查看各線程的狀態(tài)。

?

stats_mysql_query_digest

表示SQL的執(zhí)行次數(shù)、時間消耗等。通過變量mysql-query_digests控制開關,默認是開。

?

stats_mysql_query_rules

路由命中次數(shù)統(tǒng)計。

?

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_表,

修改后必須執(zhí)行"LOAD ... TO RUNTIME"才能加載到RUNTIME生效,執(zhí)行save ... to disk才能將配置持久化保存到磁盤。

global_variables 有80多個變量可以設置,其中就包括監(jiān)聽的端口、管理賬號、禁用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 的從庫全都不可用時,依然可以把讀請求發(fā)到主庫上。
-? 一個 HG 可以有多個實例,即多個從庫,可以通過 weight 分配權重
-??hostgroup_id 0 是一個特殊的HG,路由查詢的時候,沒有匹配到規(guī)則則默認選擇 HG 0
-??status:
-? ONLINE: 當前后端實例狀態(tài)正常
? ?-??SHUNNED: 臨時被剔除,可能因為后端 too many connections error,或者超過了可容忍延遲閥值 max_replication_lag
? ?-??OFFLINE_SOFT: “軟離線”狀態(tài),不再接受新的連接,但已建立的連接會等待活躍事務完成。
? ?-? OFFLINE_HARD: “硬離線”狀態(tài),不再接受新的連接,已建立的連接或被強制中斷。當后端實例宕機或網(wǎng)絡不可達,會出現(xiàn)。
-? max_connections: 允許連接到該后端mysql實例的最大連接數(shù)。不要大于MySQL設置的 max_connections,如果后端實例 hostname:port 在多個 hostgroup 里,以較大者為準,而不是各自獨立允許的最大連接數(shù)。
-??max_replication_lag: 允許的最大延遲,主庫不受這個影響,默認0。如果 > 0, monitor 模塊監(jiān)控主從延遲大于閥值時,會臨時把它變?yōu)?SHUNNED 。
-??max_latency_ms: mysql_ping 響應時間,大于這個閥值會把它從連接池剔除(即使是ONLINE)
-??comment: 備注,不建議留空??梢酝ㄟ^它的內容如json格式的數(shù)據(jù),配合自己寫的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 里,都統(tǒng)一變成了密文,所以可以明文插入,再 SAVE MYSQL USERS TO MEM,此時看到的也是HASH密文。
-? active: 是否生效該用戶。
-??default_hostgroup: 這個用戶的請求沒有匹配到規(guī)則時,默認發(fā)到這個 hostgroup,默認0
-??default_schema: 這個用戶連接時沒有指定 database name 時,默認使用的schema
注意表面上看默認為NULL,但實際上受到變量 mysql-default_schema 的影響,默認為 information_schema。關于這個參考我所提的 issue #988
-??transaction_persistent: 如果設置為1,連接上ProxySQL的會話后,如果在一個hostgroup上開啟了事務,那么后續(xù)的sql都繼續(xù)維持在這個hostgroup上,不倫是否會匹配上其它路由規(guī)則,直到事務結束。
雖然默認是0,但我建議還是設成1,雖然一般來說由于前段應用的空值,為0出問題的情況幾乎很小。作者也在考慮默認設成 1,refer this issue #793
-? frontend, backend: 目前版本這兩個都需要使用默認的1,將來有可能會把 Client -> ProxySQL (frontend) 與 ProxySQL -> BackendDB (backend)的認證分開。從 runtime_mysql_users 表內容看到,記錄數(shù)比 mysql_users 多了一倍,就是把前端認證與后端認證獨立出來的結果。
-??fast_forward: 忽略查詢重寫/緩存層,直接把這個用戶的請求透傳到后端DB。相當于只用它的連接池功能,一般不用,路由規(guī)則 .* 就行了。

表 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 模塊會監(jiān)控 HG 后端所有servers 的?read_only?變量,如果發(fā)現(xiàn)從庫的 read_only 變?yōu)?、主庫變?yōu)?,則認為角色互換了,自動改寫 mysql_servers 表里面 hostgroup 關系,達到自動 Failover 效果。

表 mysql_query_rules
mysql_query_rules 是ProxySQL非常核心一個表,定義查詢路由規(guī)則

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: 表主鍵,自增。規(guī)則處理是以 rule_id 的順序進行。
-??active: 只有 active=1 的規(guī)則才會參與匹配。
-? username: 如果非 NULL,只有連接用戶是 username 的值才會匹配。
-??schemaname: 如果非 NULL,只有查詢連接使用的db是 schemaname 的值才會匹配。
? ?注意如果是 NULL,不代表連接沒有使用schema,而是不倫任何schema都進一步匹配。
-??flagIN, flagOUT, apply: 用來定義路由鏈 chains of rules。
? ?-??首先會檢查 flagIN=0 的規(guī)則,以rule_id的順序;如果都沒匹配上,則走這個用戶的 default_hostgroup。
? ?-??當匹配一條規(guī)則后,會檢查 flagOUT。
? ? ??-? 如果不為NULL,并且 flagIN != flagOUT ,則進入以flagIN為上一個flagOUT值的新規(guī)則鏈。
? ? ??-??如果不為NULL,并且 flagIN = flagOUT,則應用這條規(guī)則。
? ? ??-? 如果為NULL,或者 apply=1,則結束,應用這條規(guī)則。
? ? ??-? 如果最終沒有匹配到,則找到這個用戶的 default_hostgroup。
-? client_addr: 匹配客戶端來源IP
-? proxy_addr, proxy_port: 匹配本地proxysql的IP、端口。我目前沒有想到它的應用場景,可能是把proxysql監(jiān)聽在多個接口上,分發(fā)到不同的業(yè)務?
-??digest: 精確的匹配一類查詢。
-??match_digest: 正則匹配一類查詢。query digest 是指對查詢去掉具體值后進行“模糊化”后的查詢,類似 pt-fingerprint / pt-query-digest 的效果。
-? match_pattern: 正則匹配查詢。

以上都是匹配查詢的規(guī)則,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等特殊命令,是不能復用的。
? ?-??完整的查詢去匹配正則的效率,一般沒有參數(shù)化后的查詢匹配效率高,因為有很長的字符串內容需要處理。再者,SELECT * FROM randomtable WHERE comment LIKE ‘%INTO sbtest1 %? ? ? ? ? ? ? ? FROM sbtest2 %’字符串里有類似這樣的語句,很難排除誤匹配。
-??negate_match_pattern: 反向匹配,相當于對 match_digest/match_pattern 的匹配取反。
-? re_modifiers: 修改正則匹配的參數(shù),比如默認的:忽略大小寫CASELESS、禁用GLOBAL.

上面都是匹配規(guī)則,下面是匹配后的行為
-??replace_pattern: 查詢重寫,默認為空,不rewrite。
-? rewrite規(guī)則要遵守 RE2::Replace 。
destination_hostgroup: 路由查詢到這個 hostgroup。當然如果用戶顯式 start transaction 且 transaction_persistent=1,那么即使匹配到了,也依然按照事務里第一條sql的路由規(guī)則去走。
-? cache_ttl: 查詢結果緩存的毫秒數(shù)。
proxysql這個 Query Cache 與 MySQL 自帶的query cache不是同一個。proxysql query cache也不會關心后端數(shù)據(jù)是否被修改,它所做的就是針對某些特定種類的查詢結果進行緩存,比如一些歷史數(shù)據(jù)的count結果。一般不設。
-??timeout: 這一類查詢執(zhí)行的最大時間(毫秒),超時則自動kill。
這是對后端DB的保護機制,相當于阿里云RDS loose_max_statement_time 變量的功能,但是注意不同的是,阿里云這個變量的時間時不包括DML操作出現(xiàn)InnoDB行鎖等待的時間,而ProxySQL的這個 timeout 是計算從發(fā)送sql到等待響應的時間。默認mysql-default_query_timeout給的是 10h .
-??retries: 語句在執(zhí)行時失敗時,重試次數(shù)。默認由 mysql-query_retries_on_failure變量指定,為1 。
? ?個人建議把它設成0,即不重試。因為執(zhí)行失敗,對select而言很少見,主要是dml,但自己重試對數(shù)據(jù)不放心。
-? delay: 查詢延遲執(zhí)行,這是ProxySQL提供的限流機制,會讓其它的查詢優(yōu)先執(zhí)行。
? ?默認值 mysql-default_query_delay,為0。我們一般不用,其實還是要配合應用端使用,比如這邊延遲執(zhí)行,但上層等待你返回,那前端不就堵住了,沒準出現(xiàn)雪崩效應。
-??mirror_flagOUT,mirror_hostgroup
這兩個高級了,目前這部分文檔不全,功能是SQL鏡像。顧名思義,就是把匹配到的SQL除了發(fā)送到 destination_hostgroup,同時鏡像一份到這里的hostgroup,比如我們的測試庫。比如這種場景,數(shù)據(jù)庫要從5.6升級到5.7,要驗證現(xiàn)有查詢語句對5.7的適用情況,就可以把生產流量鏡像到5.7新庫上驗證。
-? error_msg: 默認為NULL,如果指定了則這個查詢直接被 block 掉,馬上返回這個錯誤信息。
這個功能也很實用,比如線上突然冒出一個 “壞查詢”,應用端不方便馬上發(fā)版解決,我們就可以在這配置一個規(guī)則,把查詢屏蔽掉,想正常的mysql報錯那樣拋異常。下一篇文章有演示。
-??multiplex: 連接是否復用。
-??log: 是否記錄查詢日志。可以看到log是否記錄的對象是根據(jù)規(guī)則。
要開啟日志記錄,需要設置變量 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
兩種方式,區(qū)別在于
1)? 一種是在往mysql_servers表中添加server時就為其劃分好hostgroup_id(例如0表示寫組,1表示讀組)
2)? 另一種往mysql_servers表中添加server時不區(qū)分hostgroup_id(例如全部設為0),然后通過mysql_replication_hostgroups表中的值,
根據(jù)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表中執(zhí)行一個插入操作:

MySQL [(none)]> insert into mysql_users(username,password,active,default_hostgroup,transaction_persistent) values('myadmin','mypass',1,0,1);

??

這樣就完成了一個用戶的添加。要讓這個insert生效,還需要執(zhí)行如下操作:

MySQL [(none)]>load mysql?users?to runtime;

表示將修改后的配置(MEMORY層)用到實際生產環(huán)境(RUNTIME層)

??

如果想保存這個設置永久生效,還需要執(zhí)行如下操作:

MySQL [(none)]>save mysql?users?to disk;

表示將memoery中的配置保存到磁盤中去。

??

除了上面兩個操作,還可以執(zhí)行如下操作:

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表等執(zhí)行類似的操作。

如對mysql_servers表插入完成數(shù)據(jù)后,要執(zhí)行保存和加載操作,可執(zhí)行如下SQL命令:

MySQL [(none)]> load mysql servers to runtime;

MySQL [(none)]> save mysql servers to disk;

??

對mysql_query_rules表插入完成數(shù)據(jù)后,要執(zhí)行保存和加載操作,可執(zhí)行如下SQL命令:

MySQL [(none)]> load mysql query rules to runtime;

MySQL [(none)]> save mysql query rules to disk;

??

對global_variables表插入完成數(shù)據(jù)后,要執(zhí)行保存和加載操作,可執(zhí)行如下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)
接下來通過實戰(zhàn)操作來全面了解一下 ProxySQL 的特性和使用場景。

1. 實驗環(huán)境

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

?

系統(tǒng)都是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) 三個節(jié)點各自設置主機名

[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) 所有節(jié)點關閉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節(jié)點上安裝)

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節(jié)點機上使用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開始不允許首次安裝后使用空密碼進行登錄!為了加強安全性,系統(tǒng)會隨機生成一個密碼以供管理員首次登錄使用,

這個密碼記錄在/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通過上面默認安裝后,執(zhí)行語句可能會報錯:

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節(jié)點上)

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) 主數(shù)據(jù)庫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狀態(tài), 發(fā)現(xiàn)多了一項"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)

?

主庫執(zhí)行從庫復制授權

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)

?

在主數(shù)據(jù)庫機器上創(chuàng)建一個測試庫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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。