mysq通過ProxySQL實現讀寫分離
阿新 • • 發佈:2019-05-10
127.0.0.1 rac 方式 https 特殊 lib 客戶端 端口號 oracl mysq通過ProxySQL實現讀寫分離
常見的讀寫分離應用
Oracle:mysql-proxy
qihoo:Atlas
美團:dbproxy
網易:cetus
amoeba
阿裏巴巴:cobar 基於amoeba研發
Mycat:基於cobar實現
ProxySQL
ProxySQL:MySQL中間件
- 版本:
- 官方版
- percona版:percona公司基於官方版本用C++語言開發,性能更優
- 特點:具有中間件所需的絕大多數功能,包括:
- 多種方式的讀/寫分離
- 定制基於用戶、基於schema、基於語句的規則對SQL語句進行路由
- 緩存查詢結果
- 後端節點監控
官方站點:https://proxysql.com/
ProxySQL安裝:
-
準備:
- 實現讀寫分離前,先實現主從復制
註:slave服務器 配置文件中必須為 read_only=1,ProxySQL通過read_only=1參數,確定哪個是salve服務器
- 實現讀寫分離前,先實現主從復制
-
基於YUM倉庫安裝:
[ [email protected] ~]# cat <<EOF | tee /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 EOF
-
基於RPM下載安裝:https://github.com/sysown/proxysql/releases
-
ProxySQL的組成:
- 服務腳本:/etc/init.d/proxysql
- 配置文件:/etc/proxysql.cnf
- 主程序:/usr/bin/proxysql
- 基於SQLITE的數據庫文件:/var/lib/proxysql/
-
啟動ProxySQL:service proxysql start
- 啟動後會監聽兩個默認端口:
- 6032:ProxySQL的管理端口
- 6033:ProxySQL對外提供服務的端口
- 啟動後會監聽兩個默認端口:
-
使用mysql客戶端連接到ProxySQL的管理端口6032,默認管理員用戶和密碼都是admin
[ [email protected] ~]# mysql -uadmin -padmin -p6032 -hhost
-
ProxySQL實現讀寫分離:
內置了SQLite小型數據庫,裏面存儲了proxysql的設置
- 內置的數據庫說明:
- main:是默認的數據庫名,表裏面存放後端db實例,用戶驗證,路由規則等信息,表名以runtime_開頭表示ProxySQL當前運行的配置內容,不能通過dml語句修改,只能修改對應的不以runtime_開頭的表,然後LOAD使其生效,save使其保存到硬盤一共下次重啟加載
- disk:是持久化到停盤的配置,sqlite數據文件
- stats:是ProxySQL運行抓取到的統計信息,包括到後端各命令的執行次數、流量、processlist、查詢種類匯總/執行時間、等等
- monnitor:庫存儲monitor模塊收集的信息,主要是對後端db的健康/延遲檢查
註:監控模塊的指標存在log表中
- 說明: 1. 在main和monitor數據庫中的表,runtime_開頭的是運行時的配置,不能修改,只能修改非runtime_表 2. 修改後必須執行LOAD … TO RUNTIME才能加載到RUNTIME生效 3. 執行save … to disk 才將配置持久化保存到磁盤,即保存在proxysql.db文件中 4. global_variables 有許多變量可以設置,其中就包括監聽的端口、管理賬號等 參考: https://github.com/sysown/proxysql/wiki/Global-variables
配置- ProxySQL:
- 向ProxySQL中的main庫中指定mysql節點(不需要使用use main也可以):
1. 查看指定的表結構: select * from sqlite_master where name=‘mysql_servers‘\G 2. 添加所有參與主從復制的主機: insert into mysql_servers(hostgroup_id,hostname,port) values(10,‘172.22.45.131‘,3306); insert into mysql_servers(hostgroup_id,hostname,port) values(10,‘172.22.45.132‘,3306); 3. 加載到runtime中使其生效: load mysql servers to runtime; 4. 保存到硬盤中: save mysql servers to disk; 字段說明: hostgroup_id:分組id,用來實現區分讀組和寫組,後續可通過ProxySQL程序自動判斷 hostname:主從服務器的地址 port:主從服務器監聽的端口號
- master和slave節點操作:
- 添加監控後端節點的用戶,ProxySQL通過每個節點的read_only值來自動調整它們是屬於讀組還是寫組
- 主從節點創建用戶:
grant replication client on *.* to [email protected]‘172.22.45.%‘ identified by ‘centos‘; #用來實現proxysql連接主從節點
- 主從節點創建用戶:
- 添加監控後端節點的用戶,ProxySQL通過每個節點的read_only值來自動調整它們是屬於讀組還是寫組
-
ProxySQL上配置監控:
set mysql-monitor_username=‘monitor‘; set mysql-monitor_password=‘centos‘; load mysql variables to runtime; save mysql variables to disk; 查看監控連接是否正常: select * from mysql_server_connect_log; 查看監控心跳信息(對ping指標的監控): select * from mysql_server_ping_log; 查看read_only和replication_lag的監控日誌 select * from mysql_server_read_only_log; select * from mysql_server_replication_lag_log;
- 設置分組信息:
- 需要修改的是main庫中的mysql_replication_hostgroups表,該表有3個字段:writer_hostgroup,reader_hostgroup,comment, 指定寫組的id為10,讀組的id為20
insert inot mysql_replication_hostgroups values(10,20,‘test‘); load mysql servers to runtime; save mysql servers to disk; # Monitor模塊監控後端的read_only值,按照read_only的值將節點自動移動到讀/寫組 查看主從服務器的分組信息: select hostgroup_id,hostname,port,status,weight from mysql_servers; +--------------+---------------+------+--------+--------+ | hostgroup_id | hostname | port | status | weight | +--------------+---------------+------+--------+--------+ | 10 | 172.22.45.131 | 3306 | ONLINE | 1 | | 20 | 172.22.45.132 | 3306 | ONLINE | 1 | +--------------+---------------+------+--------+--------+
- 需要修改的是main庫中的mysql_replication_hostgroups表,該表有3個字段:writer_hostgroup,reader_hostgroup,comment, 指定寫組的id為10,讀組的id為20
- 配置發送SQL語句的用戶:
- 在master節點上創建訪問用戶
grant all on *.* to [email protected]‘host‘ identified by ‘centos‘; #用來讓用戶連接proxy使用
- 在ProxySQL配置,將用戶sqluser添加到mysql_users表中, default_hostgroup默認組設置為寫組10,當讀寫分離的路由規則不符合時,會訪問默認組的數據庫
insert into mysql_users(username,password,default_hostgroup)values(‘sqluser‘,‘magedu‘,10); load mysql servers to runtime; save mysql servers to disk;
- 測試:目前由於沒有設置讀寫分離的路由規則,則所有的讀寫語句都到默認的分組10中實現
mysql -usqluser -pcentos -P6033 -h127.0.0.1 -e ‘select @@server_id‘ +-------------+ | @@server_id | +-------------+ | 131 | +-------------+ mysql -usqluser -pcentos -P6033 -h127.0.0.1 -e ‘create database testdb‘ mysql -usqluser -pcentos testdb -P6033 -h127.0.0.1 -e ‘create table t(id int)‘
- 在master節點上創建訪問用戶
-
配置讀寫分離的路由規則:
與規則有關的表:mysql_query_rules和mysql_query_rules_fast_routing,後者是前者的擴展表,1.4.7之後支持
插入路由規則:將select語句分離到20的讀組,select語句中有一個特殊語句SELECT...FOR UPDATE它會申請寫鎖,應路由到10的寫組:insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply) VALUES(1,1,‘^SELECT.*FOR UPDATE$‘,10,1),(2,1,‘^SELECT‘,20,1);
load mysql query rules to runtime;
save mysql query rules to disk;
#註意:因ProxySQL根據rule_id順序進行規則匹配,select ... for update規則的 rule_id必須要小於普通的select規則的rule_id - 測試讀操作是否路由給20的讀組
mysql -usqluser -pmagedu -P6033 -h127.0.0.1 -e ‘select @@server_id‘ +-------------+ | @@server_id | +-------------+ | 131 | +-------------+
- 測試寫操作,以事務方式進行測試
mysql -usqluser -pcentos -P6033 -h172.22.45.133 -e ‘start transaction;select @@server_id;commit;select @@server_id‘ +-------------+ | @@server_id | +-------------+ | 131 | +-------------+ +-------------+ | @@server_id | +-------------+ | 132 | +-------------+ mysql -usqluser -pcentos -P6033 -h127.0.0.1 -e ‘insert testdb.t values (1)‘ mysql -usqluser -pcentos -P6033 -h127.0.0.1 -e ‘select id from testdb.t‘
- 路由的信息:查詢stats庫中的stats_mysql_query_digest表
SELECT hostgroup hg,sum_time, count_star, digest_text FROM stats_mysql_query_digest ORDER BY sum_time DESC;
mysq通過ProxySQL實現讀寫分離