我们首先看一下自己的环境:
MHA已经搭建:
  1. master172.16.16.35:
  2. slave172.16.16.35:
  3. slave172.16.16.34:

MHA manager在172.16.16.34,配置文件如下:

  1. [root@localhost bin]# cat /etc/masterha/app1.cnf
  2. [server default]
  3. manager_log=/var/log/mha/app1/manager.log
  4. manager_workdir=/var/log/mha/app1.log
  5. master_binlog_dir=/home/mysql/db3306/log/
  6. master_ip_failover_script=/usr/local/bin/master_ip_failover
  7. master_ip_online_change_script=/usr/local/bin/master_ip_online_change
  8. password=
  9. ping_interval=
  10. remote_workdir=/tmp
  11. repl_password=
  12. repl_user=root
  13. report_script=/usr/local/bin/send_report
  14. shutdown_script=""
  15. ssh_user=root
  16. user=root
  17. [server1]
  18. hostname=172.16.16.35
  19. port=
  20. [server2]
  21. candidate_master=
  22. check_repl_delay=
  23. hostname=172.16.16.34
  24. port=
  25. [server3]
  26. hostname=172.16.16.35
  27. port=
下面我们基于这样一套MHA环境搭建读写分离。
1:安装ProxySQL软件,这个我们部署到172.16.16.34上
  1. [root@localhost bin]# sudo yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
  2. [root@localhost bin]# yum install proxysql
最后有以下提示:
  1. Installed:
  2. proxysql.x86_64 :1.3.-1.1.el6
  3. Complete!
也就是安装完成了。然后查一下具体的文件:
  1. [root@localhost bin]# find / -name proxysql
  2. /var/lib/proxysql
  3. /var/run/proxysql
  4. /etc/rc.d/init.d/proxysql
  5. /usr/bin/proxysql
发现确实已经将ProxySQL安装成功了
2:启动配置ProxySQL
看一下配置文件:
  1. [root@localhost bin]# cat /etc/proxysql-admin.cnf
  2. # proxysql admin interface credentials.
  3. export PROXYSQL_USERNAME="admin"
  4. export PROXYSQL_PASSWORD="admin"
  5. export PROXYSQL_HOSTNAME="localhost"
  6. export PROXYSQL_PORT=""
  7.  
  8. # PXC admin credentials for connecting to pxc-cluster-node.
  9. export CLUSTER_USERNAME="admin"
  10. export CLUSTER_PASSWORD="admin"
  11. export CLUSTER_HOSTNAME="localhost"
  12. export CLUSTER_PORT=""
  13.  
  14. # proxysql monitoring user. proxysql admin script will create this user in pxc to monitor pxc-nodes.
  15. export MONITOR_USERNAME="monitor"
  16. export MONITOR_PASSWORD="monit0r"
  17.  
  18. # Application user to connect to pxc-node through proxysql
  19. export CLUSTER_APP_USERNAME="proxysql_user"
  20. export CLUSTER_APP_PASSWORD="passw0rd"
  21.  
  22. # ProxySQL read/write hostgroup
  23. export WRITE_HOSTGROUP_ID=""
  24. export READ_HOSTGROUP_ID=""
  25.  
  26. # ProxySQL read/write configuration mode.
  27. export MODE="singlewrite"
启动:
  1. [root@localhost bin]# proxysql-admin --config-file=/etc/proxysql-admin.cnf --enable
  2. This script will assist with configuring ProxySQL (currently only Percona XtraDB cluster in combination with ProxySQL is supported)
  3. ProxySQL read/write configuration mode is singlewrite
  4. ProxySQL is not running; please start the proxysql service
现在来说ProxySQL 的路由已经启动,提示我们要启动proxysql service
  1. [root@localhost bin]# service proxy
  2. proxy proxysql proxysql-admin proxysql_galera_checker proxysql_node_monitor
  3. [root@localhost bin]# service proxysql start
  4. Starting ProxySQL: DONE!
  5. [root@localhost bin]# mysql -uadmin -padmin -h127.0.0. -P6032
  6. mysql: [Warning] Using a password on the command line interface can be insecure.
  7. Welcome to the MySQL monitor. Commands end with ; or \g.
  8. Your MySQL connection id is
  9. Server version: 5.7. (ProxySQL Admin Module)
  10. Copyright (c) , , Oracle and/or its affiliates. All rights reserved.
  11. Oracle is a registered trademark of Oracle Corporation and/or its
  12. affiliates. Other names may be trademarks of their respective
  13. owners.
  14. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  15. mysql>
可以看到我们已经登录成功了,这里要说明的是 proxysql的默认配置文件是在:
  1. [root@localhost bin]# find / -name proxysql.cnf
  2. /etc/proxysql.cnf
接下来我们开始配置ProxySQL:
  1. [root@localhost bin]# mysql -uadmin -padmin -h127.0.0. -P6032
  2. mysql: [Warning] Using a password on the command line interface can be insecure.
  3. Welcome to the MySQL monitor. Commands end with ; or \g.
  4. Your MySQL connection id is
  5. Server version: 5.7. (ProxySQL Admin Module)
  6.  
  7. Copyright (c) , , Oracle and/or its affiliates. All rights reserved.
  8.  
  9. Oracle is a registered trademark of Oracle Corporation and/or its
  10. affiliates. Other names may be trademarks of their respective
  11. owners.
  12.  
  13. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  14.  
  15. mysql> show databases;
  16. +-----+---------+-------------------------------+
  17. | seq | name | file |
  18. +-----+---------+-------------------------------+
  19. | | main | |
  20. | | disk | /var/lib/proxysql/proxysql.db |
  21. | | stats | |
  22. | | monitor | |
  23. +-----+---------+-------------------------------+
  24. rows in set (0.00 sec)
  25.  
  26. mysql> use admin
  27. Database changed
  28. mysql> show tables;
  29. +--------------------------------------+
  30. | tables |
  31. +--------------------------------------+
  32. | global_variables |
  33. | mysql_collations |
  34. | mysql_query_rules |
  35. | mysql_replication_hostgroups |
  36. | mysql_servers |
  37. | mysql_users |
  38. | runtime_global_variables |
  39. | runtime_mysql_query_rules |
  40. | runtime_mysql_replication_hostgroups |
  41. | runtime_mysql_servers |
  42. | runtime_mysql_users |
  43. | runtime_scheduler |
  44. | scheduler |
  45. +--------------------------------------+
  46. rows in set (0.00 sec)
下面加入主从信息:
  1. mysql> insert into mysql_servers(hostgroup_id,hostname,port,weight,max_connections,max_replication_lag,comment) values(,'172.16.16.35',,,,,'test');
  2. Query OK, row affected (0.00 sec)
  3. mysql> insert into mysql_servers(hostgroup_id,hostname,port,weight,max_connections,max_replication_lag,comment) values(,'172.16.16.34',,,,,'test');
  4. Query OK, row affected (0.00 sec)
  5. mysql> insert into mysql_servers(hostgroup_id,hostname,port,weight,max_connections,max_replication_lag,comment) values(,'172.16.16.35',,,,,'test');
  6. Query OK, row affected (0.00 sec)
  7. mysql> select * from mysql_servers;
  8. +--------------+--------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
  9. | hostgroup_id | hostname | port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |
  10. +--------------+--------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
  11. | | 172.16.16.35 | | ONLINE | | | | | | | test |
  12. | | 172.16.16.34 | | ONLINE | | | | | | | test |
  13. | | 172.16.16.35 | | ONLINE | | | | | | | test |
  14. +--------------+--------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
  15. rows in set (0.00 sec)
然后添加读写映射(主要是MHA后端切换的时候保证ProxySQL也能够自动切换):
  1. mysql> insert into mysql_replication_hostgroups values(,,'masterha') ;
  2. Query OK, row affected (0.00 sec)
  3. mysql> select * from mysql_replication_hostgroups;
  4. +------------------+------------------+----------+
  5. | writer_hostgroup | reader_hostgroup | comment |
  6. +------------------+------------------+----------+
  7. | | | masterha |
  8. +------------------+------------------+----------+
  9. row in set (0.00 sec)
为ProxySQL添加监控账号:
  1. mysql> GRANT SUPER, REPLICATION CLIENT ON *.* TO 'proxysql'@'172.16.16.%' IDENTIFIED BY 'proxysql';
  2. Query OK, rows affected, warning (0.09 sec)
  3. mysql> flush privileges;
  4. Query OK, rows affected (0.10 sec)
配置监控账号(在proxySQL当中进行配置):
  1. mysql> set mysql-monitor_username='proxysql';
  2. Query OK, row affected (0.00 sec)
  3. mysql> set mysql-monitor_password='proxysql';
  4. Query OK, row affected (0.00 sec)
  5. mysql> load mysql variables to runtime;
  6. Query OK, rows affected (0.00 sec)
  7. mysql> save mysql variables to disk;
  8. Query OK, rows affected (0.02 sec)
PS:有时候runtime_mysql_servers的status不为ONLINE状态的话可以通过查看monitor.mysql_server_ping_log这个表来查看具体的报错信息。
mysql> select * from monitor.mysql_server_ping_log;
然后配置程序账号,简单点统一使用root:123456最高权限来配置:
  1. mysql> insert into mysql_users(username,password,active,default_hostgroup,transaction_persistent) values('root','',,,);
  2. Query OK, row affected (0.00 sec)
  3. mysql> select * from mysql_users;
  4. +----------+----------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+
  5. | username | password | active | use_ssl | default_hostgroup | default_schema | schema_locked | transaction_persistent | fast_forward | backend | frontend | max_connections |
  6. +----------+----------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+
  7. | root | | | | | NULL | | | | | | |
  8. +----------+----------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+
  9. row in set (0.00 sec)
配置完成以后开始重新加载和保存我们的配置:
  1. mysql> load mysql servers to runtime;
  2. Query OK, rows affected (0.01 sec)
  3. mysql> save mysql servers to disk;
  4. Query OK, rows affected (0.08 sec)
  5. mysql> load mysql users to runtime;
  6. Query OK, rows affected (0.00 sec)
  7. mysql> save mysql users to disk;
  8. Query OK, rows affected (0.03 sec)
接下来开始配置路由规则:
  1. mysql> INSERT INTO mysql_query_rules(active,match_pattern,destination_hostgroup,apply) VALUES(,'^SELECT.*FOR UPDATE$',,);
  2. Query OK, row affected (0.01 sec)
  3. mysql> INSERT INTO mysql_query_rules(active,match_pattern,destination_hostgroup,apply) VALUES(,'^SELECT',,);
  4. Query OK, row affected (0.00 sec)
  5. mysql> LOAD MYSQL QUERY RULES TO RUNTIME;
  6. Query OK, rows affected (0.00 sec)
  7. mysql> SAVE MYSQL QUERY RULES TO DISK;
  8. Query OK, rows affected (0.04 sec)
至此配置已经完成了
3:测试读写分离
在172.16.16.35上链接proxySQL端口6033,并且做简单的select操作:
  1. [root@localhost ~]# mysql -uroot -p123456 -h172.16.16. -P6033
  2. mysql: [Warning] Using a password on the command line interface can be insecure.
  3. Welcome to the MySQL monitor. Commands end with ; or \g.
  4. Your MySQL connection id is
  5. Server version: 5.7. (ProxySQL)
  6. Copyright (c) , , Oracle and/or its affiliates. All rights reserved.
  7. Oracle is a registered trademark of Oracle Corporation and/or its
  8. affiliates. Other names may be trademarks of their respective
  9. owners.
  10. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  11. mysql> select * from maxiangqian.test;
  12. +-----+------+
  13. | id | name |
  14. +-----+------+
  15. | | qq |
  16. | | qq |
  17. | | aa |
  18. | | a |
  19. | | a |
  20. +-----+------+
  21. rows in set (0.04 sec)
然后在进行查询看一下:
  1. mysql> select * from stats_mysql_query_digest;

可以看到已经完成了读写分离了。
  1. mysql> select @@server_id;
  2. +-------------+
  3. | @@server_id |
  4. +-------------+
  5. | |
  6. +-------------+
  7. row in set (0.01 sec)
查看一下server ID已经路由到了172.16.16.35:3307这个从库上了。
测一下for update:
  1. mysql> select * from maxiangqian.test for update;
  2. +-----+------+
  3. | id | name |
  4. +-----+------+
  5. | | qq |
  6. | | qq |
  7. | | aa |
  8. | | a |
  9. | | a |
  10. +-----+------+
  11. rows in set (0.00 sec)
再查看
  1. mysql> select * from stats_mysql_query_digest;

已经自动路由到了主库。
至此ProxySQL+MySQL MHA读写分离测试完成。。。未完待续
5:关于ProxySQL的思考以及简单的命令
ProxySQL通过以上方式是可以实现读写分离,但是这种方式真的就没有问题了吗,如果是一些比如查询订单状态的这种要求实时性非常高的SQL的话,似乎被路由到了从库就会出现BUG。我们可以选择在程序端控制这些参数,ProxySQL只作为一个负载均衡来使用,给ProxySQL创建多个账号,一个读写,一个只读。然后程序去实现读写分离。
ProxySQL是分三层来设计运行的,分别为RUNTIME ,MEMORY ,DISK :
RUNTIME 代表的是ProxySQL当前生效的配置,包括 global_variables, mysql_servers, mysql_users, mysql_query_rules。无法直接修改这里的配置,必须要从下一层load进来。
MEMORY 是平时在mysql命令行修改的 main 里头配置,可以认为是SQLite数据库在内存的镜像
DISK / CONFIG FILE 持久存储的那份配置,一般在$(DATADIR)/proxysql.db,在重启的时候会从硬盘里加载。 /etc/proxysql.cnf文件只在第一次初始化的时候用到,完了后,如果要修改监听端口,还是需要在管理命令行里修改,再 save 到硬盘
常用命令:
LOAD MYSQL SERVERS TO RUNTIME -- 让修改的配置生效,也就是从MEMORY 把参数LOAD过来,等价于LOAD MYSQL USERS FROM MEMORY,这个语句的语法比较单间,FROM代表从上层LOAD过来,TO代表从本层到某一个层。比如前面我们设置了MySQL的监控账号,但是还是要执行LOAD和SAVE保存变量并且使变量生效。

ProxySQL读写分离的更多相关文章

  1. MySQL ProxySQL读写分离实践

    目的 在上一篇文章MySQL ProxySQL读写分离使用初探里初步介绍了ProxySQL的使用,本文继续介绍它的一些特点和DBProxy的性能差异.深入一些去了解ProxySQL,通过测试来说明Pr ...

  2. mysqlfailover高可用与proxysql读写分离配置

    proxysql官方推荐两种高可用方案: 1.MHA+proxysql 2.mysqlrpladmin+proxysql MySQLfailover工具包含在mysqlrpladmin工具中,所以两者 ...

  3. MHA+ProxySQL 读写分离高可用

    文档结构如下: 1.ProxySQL说明 ProxySQL是mysql的一款中间件的产品,是灵活的mysql代理层,可以实现读写分离,支持query路由器的功能,支持动态指定sql进行缓存,支持动态加 ...

  4. MySQL ProxySQL读写分离使用初探

    目的 在美团点评DBProxy读写分离使用说明文章中已经说明了使用目的,本文介绍ProxySQL的使用方法以及和DBProxy的性能差异.具体的介绍可以看官网的相关说明,并且这个中间件也是percon ...

  5. ProxySQL 读写分离实践

    前言 ProxySQL是一个高性能的MySQL中间件,拥有强大的规则引擎.具有以下特性: 连接池,而且是 multiplexing 主机和用户的最大连接数限制 自动下线后端DB 延迟超过阀值 ping ...

  6. Proxysql读写分离配置

    ProxySQL是Percona主推的读写分离中间件,下载地址为: https://www.percona.com/downloads/proxysql/ 一.安装 1:下载 wget https:/ ...

  7. ProxySQL读写分离代理

    实现ProxySQL反向代理Mysql读写分离 简介 ProxySQL相当于小型的数据库,在磁盘上有存放数据库的目录:ProxySQL用法和mysql相似 启动ProxySQL后会有两个监听端口: 6 ...

  8. ProxySQL 读写分离方法

    转载自:https://www.jianshu.com/p/597b840bf70c (使用正则表达式实现基本的读/写分离) 在这一部分,我将通过一个示例来演示如何通过正则表达式来实现读/写分离. 首 ...

  9. ProxySQL读写分离测试(续)

      Preface       I've implemented ProxySQL on PXC yesterday but got some errors when configured query ...

随机推荐

  1. C# 文件操作系列一

    在.Net环境中,所有关于文件操作的类都在System.IO命名空间下,注:在修改文件时,安全性显得格外重要,但是本随笔不过多讲述安全性,这里假设我们有足够的权限. 1.管理文件系统 先通过一幅图来了 ...

  2. 第一个hibernate程序HelloWorldHibernate

    HelloWorldHibernate步骤: HelloWorld 1,新建java项目hibernate_0100_HelloWorld 2,学习User-library-hibernate,并加入 ...

  3. java面试题汇总(一)

    1.MySQL之binlog底层原理分析:https://www.jianshu.com/p/e19d9312d1b5 2.redis持久化的几种方式https://www.cnblogs.com/A ...

  4. 《Algorithms算法》笔记:元素排序(4)——凸包问题

    <Algorithms算法>笔记:元素排序(4)——凸包问题 Algorithms算法笔记元素排序4凸包问题 凸包问题 凸包问题的应用 凸包的几何性质 Graham 扫描算法 代码 凸包问 ...

  5. android Application类的详细介绍(转)

    在代码中经常看到application这个类,一直不知道这个是干什么用的,今天刚好有点时间,所以进行了详细的学习. 一.先对它的整体概念解释: 在android源码中对他的描述是; * Base cl ...

  6. 各种数据库maven的pom文件编写与ibernate链接配置

    各种数据库Hibernate链接配置 Derby db driver maven dependency <dependency>         <groupId>org.ap ...

  7. %notfound的理解——oracle存储过程 .

    文档中的解释:It returns TRUE if an INSERT, UPDATE, or DELETE statement affected no rows, or a SELECT INTO ...

  8. 非科班双非本科投的337家Java后台(励志)

    考试结束,班级平均分只拿到了年级第二,班主任于是问道:大家都知道世界第一高峰珠穆朗玛峰,有人知道世界第二高峰是什么吗?正当班主任要继续发话,只听到角落默默想起来一个声音:”乔戈里峰” 前言 文章出自h ...

  9. Charles 抓取 iphone https的设置方式

    1. Charles:  help > SSL Proxying > Install Charles Root Certificate, 2. 将会打开 钥匙串访问 的功能,查找 Char ...

  10. webstorm 连接svn

    先下个Slik-Subversion,安装好,在webstorm中setting中搜索Subversion,把上边安装的地址加上\svn.exe配置在Use command line client,然 ...