实现ProxySQL反向代理Mysql读写分离

简介

ProxySQL相当于小型的数据库,在磁盘上有存放数据库的目录;ProxySQL用法和mysql相似
启动ProxySQL后会有两个监听端口;
6032:ProxySQL的管理端口
6033:ProxySQL对外提供服务的端口
注意:ProxySQL区分主从节点,是通过主从服务器配置文件中的read_only来区分的;哪个服务器配置文件中有read_only,哪台服务器就是从节点,所以从节点必须加read_only选项

ProxySQL下载地址

实现ProxySQL代理最少准备4台机器

https://github.com/sysown/proxysql/releases/tag/v2.0.8

主节点配置:

[root@master ~]# vim /etc/my.cnf
[mysqld]
server-id=17
log-bin
[root@master ~]# systemctl restart mariadb
[root@master ~]# mysql -e 'grant replication slave on *.* to repluser@"192.168.38.%" identified by "centos";'     #授权并且创建用于主从同步的账号
[root@master ~]# mysql -e 'grant replication client on *.* to monitor@"192.168.38.%" identified by "centos";'        #授权并创建用于ProxySQL监控节点服务器上的read_only值的账号
[root@master ~]# mysql -e 'grant all on *.* to sqluser@"192.168.38.%" identified by "centos";'       #创建一个mysql客户端连接ProxySQL代理服务器的账号;客户端连接代理服务器,代理服务器反向代理到后端的mysql数据库;ProxySQL上是没有这个账号的

授权创建的这些账号主从节点都需要设置,主节点和从节点都配置完,这些账号会自动同步到从节点上

从节点配置

[root@slave ~]# vim /etc/my.cnf
[mysqld]
server-id=27
read-only           #从节点必须配置
[root@slave ~]# systemctl restart mariadb
[root@slave ~]# mysql
MariaDB [(none)]> CHANGE MASTER TO
    -> MASTER_HOST='192.168.38.37',
    -> MASTER_USER='repluser',
    -> MASTER_PASSWORD='centos',
    -> MASTER_PORT=3306,
    -> MASTER_LOG_FILE='mariadb-bin.000001',
    -> MASTER_LOG_POS=245;
MariaDB [(none)]> start slave;

ProxySQL服务器配置

[root@proxysql ~]# yum install proxysql-2.0.8-1-centos67.x86_64.rpm -y     #提前下载好ProxySQL包
[root@proxysql ~]# rpm -ql proxysql
/etc/init.d/proxysql
/etc/logrotate.d/proxysql
/etc/proxysql.cnf
/usr/bin/proxysql
/usr/share/proxysql/tools/proxysql_galera_checker.sh
/usr/share/proxysql/tools/proxysql_galera_writer.pl
[root@proxysql ~]# vim /etc/proxysql.cnf    #可以修改对外提供服务的端口号为3306
[root@proxysql ~]# service proxysql start
[root@proxysql ~]# mysql -uadmin -padmin -P6032 -h127.0.0.1       #连接proxysql的管理端口;mysql客户端连接服务器端,在同一台机器默认走的是mysql客户端的socket文件,所以这里指定代表本机的IP
MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port)values(10,'192.168.38.37',3306);    #往mysql_servers表中插入主从节点的信息,默认都放在10组里
MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port)values(10,'192.168.38.47',3306);
MySQL [(none)]> select * from mysql_servers;
+--------------+---------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| hostgroup_id | hostname      | port | gtid_port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |
+--------------+---------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| 10           | 192.168.38.37 | 3306 | 0         | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
| 10           | 192.168.38.47 | 3306 | 0         | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
+--------------+---------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
MySQL [(none)]> load mysql servers to runtime;     #加载到runtime中,生效
MySQL [(none)]> save mysql servers to disk;    #保存到磁盘中
MySQL [(none)]> set mysql-monitor_username='monitor';     #设置监控账号的用户名
MySQL [(none)]> set mysql-monitor_password='centos';    #密码
MySQL [(none)]> load mysql variables to runtime;
MySQL [(none)]> save mysql variables to disk;
MySQL [(none)]> select * from mysql_server_connect_log;       #可以查到监控信息了,没指定连接数据库的监控账号之前查询,会显示error
+---------------+------+------------------+-------------------------+---------------+
| hostname      | port | time_start_us    | connect_success_time_us | connect_error |
+---------------+------+------------------+-------------------------+---------------+
| 192.168.38.37 | 3306 | 1574775423158525 | 873                     | NULL          |
| 192.168.38.47 | 3306 | 1574775423859699 | 701                     | NULL          |
+---------------+------+------------------+-------------------------+---------------+
MySQL [(none)]> select * from sqlite_master where name='mysql_replication_hostgroups'\G    #查询一下mysql_replication_hostgroups这个表的结构
MySQL [(none)]> insert into mysql_replication_hostgroups values(10,20,'read_only',"test");    #把10组添加到写组,把20组添加到读组下,针对read_only进行区分;有read_only的放到20组,没有read_only的放到10组
MySQL [(none)]> load mysql servers to runtime;
MySQL [(none)]> save mysql servers to disk;
MySQL [(none)]> MySQL [(none)]> select * from mysql_servers;     #47这台主机放到了20组下,区分开47这台机器为从节点(负责读),37为主节点(负责写)
+--------------+---------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| hostgroup_id | hostname      | port | gtid_port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |
+--------------+---------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| 10           | 192.168.38.37 | 3306 | 0         | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
| 20           | 192.168.38.47 | 3306 | 0         | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
+--------------+---------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
MySQL [(none)]> select * from mysql_replication_hostgroups;
+------------------+------------------+------------+---------+
| writer_hostgroup | reader_hostgroup | check_type | comment |
+------------------+------------------+------------+---------+
| 10               | 20               | read_only  | test    |
+------------------+------------------+------------+---------+
MySQL [(none)]> insert into mysql_users(username,password,default_hostgroup)values('sqluser','centos',10);     #把mysql客户端连接proxysql,proxysql真正代理到mysql服务器的账号指定用户名密码,默认操作都指定为10组的服务器
MySQL [(none)]> load mysql users to runtime;
MySQL [(none)]> save mysql servers to disk;
MySQL [(none)]> insert into mysql_query_rules (rule_id,active,match_digest,destination_hostgroup,apply)VALUES  (1,1,'^SELECT.*FOR UPDATE$',10,1),(2,1,'^SELECT',20,1);      #往mysql_query_rules表中添加查询规则;select for update操作会申请写锁,所以默认放到10组(写)里面;其余select开头的操作放到20组(读)里面;其余所有默认操作都放到10组里面
MySQL [(none)]> load mysql query rules to runtime;
MySQL [(none)]> save mysql servers to disk;

Mysql客户端操作

[root@centos6 ~]# mysql -usqluser -pcentos -P6033 -h192.168.38.7 -e 'begin;select @@server_id;commit;'     #指定连接proxysql代理服务器的用户名密码、指定proxysql提供服务的端口、IP;不进入mysql界面执行mysql里面的操作;开启事务操作属于写操作,所以显示的是主节点的server-id
+-------------+
| @@server_id |
+-------------+
|          17 |
+-------------+
[root@centos6 ~]# mysql -usqluser -pcentos -P6033 -h192.168.38.7 -e 'select @@server_id;'      #select属于读操作,所以显示的是从节点的server-id
+-------------+
| @@server_id |
+-------------+
|          27 |
+-------------+

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

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

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

  2. MySQL ProxySQL读写分离实践

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

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

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

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

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

  5. Proxysql读写分离配置

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

  6. ProxySQL 读写分离实践

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

  7. ProxySQL读写分离

    我们首先看一下自己的环境: MHA已经搭建: master: slave: slave: MHA manager在172.16.16.34,配置文件如下: [root@localhost bin]# ...

  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. PostgreSQL使用安装

    PostgreSQL使用安装 一. 安装 ubuntu安装: # 安装客户端 sudo apt-get install postgresql-client # 安装服务器 sudo apt-get i ...

  2. redis入门(一)

    目录 redis入门(一) 前言 特性 速度快 简单稳定 丰富的功能 历史 历史版本 安装与启动 安装 数据类型与内部编码 数据结构 内部编码 常用API与使用场景 常用命令 字符串 列表 哈希 集合 ...

  3. 在vue中使用Ueditor

    今天研究的主角是:UEditor UEditor是由百度WEB前端研发部开发的所见即所得的开源富文本编辑器,具有轻量.可定制.用户体验优秀等特点. 版本有很多 我用的是:[1.4.3.3 PHP 版本 ...

  4. SpringBoot整合Mybatisplus3.x之CRUD(一)

    pom.xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId& ...

  5. 《Effective Java》 读书笔记(七)消除过期的对象引用

    大概看了一遍这个小节,其实这种感觉体验最多的应该是C/C++程序,有多杀少个new就得有多个delete. 一直以为Java就不会存在这个问题,看来是我太年轻. 感觉<Effective Jav ...

  6. [考试反思]1026csp-s模拟测试88:发展

    不用你们说,我自己来:我颓闪存我没脸. 昨天的想法, 今天的回答. 生存, 发展. 总分榜应该稍有回升,但是和上面的差距肯定还是很大. 继续. 为昨天的谬误,承担代价. T2和T3都值得张记性. T2 ...

  7. 长寿花:dp

    当然可以打组合数+CRT什么的,但是其实不必那么麻烦. 先讲那个思路,再转化过来吧. 首先可以发现的一个问题:所有颜色之间是没有区别的,所以我们其实并不在意到底是哪几种,我们只需要知道有几种就可以了. ...

  8. 20190820 Tue 集训总结&NOIP模拟 27

    低谷度过了? 但是skyh阿卡了,还是反衬出我的辣鸡. T1知道要sort,却忘了判重,正解不如暴力分高,555. T2成功化出正解柿子,然后化过头了,化出了无法DP的柿子. 果然不够强,大神们一眼就 ...

  9. 详谈Generator

    Generator究竟有什么样的作用呢???? 他是ES6提出的一个解决异步问题方案 先看一段代码, 感受一下generator函数和普通函数的区别 function* test(){ yield 2 ...

  10. 使用Typescript重构axios(六)——实现基础功能:获取响应数据

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...