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行。

像这样:

proxysql读写分离配置

注掉这两个家伙就可以愉快的玩耍了。是的,很愉快的开启了。

然后 mysql -u admin -padmin -h 127.0.0.1 -P6032 的时候,他会提示你没有mysql,是的,因为proxysql启动的时候需要调用mysql的客户端启动,这也是经过惨痛教训才走过去的。好像忘记说了我的数据库读写分离结构了。是这样的

proxysql读写分离配置

其中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读写分离配置


貌似很开心的样子。然后我们首先看看我们的proxysql里面有什么。

proxysql读写分离配置

就是这些内容。不要太在意,他们我也不知道是干嘛的。。。。

  • main 是默认的”数据库”名,表里存放后端db实例、用户验证、路由规则等信息。表名以 runtime_开头的表示proxysql当前运行的配置内容,不能通过dml语句修改,只能修改对应的不以 runtime_ 开头的(在内存)里的表,然后 LOAD 使其生效, SAVE 使其存到硬盘以供下次重启加载。

  • disk 是持久化到硬盘的配置,sqlite数据文件。

  • stats 是proxysql运行抓取的统计信息,包括到后端各命令的执行次数、流量、processlist、查询种类汇总/执行时间,等等。

  • monitor 库存储 monitor 模块收集的信息,主要是对后端db的健康/延迟检查。

接着看看有那些表吧!!!

show tables ;

你会发现几乎所有的sql语句都可以在这里运行。其实proxysql最终选择适配sql语句的目的就是给你一种执行数据库的错觉,让你一种亲切感。

proxysql读写分离配置

重点关注这三个就可以。其他的啥时候用到啥时候再看就可以。

proxysql读写分离配置

这里稍微解释一下:

  • 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;

如果执行完了显示这样,证明你没有错误。

proxysql读写分离配置

其实我这里遇到的另外一个问题就是,我安装完成以后显示的是主机访问被拒绝。为什么拒绝人家,是不是哪里设置错误了。后来我仔细想了下,其实是我的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读写分离配置

大概表情就是这样的。

很想记录下错误来,但是。。。

无法重现了。。。。

proxysql读写分离配置

proxysql读写分离配置

长按二维码

关注更多精彩

以上是关于proxysql读写分离配置的主要内容,如果未能解决你的问题,请参考以下文章

Mysql读写分离—5.7 gtid 主从 + ProxySql 配置及简单测试

Mysql读写分离—5.7 gtid 主从 + ProxySql 配置及简单测试

Mysql读写分离—5.7 gtid 主从 + ProxySql 配置及简单测试

MySQL中间件之ProxySQL:初试读写分离

利用 ProxySQL 实现 MySQL 的读写分离

proxysql读写分离配置