OceanBase 读写分离探讨

ops/2025/2/1 11:00:12/

版本信息

OceanBase: 4.2.1.10

OBProxy: 4.3.3.0

租户类型: MySQL租户

弱一致性读

官方声明 默认情况下,所有的请求都是发送到数据的 Leader 副本上,即强一致性的请求,因为 OLAP 的分析计算,一般对于数据的一致性要求不高,因此可以在开启弱一致性查询之后,实现请求访问到 Follower 副本。

SQL级别设置

SQL级别设置,即在请求的SQL中,加上弱一致性读的Hint,方法如下:

mysql> select /*+READ_CONSISTENCY(WEAK)*/ * from bmsql_config limit 1;
+------------+-----------+
| cfg_name   | cfg_value |
+------------+-----------+
| warehouses | 50        |
+------------+-----------+
1 row in set (0.02 sec)mysql>

会话级别设置

分Global级别和Session级别,修改变量 ob_read_consistency,该参数用于设置读一致性级别

设置 ob_read_consistency

mysql> set global ob_read_consistency='weak';
Query OK, 0 rows affected (0.19 sec)mysql>
mysql>
mysql> show variables like 'ob_read_consistency';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| ob_read_consistency | WEAK  |
+---------------------+-------+
1 row in set (0.01 sec)mysql>

OBProxy配置项设置

可以指定连接某个OBProxy的所有请求都为弱一致性读,修改 obproxy_read_consistency 配置

该配置项取值为 0 和 1,默认为 0,表示强读(需要读到最新的数据)。1 表示弱读

使用sys租户 登录 OBProxy(指定2883端口) 执行以下语句

[root@server061 ~]# mysql -h10.0.0.61 -P2883 -uroot@sys#obdemo61 -paaAA11__
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 854
Server version: 5.6.25 OceanBase 4.2.1.10 (r110020012024120420-760d3c19482ba306e5a10e214a8ec64422bbf1f0) (Built Dec  4 2024 20:33:18)Copyright (c) 2000, 2024, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> alter proxyconfig set obproxy_read_consistency = 1;
Query OK, 0 rows affected (0.02 sec)mysql>
mysql> show proxyconfig like 'obproxy_read_consistency';
+--------------------------+-------+--------------------------------------------------+-------------+---------------+-------+--------------+
| name                     | value | info                                             | need_reboot | visible_level | range | config_level |
+--------------------------+-------+--------------------------------------------------+-------------+---------------+-------+--------------+
| obproxy_read_consistency | 1     | request target: 0 means leader; 1 means follower | false       | SYS           | [0,1] | LEVEL_VIP    |
+--------------------------+-------+--------------------------------------------------+-------------+---------------+-------+--------------+
1 row in set (0.00 sec)mysql>

小结

官方声明如下:

通过Hint的方式,需要修改SQL,如果SQL数量比较多,则修改起来工作量大,并且对业务代码有一定侵入性,会话级别的设置,如果是全局设置,则会导致所有的连接会话都开启弱一致性读,如果只开启Session级别,则每开启一个Session都需要先执行以下命令,通过修改OBProxy配置,在分析请求比较多且复杂的场景,则是最方便的方式,所有连接这个OBProxy的SQL默认开启弱一致性读

开启弱一致性读只是配置读写分离的第一步,在开启弱一致性读时,如果没有设置LDC策略所有的请求还是会按照 OBProxy 路由策略优先发送到primary zone,如果未设置primary zone,即primary zone为random,那么请求会按照随机路由的策略,随机发送到任意副本,因此时有可能发送到 Leader 副本并未实现完全的读写分离

LDC路由

官网声明如下

 LDC 包含了 IDC 机房信息和 Region 城市信息。一个城市,包含一个或多个IDC,每个IDC中可部署一个或多个Zone

OBServer设置

使用sys租户设置OceanBase 集群的LDC配置

[root@server061 ~]# mysql -h10.0.0.61 -P2883 -uroot@sys#obdemo61 -paaAA11__
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7616
Server version: 5.6.25 OceanBase 4.2.1.10 (r110020012024120420-760d3c19482ba306e5a10e214a8ec64422bbf1f0) (Built Dec  4 2024 20:33:18)Copyright (c) 2000, 2024, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> ALTER SYSTEM MODIFY zone "zone1" SET region = "zhejiang";
Query OK, 0 rows affected (0.08 sec)mysql> ALTER SYSTEM MODIFY zone "zone1" SET idc = "hanzghou1"-> ;
Query OK, 0 rows affected (0.00 sec)mysql> SELECT * FROM oceanbase.DBA_OB_ZONES;
+-------+----------------------------+----------------------------+--------+-----------+----------+-----------+
| ZONE  | CREATE_TIME                | MODIFY_TIME                | STATUS | IDC       | REGION   | TYPE      |
+-------+----------------------------+----------------------------+--------+-----------+----------+-----------+
| zone1 | 2024-12-29 14:35:19.466142 | 2025-01-28 23:49:47.159742 | ACTIVE | hanzghou1 | zhejiang | ReadWrite |
+-------+----------------------------+----------------------------+--------+-----------+----------+-----------+
1 row in set (0.01 sec)mysql>

OBProxy设置

使用sys租户登录设置ODP的LDC 配置

mysql> ALTER PROXYCONFIG SET proxy_idc_name= hanzghou1;
Query OK, 0 rows affected (0.00 sec)mysql>
mysql>
mysql> SHOW PROXYINFO IDC;
+-----------------+--------------+----------------+-----------------+--------------+-------------+--------------+
| global_idc_name | cluster_name | match_type     | regions_name    | same_idc     | same_region | other_region |
+-----------------+--------------+----------------+-----------------+--------------+-------------+--------------+
| hanzghou1       | obdemo61     | MATCHED_BY_IDC | [[0]"zhejiang"] | [[0]"zone1"] | []          | []           |
+-----------------+--------------+----------------+-----------------+--------------+-------------+--------------+
1 row in set (0.01 sec)mysql>

小结

此时,业务访问hanghou1的这个OBProxy,默认会将请求路由到zone1的OBServer上,但是这样也只是保证了就近原则,无法保证OLAP类的读请求都访问到 Follower副本

ODP路由设置(proxy_route_policy设置)

在设置了LDC路由策略之后,弱一致性的读请求只会就近访问,为了保证弱一致性的读请求能够优先路由到Follower 副本上,还需要对OBProxy设置 proxy_route_policy 参数

参数值如下:

  • follower_first:弱读请求优先路由到备副本,如果备副本都不可用,弱读请求路由到主副本。
  • follower_only:弱读请求路由到备副本,如果备副本都不可用,断开和客户端的连接。

使用sys租户 登录 OBProxy(指定2883端口) 执行以下语句

[root@server061 ~]# mysql -h10.0.0.61 -P2883 -uroot@sys#obdemo61 -paaAA11__
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 873
Server version: 5.6.25 OceanBase 4.2.1.10 (r110020012024120420-760d3c19482ba306e5a10e214a8ec64422bbf1f0) (Built Dec  4 2024 20:33:18)Copyright (c) 2000, 2024, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> alter proxyconfig set proxy_route_policy="follower_first";
Query OK, 0 rows affected (0.00 sec)mysql> show proxyconfig like "%proxy_route_policy%";
+--------------------+----------------+---------------------------------+-------------+---------------+-------+--------------+
| name               | value          | info                            | need_reboot | visible_level | range | config_level |
+--------------------+----------------+---------------------------------+-------------+---------------+-------+--------------+
| proxy_route_policy | follower_first | proxy route policy for weakread | false       | SYS           |       | LEVEL_VIP    |
+--------------------+----------------+---------------------------------+-------------+---------------+-------+--------------+
1 row in set (0.01 sec)mysql>

总结

通过以上的三类配置,可以实现弱一致性的优先访问 follower 副本的策略在AP类读操作多的业务场景上减轻leader副本的压力


http://www.ppmy.cn/ops/154720.html

相关文章

创建前端项目的方法

目录 一、创建前端项目的方法 1.前提:安装Vue CLI 2.方式一:vue create项目名称 3.方式二:vue ui 二、Vue项目结构 三、修改Vue项目端口号的方法 一、创建前端项目的方法 1.前提:安装Vue CLI npm i vue/cli -g 2.方式一&…

二叉树的最大深度(遍历思想+分解思想)

Problem: 104. 二叉树的最大深度 文章目录 题目描述思路复杂度Code 题目描述 思路 遍历思想(实则二叉树的先序遍历) 1.欲望求出最大的深度,先可以记录一个变量res,同时记录每次当前节点所在的层数depth 2.在递的过程中,每次递一层&#xff0…

蓝桥云课下载(jdk11、eclipse、idea)

目录 下载jdk11下载eclipse下载idea 下载jdk11 下载地址: (自用) https://www.lanqiao.cn/courses/44495/learning/?id3144371&compatibilityfalse 安装步骤: 双击 -> -> 下一步 -> 配置环境变量(略…

【深度之眼cs231n第七期】笔记(三十一)

目录 强化学习什么是强化学习?马尔可夫决策过程(MDP)Q-learning策略梯度SOTA深度强化学习 还剩一点小尾巴,还是把它写完吧。(距离我写下前面那行字又过了好几个月了【咸鱼本鱼】)(汗颜&#xff…

在sortablejs的拖拽排序情况下阻止input拖拽事件

如题 问题 在vue3的elementPlus的table中,通过sortablejs添加了行拖拽功能,但是在行内会有输入框,此时拖拽输入框会触发sortablejs的拖拽功能 解决 基于这个现象,我怀疑是由于拖拽事件未绑定而冒泡到后面的行上从而导致的拖拽…

1 HDFS

1 HDFS 1. HDFS概述2. HDFS架构3. HDFS的特性4. HDFS 的命令行使用5. hdfs的高级使用命令6. HDFS 的 block 块和副本机制6.1 抽象为block块的好处6.2 块缓存6.3 hdfs的文件权限验证6.4 hdfs的副本因子 7. HDFS 文件写入过程(非常重要)7.1 网络拓扑概念7.…

IDEA创建修改gitee仓库

一、创建gitee仓库 创建gitee仓库 点击复制仓库地址 右击项目名 --> Open In --> Terminal 初始化仓库 git init 添加仓库地址 复制之前创建的仓库地址 git remote add origin 仓库地址 二、修改IDEA的gitee仓库 查询当前项目所在仓库 git remote -v 删除原仓库…

Vue.js 响应式引用与响应式数据(`ref` 和 `reactive`)

Vue.js 响应式引用与响应式数据(ref 和 reactive) 今天我们来聊聊 Vue 3 中的两个核心概念:ref 和 reactive。如果你对如何在 Vue 3 中创建响应式数据感到困惑,那么这篇文章将为你解答。 ref 和 reactive 的区别 在 Vue 3 中&a…