各位兄弟们,时隔多日老张又与大家见面啦。每次与大家见面,都会有好消息告诉大家,这次也不例外。前段时间出版了《MySQL王者晋级之路》一书,反响还不错。争取今年再出版一本MongoDB运维实战的书籍,供给那些想要学习NoSQL的同学们作为工作中的参考。
现在正赶上世界杯,老张最喜欢的球队是葡萄牙——最爱C罗,喜欢他那种在比赛中好强不服输的精神。我们做技术也是一样,不要因为一点困难,就放弃了当初的梦想。只有不断努力,提升自己,才能在更好的平台上实现自我价值。
今儿,老张给大家介绍一款MySQL的一款中间件的产品——ProxySQL,它是灵活强大的MySQL代理层。像C罗一样的强大,可以实现读写分离,支持Query路由功能,支持动态指定某个SQL进行cache,支持动态加载配置、故障切换和一些SQL的过滤功能。还有一些同类产品比如DBproxy、MyCAT、OneProxy等。但经过反复对比和测试之后,决定给大家介绍一款性能不谙的MySQL中间件产品ProxySQL。
有关ProxySQL更多的详细信息可访问:
https://github.com/sysown/proxysql/wiki。
接下来通过实战来全面了解一下ProxySQL的特性和使用场景,先介绍一下环境,我们的系统是CentOS6.7,MySQL版本是5.7.14,准备一主两从架构来配合ProxySQL。环境配置:
192.168.56.100 Master(node1) server-id:3306100
192.168.56.101 Slave1(node2) server-id:3306101
192.168.56.102 Slave2(node3) server-id:3306102
192.168.56.103 Proxysql中间件 server-id:3306103
注:两个从库都要开启read_only=on。
实验架构:
管理员登录命令:
/usr/local/mysql/bin/mysql -uadmin -padmin -h 127.0.0.1 -P 6032
库下的主要表:
mysql_servers—后端可以连接MySQL服务器的列表。
mysql_users—配置后端数据库的账号和监控的账号。
mysql_query_rules—指定Query路由到后端不同服务器的规则列表。
注:表名以runtime_开头的表示ProxySQL当前运行的配置内容,不能通过DML语句修改。只能修改对应的不以 runtime开头的表,然后“LOAD”使其生效,“SAVE”使其存到硬盘以供下次重启加载。 disk库—持久化磁盘的配置。
stats库—统计信息的汇总。
monitor库—一些监控的收集信息,包括数据库的健康状态等。
配置ProxySQL监控 首先在master(192.168.56.100)上创建ProxySQL的监控账户和对外访问账户并赋予权限。
命令如下:create user 'monitor'@'192.168.56.%' identified by 'monitor';
grant all privileges on *.* to 'monitor'@'192.168.56.%' with grant option;
create user 'zs'@'192.168.56.%' identified by 'zs';
grant all privileges on *.* to 'zs'@'192.168.56.%' with grant option;
flush privileges;
ProxySQL的多层配置系统
ProxySQL有一套很完整的配置系统,方便DBA对线上的操作。整套配置系统分为三层,最顶层为RUNTIME,中间层为MEMORY和最底层,也就是持久层的DISK和CONFIG FILE。
配置结构:
加载完成之后,三台机器都是ONLINE状态。
接下来继续为ProxySQL配置监控账号,命令如下: set mysql-monitor_username='monitor';
set mysql-monitor_password='monitor';
load mysql variables to runtime;
save mysql variables to disk;
之后验证监控信息:
监控信息都已正常,没有任何报错。
配置ProxySQL主从分组信息 这里会用到一张表mysql_replication_hostgroups:
ProxySQL会根据server的read_only的取值将服务器进行分组。read_only=0的server,master被分到编号为10的写组,read_only=1的server,slave则被分到编号为20的读组。
然后再登录管理端口,通过查询stats_mysql_query_digest这张表来监控查询状态,命令如下:
select from stats_mysql_query_digest;
` 作为苦逼DBA的我们,无论是初学者还是已经从业多年的“老司机”,都不要急于去把每个MySQL集群架构搭建出来。在学习的过程中,一些同学总是存在一个误区,就是觉得我会搭建所有的数据库架构就非常厉害了。其实并不是这样的,架构搭建并不是我们的最终目的,作为DBA要先了解清楚自己公司的现有业务,看看公司的业务场景适合什么样的架构,要做好相应的数据库架构设计。了解好该架构的优缺点,以及在今后应用中可能出现的问题,提前做好能解决问题的预案。知己知彼,注重细节,才能避免没日没夜地加班熬夜处理那些不该发生的问题。
下面总结了五条MySQL架构设计中的经验。
(1)根据公司现有业务设计合理架构。
(2)选择成熟的架构方案。
(3)因地制宜,根据实际设备情况做出选择。
(4)考虑方案的可行性。
(5)越简单越好,越适合公司越好。
老张我就希望写任何东西,都可以给大家一些启示。在工作中,可以帮助到各位就够了!技术需要分享,我们一起努力工作,让家人过得更好!
最后说句题外话,老张近期应邀在51CTO博客上线专栏《练一套正宗的MySQL降龙十八掌》 ,大家感兴趣可以戳链接了解一下。