三个节点的作用有什么不同?为什么测试的时候一台服务器的CPU远高于其他节点

【 使用环境 】测试环境
【 OB or 其他组件 】OB
【 使用版本 】4.3
【问题描述】对OB环境进行压测,41和42在同一台物理机,43在另外一台物理机,每个节点各连了700线程,测试脚本也是一样的,但是43服务器的CPU一会就飙到90%以上,这是什么原因,43部署的软件和其他2台有差异或者其他原因?
【附件及日志】


image

{
“component”: “oceanbase-ce”,
“access_url”: “192.168.3.41:2881”,
“user”: “root”,
“password”: “MOK0W|E^Bk88=pF”,
“connect_url”: “obclient -h192.168.3.41 -P2881 -uroot -p’MOK0W|E^Bk88=pF’ -Doceanbase -A”
},
{
“component”: “obproxy-ce”,
“access_url”: “192.168.3.41:2883”,
“user”: “root@proxysys”,
“password”: “-;##}/NPKz8C/c8yeAv|:#tJrm”,
“connect_url”: “obclient -h192.168.3.41 -P2883 -uroot@proxysys -p’-;##}/NPKz8C/c8yeAv|:#tJrm’ -Doceanbase -A \n”
},
{
“component”: “ocp-express”,
“access_url”: “192.168.3.41:8180”,
“user”: “admin”,
“password”: “BcnFGH1rZH^UWqb]T}XkZvGl3-8N0Q”,
“connect_url”: “http://192.168.3.41:8180
}

2 个赞

看一下zone的优先级是怎没设置的

1 个赞

随机

1 个赞

OB 三节点提供同时读写能力并不是说部署了三节点就一定都有访问。其次,都有访问的时候也并不是说三节点的负载就会严格一样。 决定节点负载的关键是租户在该节点上是否有主副本数据被业务读写,或者说是否有日志流。

PRIMARY_ZONE 已经设置为 RANDOM , 理论上租户在每个节点上都有一个业务日志流,也有对应的表的分区的主副本在该节点上(前提是有多个表或者一个分区表)。 只要节点上有表的主副本数据,测试数据分布均匀的情形下,节点上就会有读写请求。

三节点负载是否均衡一看业务数据主副本在三节点上的分布情况,二看对应的数据访问请求分布情况。二者如果都不均匀,最终节点负载差异也会很多。一跟 OB 的能力有关,二跟业务特点有关。

所以,分析这个问题,需要两个具体的信息:

    1. 业务表的主副本分布位置特点。
SELECT /*+ read_consistency(weak) query_timeout(1000000000) */ t1.tenant_id, t1.database_name,  round(sum(t2.required_size)/1024/1024/1024) required_size_gb, count(*) cnt
FROM oceanbase.CDB_OB_TABLE_LOCATIONS t1 
  JOIN oceanbase.cdb_ob_tablet_replicas t2 ON (t1.tenant_id=t2.tenant_id and t1.tablet_id=t2.tablet_id AND t1.ls_id=t2.ls_id and t1.svr_ip=t2.svr_ip and t1.SVR_PORT=t2.svr_port )
WHERE t1.tenant_id in (1002) and t1.ROLE='LEADER'  
GROUP BY t1.tenant_id, t1.database_name
;
    1. 业务测试逻辑说明。
4 个赞

业务场景:
1.每个线程随机指定一个用户,一个商品
2.查询指定用户的总订量和金额
3.查询指定用户指定商品的总订量和金额
4.再次查询指定用户指定商品的总订量和金额
5.给指定用户指定商品插入所有条码的随机订量
6.更新指定用户指定商品的所有条码的订量
7.随机删除指定用户指定商品的5行订单明细
8.更新指定用户指定商品的所有条码的订量
9.更新指定用户订单的总订量、金额

1 个赞

抱歉,我这个 sql 给的不够具体。麻烦重发一下。

SELECT /*+ read_consistency(weak) query_timeout(1000000000) */ t1.tenant_id, t1.database_name, t1.zone, round(sum(t2.required_size)/1024/1024/1024) required_size_gb, count(*) cnt
FROM oceanbase.CDB_OB_TABLE_LOCATIONS t1 
  JOIN oceanbase.cdb_ob_tablet_replicas t2 ON (t1.tenant_id=t2.tenant_id and t1.tablet_id=t2.tablet_id AND t1.ls_id=t2.ls_id and t1.svr_ip=t2.svr_ip and t1.SVR_PORT=t2.svr_port )
WHERE t1.tenant_id in (1002) and t1.ROLE='LEADER'  
GROUP BY t1.tenant_id, t1.database_name, t1.zone
;
2 个赞

非常感谢你的回复和帮助

1 个赞

从OB 租户主分区分布上看比较均匀。
那剩下的就跟业务逻辑有关了。再深入分析就要讲述表结构了,以及每个场景的 sql。 这里就不方便继续了。

如果表没有分区,不同表承载的访问量是不同的,导致整体主机的访问负载也不同。

从场景描述推测跟电商业务类似,可以将相关订单表按用户 ID 做 HASH 分区。然后使用表分组技术。这样可以将 访问量打得更散,那各个节点负载会接近一些。

关于分布式,很早我有两篇总结,可以参考。文章有点老,大部分还是适用。

4 个赞

换一种方法测一下使用P2883端口,访问41节点提供2000个线程然后再监控一下cpu使用率

2 个赞

感谢分享

1 个赞

改为2883后,CPU正常,响应速度快到飞起,为什么?


1 个赞

我测试的这个场景数据量并不大,暂时不到区别级别,按官方的建议改为2883端口,43服务器的CPU使用率就正常了,系统响应速度大幅提升

1 个赞

好。
之前没留意到你的连接方式。

1 个赞

改为2883后,CPU正常,响应速度快到飞起,为什么用2881的话CPU使用率会那么高?2881和2883的区别是什么? 望回复

2883端口是obproxy,使用2883端口线程会自动进行路由,2881是本地连接端口会导致ob内部多进行一步sql转发操作。OceanBase 社区 可以看一下obproxy相关介绍

1 个赞

感谢分享