- 在拓撲結構中,ProxySQL部署在應用程序和MySQL集羣的中間位置。應用程序向ProxySQL發起SQL語句,ProxySQL分析收到的SQL語句,進行匹配、重寫等操作,然後路由給後端MySQL集羣中的某實例。
各大網站自己的讀寫分離中間件
讀寫分離應用:
mysql-proxy:Oracle,https://downloads.mysql.com/archives/proxy/
Atlas:Qihoo,https://github.com/Qihoo360/Atlas/blob/master/README_ZH.md
dbproxy:美團,https://github.com/Meituan-Dianping/DBProxy
Cetus:網易樂得,https://github.com/Lede-Inc/cetus
Amoeba:https://sourceforge.net/projects/amoeba/
Cobar:阿里巴巴,Amoeba的升級版
Mycat:基於Cobar, http://www.mycat.io/
ProxySQL:https://proxysql.com/
這裏使用ProxySQL
- 兩個版本:官方版和percona版,
- percona版是基於官方版基礎上修改,C++語言開發,輕量級但性能優異(支持處理千億級數據)
- 具有中間件所需的絕大多數功能,包括:
多種方式的讀/寫分離
定製基於用戶、基於schema、基於語句的規則對SQL語句進行路由
緩存查詢結果
後端節點監控
官方站點:https://proxysql.com/
官方手冊:https://github.com/sysown/proxysql/wiki架構圖
環境準備
- 實現讀寫分離前,先實現主從複製
- 注意:slave節點需要設置read_only=1
主機 | 系統 | ip |
---|---|---|
ProxySQL | centos7 | 192.168.64.140 |
masterr | centos7 | 192.168.64.142 |
slave | centos7 | 192.168.64.143 |
1.實現142,143主從複製
- 142主
修改配置
vim /etc/my.cnf
[mysqld]
server_id=142
binlog_format=row 建議
查看位置信息
root:~ # mysql -e "show master logs;"
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 30343 |
| mysql-bin.000002 | 1038814 |
| mysql-bin.000003 | 245 |
| mysql-bin.000004 | 400 |
+------------------+-----------+
root:~ # systemctl start mariadb.service
root:~ # mysql -e "grant replication slave on *.* to repluser@'192.168.64.%' identified by 'centos';"
- 143從
修改配置
vim /etc/my.cnf
[mysqld]
server_id=143
read_only #必須加,ProxySQL通過此來判斷誰是讀服務器
配置同步信息
mysql>CHANGE MASTER TO
MASTER_HOST='192.168.64.142',
MASTER_USER='repluser',
MASTER_PASSWORD='centos',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000004',
MASTER_LOG_POS=400;
啓動複製thread
mysql>start slave;
mysql>show slave status\G
- 主從已搭建完畢
MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.64.142
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000006
Read_Master_Log_Pos: 245
Relay_Log_File: localhost-relay-bin.000007
Relay_Log_Pos: 529
Relay_Master_Log_File: mysql-bin.000006
Slave_IO_Running: Yes #線程都已開啓
Slave_SQL_Running: Yes
............
Master_Server_Id: 142
1 row in set (0.00 sec)
2.配置ProxySQL
1.ProxySQL安裝(需yum源)
cat <<EOF | tee /etc/yum.repos.d/proxysql.repo
[proxysql_repo]
name= ProxySQL YUM repository
baseurl=http://repo.proxysql.com/ProxySQL/proxysql1.4.x/centos/\$releasever
gpgcheck=1
gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key
EOF
root:~ # yum clean all
root:~ # yum repolist
proxysql_repo/7 ProxySQL YUM repository 15
root:~ # yum install -y proxysql mariadb
root:~ # rpm -ql proxysql
/etc/init.d/proxysql #啓動腳本
/etc/proxysql.cnf #配置文件
/usr/bin/proxysql #啓動程序
/usr/share/proxysql/tools/proxysql_galera_checker.sh
/usr/share/proxysql/tools/proxysql_galera_writer.pl
2.配置ProxySQL
-
數據庫說明:
main 是默認的”數據庫”名,表裏存放後端db實例、用戶驗證、路由規則等信息。
表名以 runtime開頭的表示proxysql當前運行的配置內容,不能通過dml語句修改,
只能修改對應的不以 runtime 開頭的(在內存)裏的表,然後 LOAD 使其生效,
SAVE 使其存到硬盤以供下次重啓加載
disk 是持久化到硬盤的配置,sqlite數據文件
stats 是proxysql運行抓取的統計信息,包括到後端各命令的執行次數、流量、
processlist、查詢種類彙總/執行時間,等等
monitor 庫存儲 monitor 模塊收集的信息,主要是對後端db的健康/延遲檢查 - 1.添加監控節點
root:~ # mysql -uadmin -padmin -P6032 -h127.0.0.1 #連接至本機ProxySQL的數據庫 MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.64.142',3306); MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.64.143',3306); MySQL [(none)]> select * from mysql_servers;
-
2.添加監控後端節點的用戶。ProxySQL通過每個節點的read_only值來自動調整它們是屬於讀組還是寫組
- 在master142上執行
MySQL> grant replication client on *.* to monitor@'192.168.8.%' identified by 'centos';
- ProxySQL上配置監控
MySQL [(none)]> set mysql-monitor_username='monitor'; MySQL [(none)]> set mysql-monitor_password='centos';
- 加載到RUNTIME,並保存到disk
MySQL [(none)]> load mysql variables to runtime; MySQL [(none)]> save mysql variables to disk;
監控模塊的指標保存在monitor庫的log表中
- 查看監控連接是否正常的 (對connect指標的監控):(如果connect_error的結果爲NULL則表示正常)
MySQL> select * from mysql_server_connect_log;
- 查看監控心跳信息 (對ping指標的監控):
MySQL> select * from mysql_server_ping_log;
- 查看read_only和replication_lag的監控日誌
MySQL> select * from mysql_server_read_only_log;
MySQL> select * from mysql_server_replication_lag_log;
3.設置分組
需要修改的是main庫中的mysql_replication_hostgroups表,該表有3個字段:
writer_hostgroup,reader_hostgroup,comment, 指定寫組的id爲10,讀組的id爲20
MySQL> insert into mysql_replication_hostgroups values(10,20,"test");
將mysql_replication_hostgroups表的修改加載到RUNTIME生效
MySQL> load mysql servers to runtime;
MySQL> save mysql servers to disk;
MySQL [(none)]> select * from mysql_servers;
4.配置發送SQL語句的用戶
在master節點上創建訪問用戶
MySQL> grant all on *.* to sqluser@'192.168.64.%' identified by 'fscx';
在ProxySQL配置,將用戶sqluser添加到mysql_users表中, default_hostgroup默認
組設置爲寫組10,當讀寫分離的路由規則不符合時,會訪問默認組的數據庫
MySQL> insert into mysql_users(username,password,default_hostgroup)values('sqluser','fscx',10);
MySQL> load mysql users to runtime;
MySQL> save mysql users to disk;
使用sqluser用戶測試是否能路由到默認的10寫組實現讀、寫數據
mysql -usqluser -pfscx -P6033 -h127.0.0.1 -e 'select @@server_id'
mysql -usqluser -pfscx -P6033 -h127.0.0.1 -e 'create database testdb'
mysql -usqluser -pfscx testdb -P6033 -h127.0.0.1 -e 'create table t(id int)
5.在proxysql上配置路由規則,實現讀寫分離
與規則有關的表:mysql_query_rules和mysql_query_rules_fast_routing,後者是前者的擴展表,1.4.7之後支持
插入路由規則:將select語句分離到20的讀組,select語句中有一個特殊語句
SELECT...FOR UPDATE它會申請寫鎖,應路由到10的寫組MySQL> 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); MySQL> load mysql query rules to runtime; MySQL> load mysql query rules to runtime;
注意:因ProxySQL根據rule_id順序進行規則匹配,select ... for update規則的
rule_id必須要小於普通的select規則的rule_id
6.客戶端測試
- 測試讀操作是否路由給20的讀組
- 測試寫操作,以事務方式進行測試