说明:目前刚开始,下面搜集相关资料和学习思考。
同步地址:
https://wangcy6.github.io/post/plan/oceanbase_day1/
OceanBase Deploy (简称 OBD)是 OceanBase 开源软件的安装部署工具÷÷
bash build.sh debug --init --make
cd /app/data/oceanbase/build_debug
make install
obd mirror create -n oceanbase-ce -V 3.1.0 -t my-oceanbase -f -p /usr/local
Package ok
name: oceanbase-ce
version: 3.1.0
release:3.1.0
arch: x86_64
md5: 33af3cb189d73116e8d629147bc4d530、
说明:步骤1和步骤2 合并一个命令 make DESTDIR=./ install && obd mirror create -n oceanbase-ce -V 3.1.0 -p ./usr/local
配置生效 sysctl -p
open files参数修改
vim /etc/security/limits.conf #添加内容
* soft core unlimited
* hard core unlimited
* soft nofile 655350
* hard nofile 655350
退出会话,重新登录,再次运行即可。
[root@oceanbase ~]#ulimit -a
Q: 如何指定使用特定版本的组件
A: 在部署配置文件中使用 package_hash 或 tag 声明。
如果您给自己编译的 OceanBase-CE 设置了t ag,您可以使用 tag 来指定。如:
oceanbase-ce:
tag: my-oceanbase
启动
hostname oceanbase
obd cluster edit-config obtest
obd cluster redeploy obtest
obd cluster start obtest
Thread 1 (Thread 0x7f292e84a340 (LWP 59)):
#0 0x00007f292d519d98 in nanosleep () from /lib64/libc.so.6
#1 0x00007f292d519c9e in sleep () from /lib64/libc.so.6
#2 0x000000000870f998 in oceanbase::observer::ObServer::wait() ()
#3 0x00000000024c1443 in main ()
ObWorker worker;
ObServer& observer = ObServer::get_instance(); //单例模式 返回observer static对象 --认识:了解
if (OB_FAIL(observer.init(opts, log_cfg))) { //初始化配置过程复杂:---认识: 知道有这个函数,运行出错可查看
LOG_ERROR("observer init fail", K(ret));
} else if (OB_FAIL(observer.start())) { //初始化配置过程复杂:---认识: 知道有这个函数,运行出错可查看
LOG_ERROR("observer start fail", K(ret));
} else if (OB_FAIL(observer.wait())) { //处理客户端连接------认识: 知道有这个函数
LOG_ERROR("observer wait fail", K(ret));
}
class ObServer {
static ObServer& get_instance();
int init(const ObServerOptions& opts, const ObPLogWriterCfg& log_cfg);
// Start OceanBase server, this function is blocked after invoking
// until the server itself stops it.
int start();
int wait();
void set_stop();
}
Thread 2 (Thread 0x7f29277a1700 (LWP 60)):
\#0 0x00007f292dba664a in pthread_cond_timedwait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
\#1 0x0000000008241539 in bool tbutil::Cond::timedWaitImpl<tbutil::Mutex>(tbutil::Mutex const&, tbutil::Time const&) const ()
\#2 0x00000000090377f9 in oceanbase::common::ObTimer::run1() ()
\#3 0x0000000002a5346f in oceanbase::lib::ThreadPool::run0() ()
\#4 0x0000000002a58724 in std::_Function_handler<void (), oceanbase::lib::CoKThreadTemp<oceanbase::lib::CoUserThreadTemp<oceanbase::lib::CoSetSched> >::start()::{lambda()#1}>::_M_invoke(std::_Any_data const&) ()
\#5 0x0000000008ebf005 in oceanbase::lib::CoSetSched::Worker::run() ()
\#6 0x0000000008ebc9de in oceanbase::lib::CoRoutine::__start(boost::context::detail::transfer_t) ()
\#7 0x0000000008eb727f in make_fcontext ()
\#8 0x0000000000000000 in ?? ()
\~~~
\- 文件:lib/signal/ob_signal_worker.h
//我是个线程池 sig_worker_.wait();
class ObSignalWorker : public lib::ThreadPool {
public:
ObSignalWorker();
~ObSignalWorker();
void run1() override;
int start() override;
void stop() override;
void wait() override;//
};
问题:通过观察线程 无法找到sql执行过程 ?
解决办法:通过看日志方式解决,最后聚焦到stmt
tail -f observer.log
parse_sql (ob_parser.cpp:194) [31620][438][YB427F000001-0005C57D39B7B24E]
sql\parser\ob_parser.cpp
int ObParser::parse_sql(const ObString& stmt, ParseResult& parse_result)
int parse_sql(ParseResult* p, const char* buf, size_t len)
sql\parser、sql_parser_mysql_mode.y
/* only preparable statement will set question mark size */
stmt:
select_stmt { $$ = $1; question_mark_issue($$, result); }
| insert_stmt { $$ = $1; question_mark_issue($$, result); }
| create_table_stmt { $$ = $1;
parse_sql (ob_parser.cpp:194)
任务1:Lex-and-Yacc【sql解析基础知识必须掌握】!!!
动手练习:yum -y install flex bison
理论:
任务2:pingcap/parser【很直观,必须掌握】
任务3:MySQL解析——MySQL内核源码解读【后面需要,必须掌握】
https://www.oceanbase.com/docs/oceanbase-database/oceanbase-database/V3.1.2/system-architecture
OceanBase 数据库的存储引擎采用了基于 LSM-Tree 的架构,把基线数据和增量数据分别保存在磁盘(SSTable)和内存(MemTable)中,具备读写分离的特点。对数据的修改都是增量数据,只写内存。所以 DML 是完全的内存操作,性能非常高。读的时候,数据可能会在内存里有更新过的版本,在持久化存储里有基线版本,需要把两个版本进行合并,获得一个最新版本。
image.png
如上图所示,在内存中针对不同的数据访问行为,OceanBase 数据库设计了多种缓存结构。除了常见的数据块缓存之外,也会对行进行缓存,行缓存会极大加速对单行的查询性能。为了避免对不存在行的空查,OceanBase 数据库对行缓存构建了布隆过滤器,并对布隆过滤器进行缓存。OLTP 业务大部分操作为小查询,通过小查询优化,OceanBase 数据库避免了传统数据库解析整个数据块的开销,达到了接近内存数据库的性能。当内存的增量数据达到一定规模的时候,会触发增量数据和基线数据的合并,把增量数据落盘。同时每天晚上的空闲时刻,系统也会启动每日合并。另外,由于基线是只读数据,而且内部采用连续存储的方式,OceanBase 数据库可以根据不同特点的数据采用不同的压缩算法,既能做到高压缩比,又不影响查询性能,大大降低了成本。
OceanBase 数据库的 SQL 引擎是整个数据库的数据计算中枢,和传统数据库类似,整个引擎分为解析器、优化器、执行器三部分。当 SQL 引擎接受到了 SQL 请求后,经过语法解析、语义分析、查询重写、查询优化等一系列过程后,再由执行器来负责执行。所不同的是,在分布式数据库里,查询优化器会依据数据的分布信息生成分布式的执行计划。如果查询涉及的数据在多台服务器,需要走分布式计划,这是分布式数据库 SQL 引擎的一个重要特点,也是十分考验查询优化器能力的场景。OceanBase 数据库查询优化器做了很多优化,诸如算子下推、智能连接、分区裁剪等。如果 SQL 语句涉及的数据量很大,OceanBase 数据库的查询执行引擎也做了并行处理、任务拆分、动态分区、流水调度、任务裁剪、子任务结果合并、并发限制等优化技术。
下图描述了一条 SQL 语句的执行过程,并列出了 SQL 引擎中各个模块之间的关系。
请求流程
OPERATOR 类型 常用操作算子
output
range_cond
[2021-07-03 16:35:25.259332] WARN [SQL.RESV] select_stmt_resolver_func (ob_resolver.cpp:142) [14686][424][YB427F000001-0005C6331F72012E] [lt=4] [dc=0] execute stmt_resolver failed(ret=-5019, parse_tree.type_=3035)
[2021-07-03 16:35:25.259347] WARN [SQL] generate_stmt (ob_sql.cpp:1406) [14686][424][YB427F000001-0005C6331F72012E] [lt=4] [dc=0] failed to resolve(ret=-5019)
[2021-07-03 16:35:25.259359] WARN [SQL] generate_physical_plan (ob_sql.cpp:1494) [14686][424][YB427F000001-0005C6331F72012E] [lt=9] [dc=0] Failed to generate stmt(ret=-5019, result.get_exec_context().need_disconnect()=false)
[2021-07-03 16:35:25.259367] WARN [SQL] handle_physical_plan (ob_sql.cpp:3159) [14686][424][YB427F000001-0005C6331F72012E] [lt=5] [dc=0] Failed to generate plan(ret=-5019, result.get_exec_context().need_disconnect()=false)
[2021-07-03 16:35:25.259376] WARN [SQL] handle_text_query (ob_sql.cpp:1188) [14686][424][YB427F000001-0005C6331F72012E] [lt=8] [dc=0] fail to handle physical plan(ret=-5019)
https://blog.csdn.net/qq910894904/article/details/32322909?spm=1001.2014.3001.5501
TiDB 源码阅读系列文章(六)Select 语句概览 https://pingcap.com/blog-cn/tidb-source-code-reading-6/
TiDB 源码阅读系列文章(五)TiDB SQL Parser 的实现
TiDB 源码阅读系列文章(二十三)Prepare/Execute 请求处理 https://pingcap.com/blog-cn/tidb-source-code-reading-23/
TiDB 源码阅读系列文章(四)Insert 语句概览 https://pingcap.com/blog-cn/tidb-source-code-reading-4/