转载自:https://www.jianshu.com/p/ca1b78b5d615

可以在mysql_servers表和mysql_replication_hostgroups表(可选)中配置后端的MySQL Servers。
注意:在阅读下面内容之前,请确定你已经理解了ProxySQL中的多层次配置系统,不理解的返回去看手册第二节。
特别是: 修改mysql_servers表和mysql_replication_hostgroups表后,在没有运行LOAD MYSQL SERVERS TO RUNTIME时是不会生效的。
修改mysql_servers表和mysql_replication_hostgroups表后,在没有运行SAVE MYSQL SERVERS TO DISK时,ProxySQL的重启或崩溃都会丢失这些修改。
也就是说,修改mysql_servers和mysql_replication_hostgroups表后,需要运行LOAD MYSQL SERVERS TO RUNTIME才能让这些修改生效,需要运行SAVE MYSQL SERVERS TO DISK才能持久化这些修改。
重要:下面的所有例子中,都需要执行LOAD MYSQL SERVERS TO RUNTIME才生效,都需要执行SAVE MYSQL SERVERS TO DISK才永久保存。 将MySQL Servers从内存数据库拷贝到runtime 例如,要将MySQL Servers从内存数据库拷贝到runtime数据结构:
Admin> LOAD MYSQL SERVERS TO RUNTIME; 等价写法:
LOAD MYSQL SERVERS TO RUN
LOAD MYSQL SERVERS FROM MEM
LOAD MYSQL SERVERS FROM MEMORY
将MySQL Servers从内存数据库持久化到磁盘数据库 例如,要将MySQL Servers从内存数据库持久化到磁盘数据库:
Admin> SAVE MYSQL SERVERS TO DISK; 等价写法:
SAVE MYSQL SERVERS FROM MEM
SAVE MYSQL SERVERS FROM MEMORY
将MySQL Servers从runtime数据结构拷贝到内存数据库 例如,将MySQL Servers从runtime数据结构拷贝到内存数据库:
Admin> SAVE MYSQL SERVERS TO MEMORY; 等价写法:
SAVE MYSQL SERVERS TO MEM
SAVE MYSQL SERVERS FROM RUN
SAVE MYSQL SERVERS FROM RUNTIME
将MySQL Servers从磁盘数据结构拷贝到内存数据库 例如,要将MySQL Servers从磁盘数据结构拷贝到内存数据库:
Admin> LOAD MYSQL SERVERS TO MEMORY; 等价写法:
LOAD MYSQL SERVERS TO MEM
LOAD MYSQL SERVERS FROM DISK
添加一个新的后端MySQL节点 向mysql_servers表中插入一个新行,就表示添加一个新的后端MySQL节点。
需要注意,这个表中有几个字段带有默认值属性。
例如,下面完全使用默认配置来添加一个后端节点:
Admin> SELECT * FROM mysql_servers;
Empty set (0.00 sec) Admin> INSERT INTO mysql_servers (hostname) VALUES ('172.16.0.1');
Query OK, 1 row affected (0.00 sec) Admin> SELECT * FROM mysql_servers\G
*************************** 1. row ***************************
hostgroup_id: 0
hostname: 172.16.0.1
port: 3306
status: ONLINE
weight: 1
compression: 0
max_connections: 1000
max_replication_lag: 0
use_ssl: 0
max_latency_ms: 0
comment:
1 row in set (0.00 sec) (译注:可见,如果不需要将后端节点分组,添加时只需指定一个hostname字段即可。同时也发现,不指定主机组的后端,默认都属于id=0的主机组)
添加新的后端到主机组中 如下面的例子,将新增的主机添加到1号组中:
Admin> SELECT hostgroup_id,hostname FROM mysql_servers;
+--------------+------------+
| hostgroup_id | hostname |
+--------------+------------+
| 0 | 172.16.0.1 |
+--------------+------------+
1 row in set (0.00 sec) Admin> INSERT INTO mysql_servers (hostgroup_id, hostname) VALUES (1, '172.16.0.2'), (1,'172.16.0.3');
Query OK, 2 rows affected (0.00 sec) Admin> SELECT hostgroup_id,hostname FROM mysql_servers;
+--------------+------------+
| hostgroup_id | hostname |
+--------------+------------+
| 0 | 172.16.0.1 |
| 1 | 172.16.0.2 |
| 1 | 172.16.0.3 |
+--------------+------------+
3 rows in set (0.00 sec)
限制某后端节点的连接数量
Admin> SELECT hostgroup_id,hostname,max_connections FROM mysql_servers;
+--------------+------------+-----------------+
| hostgroup_id | hostname | max_connections |
+--------------+------------+-----------------+
| 0 | 172.16.0.1 | 1000 |
| 1 | 172.16.0.2 | 1000 |
| 1 | 172.16.0.3 | 1000 |
+--------------+------------+-----------------+
3 rows in set (0.00 sec) Admin> UPDATE mysql_servers SET max_connections=10 WHERE hostname='172.16.0.2';
Query OK, 1 row affected (0.00 sec) Admin> SELECT hostgroup_id,hostname,max_connections FROM mysql_servers;
+--------------+------------+-----------------+
| hostgroup_id | hostname | max_connections |
+--------------+------------+-----------------+
| 0 | 172.16.0.1 | 1000 |
| 1 | 172.16.0.2 | 10 |
| 1 | 172.16.0.3 | 1000 |
+--------------+------------+-----------------+
3 rows in set (0.00 sec)
通过修改权重来确定流量的优先级 权重属性只在主机组内部才有效。
Admin> SELECT hostgroup_id,hostname,weight FROM mysql_servers;
+--------------+------------+--------+
| hostgroup_id | hostname | weight |
+--------------+------------+--------+
| 0 | 172.16.0.1 | 1 |
| 1 | 172.16.0.2 | 1 |
| 1 | 172.16.0.3 | 1 |
+--------------+------------+--------+
3 rows in set (0.00 sec) Admin> UPDATE mysql_servers SET weight=1000 WHERE hostname NOT IN ('172.16.0.2', '172.16.0.1') AND hostgroup_id=1;
Query OK, 1 row affected (0.00 sec) Admin> SELECT hostgroup_id,hostname,weight FROM mysql_servers;
+--------------+------------+--------+
| hostgroup_id | hostname | weight |
+--------------+------------+--------+
| 0 | 172.16.0.1 | 1 |
| 1 | 172.16.0.2 | 1 |
| 1 | 172.16.0.3 | 1000 |
+--------------+------------+--------+
3 rows in set (0.00 sec)
和某个后端指定使用SSL连接 下面的示例演示了如何配置和后端建立SSL连接。此处没有说明如何配置全局的SSL,全局SSL配置可参见https://github.com/malongshuai/proxysql/wiki/SSL-Support。
Admin> SELECT hostgroup_id,hostname,use_ssl FROM mysql_servers;
+--------------+------------+---------+
| hostgroup_id | hostname | use_ssl |
+--------------+------------+---------+
| 0 | 172.16.0.1 | 1 |
| 1 | 172.16.0.2 | 0 |
| 1 | 172.16.0.3 | 0 |
+--------------+------------+---------+
3 rows in set (0.00 sec)
自动避开拖后腿的slave节点 如果设置了某个节点的max_replication_lag为非0值,则Monitor模块会对该节点是否拖后腿(replication lag)做常规检查。如果该字段设置为0,则Monitor模块不会做replication lag的检查。
Admin> SELECT hostgroup_id,hostname,max_replication_lag FROM mysql_servers;
+--------------+------------+---------------------+
| hostgroup_id | hostname | max_replication_lag |
+--------------+------------+---------------------+
| 0 | 172.16.0.1 | 0 |
| 1 | 172.16.0.2 | 0 |
| 1 | 172.16.0.3 | 0 |
+--------------+------------+---------------------+
3 rows in set (0.00 sec) Admin> UPDATE mysql_servers SET max_replication_lag=30 WHERE hostname='172.16.0.3';
Query OK, 1 row affected (0.00 sec) Admin> SELECT hostgroup_id,hostname,max_replication_lag FROM mysql_servers;
+--------------+------------+---------------------+
| hostgroup_id | hostname | max_replication_lag |
+--------------+------------+---------------------+
| 0 | 172.16.0.1 | 0 |
| 1 | 172.16.0.2 | 0 |
| 1 | 172.16.0.3 | 30 |
+--------------+------------+---------------------+
3 rows in set (0.00 sec) 上面的配置中,如果 172.16.0.3 相比master的数据延迟了30秒,则ProxySQL会暂时自动避开(忽略)该slave节点。
注意,如果将该字段设置为0,那么后端slave节点永远不会被自动避开,即使这个后端节点的复制线程工作不正常(译注:例如,SQL线程未开启,IO线程未开启,未连接上master等),详见:mysql-monitor_slave_lag_when_null。
将一个后端节点添加到不同主机组中 mysql_servers表的主键字段定义方式为PRIMARY KEY (hostgroup_id,hostname,port)。这意味着同一个后端节点可以加入不同主机组中。
至于为什么要让一个节点加入多个组,有多种原因。例如,在一个复制拓扑结构中,有1个master节点,2个slave节点,你希望在slave故障时(例如它们宕机、或者拖后腿而被ProxySQL避开等)可以向master节点发送读请求。
(译注:为了让读尽量路由到slave上,可以将那个跨多组的节点(可能是master)在组中的权重设置的足够小)
一个示例:
Admin> SELECT hostgroup_id,hostname,weight,max_replication_lag FROM mysql_servers;
+--------------+------------+--------+---------------------+
| hostgroup_id | hostname | weight | max_replication_lag |
+--------------+------------+--------+---------------------+
| 0 | 172.16.0.1 | 1 | 0 |
| 1 | 172.16.0.2 | 1 | 0 |
| 1 | 172.16.0.3 | 1000 | 30 |
+--------------+------------+--------+---------------------+
3 rows in set (0.00 sec) Admin> INSERT INTO mysql_servers(hostgroup_id,hostname) VALUES (1,'172.16.0.1');
Query OK, 1 row affected (0.00 sec) Admin> SELECT hostgroup_id,hostname,weight,max_replication_lag FROM mysql_servers;
+--------------+------------+--------+---------------------+
| hostgroup_id | hostname | weight | max_replication_lag |
+--------------+------------+--------+---------------------+
| 0 | 172.16.0.1 | 1 | 0 |
| 1 | 172.16.0.2 | 1 | 0 |
| 1 | 172.16.0.3 | 1000 | 30 |
| 1 | 172.16.0.1 | 1 | 0 |
+--------------+------------+--------+---------------------+
4 rows in set (0.00 sec) Admin> UPDATE mysql_servers SET max_replication_lag=30, weight=1000;
Query OK, 4 rows affected (0.00 sec) Admin> UPDATE mysql_servers SET weight=1 WHERE hostname='172.16.0.1' AND hostgroup_id=1;
Query OK, 1 row affected (0.00 sec) Admin> SELECT hostgroup_id,hostname,weight,max_replication_lag FROM mysql_servers;
+--------------+------------+--------+---------------------+
| hostgroup_id | hostname | weight | max_replication_lag |
+--------------+------------+--------+---------------------+
| 0 | 172.16.0.1 | 1000 | 30 |
| 1 | 172.16.0.2 | 1000 | 30 |
| 1 | 172.16.0.3 | 1000 | 30 |
| 1 | 172.16.0.1 | 1 | 30 |
+--------------+------------+--------+---------------------+
4 rows in set (0.00 sec) 上面的例子中,如果我们让hostgroup_id=1的组负责read请求,那么99.95%的读请求都会均衡到 172.16.0.2 和 172.16.0.3 上,只有0.05%的读操作才会路由到 172.16.0.1 上。如果 172.16.0.2 和 172.16.0.3 都不可用了, 172.16.0.1 将负责所有的read请求。
注意:max_replication_lag只对slave节点有效。如果某后端MySQL未启用复制功能,则Monitor模块不会做任何和复制相关的动作。
压缩传输到后端节点的数据 只需设置mysql_servers.compression字段为一个非0值即可。注意,启用压缩功能(已load到runtime)后,只对从此之后建立的新连接才有效,已建立的连接(包括线程池中的空闲连接)不会对数据进行压缩传输。
Admin> SELECT hostgroup_id,hostname,compression FROM mysql_servers;
+--------------+------------+-------------+
| hostgroup_id | hostname | compression |
+--------------+------------+-------------+
| 0 | 172.16.0.1 | 0 |
| 1 | 172.16.0.2 | 0 |
| 1 | 172.16.0.3 | 0 |
| 1 | 172.16.0.1 | 0 |
+--------------+------------+-------------+
4 rows in set (0.00 sec) Admin> UPDATE mysql_servers SET compression=1 WHERE hostname='172.16.0.2' AND hostgroup_id=1;
Query OK, 1 row affected (0.00 sec) Admin> SELECT hostgroup_id,hostname,compression FROM mysql_servers;
+--------------+------------+-------------+
| hostgroup_id | hostname | compression |
+--------------+------------+-------------+
| 0 | 172.16.0.1 | 0 |
| 1 | 172.16.0.2 | 1 |
| 1 | 172.16.0.3 | 0 |
| 1 | 172.16.0.1 | 0 |
+--------------+------------+-------------+
4 rows in set (0.00 sec)
平滑禁用一个后端节点 要平滑禁用一个后端节点,需要修改该后端节点的status字段值为OFFLINE_SOFT,这表示该节点正在处理的事务会继续执行,但ProxySQL不会向该节点发送新的请求。
Admin> SELECT hostgroup_id,hostname,status FROM mysql_servers;
+--------------+------------+--------+
| hostgroup_id | hostname | status |
+--------------+------------+--------+
| 0 | 172.16.0.1 | ONLINE |
| 1 | 172.16.0.2 | ONLINE |
| 1 | 172.16.0.3 | ONLINE |
| 1 | 172.16.0.1 | ONLINE |
+--------------+------------+--------+
4 rows in set (0.00 sec) Admin> UPDATE mysql_servers SET status='OFFLINE_SOFT' WHERE hostname='172.16.0.2';
Query OK, 1 row affected (0.00 sec) Admin> SELECT hostgroup_id,hostname,status FROM mysql_servers;
+--------------+------------+--------------+
| hostgroup_id | hostname | status |
+--------------+------------+--------------+
| 0 | 172.16.0.1 | ONLINE |
| 1 | 172.16.0.2 | OFFLINE_SOFT |
| 1 | 172.16.0.3 | ONLINE |
| 1 | 172.16.0.1 | ONLINE |
+--------------+------------+--------------+
4 rows in set (0.00 sec)
直接禁用后端节点 将status字段的值设置为OFFLINE_HARD,即表示强制禁用,可认为直接杀掉了该节点。该节点上正在执行的事务会停止,也不会向其发送任何请求。
Admin> SELECT hostgroup_id,hostname,status FROM mysql_servers;
+--------------+------------+--------------+
| hostgroup_id | hostname | status |
+--------------+------------+--------------+
| 0 | 172.16.0.1 | ONLINE |
| 1 | 172.16.0.2 | OFFLINE_SOFT |
| 1 | 172.16.0.3 | ONLINE |
| 1 | 172.16.0.1 | ONLINE |
+--------------+------------+--------------+
4 rows in set (0.00 sec) Admin> UPDATE mysql_servers SET status='OFFLINE_HARD' WHERE hostname='172.16.0.1' AND hostgroup_id=1;
Query OK, 1 row affected (0.00 sec) Admin> SELECT hostgroup_id,hostname,status FROM mysql_servers;
+--------------+------------+--------------+
| hostgroup_id | hostname | status |
+--------------+------------+--------------+
| 0 | 172.16.0.1 | ONLINE |
| 1 | 172.16.0.2 | OFFLINE_SOFT |
| 1 | 172.16.0.3 | ONLINE |
| 1 | 172.16.0.1 | OFFLINE_HARD |
+--------------+------------+--------------+
4 rows in set (0.00 sec)
重新启用被禁用的后端节点 直接将status字段的值改回ONLINE即可:
Admin> SELECT hostgroup_id,hostname,status FROM mysql_servers;
+--------------+------------+--------------+
| hostgroup_id | hostname | status |
+--------------+------------+--------------+
| 0 | 172.16.0.1 | ONLINE |
| 1 | 172.16.0.2 | OFFLINE_SOFT |
| 1 | 172.16.0.3 | ONLINE |
| 1 | 172.16.0.1 | OFFLINE_HARD |
+--------------+------------+--------------+
4 rows in set (0.00 sec) Admin> UPDATE mysql_servers SET status='ONLINE' WHERE status NOT IN ('ONLINE');
Query OK, 2 rows affected (0.00 sec) Admin> SELECT hostgroup_id,hostname,status FROM mysql_servers;
+--------------+------------+--------+
| hostgroup_id | hostname | status |
+--------------+------------+--------+
| 0 | 172.16.0.1 | ONLINE |
| 1 | 172.16.0.2 | ONLINE |
| 1 | 172.16.0.3 | ONLINE |
| 1 | 172.16.0.1 | ONLINE |
+--------------+------------+--------+
4 rows in set (0.00 sec)
移除一个后端节点 删除mysql_servers表中的行可以完全移除对应的后端节点:
Admin> SELECT hostgroup_id,hostname,status FROM mysql_servers;
+--------------+------------+--------+
| hostgroup_id | hostname | status |
+--------------+------------+--------+
| 0 | 172.16.0.1 | ONLINE |
| 1 | 172.16.0.2 | ONLINE |
| 1 | 172.16.0.3 | ONLINE |
| 1 | 172.16.0.1 | ONLINE |
+--------------+------------+--------+
4 rows in set (0.00 sec) Admin> DELETE FROM mysql_servers WHERE hostgroup_id=1 AND hostname IN ('172.16.0.1','172.16.0.2');
Query OK, 2 rows affected (0.00 sec) Admin> SELECT hostgroup_id,hostname,status FROM mysql_servers;
+--------------+------------+--------+
| hostgroup_id | hostname | status |
+--------------+------------+--------+
| 0 | 172.16.0.1 | ONLINE |
| 1 | 172.16.0.3 | ONLINE |
+--------------+------------+--------+
2 rows in set (0.00 sec) 在ProxySQL的内部,删除一个后端节点或将它设置为OFFLINE_HARD的处理方式是一样的。当执行LOAD MYSQL SERVERS TO RUNTIME后,主机组管理器(Hostgroup Manager)将探测到该节点已被移除,并在内部将器标记为OFFLINE_HARD。

ProxySQL 配置MySQL节点的更多相关文章

  1. MySQL中间件之ProxySQL(15):ProxySQL代理MySQL组复制

    返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html 1.ProxySQL+组复制前言 在以前的ProxySQL版本中,要支 ...

  2. ProxySQL 配置详解及读写分离(+GTID)等功能说明 (完整篇)

    ProxySQL是灵活强大的MySQL代理层, 是一个能实实在在用在生产环境的MySQL中间件,可以实现读写分离,支持 Query 路由功能,支持动态指定某个 SQL 进行 cache,支持动态加载配 ...

  3. ProxySQL实现Mysql读写分离 - 部署手册

    ProxySQL是一个高性能的MySQL中间件,拥有强大的规则引擎.ProxySQL是用C++语言开发的,也是percona推的一款中间件,虽然也是一个轻量级产品,但性能很好(据测试,能处理千亿级的数 ...

  4. mysql中间件proxysql实现mysql读写分离

    目录 1. mysql实现读写分离的方式 2. ProxySQL简介 3. ProxySQL安装 4. ProxySQL的Admin管理接口 5. 和admin管理接口相关的变量 5.1 admin- ...

  5. 利用ProxySQL实现MySQL的读写分离

    本文简单介绍ProxySQL的安装及如果实现后端MySQL主从结构的读写分离. 一.ProxySQL安装 Proxy官方地址:https://proxysql.com/ proxysql-2.0.8- ...

  6. 使用ProxySQL实现MySQL Group Replication的故障转移、读写分离(一)

    导读: 在之前,我们搭建了MySQL组复制集群环境,MySQL组复制集群环境解决了MySQL集群内部的自动故障转移,但是,组复制并没有解决外部业务的故障转移.举个例子,在A.B.C 3台机器上搭建了组 ...

  7. 使用ProxySQL实现MySQL Group Replication的故障转移、读写分离(二)

    在上一篇文章<使用ProxySQL实现MySQL Group Replication的故障转移.读写分离(一) > 中,已经完成了MGR+ProxySQL集群的搭建,也测试了ProxySQ ...

  8. ProxySQL 配置ProxySQL

    转载自:https://www.jianshu.com/p/212397a1be67 假定你已经对ProxySQL的架构有所了解.本文对ProxySQL的所有配置都是使用Admin管理接口完成的,该管 ...

  9. ProxySQL监控后端节点

    ProxySQL通过Monitor模块监控后端MySQL Server的read_only值来自动调整节点所属的组.所以,在配置读.写组之前,必须先配置好监控. 首先看下Monitor库中的表: ad ...

随机推荐

  1. C#实现FFT(递归法)

    C#实现FFT(递归法) 1. C#实现复数类 我们在进行信号分析的时候,难免会使用到复数.但是遗憾的是,C#没有自带的复数类,以下提供了一种复数类的构建方法. 复数相比于实数,可以理解为一个二维数, ...

  2. 04 MySQL_数据相关的SQL

    字符编码问题: 如果使用Windows电脑SQL语句中写中文报错的话,通过以下指令解决 set names gbk; 判空NULL问题: 判值用=,判空用is xxx = 非空值; xxx is nu ...

  3. net core 3.1使用identityServer登录时signin-oidc报Correlation failed的解决方法

    此问题全网找了很久,也困扰了我很久,始终没有找到解决方法.今天结合网上其他问题的帖子,自己研究的半天,终于找到了这个解决方法,经亲自测试可行.欢迎大牛指导指正. 有时客户收藏的系统地址是认证端的,然后 ...

  4. ajax01_基础知识

    ajax请求 ajax概述 组成:asynchronous + javascript + xml 特点: 可发送异步请求(这也是与传统请求方式的区别) 用javascript语言编写代码 前后端数据交 ...

  5. DQL分组查询和DQL分页查询

    分组查询: 1.语法:group by 分组字段: 2.注意: 分组之后查询的字符按:分组字段.聚合函数 where 和having 的区别 where再分组前进行限定,如果不满足条件则不参与分组.h ...

  6. 【原创】Python 二手车之家车辆档案数据爬虫

    本文仅供学习交流使用,如侵立删! 二手车之家车辆档案数据爬虫 先上效果图 环境 win10 python3.9 lxml.retrying.requests 需求分析 需求: 主要是需要车辆详情页中车 ...

  7. Reactive UI -- 反应式编程UI框架入门学习(二)

    前文Reactive UI -- 反应式编程UI框架入门学习(一)  介绍了反应式编程的概念和跨平台ReactiveUI框架的简单应用. 本文通过一个简单的小应用更进一步学习ReactiveUI框架的 ...

  8. ASP.NET Core 5.0中的Host.CreateDefaultBuilder执行过程

      通过Rider调试的方式看了下ASP.NET Core 5.0的Web API默认项目,重点关注Host.CreateDefaultBuilder(args)中的执行过程,主要包括主机配置.应用程 ...

  9. Spring 04: IOC控制反转 + DI依赖注入

    Spring中的IOC 一种思想,两种实现方式 IOC (Inversion of Control):控制反转,是一种概念和思想,指由Spring容器完成对象创建和依赖注入 核心业务:(a)对象的创建 ...

  10. GIL互斥锁与线程

    GIL互斥锁与线程 GIL互斥锁验证是否存在 """ 昨天我们买票的程序发现很多个线程可能会取到同一个值进行剪除,证明了数据是并发的,但是我们为了证明在Cpython中证 ...