proxysql读写分离配置
Posted 玄奘骑过的马
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了proxysql读写分离配置相关的知识,希望对你有一定的参考价值。
之前接触过proxysql,但是只是简单的搭建,好像并没有怎样深入的去研究过,有种始于皮毛,止于皮毛的感觉。云里雾里,不求甚解。如果是修仙,想必是极好的。
今天记录一下安装过程中遇到的问题。这里的mysql的主从就不再赘述了,以前的文章里面有详(da)细(gai)的教程,不会的可以去看看。就从proxysql的安装开始。首先,我这里的环境是centos7的操作系统。
安装开始,问题就在不断的出现。
yum install proxysql-1.3.8-1-centos7.x86_64.rpm -y
然后很愉快的安装上了,并且很是开心。毕竟是yum安装,没有什么问题。但是当你执行systemctl start proxysql 的时候,发现没办法启动,你systemctl status proxysql 的时候,你发现你的34行报错了。所以这里的解决办法是:请注掉你的34、35行。
像这样:
注掉这两个家伙就可以愉快的玩耍了。是的,很愉快的开启了。
然后 mysql -u admin -padmin -h 127.0.0.1 -P6032 的时候,他会提示你没有mysql,是的,因为proxysql启动的时候需要调用mysql的客户端启动,这也是经过惨痛教训才走过去的。好像忘记说了我的数据库读写分离结构了。是这样的
其中proxysql 在192.168.0.184上,
mysql主 在192.168.0.181上,
mysql从分别是192.168.0.187和192.168.0.188两台上。
言接上文,提示没有mysql那种,我最终解决办法就是yum install mysql 。当然centos7上安装的是mariadb,但是操作是一样的。
进入之后好像一切就没有那么复杂了。
开始进行配置。
貌似很开心的样子。然后我们首先看看我们的proxysql里面有什么。
就是这些内容。不要太在意,他们我也不知道是干嘛的。。。。
main
是默认的”数据库”名,表里存放后端db实例、用户验证、路由规则等信息。表名以runtime_
开头的表示proxysql当前运行的配置内容,不能通过dml语句修改,只能修改对应的不以 runtime_ 开头的(在内存)里的表,然后LOAD
使其生效,SAVE
使其存到硬盘以供下次重启加载。disk
是持久化到硬盘的配置,sqlite数据文件。stats
是proxysql运行抓取的统计信息,包括到后端各命令的执行次数、流量、processlist、查询种类汇总/执行时间,等等。monitor
库存储 monitor 模块收集的信息,主要是对后端db的健康/延迟检查。
接着看看有那些表吧!!!
show tables ;
你会发现几乎所有的sql语句都可以在这里运行。其实proxysql最终选择适配sql语句的目的就是给你一种执行数据库的错觉,让你一种亲切感。
重点关注这三个就可以。其他的啥时候用到啥时候再看就可以。
这里稍微解释一下:
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设置的 max_connections
如果后端实例 hostname:port 在多个 hostgroup 里,以较大者为准,而不是各自独立允许的最大连接数。max_replication_lag
: 允许的最大延迟,主库不受这个影响,默认0。如果 > 0, monitor 模块监控主从延迟大于阀值时,会临时把它变为 SHUNNED 。max_latency_ms
: mysql_ping 响应时间,大于这个阀值会把它从连接池剔除(即使是ONLINE)comment
: 备注,不建议留空。这有什么好讲呢,但是你可以通过它的内容如json格式的数据,配合自己写的check脚本,完成一些自动化的工作。
compression
和 use_ssl
顾名思义。
目前都是在proxysql 端执行的:
这是已经添加完成了主机的图片,开始的时候你是什么都没有的,这俩可以看看是不是缺少什么东西,就是怎么添加这些用户。
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (0,'192.168.56.101',24801);
group_id 后面有用的,设置规则的时候要用到,hostname就是你要添加的主机名称 ,port就是你相应主机上的mysql的端口号。是的,mysql的端口号是可以更改的。
添加完成主机就是添加用户了。
先在主库上添加:
CREATE USER 'ProxySQL'@'%' IDENTIFIED BY 'ProxySQLPa55'; GRANT USAGE ON *.* TO 'ProxySQL'@'%'; CREATE USER 'sbuser'@'%' IDENTIFIED BY 'sbpass'; GRANT ALL ON * . * TO 'sbuser'@'%'; FLUSH PRIVILEGES;
select host,user from mysql.user;
查看主库的用户。
回到proxysql端
添加账号:
admin@127.0.0.1 [(none)] 01:59:49>>>INSERT INTO mysql_users(username,password,default_hostgroup) VALUES ('sbuser','sbpass',0); Query OK, 1 row affected (0.00 sec) admin@127.0.0.1 [(none)] 01:59:50>>>UPDATE global_variables SET variable_value='proxysql' WHERE variable_name='mysql-monitor_username'; Query OK, 1 row affected (0.01 sec) admin@127.0.0.1 [(none)] 01:59:50>>>UPDATE global_variables SET variable_value='ProxySQLPa55' WHERE variable_name='mysql-monitor_password'; Query OK, 1 row affected (0.00 sec) admin@127.0.0.1 [(none)] 01:59:51>>>LOAD MYSQL SERVERS TO RUNTIME; Query OK, 0 rows affected (0.00 sec) /*将配置应用于proxysql运行环境*/ admin@127.0.0.1 [(none)] 02:00:45>>>SAVE MYSQL SERVERS TO DISK; Query OK, 0 rows affected (0.05 sec) /*将配置存储到sqlite数据库中*/
SELECT * FROM monitor.mysql_server_connect_log;
如果执行完了显示这样,证明你没有错误。
其实我这里遇到的另外一个问题就是,我安装完成以后显示的是主机访问被拒绝。为什么拒绝人家,是不是哪里设置错误了。后来我仔细想了下,其实是我的firewalld没有关闭,和我的selinux没有关闭。这两个可是大坑啊。
这里的红色是因为怕看不见。
SELECT * FROM monitor.mysql_server_ping_log;
执行完成以后会和上面差不多,就不截图了。
突然想起一件事情来,就是proxysql的存储机制是什么。其实是开始的那个配置文件,到后期就没有用了,也不能说没有用,而是下次重启的时候还是需要它才能启动,所有的这些配置都会存储到proxysql.db文件中。用于以后保存配置。
保护好这个文件,你就可以权倾天下了。
mysql -u sbuser -psbpass -h 127.0.0.1 -P6033 -e "select @@port"
看一下是不是可以连接上,我这里开始的时候一直跟我说访问被拒绝了,是不是很气人,有没有很讨厌,我当时都觉得世界好像不喜欢我一样,事实证明,世界好像真的不喜欢我,
下面这个sql在proxysql是专门清空stats_mysql_query_digest表的。
SELECT 1 FROM stats_mysql_query_digest_reset LIMIT 1;
差不多了,开始配置路由规则了
admin@127.0.0.1 [(none)] 02:41:58>>>INSERT INTO mysql_query_rules(active,match_pattern,destination_hostgroup,apply) VALUES(1,'^SELECT.*FOR UPDATE$',0,1); Query OK, 1 row affected (0.00 sec) admin@127.0.0.1 [(none)] 02:41:59>>>INSERT INTO mysql_query_rules(active,match_pattern,destination_hostgroup,apply) VALUES(1,'^SELECT',1,1); Query OK, 1 row affected (0.00 sec) admin@127.0.0.1 [(none)] 02:41:59>>>LOAD MYSQL QUERY RULES TO RUNTIME; Query OK, 0 rows affected (0.00 sec) admin@127.0.0.1 [(none)] 02:42:20>>>SAVE MYSQL QUERY RULES TO DISK; Query OK, 0 rows affected (0.04 sec)
这里就用到了上文设置group_id的作用了。这里的第三位置上的0和1就是这个作用。
其实你发现,他的读写分离就是一个正则匹配,你想些什么样的读写分离就用正则匹配去就好了,随便你怎么改,用不了不算我的。
这里这句话可以让你看到现在访问时谁
select hostgroup hg,sum_time, count_star, digest_text FROM stats_mysql_query_digest ORDER BY SUM_TIME desc;
大概表情就是这样的。
很想记录下错误来,但是。。。
无法重现了。。。。
长按二维码
关注更多精彩
以上是关于proxysql读写分离配置的主要内容,如果未能解决你的问题,请参考以下文章
Mysql读写分离—5.7 gtid 主从 + ProxySql 配置及简单测试
Mysql读写分离—5.7 gtid 主从 + ProxySql 配置及简单测试