rm oceanbase document

This commit is contained in:
csunny
2023-05-08 23:01:52 +08:00
parent f08e894e88
commit 25fd7450cc
8 changed files with 296 additions and 47618 deletions

65
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,65 @@
To contribute to this GitHub project, you can follow these steps:
1. Fork the repository you want to contribute to by clicking the "Fork" button on the project page.
2. Clone the repository to your local machine using the following command:
```
git clone https://github.com/<YOUR-GITHUB-USERNAME>/DB-GPT
```
3. Install the project requirements
```
pip install -r requirements.txt
```
4. Install pre-commit hooks
```
pre-commit install
```
5. Create a new branch for your changes using the following command:
```
git checkout -b "branch-name"
```
6. Make your changes to the code or documentation.
- Example: Improve User Interface or Add Documentation.
7. Add the changes to the staging area using the following command:
```
git add .
```
8. Commit the changes with a meaningful commit message using the following command:
```
git commit -m "your commit message"
```
9. Push the changes to your forked repository using the following command:
```
git push origin branch-name
```
10. Go to the GitHub website and navigate to your forked repository.
11. Click the "New pull request" button.
12. Select the branch you just pushed to and the branch you want to merge into on the original repository.
13. Add a description of your changes and click the "Create pull request" button.
14. Wait for the project maintainer to review your changes and provide feedback.
15. Make any necessary changes based on feedback and repeat steps 5-12 until your changes are accepted and merged into the main project.
16. Once your changes are merged, you can update your forked repository and local copy of the repository with the following commands:
```
git fetch upstream
git checkout master
git merge upstream/master
```
Finally, delete the branch you created with the following command:
```
git branch -d branch-name
```
That's it you made it 🐣⭐⭐

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,206 @@
OceanBase 数据库OceanBase Database是一款完全自研的企业级原生分布式数据库在普通硬件上实现金融级高可用首创“三地五中心”城市级故障自动无损容灾新标准刷新 TPC-C 标准测试,单集群规模超过 1500 节点,具有云原生、强一致性、高度兼容 Oracle/MySQL 等特性。
核心特性
高可用
独创 “三地五中心” 容灾架构方案,建立金融行业无损容灾新标准。支持同城/异地容灾,可实现多地多活,满足金融行业 6 级容灾标准RPO=0RTO< 8s数据零丢失
高兼容
高度兼容 Oracle MySQL覆盖绝大多数常见功能支持过程语言触发器等高级特性提供自动迁移工具支持迁移评估和反向同步以保障数据迁移安全可支撑金融政府运营商等关键行业核心场景替代
水平扩展
实现透明水平扩展支持业务快速的扩容缩容同时通过准内存处理架构实现高性能支持集群节点超过数千个单集群最大数据量超过 3PB最大单表行数达万亿级
低成本
基于 LSM-Tree 的高压缩引擎存储成本降低 70% - 90%原生支持多租户架构同集群可为多个独立业务提供服务租户间数据隔离降低部署和运维成本
实时 HTAP
基于同一份数据同一个引擎同时支持在线实时交易及实时分析两种场景一份数据的多个副本可以存储成多种形态用于不同工作负载从根本上保持数据一致性
安全可靠
12 年完全自主研发代码级可控自研单机分布式一体化架构大规模金融核心场景 9 年可靠性验证完备的角色权限管理体系数据存储和通信全链路透明加密支持国密算法通过等保三级专项合规检测
深入了解 OceanBase 数据库
您可以通过以下内容更深入地了解 OceanBase 数据库
OceanBase 使用通用服务器硬件依赖本地存储分布式部署使用的多个服务器也是对等的没有特殊的硬件要求OceanBase 的分布式数据库处理采用 Shared Nothing 架构数据库内的 SQL 执行引擎具有分布式执行能力
OceanBase 在服务器上会运行叫做 observer 的单进程程序作为数据库的运行实例使用本地的文件存储数据和事务 Redo 日志
OceanBase 集群部署需要配置可用区Zone由若干个服务器组成可用区是一个逻辑概念表示集群内具有相似硬件可用性的一组节点它在不同的部署模式下代表不同的含义例如当整个集群部署在同一个数据中心IDC内的时候一个可用区的节点可以属于同一个机架同一个交换机等当集群分布在多个数据中心的时候每个可用区可以对应于一个数据中心
用户存储的数据在分布式集群内部可以存储多个副本用于故障容灾也可以用于分散读取压力在一个可用区内部数据只有一个副本不同的可用区可以存储同一个数据的多个副本副本之间由共识协议保证数据的一致性
OceanBase 内置多租户特性每个租户对于使用者是一个独立的数据库一个租户能够在租户级别设置租户的分布式部署方式租户之间 CPU内存和 IO 都是隔离的
OceanBase的数据库实例内部由不同的组件相互协作这些组件从底层向上由存储层复制层均衡层事务层SQL 接入层组成
存储层
存储层以一张表或者一个分区为粒度提供数据存储与访问每个分区对应一个用于存储数据的Tablet分片用户定义的非分区表也会对应一个 Tablet
Tablet 的内部是分层存储的结构总共有 4 DML 操作插入更新删除等首先写入 MemTable等到 MemTable 达到一定大小时转储到磁盘成为 L0 SSTableL0 SSTable 个数达到阈值后会将多个 L0 SSTable 合并成一个 L1 SSTable在每天配置的业务低峰期系统会将所有的 MemTableL0 SSTable L1 SSTable 合并成一个 Major SSTable
每个 SSTable 内部是以 2MB 定长宏块为基本单位每个宏块内部由多个不定长微块组成
Major SSTable 的微块会在合并过程中用编码方式进行格式转换微块内的数据会按照列维度分别进行列内的编码编码规则包括字典/游程/常量/差值等每一列压缩结束后还会进一步对多列进行列间等值/子串等规则编码编码能对数据大幅压缩同时提炼的列内特征信息还能进一步加速后续的查询速度
在编码压缩之后还可以根据用户指定的通用压缩算法进行无损压缩进一步提升数据压缩率
复制层
复制层使用日志流LSLog Stream在多副本之间同步状态每个 Tablet 都会对应一个确定的日志流DML 操作写入 Tablet 的数据所产生的 Redo 日志会持久化在日志流中日志流的多个副本会分布在不同的可用区中多个副本之间维持了共识算法选择其中一个副本作为主副本其他的副本皆为从副本Tablet DML 和强一致性查询只在其对应的日志流的主副本上进行
通常情况下每个租户在每台机器上只会有一个日志流的主副本可能存在多个其他日志流的从副本租户的总日志流个数取决于 Primary Zone Locality 的配置
日志流使用自研的 Paxos 协议将 Redo 日志在本服务器持久化同时通过网络发送给日志流的从副本从副本在完成各自持久化后应答主副本主副本在确认有多数派副本都持久化成功后确认对应的 Redo 日志持久化成功从副本利用 Redo 日志的内容实时回放保证自己的状态与主副本一致
日志流的主副本在被选举成为主后会获得租约Lease正常工作的主副本在租约有效期内会不停的通过选举协议延长租约期主副本只会在租约有效时执行主的工作租约机制保证了数据库异常处理的能力
复制层能够自动应对服务器故障保障数据库服务的持续可用如果出现少于半数的从副本所在服务器出现问题因为还有多于半数的副本正常工作数据库的服务不受影响如果主副本所在服务器出现问题其租约会得不到延续待其租约失效后其他从副本会通过选举协议选举出新的主副本并授予新的租约之后即可恢复数据库的服务
均衡层
新建表和新增分区时系统会按照均衡原则选择合适的日志流创建 Tablet当租户的属性发生变更新增了机器资源或者经过长时间使用后Tablet 在各台机器上不再均衡时均衡层通过日志流的分裂和合并操作并在这个过程中配合日志流副本的移动让数据和服务在多个服务器之间再次均衡
当租户有扩容操作获得更多服务器资源时均衡层会将租户内已有的日志流进行分裂并选择合适数量的 Tablet 一同分裂到新的日志流中再将新日志流迁移到新增的服务器上以充分利用扩容后的资源当租户有缩容操作时均衡层会把需要缩减的服务器上的日志流迁移到其他服务器上并和其他服务器上已有的日志流进行合并以缩减机器的资源占用
当数据库长期使用后随着持续创建删除表格并且写入更多的数据即使没有服务器资源数量变化原本均衡的情况可能被破坏最常见的情况是当用户删除了一批表格后删除的表格可能原本聚集在某一些机器上删除后这些机器上的 Tablet 数量就变少了应该把其他机器的 Tablet 均衡一些到这些少的机器上均衡层会定期生成均衡计划 Tablet 多的服务器上日志流分裂出临时日志流并携带需要移动的 Tablet临时日志流迁移到目的服务器后再和目的服务器上的日志流进行合并以达成均衡的效果
事务层
事务层保证了单个日志流和多个日志流DML操作提交的原子性也保证了并发事务之间的多版本隔离能力
原子性
一个日志流上事务的修改即使涉及多个 Tablet通过日志流的 write-ahead log 可以保证事务提交的原子性事务的修改涉及多个日志流时每个日志流会产生并持久化各自的write-ahead log事务层通过优化的两阶段提交协议来保证提交的原子性
事务层会选择一个事务修改的一个日志流产生协调者状态机协调者会与事务修改的所有日志流通信判断 write-ahead log 是否持久化当所有日志流都完成持久化后事务进入提交状态协调者会再驱动所有日志流写下这个事务的 Commit 日志表示事务最终的提交状态当从副本回放或者数据库重启时已经完成提交的事务都会通过 Commit 日志确定各自日志流事务的状态
宕机重启场景下宕机前还未完成的事务会出现写完 write-ahead log 但是还没有Commit 日志的情况每个日志流的 write-ahead log 都会包含事务的所有日志流列表通过此信息可以重新确定哪个日志流是协调者并恢复协调者的状态再次推进两阶段状态机直到事务最终的 Commit Abort 状态
隔离性
GTS 服务是一个租户内产生连续增长的时间戳的服务其通过多副本保证可用性底层机制与上面复制层所描述的日志流副本同步机制是一样的
每个事务在提交时会从 GTS 获取一个时间戳作为事务的提交版本号并持久化在日志流的write-ahead log 事务内所有修改的数据都以此提交版本号标记
每个语句开始时对于 Read Committed 隔离级别或者每个事务开始时对于Repeatable Read Serializable 隔离级别会从 GTS 获取一个时间戳作为语句或事务的读取版本号在读取数据时会跳过事务版本号比读取版本号大的数据通过这种方式为读取操作提供了统一的全局数据快照
SQL
SQL 层将用户的 SQL 请求转化成对一个或多个 Tablet 的数据访问
SQL 层组件
SQL 层处理一个请求的执行流程是ParserResolverTransformerOptimizerCode GeneratorExecutor
Parser 负责词法/语法解析Parser 会将用户的 SQL 分成一个个的 "Token"并根据预先设定好的语法规则解析整个请求转换成语法树Syntax Tree
Resolver 负责语义解析将根据数据库元信息将 SQL 请求中的 Token 翻译成对应的对象例如库索引等生成的数据结构叫做 Statement Tree
Transformer 负责逻辑改写根据内部的规则或代价模型 SQL 改写为与之等价的其他形式并将其提供给后续的优化器做进一步的优化Transformer 的工作方式是在原Statement Tree 上做等价变换变换的结果仍然是一棵 Statement Tree
Optimizer优化器 SQL 请求生成最佳的执行计划需要综合考虑 SQL 请求的语义对象数据特征对象物理分布等多方面因素解决访问路径选择联接顺序选择联接算法选择分布式计划生成等问题最终生成执行计划
Code Generator代码生成器将执行计划转换为可执行的代码但是不做任何优化选择
Executor执行器启动 SQL 的执行过程
在标准的 SQL 流程之外SQL 层还有 Plan Cache 能力将历史的执行计划缓存在内存中后续的执行可以反复执行这个计划避免了重复查询优化的过程配合 Fast-parser 模块仅使用词法分析对文本串直接参数化获取参数化后的文本及常量参数 SQL 直接命中 Plan Cache加速频繁执行的 SQL
多种计划
SQL 层的执行计划分为本地远程和分布式三种本地执行计划只访问本服务器的数据远程执行计划只访问非本地的一台服务器的数据分布式计划会访问超过一台服务器的数据执行计划会分成多个子计划在多个服务器上执行
SQL 层并行化执行能力可以将执行计划分解成多个部分由多个执行线程执行通过一定的调度的方式实现执行计划的并行处理并行化执行可以充分发挥服务器 CPU IO 处理能力缩短单个查询的响应时间并行查询技术可以用于分布式执行计划也可以用于本地执行计划
接入层
obproxy OceanBase 数据库的接入层负责将用户的请求转发到合适的 OceanBase 实例上进行处理
obproxy 是独立的进程实例独立于 OceanBase 的数据库实例部署obproxy 监听网络端口兼容 MySQL 网络协议支持使用 MySQL 驱动的应用直接连接 OceanBase
obproxy 能够自动发现 OceanBase 集群的数据分布信息对于代理的每一条 SQL 语句会尽可能识别出语句将访问的数据并将语句直接转发到数据所在服务器的 OceanBase 实例
obproxy 有两种部署方式一种是部署在每一个需要访问数据库的应用服务器上另一种是部署在与 OceanBase 相同的机器上第一种部署方式下应用程序直接连接部署在同一台服务器上的 obproxy所有的请求会由 obproxy 发送到合适的 OceanBase 服务器第二种部署方式下需要使用网络负载均衡服务将多个 obproxy 聚合成同一个对应用提供服务的入口地址
OceanBase 数据库采用 Shared-Nothing 架构各个节点之间完全对等每个节点都有自己的 SQL 引擎存储引擎事务引擎运行在普通 PC 服务器组成的集群之上具备高可扩展性高可用性高性能低成本与主流数据库高兼容等核心特性
OceanBase 数据库的一个集群由若干个节点组成这些节点分属于若干个可用区Zone每个节点属于一个可用区可用区是一个逻辑概念表示集群内具有相似硬件可用性的一组节点它在不同的部署模式下代表不同的含义例如当整个集群部署在同一个数据中心IDC内的时候一个可用区的节点可以属于同一个机架同一个交换机等当集群分布在多个数据中心的时候每个可用区可以对应于一个数据中心每个可用区具有 IDC 和地域Region两个属性描述该可用区所在的 IDC IDC 所属的地域一般地地域指 IDC 所在的城市可用区的 IDC Region 属性需要反映部署时候的实际情况以便集群内的自动容灾处理和优化策略能更好地工作根据业务对数据库系统不同的高可用性需求OceanBase 集群提供了多种部署模式参见 高可用架构概述
OceanBase 数据库中一个表的数据可以按照某种划分规则水平拆分为多个分片每个分片叫做一个表分区简称分区Partition某行数据属于且只属于一个分区分区的规则由用户在建表的时候指定包括hashrangelist等类型的分区还支持二级分区例如交易库中的订单表可以先按照用户 ID 划分为若干一级分区再按照月份把每个一级分区划分为若干二级分区对于二级分区表第二级的每个子分区是一个物理分区而第一级分区只是逻辑概念一个表的若干个分区可以分布在一个可用区内的多个节点上每个物理分区有一个用于存储数据的存储层对象叫做 Tablet 用于存储有序的数据记录
当用户对 Tablet 中记录进行修改的时候为了保证数据持久化需要记录重做日志REDO Tablet 对应的日志流Log Stream每个日志流服务了其所在节点上的多个 Tablet为了能够保护数据并在节点发生故障的时候不中断服务每个日志流及其所属的 Tablet 有多个副本一般来说多个副本分散在多个不同的可用区里多个副本中有且只有一个副本接受修改操作叫做主副本Leader其他副本叫做从副本Follower主从副本之间通过基于 Multi-Paxos 的分布式共识协议实现了副本之间数据的一致性当主副本所在节点发生故障的时候一个从副本会被选举为新的主副本并继续提供服务
在集群的每个节点上会运行一个叫做 observer 的服务进程它内部包含多个操作系统线程节点的功能都是对等的每个服务负责自己所在节点上分区数据的存取也负责路由到本机的 SQL 语句的解析和执行这些服务进程之间通过 TCP/IP 协议进行通信同时每个服务会监听来自外部应用的连接请求建立连接和数据库会话并提供数据库服务关于 observer 服务进程的更多信息参见 线程简介
为了简化大规模部署多个业务数据库的管理并降低资源成本OceanBase 数据库提供了独特的多租户特性在一个 OceanBase 集群内可以创建很多个互相之间隔离的数据库"实例"叫做一个租户从应用程序的视角来看每个租户是一个独立的数据库不仅如此每个租户可以选择 MySQL Oracle 兼容模式应用连接到 MySQL 租户后可以在租户下创建用户database与一个独立的 MySQL 库的使用体验是一样的同样的应用连接到 Oracle 租户后可以在租户下创建 schema管理角色等与一个独立的 Oracle 库的使用体验是一样的一个新的集群初始化之后就会存在一个特殊的名为 sys 的租户叫做系统租户系统租户中保存了集群的元数据是一个 MySQL 兼容模式的租户
为了隔离租户的资源每个 observer 进程内可以有多个属于不同租户的虚拟容器叫做资源单元UNIT每个租户在多个节点上的资源单元组成一个资源池资源单元包括 CPU 和内存资源
为了使 OceanBase 数据库对应用程序屏蔽内部分区和副本分布等细节使应用访问分布式数据库像访问单机数据库一样简单我们提供了 obproxy 代理服务应用程序并不会直接与 OBServer 建立连接而是连接obproxy然后由 obproxy 转发 SQL 请求到合适的 OBServer 节点obproxy 是无状态的服务多个 obproxy 节点通过网络负载均衡SLB对应用提供统一的网络地址
OceanBase 数据库是随着阿里巴巴电商业务的发展孕育而生随着蚂蚁集团移动支付业务的发展而壮大经过十多年各类业务的使用和打磨才终于破茧成蝶推向了外部市场本章节简述 OceanBase 数据库发展过程中一些里程碑意义的事件
诞生
2010 OceanBase 创始人阳振坤博士带领初创团队启动了 OceanBase 项目第一个应用是淘宝的收藏夹业务如今收藏夹依然是 OceanBase 的客户收藏夹单表数据量非常大OceanBase 用独创的方法解决了其高并发的大表连接小表的需求
关系数据库
早期的版本中应用通过定制的 API 库访问 OceanBase 数据库2012 OceanBase 数据库发布了支持 SQL 的版本初步成为一个功能完整的通用关系数据库
初试金融业务
OceanBase 进入支付宝后来的蚂蚁集团开始应用于金融级的业务场景2014 " 11"大促活动OceanBase 开始承担交易库部分流量此后新成立的网商银行把所有核心交易库都运行在 OceanBase 数据库上
金融级核心库
2016 OceanBase 数据库发布了架构重新设计后的 1.0 版本支持了分布式事务提升了高并发写业务中的扩展同时实现了多租户架构这个整体架构延续至今同时 2016 " 11"支付宝全部核心库的业务流量 100% 运行在 OceanBase 数据库上包括交易支付会员和最重要的账务库
走向外部市场
2017 OceanBase 数据库开始试点外部业务成功应用于南京银行
商业化加速
2018 OceanBase 数据库发布 2.0 版本开始支持 Oracle 兼容模式这一特性降低应用改造适配成本在外部客户中快速推广开来
勇攀高峰
2019 OceanBase 数据库 V2.2 版本参加代表 OLTP 数据库最权威的 TPC-C 评测 6000 tpmC 的成绩登顶世界第一随后 2020 又以 7 亿 tpmC 刷新纪录截止目前依然稳居第一这充分证明了 OceanBase 数据库优秀的扩展性和稳定性OceanBase 数据库是第一个也是截止目前唯一一个上榜 TPC-C 的中国数据库产品
HTAP 混合负载
2021 OceanBase 数据库 V3.0 基于全新的向量化执行引擎 TPC-H 30000GB 的评测中以 1526 QphH 的成绩刷新了评测榜单这标志着 OceanBase 数据库一套引擎处理 AP TP 混合负载的能力取得了基础性的突破
开源开放
2021 年六一儿童节OceanBase 数据库宣布全面开源开放合作共建生态
OceanBase 数据库采用了单集群多租户设计天然支持云数据库架构支持公有云私有云混合云等多种部署形式
架构
OceanBase 数据库通过租户实现资源隔离让每个数据库服务的实例不感知其他实例的存在并通过权限控制确保租户数据的安全性配合 OceanBase 数据库强大的可扩展性能够提供安全灵活的 DBaaS 服务
租户是一个逻辑概念 OceanBase 数据库中租户是资源分配的单位是数据库对象管理和资源管理的基础对于系统运维尤其是对于云数据库的运维有着重要的影响租户在一定程度上相当于传统数据库的"实例"概念租户之间是完全隔离的在数据安全方面OceanBase 数据库不允许跨租户的数据访问以确保用户的数据资产没有被其他租户窃取的风险在资源使用方面OceanBase 数据库表现为租户"独占"其资源配额总体上来说租户tenant既是各类数据库对象的容器又是资源CPUMemoryIO 的容器
OceanBase 数据库在一个系统中可同时支持 MySQL 模式和 Oracle 模式两种模式的租户用户在创建租户时可选择创建 MySQL 兼容模式的租户或 Oracle 兼容模式的租户租户的兼容模式一经确定就无法更改所有数据类型SQL 功能视图等相应地与 MySQL 数据库或 Oracle 数据库保持一致
MySQL 模式
MySQL 模式是为降低 MySQL 数据库迁移至 OceanBase 数据库所引发的业务系统改造成本同时使业务数据库设计人员开发人员数据库管理员等可复用积累的 MySQL 数据库技术知识经验并能快速上手 OceanBase 数据库而支持的一种租户类型功能OceanBase 数据库的 MySQL 模式兼容 MySQL 5.7 的绝大部分功能和语法兼容 MySQL 5.7 版本的全量以及 8.0 版本的部分 JSON 函数基于 MySQL 的应用能够平滑迁移
Oracle 模式
OceanBase 数据库从 V2.x.x 版本开始支持 Oracle 兼容模式Oracle 模式是为降低 Oracle 数据库迁移 OceanBase 数据库的业务系统改造成本同时使业务数据库设计开发人员数据库管理员等可复用积累的 Oracle 数据库技术知识经验并能快速上手 OceanBase 数据库而支持的一种租户类型功能Oracle 模式目前能够支持绝大部分的 Oracle 语法和过程性语言功能可以做到大部分的 Oracle 业务进行少量修改后的自动迁移
OceanBase 数据库是多租户架构 V4.0.0 版本之前仅支持两种类型的租户系统租户和用户租户 V4.0.0 版本开始引入了 Meta 租户概念因此当前版本对用户可见的租户有三种类型系统租户用户租户以及 Meta 租户
系统租户
系统租户是集群默认创建的租户与集群的生命周期一致负责管理集群和所有租户的生命周期系统租户仅有一个 1 号日志流仅支持单点写入不具备扩展能力
系统租户可以创建用户表所有的用户表和系统表数据均由 1 号日志流服务系统租户的数据是集群私有的不支持主备集群物理同步和物理备份恢复
用户租户
用户租户是由用户创建的租户对外提供完整的数据库功能支持 MySQL Oracle 两种兼容模式用户租户支持服务能力水平扩展到多台机器上支持动态扩容和缩容内部会根据用户的配置自动创建和删除日志流
用户租户的数据有更强的数据保护和可用性要求支持跨集群物理同步和物理备份恢复典型数据包括Schema 数据用户表数据及事务数据等
Meta 租户
Meta 租户是 OceanBase 数据库内部自管理的租户每创建一个用户租户系统就会自动创建一个对应的 Meta 租户其生命期与用户租户保持一致
Meta 租户用于存储和管理用户租户的集群私有数据这部分数据不需要进行跨库物理同步以及物理备份恢复这些数据包括配置项位置信息副本信息日志流状态备份恢复相关信息合并信息等
租户对比
从用户角度来看系统租户用户租户和 Meta 租户的差异性如下表所示
OceanBase 数据库是多租户的数据库系统一个集群内可包含多个相互独立的租户每个租户提供独立的数据库服务 OceanBase 数据库中使用资源配置unit_config资源池Resource Pool和资源单元Unit三个概念对各租户的可用资源进行管理
创建租户前需首先确定租户的资源配置使用资源范围等租户创建的通用流程如下
资源配置是描述资源池的配置信息用来描述资源池中每个资源单元可用的 CPU内存存储空间和 IOPS 等的规格修改资源配置可动态调整资源单元的规格这里需要注意资源配置指定的是对应资源单元能够提供的服务能力而不是资源单元的实时负载 创建资源配置的示例语句如下

25
run.sh Normal file
View File

@@ -0,0 +1,25 @@
#!/bin/bash
function find_python_command() {
if command -v python &> /dev/null
then
echo "python"
elif command -v python3 &> /dev/null
then
echo "python3"
else
echo "Python not found. Please install python."
exit 1
fi
}
PYTHONCMD=$(find_python_command)
nohup PYTHONCMD pilot/server/vicuna_server.py >> /root/server.log 2>&1 &
while [ `grep -c "Uvicorn running on" /root/server.log` -eq '0' ];do
sleep 1s;
echo "wait server running"
done
echo "server running"
PYTHONCMD pilot/server/webserver.py