ProxySQL是Percona主推的读写分离中间件,下载地址为:mysql
1:下载
wget https://www.percona.com/downloads/proxysql/proxysql-1.4.5/binary/redhat/6/x86_64/proxysql-1.4.5-1.1.el6.x86_64.rpm
2:安装
rpm -ivh proxysql-1.4.5-1.1.el6.x86_64.rpm
3:启动
service proxysql start/stop/status
2、配置git
--登陆Proxysql管理和监控界面(也是使用Mysql协议,端口是6032,不加-h会自动使用本地sock连到3306的mysql端口,因此必需要加上-h参数) mysql -uadmin -padmin -P6032 -h127.0.0.1
maingithub
是默认的数据库名,表里存放后端db实例、用户验证、路由规则等信息。表名以 runtime_开头的表示proxysql当前运行的配置内容,不能经过dml语句修改,只能修改对应的不以 runtime_ 开头的(在内存)里的表,而后 LOAD 使其生效, SAVE 使其存到硬盘以供下次重启加载。sql
disk数据库
是持久化到硬盘的配置,sqlite数据文件。后端
stats服务器
是proxysql运行抓取的统计信息,包括到后端各命令的执行次数、流量、processlist、查询种类汇总/执行时间,等等。app
monitor 负载均衡
存储 monitor 模块收集的信息,主要是对后端db的健康/延迟检查。加密
Proxysql登陆管理和监控界面后,不须要使用use database_name;的命令,直接查询下列表便可。
主要的表信息:
其中最重要的是mysql_servers,mysql_users,mysql_query_rules这3个表,其余表不多修改。这3个最重要的表的内容也能够在/etc/proxysql.conf中修改,但只是第一次初始化时有用,之后的修改和初始化信息都是存储在sqllite文件中的,建议不要对/etc/proxysql.conf作任何修改。
定义全部可用的mysql数据库IP,hostgroup_id能够自定义,只需将读和写的组设为不同的hostgroup_id便可。
本例中是在MHA环境下配置的,5九、60、61为MHA的3个节点,其中59目前为master,200为MHA的VIP(公共IP)。
在配置完mysql_users后,ProxySQL为每一个mysql_servers表中定义的hostname建立一个默认的链接放入链接池中,能够经过查看stats_mysql_connection_pool表获知。
insert into mysql_servers(hostgroup_id,hostname,port,weight,max_connections,max_replication_lag,comment)
values(100,'10.0.1.59',3306,1,1000,10,'test my proxysql');
insert into mysql_servers(hostgroup_id,hostname,port,weight,max_connections,max_replication_lag,comment)
values(100,'10.0.1.60',3306,1,1000,10,'test my proxysql');
insert into mysql_servers(hostgroup_id,hostname,port,weight,max_connections,max_replication_lag,comment)
values(100,'10.0.1.61',3306,1,1000,10,'test my proxysql');
insert into mysql_servers(hostgroup_id,hostname,port,weight,max_connections,max_replication_lag,comment)
values(1000,'10.0.1.200',3306,1,1000,10,'test my proxysql');
这里把MHA的3个节点的IP--59,60,61的hostgroup_id设为100,将MHA的VIP--200的hostgroup_id设置为1000,实现读写分离和读的负载均衡。
定义链接proxysql的数据库帐户和密码,首先须要此帐号在mysql库中存在,这里使用已经存在的帐leo,能够看到这个帐号既能链接mysql也能链接proxysql的6033端口。
default_hostgroup能够设为上边定义的1000,这样全部链接到MHA所在服务器的6033端口的客户端会话都会默认转发到hostgroup 1000上,可是若是设置了任何mysql_query_rules,那么只要有select操做就会按mysql_query_rules的规则转发,因此若是你设置了mysql_query_rules,那么select @@hostname;查到的可能不会是hostgroup为1000的节点,由于这也属于select语句。本例中hostgroup为1000的是MHA的VIP,proxysql自动链接到MHA的VIP上,即始终默认链接到master库,执行任何语句都会根据mysql_query_rules的规则转发。
通常会话都不会只执行select或者只执行DML操做,所以default_hostgroup可设可不设。
insert into mysql_users(username,password,active,default_hostgroup,transaction_persistent) values('leo','leo',1,1000,1); --须要注意的是这里的password是明文密码,可使用以下方式加密一下。 save mysql users to mem; --而后就能够看到mysql_users里的密码变成了密文。
建议再定义一个监控帐号,以下:
mysql> GRANT SUPER,REPLICATION CLIENT ON *.* TO 'proxysql' IDENTIFIED BY 'proxysql';
而后mysql -uadmin -padmin -h127.0.0.1 -P6032进入管理和监控界面:
set mysql-monitor_username='proxysql';
set mysql-monitor_password='proxysql';
--此帐号也能够不配置直接使用默认的admin:admin,区别是默认的admin:admin权限很大,且只能在本地登陆,而本身设置的proxysql帐户只能看到监控信息。
最后再load并在sqlite中保存上述各类修改:
load mysql servers to runtime;
load mysql users to runtime;
load mysql variables to runtime;
save mysql servers to disk;
save mysql users to disk;
save mysql variables to disk;
定义读写分离规则,能够看到是经过正则实现的,下列定义表示除了select for update,其余的select一概转发到hostgroup_id为100的虚拟节点上,也就说读操做负载均衡的分配到5九、60、61三个库上。其余操做使用默认的hostgroup_id为1000的库,也就是MHA的master库。
关于mysql_query_rules各个字段的解释参考:https://github.com/sysown/proxysql/wiki/Main-(runtime)#mysql_query_rules
INSERT INTO mysql_query_rules(active,match_pattern,destination_hostgroup,apply)
VALUES(1,'^SELECT.*FOR UPDATE$',1000,1);
INSERT INTO mysql_query_rules(active,match_pattern,destination_hostgroup,apply)
VALUES(1,'^SELECT',100,1);
--load并在sqlite中保存上述修改。
load mysql query rules to runtime;
save mysql query rules to disk;
select * from stats_mysql_query_digest_reset;