如果 OBServer 节点的运行日志、事务日志、数据文件都在一块盘上,则被称为单盘部署。单盘部署的风险较大,目前已知问题有如下几项:
事务日志(CLOG)空间利用率超过 80% 会开始回收,超过 95% 节点就会停止写入、掉线。
转储和合并时需要额外的 IO、CPU 资源,和业务读写的 IO 可能会互相影响。
运行日志(LOG)写的太多太快,可能会导致节点掉线,LOG 写满可能会导致节点异常。
影响 liboblog
同步,影响 CLOG 回收和副本迁移速度等。
参数文件 observer.config.bin
因为盘满导致持久化失败。
以上对 TPC-C 和 SYSBENCH 测试影响多一些,对 TPC-H 影响少一些。
应对策略:
CLOG、LOG、SSTable 分多个独立文件系统。无论是多盘部署还是单盘部署,均使用 LVM 划分出多个 LV。
开启 LOG 限流,相关参数为:syslog_io_bandwidth_limit
。
alter system set syslog_io_bandwidth_limit='10M';
LOG 滚动输出,设置最大数目。
alter system set enable_syslog_recycle=true; alter system set max_syslog_file_count=50;
CLOG 参数
clog_disk_usage_limit_percentage
默认为 95,不建议调大。
clog_disk_utilization_threshold
默认为 80,可以下调到 50,但不能太低。
alter system set net_thread_count = 32; -- 网络线程数
alter system set _clog_aggregation_buffer_amount=4;
alter system set _flush_clog_aggregation_buffer_timeout='1ms' ; -- 把大概几毫秒之内的日志都聚合到一个 rpc 中发送,减小网络开销,提高并发读
alter system set trace_log_slow_query_watermark='10s' ; --打印 SQL QUERY 的阈值
alter system set large_query_threshold='1s' ; -- large query 的阈值,超过后进入大查询队列,避免大查询阻塞小查询
alter system set syslog_level='PERF'; -- 控制日志输出级别
alter system set clog_sync_time_warn_threshold='2000ms' ; -- clog 日志同步慢的时候触发 debug 日志的输出。
alter system set syslog_io_bandwidth_limit='10M' ; -- 超过 10M 会日志限流,减小写日志文件带来的 IO 消耗
alter system set enable_sql_audit=false; -- 关闭 sql audit
alter system set enable_perf_event=false; -- 关闭监控项
alter system set clog_max_unconfirmed_log_count=5000; -- 增大滑动窗口,解决 clog 滑动窗口满导致的性能问题
alter system set minor_warm_up_duration_time=0 ; -- 转储 SSTable 预热时间,转储完成后到预热时间内,所有对应 partition 的流量会逐步从 MemTable 过渡到 SSTable,设置 0 转储之后流量马上切到 SSTable,使得 MemTable 快速释放 ,内存释放更快。
alter system set memory_chunk_cache_size = '0'; -- 降低 OceanBase 内部 2MB 内存块被 OS 回收的概率,增大 2MB 内存块在 OceanBase 内部的复用率,减少 RPC 由于内存操作慢而导致超时的风险。
alter system set minor_merge_concurrency = 32; -- 增大转储的线程数,期望提高转储的速度。
alter system set _mini_merge_concurrency = 8; -- 增大 mini_merge 的线程数,期望提高 mini_merge 的速度
alter system set freeze_trigger_percentage = 40; -- 触发转储的时机
alter system set autoinc_cache_refresh_interval='86400s'; -- 调大自增列刷新的频率,减少性能损耗。
alter system set cpu_quota_concurrency=2; -- 这个数*租户cpu=工作线程数,具体调整的数值需要根据业务模型和机器配置调整,工作线程超过实际 CPU 核数也没有意义同时会增加 CPU 调度和上下文切换的开销
alter system set builtin_db_data_verify_cycle = 0 ; -- 宏块巡检周期参数,当设置为 0 时关闭巡检
alter system set micro_block_merge_verify_level = 0; -- 微块校验等级设置,0:不做任何校验;1:对 encoding 做 decode 校验;2:对 encoding 做 decode 校验,对压缩做解压校验
alter system set _ob_get_gts_ahead_interval = '0ms';
alter system set bf_cache_priority = 10; -- 为频繁空查的宏块建立 bloomfilter 并缓存,减少磁盘 IO 和 CPU 消耗,提升写入性能
alter system set user_block_cache_priority=5;
alter system set merge_stat_sampling_ratio = 1 ; -- 合并时统计信息采样率,当设置为 0 时则关闭统计信息采集
alter system set _enable_static_typing_engine=true;
alter system set enable_early_lock_release=false tenant=all; -- 提前解行锁场景下,用于租户级别控制,是否打开该优化
alter proxyconfig set enable_ob_protocol_v2=false ;
alter proxyconfig set enable_qos=false ;
alter proxyconfig set enable_compression_protocol=false ;
alter proxyconfig set automatic_match_work_thread = false; -- 关闭自动计算线程个数
alter proxyconfig set work_thread_num = 32; -- 手动设置工作线程个数,需要 restart
alter proxyconfig set syslog_level='ERROR';
alter proxyconfig set monitor_log_level = 'ERROR';
alter proxyconfig set enable_monitor_stat = false ;
alter proxyconfig set xflush_log_level="ERROR";
conn=jdbc:mysql://x.x.x.x(ip):xx(port)/xxxx(dbname)?rewriteBatchedStatements=true&allowMultiQueries=true&useLocalSessionState=true&useUnicode=true&characterEncoding=utf-8&socketTimeout=3000000
rewriteBatchedStatements:此参数影响导数据效率,不可以忽略。
useLocalSessionState:是否使用 autocommit
、read_only
和 transaction isolation
的内部值(jdbc 端的本地值),建议设置为 true
。如果设置为 false
,则需要发语句到远端请求,增加发送请求频次将会影响性能。
转储是租户级别的操作,当一台服务器的一个租户中 MemTable 的内存占用超过租户内存上限的一定比例时,就会触发小版本冻结(Minor Freeze)。
所谓冻结,就是禁止当前活跃 MemTable 的写入,并同时创建新的空 MemTable 以支持新的写入。被冻结后的 MemTable 就成为一个静态的数据结构,可以被后台线程读取并转储为 SSTable。
合并是全局级别的操作,合并会把当前大版本的 SSTable 和 MemTable 与前一个大版本的全量静态数据进行合并,产生新的全量数据。
合并操作包含转储操作。
转储和合并是把内存数据刷到磁盘上,存储层统计信息可以更准确,生成的执行计划也就更稳定准确。MemTable 扫描性能很差,合并后 RANGE 查询性能会有提升。
租户的 PRIMARY_ZONE 用来控制租户里主副本的分布。如果设置为 RANDOM,就可以将不同分区的主副本分散在不同 Zone 的节点上,机器利用率将达到最大化。反过来,设置为某个具体的 Zone,则只能利用部分节点。
分区表使用水平拆分策略将一个大表切割为多个独立的分区。
独立的分区并不是分表,依然是分区表的一部分。
分区表有以下作用:
将海量数据分散到不同分区存储,不同分区可以分散在不同节点存储,从而化解单机空间瓶颈。
将海量请求分散到不同分区,不同分区主副本可以分散在不同节点,从而化解单机处理能力瓶颈。
分区表的索引分为全局索引和本地索引:
全局索引对某些不带分区键的查询比较友好,但是对写不友好,可能导致分布式事务。此外,当 RANGE 查询要返回很多数据时,全局索引也会有很多分布式查询,性能并不一定比本地索引好。
使用本地索引读写数据,可以规避分布式事务,可以多分区多节点并行读。
表分组是将一组业务联系紧密的表的分区分布调度在一起。
table_group
:Table Group 是一个逻辑概念,它和物理数据文件没有关联关系,Table Group 只影响表分区的调度方法,OceanBase 数据库会优先把属于同一个 Table Group 的相同分区号的分区调度到同一台节点上,以减少跨节点分布式事务。
partition_group
:Table Group 的每个分区表中下标相同的一组分区为 Partition Group,作用是将分区号相同的 partition 放到 1 个 Partition Group 的物理结构里面达到提升性能的目的。
同一个表分组里面的分区表的分区策略必须一致。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。