proxysql 作为 PXC 集群的代理实现读写分离
参考资料:http://blog.itpub.net/21582653/viewspace-2141126/
对了,有个问题提前请教一下大家,为什么我的Proxysql代理只能在本机登录不能在其他机器上使用IP登录啊?具体如下:
在别的机器上:
mysql -utest -ptest -h 192.168.1.99 -P6033
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): ProxySQL Error: Access denied for user 'test'@'192.168.1.80' (using password: NO).
这种登录方式只能在192.168.1.99的机器上登录,在别的机器上比如192.168.1.80就不能登录。
MGR多主搭建参考另一篇文章,本文直接记录Proxysql的配置,出差回来再继续测试。
以前的Proxysql都要建一个视图sys.gr_member_routing_candidate_status,也有直接叫做addition_xxxxx什么的;
本文未使用。
一、安装
yum -y install http://www.percona.com/downloads/percona-release/redhat/0.1-6/percona-release-0.1-6.noarch.rpm
yum -y install Percona-XtraDB-Cluster-client-57 (此步注意提示与mariadb冲突,注意要yum -y remove mysql)
yum -y install proxysql
service proxysql start (或者: /etc/init.d/proxysql start)
如需删除proxysql:
yum -y remove proxysql;
删除以下路径:
rm -rf /usr/share/proxysql
rm -rf /var/lib/proxysql
二、 MYSQL(MGR多主)添加 proxysql 需要用到的用户
MGR多主:
192.168.1.78:3306
192.168.1.79:3306
192.168.1.80:3306
1、添加监控用户
mysql>
CREATE USER 'monitor'@'192.168.1.%' IDENTIFIED BY 'monitor';
GRANT USAGE ON *.* TO 'monitor'@'192.168.1.%';
2、添加客户端用户
CREATE USER 'test'@'192.168.1.%' IDENTIFIED BY 'test';
GRANT all ON sbtest.* TO 'test'@'192.168.1.%';
3、建测试库:
create database sbtest;
三、proxysql配置
需要配置非mariadb的mysql客户端;
mysql -uadmin -padmin -h 127.0.0.1 -P 6032 (admin用户只能在本地登录)
1、全局变量配置
mysql> \R Admin>
PROMPT set to 'Admin>'
Admin>
-- 配置提供MSYQL代理的线程数
update global_variables set variable_value=32 where variable_name='mysql-threads';
-- 配置返回信息给客户端的MYSQL服务器版本,不论实际MYSQL服务器是什么版本都用这里配置的版本来应答客户端
update global_variables set variable_value='8.0.11' where variable_name='mysql-server_version';
--修改 proxysql 管理用户名和密码(可以不修改)
update global_variables set variable_value='admin:admin' where variable_name='admin-stats_credentials';
--修改 proxysql 监控用户名和密码
update global_variables set variable_value='stats:stats' where variable_name='admin-admin_credentials';
此后使用mysql -ustats -pstats -h 127.0.0.1 -P 6032登录;
2、配置服务器
mysql -u admin -padmin -h 127.0.0.1 -P6032
mysql> \R Admin>
Admin>
INSERT INTO mysql_servers(hostgroup_id,hostname,port,weight) VALUES (1,'192.168.1.78',3306,1000000);
INSERT INTO mysql_servers(hostgroup_id,hostname,port,weight) VALUES (1,'192.168.1.79',3306,1);
INSERT INTO mysql_servers(hostgroup_id,hostname,port,weight) VALUES (2,'192.168.1.78',3306,1);
INSERT INTO mysql_servers(hostgroup_id,hostname,port,weight) VALUES (2,'192.168.1.79',3306,1000000);
INSERT INTO mysql_servers(hostgroup_id,hostname,port,weight) VALUES (2,'192.168.1.80',3306,1000000);
分两个组,1组代表主备,2组代表读负载均衡;在各节点都没有故障的情况下,
1组:192.168.1.78为主,192.168.1.79为备,权重代表在主上写100万次才会去备上写1次;
2组:代表192.168.1.79和192.168.1.80各读100万次才会去192.168.1.78上读一次;
3、配置监控
Admin> UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_username';
Admin> UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_password';
Admin> UPDATE global_variables SET variable_value='2000' WHERE variable_name IN ('mysql-monitor_connect_interval','mysql-monitor_ping_interval','mysql-monitor_read_only_interval');
4、配置用户
INSERT INTO mysql_users(username,password,default_hostgroup,transaction_persistent) VALUES ('test','test',1,1);
transaction_persistent 设置为1,确保同一个事务的SQL路由到同一个MSYQL实例,确保开启事务的SQL路由到主库。
5、配置路由
两条路由规则:
Admin>
INSERT INTO mysql_query_rules (rule_id,active,username,match_digest,destination_hostgroup,apply) VALUES (1,1,'test','^SELECT',2,0);
下一条:(暂时没有执行)
INSERT INTO mysql_query_rules (rule_id,active,username,match_digest,destination_hostgroup,apply) VALUES (1,1,'test','^SELECT. * for update $',2,0);
6、Adding Galera Support
Admin>
INSERT INTO scheduler(id,interval_ms,filename,arg1,arg2,arg3,arg4)
VALUES
(1,'10000','/usr/bin/proxysql_galera_checker','127.0.0.1','6032','0',
'/var/lib/proxysql/proxysql_galera_checker.log');
Admin> LOAD SCHEDULER TO RUNTIME;
Admin>SELECT * FROM runtime_scheduler\G
*************************** 1. row ***************************
id: 1
interval_ms: 10000
filename: /usr/bin/proxysql/proxysql_galera_checker
arg1: 127.0.0.1
arg2: 6032
arg3: 0
arg4: /var/lib/proxysql/proxysql_galera_checker.log
arg5: NULL
1 row in set (0.00 sec)
7、应用配置和把配置保存到磁盘
Admin>
LOAD MYSQL USERS TO RUNTIME;
LOAD MYSQL SERVERS TO RUNTIME;
LOAD MYSQL QUERY RULES TO RUNTIME;
LOAD MYSQL VARIABLES TO RUNTIME;
LOAD ADMIN VARIABLES TO RUNTIME
Admin>
SAVE ADMIN VARIABLES TO DISK ;
SAVE MYSQL VARIABLES TO DISK ;
SAVE MYSQL QUERY RULES TO DISK;
SAVE MYSQL SERVERS TO DISK ;
SAVE MYSQL USERS TO DISK ;
8、使用 sysbentch 测试
192.168.1.99上安装sysbench:
yum -y install sysbench
(1)使用sysbench进行只写测试
/usr/bin/sysbench --time=600 --threads=30 --mysql-user=test --mysql-password=test /usr/share/sysbench/oltp_write_only.lua --mysql-host=192.168.1.99 \
--mysql-port=6033 --db-driver=mysql --tables=30 --table_size=1000 --mysql_storage_engine=innodb --report-interval=10 --db-ps-mode=disable prepare
/usr/bin/sysbench --time=600 --threads=30 --mysql-user=test --mysql-password=test /usr/share/sysbench/oltp_write_only.lua --mysql-host=192.168.1.99 \
--mysql-port=6033 --db-driver=mysql --tables=30 --table_size=1000 --mysql_storage_engine=innodb --report-interval=10 --db-ps-mode=disable run
查看测试结果的方法:
登录:mysql -ustats -pstats -h 127.0.0.1 -P 6032
然后查看下表:
select * from stats.stats_mysql_query_digest;
select hostgroup,digest_text from stats.stats_mysql_query_digest;
可以看到,所有的DELETE INSERT UPDATE CREATE等语句,均在hostgroup=1完成,也就是说都在1组里完成,跟上面设置的一致。
简单的测试写入方法可以直接通过代理连接数据库:
mysql -utest -ptest -h 192.168.1.99 -P 6033
然后进行各种写操作:CREATE INSERT DELETE DROP UPDATE等操作,然后到上述的表里查看hostgroup是否为1;
或者使用stats账户密码执行:(DELETE可以替换成任何其他关键字,也可以加limit关键字来限制行数)
select hostgroup,digest_text from stats.stats_mysql_query_digest where digest_text like "DELETE%" order by hostgroup\G;
(2)OLTP 使用sysbench进行只读测试(检验尚未成功)
首先去数据库里删除并重建sbtest库,因为需要清除里面的表;
然后执行下列:(可自行调整table_size,太多了容易掉节点,还不知道为啥)
/usr/bin/sysbench --time=300 --threads=100 --mysql-user=test --mysql-password=test /usr/share/sysbench/oltp_read_only.lua --mysql-host=127.0.0.1 --mysql-port=6033 --db-driver=mysql --tables=30 --table_size=3000 --mysql_storage_engine=innodb --report-interval=10 --db-ps-mode=disable --skip_trx=on prepare
/usr/bin/sysbench --time=300 --threads=100 --mysql-user=test --mysql-password=test /usr/share/sysbench/oltp_read_only.lua --mysql-host=127.0.0.1 --mysql-port=6033 --db-driver=mysql --tables=30 --table_size=3000 --mysql_storage_engine=innodb --report-interval=10 --db-ps-mode=disable --skip_trx=on run
同样登录代理查看状态:
select hostgroup,digest_text from stats.stats_mysql_query_digest where digest_text like "SELECT%" order by hostgroup\G;
可以看到hostgroup都是2,但是2组里有两个机器,怎么知道他们之间是否有实现负载均衡呢?待定
(3)OLTP 使用sysbench进行读写测试(供参考,未测试)
/usr/bin/sysbench --time=600 --threads=30 --mysql-user=test --mysql-password=test /usr/share/sysbench/oltp_read_only.lua --mysql-host=127.0.0.1 --mysql-port=6033 --db-driver=mysql --tables=30 --skip_trx=on --table_size=3000000 --mysql_storage_engine=innodb --report-interval=10 --db-ps-mode=disable run