未验证 提交 9a80911e 编写于 作者: O obpilot 提交者: GitHub

Ob quick start (#499)

* Add Chapter One of the tutorial.

* Updated some descriptions.

* Added some urls.

* Add chapter02 : How to deploy an oceanbase-ce cluster

* Add all chapters of the tutorial. Waiting for review.

* Modifiy some files as the first preview suggested.

* Modifiy some files as the first preview suggested.

* I  temporarily remove some chapters for this PR, I will add them back in the later PR.

* change OB to OceanBase.

* 1.Remove pictures. 2. Add some description about Prometheus and  Grafana.

* Relocate the images.

* Change OceanBase Deploy to OBD.

* Fixed some format errors.
上级 fd0fb243
# 第 1 章:OceanBase 数据库概述
OceanBase 数据库是一个原生的分布式关系数据库,它是完全由阿里巴巴和蚂蚁集团自主研发的项目。OceanBase 数据库构建在通用服务器集群上,基于 Paxos 协议和分布式架构,提供金融级高可用和线性伸缩能力,不依赖特定硬件架构,具备高可用、线性扩展、高性能、低成本等核心技术优势。
OceanBase 数据库具有如下特点:
+ 高可用
单服务器故障能够自愈,支持跨城多机房容灾,数据零丢失,可满足金融行业 6 级容灾标准(RPO=0,RTO<=30 秒)。
+ 线性扩展
透明扩展,自动负载均衡,应用透明的水平扩展,集群规模可超过 1500 节点,数据量可达 PB 级,单表记录万亿行。
+ MySQL/ORACLE 高度兼容
社区版兼容 MySQL 协议、语法和使用习惯,MySQL 客户端工具可以直接访问 OceanBase 数据库。MySQL 从 5.6 开始。
企业版兼容 MySQL、ORACLE 协议。ORACLE 从 ORACLE 11g 开始兼容。需要使用 OceanBase 自己的驱动才可以访问 OceanBase 的 ORACLE 租户。
+ 高性能
准内存级数据变更操作、独创的编码压缩技术,结合线性水平扩展,TPC-C 测试达到 7.07 亿 tpmC。
+ 低成本
使用 PC 服务器和低端 SSD,高存储压缩率降低存储成本,高性能降低计算成本,多租户混部充分利用系统资源。
+ 多租户
原生支持多租户构架,同一套数据库集群可以为多个独立业务提供服务,租户间数据隔离,降低部署和运维成本。
OceanBase 数据库支持支付宝的全部核心业务,以及银行、保险、证券、运营商等多个行业的数百个客户的核心业务系统。
## OceanBase 发展历史
在使用 OceanBase 之前,我们先对 OceanBase 的历史做一个简单的了解。
![oceanbase histories](https://cdn.nlark.com/yuque/0/2021/png/383093/1637564600047-4293062f-bbb2-4386-84fc-76b63b737d58.png?x-oss-process=image%2Fresize%2Cw_1500%2Climit_0)
+ 诞生 : 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 2.2 版本参加代表 OLTP 数据库最权威的 TPC-C 评测,以 6000万 tpmC 的成绩登顶世界第一。随后,在 2020 年,又以 7亿 tpmC 刷新纪录,截止目前依然稳居第一。这充分证明了 OceanBase 优秀的扩展性和稳定性。OceanBase 是第一个也是截止目前唯一一个上榜 TPC-C 的中国数据库产品。
+ HTAP 混合负载 : 2021年,OceanBase 3.0 基于全新的向量化执行引擎,在TPC-H 30000GB 的评测中以 1526 万 QphH 的成绩刷新了评测榜单。这标志着 OceanBase 一套引擎处理 AP 和 TP 混合负载的能力取得了基础性的突破。
+ 开源开放 : 2021年六一儿童节,OceanBase宣布全面开源,开放合作,共建生态。
OceanBase 在 2021年6月份正式推出社区版并开放源码,版本从 3.1.0 开始,源码托管地址:[github.com/oceanbase](github.com/oceanbase) 。同时代码也同步发布到开源中国网站:[gitee.com/oceanbase](gitee.com/oceanbase)
开源的内容包括:
+ 数据库内核 OceanBase
+ 反向访问代理 `obproxy`
+ 数据库客户端命令行工具 `obclient`
+ 自动化部署工具 `OBD`
+ c 语言驱动 `obconnector-c`
+ CDC 组件 `oblogproxy``canal` 插件
+ OB监控客户端组件 `obagent`
+ spark 插件 `obspark`(待开源)
## OceanBase 业务案例
跟其他开源数据库不一样的地方是, OceanBase 先有企业版后有社区版。先有大企业商业版案例,再有社区版案例。社区版和企业版的核心能力是一样的。
典型客户如下:
+ 自用:蚂蚁集团(包括支付宝、网商银行)。
+ 银行:中国工商银行;南京银行、东莞银行、天津银行、苏州银行;常熟农商行。
+ 保险:中国人保、中华保险。
+ 证券:招商证券、上投摩根。
+ 非金融行业:浙江移动、山东移动;数字江西;中国石化。
详细案例请查看:`https://www.oceanbase.com/customer/home` 。更多行业和客户还没有在这里列出。
OceanBase 本质上是个单进程软件,独立部署,跟硬件、云平台没有绑定关系。可以部署在各个云厂商的云服务器上。OceanBase 在阿里云也有公有云数据库服务(`https://www.aliyun.com/product/oceanbase`)。
OceanBase 在公有云上(包括在 ECS 上独立部署的)客户案例有:
+ 中华联合财险
+ 菲律宾版支付GCash
+ 印度尼西亚电子钱包 DANA
## OceanBase 社区版简介
OceanBase 数据库社区版使用 [MulanPubL - 2.0 许可证](http://license.coscl.org.cn/MulanPubL-2.0/index.html) 。您可以免费复制及使用源代码。当您修改或分发源代码时,请遵守木兰协议。
OceanBase 社区版官方网站地址是: [open.oceanbase.com](open.oceanbase.com)
### 下载方法
+ 官网下载:[https://open.oceanbase.com/softwareCenter/community](https://open.oceanbase.com/softwareCenter/community)
+ GitHub 下载:[https://github.com/oceanbase/oceanbase/releases/](https://github.com/oceanbase/oceanbase/releases/)
+ 阿里云 Yum 源:[https://mirrors.aliyun.com/oceanbase/OceanBase.repo](https://mirrors.aliyun.com/oceanbase/OceanBase.repo)
### 支持的操作系统
OceanBase 社区版支持的操作系统包括:
+ CentOS :推荐7.2 以后版本。
+ Debian :推荐 9.8, 10.9 版本。
+ openSUSE :推荐 15.2 版本。
+ OpenAnolis:推荐 8.2 版本。
+ SUSE : 推荐 15.2 版本。
+ Ubuntu:推荐 16.04 、18.04、20.04 等版本。
### 跟MySQL 数据库的不同
OceanBase 社区版兼容 MySQL 语法功能(主要是 5.6 的绝大部分语法,部分 8.0 的新特性等),底层原理跟 MySQL 完全没有关系,不依赖开源 MySQL 组件,没有 InnoDB 引擎等。
OceanBase 自身的存储引擎相比 MySQL 的存储,空间压缩效果更明显,社区版的压缩效果可以做到 MySQL 空间的四分之一。
OceanBase 是分布式数据库集群产品,生产环境默认数据三副本,并且三副本之前同步协议不是异步同步、半同步同步技术,而是使用 Paxos 协议同步事务日志。OceanBase 集群可以跨机房跨城市部署,机器或者机房故障时,集群内部多副本自动切换,不丢数据。OceanBase 天然适合两地三中心异地容灾和多活建设。
OceanBase 集群支持多租户(也叫多实例),所有的租户按需分配,弹性伸缩,具备高可用能力,类似云数据库服务。运维人员只需要维护少数几套集群,就可以提供很多实例给业务使用,易用性非常好。
OceanBase 支持水平拆分技术,具体就是分区表,不需要分库分表,SQL 和事务对业务完全透明,功能上没有限制。分区表线性扩展性也很好,目前已知案例最大单租户节点规模是 1500 台。
OceanBase 的 SQL 引擎能力远比 MySQL 功能强大,支持 SQL 解析和执行计划缓存,支持复杂的 SQL 运算,支持大纲技术干预 SQL 执行计划等。同时一套 SQL 引擎 一个数据源 同时支持 OLTP 和 ROLAP 类型的混合场景需求。即通常说的 HTAP 能力。
### 社区版核心功能
OceanBase 社区版包含 OceanBase 企业版的所有核心功能,如下:
+ 多副本高可用、强同步能力。
+ 多租户能力。
+ 在线弹性伸缩能力。
+ 异地容灾/多活能力(包括两地三中心、三地五中心等)。
+ 分区表、复制表等分布式能力。
+ HTAP 能力。
+ MySQL 兼容性。
+ 备份恢复能力。
+ CDC 能力。
OceanBase 社区版跟企业版的差异在于企业版会包含更多高级功能。如商业特性兼容、图形化管理工具、操作审计、安全加密、高可用扩展等。有关企业版信息请查看企业版官方网站([`oceanbase.com`](oceanbase.com))。
## 适合社区版的业务场景
+ MySQL 5.6/5.7 实例规模很大的场景。
MySQL 实例规模大,需要自动化运维平台。自动化运维平台在处理 MySQL 异常宕机切换和主备不一致问题时很可能需要 DBA 介入。高可用和强一致问题是MySQL 最大的风险。
OceanBase 的多租户、高可用和强一致能力可以彻底解决这个痛点。
+ MySQL 5.6/5.7 数据量非常大存储成本高的场景。
MySQL 业务数据量增长到 几T 以上时,查询和读写性能可能会下降,大表 DDL 时间变长风险增加。单机磁盘容量可能到达扩容瓶颈。
OceanBase MySQL租户的在线 DDL,数据存储高压缩比可以解决这些痛点。
+ 业务访问压力大或者变化大的场景。
业务访问压力大,基于MySQL 改造的分布式数据库中间件产品能一定程度分担业务压力和存储空间压力,但是缺乏跨节点的强一致性查询,以及需要分布式事务中间件协调事务,扩容的时候可能要数据逻辑拆分(俗称拆库拆表),运维成本高,风险高。
OceanBase MySQL 租户提供分区表的水平拆分方案,提供原生的 SQL 和事务能力,对业务透明。并且支持在线扩容和缩容,内部数据迁移异步进行,具备高可用能力,不怕扩容和缩容过程中出现故障,可以解决上面这些痛点。
+ 交易数据库上的复杂查询场景。
交易数据库上有少量复杂的查询场景,涉及到的数据量很大,传统解决方案是通过数据同步到数据仓库进行查询。OceanBase 数据库的 SQL 引擎同时满足 OLTP 和 OLAP 场景,采用经过 ORACLE 复杂业务场景检验的先进的SQL优化器技术,能支持复杂的SQL优化和高效执行。因此可以在交易数据库上直接做复杂查询,减少不必要的数据同步。此外,OceanBase 还提供不同程度的读写分离技术来控制复杂查询对交易场景的影响。
其他更多场景待实践总结,敬请关注。
## 如何联系我们
欢迎广大 OceanBase 爱好者、用户和客户有任何问题联系我们反馈:
+ 企业版官网:[https://oceanbase.com](https://oceanbase.com)
+ 社区版官网:[https://open.oceanbase.com](https://open.oceanbase.com)
+ 社区版项目网站提 `Issue`[https://github.com/oceanbase/oceanbase/issues](https://github.com/oceanbase/oceanbase/issues)
+ 钉钉群:群号 `33254054`
# 第 2 章:如何部署 OceanBase 社区版
本章主要介绍如何手动或自动部署 OceanBase 社区版集群,包括单副本和三副本集群。
## 本章目录
+ [部署准备](2.1.md)
+ [如何快速体验 OB](2.2.md)
+ [如何规划 OceanBa se集群部署](2.3.md)
+ [如何初始化服务器环境](2.4.md)
+ [如何安装 OBD 自动化部署软件](2.5.md)
+ [如何使用 OBD 自动化部署单节点集群](2.6.md)
+ [如何使用 OBD 自动化部署多节点集群](2.7.md)
+ [如何查看和修改 OceanBase 集群参数](2.8.md)
+ [如何部署 OBAgent](2.9.md)
+ [如何重启 OceanBase 集群](2.10.md)
+ [(高级)如何手动部署 OceanBase 集群](2.11.md)
+ [常见问题](2.12.md)
+ [附录](2.13.md)
## 如何联系我们
欢迎广大 OceanBase 爱好者、用户和客户有任何问题联系我们反馈:
+ 社区版官网论坛:[https://open.oceanbase.com/answer](https://open.oceanbase.com/answer)
+ 社区版项目网站提 `Issue`[https://github.com/oceanbase/oceanbase/issues](https://github.com/oceanbase/oceanbase/issues)
+ 钉钉群:群号 `33254054`
\ No newline at end of file
# 部署准备
OceanBase 是一个分布式集群产品,在生产环境至少是三台机器。学习环境可以部署单机版本。
OceanBase 的部署跟传统数据库的部署有很多共同的地方,对操作系统硬件、软件设置、文件系统等会有一些最佳实践建议。那些是 OceanBase 发挥高性能稳定运行的基础。社区版也提供了工具能实现一定程度的自动化。
<!-- more -->
## 软件介绍
OceanBase 本质上是一个单进程的软件,可执行文件名叫 `observer` 。可以通过 RPM 包安装,也可以通过源码直接编译安装。本课程都是通过 RPM 包方式安装、
软件包下载地址有:
+ 官网下载:[https://open.oceanbase.com/softwareCenter/community](https://open.oceanbase.com/softwareCenter/community)
+ GitHub 下载:[https://github.com/oceanbase/oceanbase/releases/](https://github.com/oceanbase/oceanbase/releases/)
+ 阿里云 Yum 源:[https://mirrors.aliyun.com/oceanbase/OceanBase.repo](https://mirrors.aliyun.com/oceanbase/OceanBase.repo)
| 软件包名 | 进程名 | 软件用途 |
|------------------------------------------|----------|------------------------------------|
| oceanbase-ce-3.1.1-1.el7.x86_64.rpm | observer | oceanbase 数据库进程,常驻后台运行。 |
| oceanbase-ce-libs-3.1.1-1.el7.x86_64.rpm | | 提供软件运行的 library,不运行。 |
| obproxy-3.1.0-1.el7.x86_64.rpm | obproxy | oceanbase 访问反向代理,单进程,常驻后台运行。 |
| ob-deploy-1.1.1-1.el7.x86_64 | obd | oceanbase 自动化部署软件,提供部署命令行,不常驻后台运行。 |
| obclient-2.0.0-2.el8.x86_64.rpm | obclient| oceanbase 官方命令行客户端 |
注:版本号后期会变,以实际版本为主。
如果机器可以连公网,可以将阿里云 YUM 源添加到本地仓库,使用 yum 命令安装。
```bash
yum install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/oceanbase/OceanBase.repo
yum -y install ob-deploy oceanbase obclient
```
## 部署资源要求
OceanBase 数据库运行的时候会对主机资源有一些要求,主要是 CPU、内存和磁盘空间。安装 OceanBase 的目的不一样,对资源的要求也不一样。
| 目的 | CPU(核数) | 可用内存 | 磁盘 | 备注 |
|-----|---------|------|----|----|
| 功能学习 | 2 | 10G | 10G | 不初始化数据。 |
| 性能测试 | 24 | 128G | SSD 500G以上 | 数据盘和日志盘要分开。|
| 生产环境 | 32 | 256G | SSD 2T以上 | 数据盘和日志盘要分开。日志盘大小是内存的3-4倍。数据量增长的时候,数据盘大小也要增加。 |
注意:上面性能测试环境和生产环境的资源要求是建议。在社区版后续版本,会进一步降低对内存的要求。
OceanBase 对操作系统也有一些要求,目前支持下面这些系统:
+ Redhat / CentOS 7.x/8.x
+ SUSE / OpenSUSE 15.x
+ Anlios 7.x/8.x
+ Debian 9.x
+ Ubuntu 20.x
## 部署过程简介
自动化部署过程简单来说分为几步:
+ 初始化 OceanBase 各个节点环境。包括参数配置、文件系统目录设置等。
+ 初始化中控机到OceanBase 各个节点的 SSH 免密登录。
+ 准备 OBD 自动化部署配置文件。
+ 使用 OBD 部署集群节点目录。
+ 使用 OBD 启动并初始化集群。
后面还会详细介绍单节点和三节点集群的部署方法,以及手动部署的一些步骤。
# 如何重启 OceanBase 集群
OB 自身并没有提供“重启集群”的命令。OB 的核心能力就是高可用,前提是三副本部署。当少数派节点故障时,OB 内部可能会自动切换,依然可以为业务提供读写服务。OB 提供了停止和启动某个副本(`zone` 级别或者 `server` 级别)的功能,并且只允许停止少数派节点。
所以,OB 集群的重启是靠外部操作。比如说用 `kill` 命令杀进程,然后再启动进程 `observer`
上面修改参数的时候已经演示了如何杀单副本集群里的节点进程,下面演示三副本集群里的重启集群方法。在生产环境为了尽可能的缩短集群不可用时间,重启集群采取一种保险的策略:按 `zone``server` 逐个重启集群节点。这个过程可能会比较长,持续几分钟到十几分钟。在刚开始学习 OceanBase 的时候,我们先掌握简单的重启方法,后面深入介绍 OceanBase 运维的时候,再介绍安全稳妥的重启方法。
## 直接手动重启 OceanBase 集群节点
```bash
# ssh 到 节点 1
ssh 172.20.249.52
# 正常 kill 进程,除非是测试用或者评估过风险,否则不要用 `kill -9` 。
kill `pidof observer`
# 等待 60s,等进程完全退出
sleep 60
# 反复确认进程完全退出
ps -ef | grep observer
# 配置 LIBRARY PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/oceanbase-ce/lib/
# 启动进程
cd /home/admin/oceanbase-ce && bin/observer
# 等待 10s 进程启动
sleep 10
# 反复确认进程启动时没有退出
ps -ef | grep observer | grep -v grep
# 等待 60s,等进程完全启动并恢复完毕
sleep 60
# 查看进程监听成功(默认监听 2881 和 2882 端口)
netstat -ntlp
# 在集群中查看节点状态(`status`)、开始服务时间(`start_service_time`)是否正常。
select a.zone,concat(a.svr_ip,':',a.svr_port) observer, cpu_total, (cpu_total-cpu_assigned) cpu_free, round(mem_total/1024/1024/1024) mem_total_gb, round((mem_total-mem_assigned)/1024/1024/1024) mem_free_gb, usec_to_time(b.last_offline_time) last_offline_time, usec_to_time(b.start_service_time) start_service_time, b.status, usec_to_time(b.stop_time) stop_time, b.build_version from __all_virtual_server_stat a join __all_server b on (a.svr_ip=b.svr_ip and a.svr_port=b.svr_port) order by a.zone, a.svr_ip;
```
只有第一个节点重启成功后,再重复操作第二个节点。
当然,如果只是测试,不在乎可用性。就可以忽略上面的确认过程,直接杀掉所有集群节点的进程,然后启动进程。这个时候集群节点起来后也许要几分钟恢复数据和通信。如果集群重启之前有大量的数据读写,这个节点进程的恢复时间可能会很长,要十几分钟甚至几十分钟。
## 使用 OBD 重启集群
上面是手动重启 OceanBase 集群节点的原理,下面是使用 OBD 工具自动化做这个操作。但是注意,当前 OBD 的重启集群可能并没有包含必要的检查操作,所以,测试环境可以用,生产环境要谨慎使用。
使用 OBD 重启集群的命令是:`obd cluster restart `
```bash
obd cluster restart obce-3zones
输出:
[admin@obce00 oceanbase-ce]$ obd cluster restart obce-3zones
Get local repositories and plugins ok
Open ssh connection ok
Stop observer ok
Stop obproxy ok
obce-3zones stopped
Get local repositories and plugins ok
Open ssh connection ok
Cluster param config check ok
Check before start observer ok
Check before start obproxy ok
Start observer ok
observer program health check ok
Connect to observer ok
Wait for observer init ok
+-------------------------------------------------+
| observer |
+---------------+---------+------+-------+--------+
| ip | version | port | zone | status |
+---------------+---------+------+-------+--------+
| 172.20.249.49 | 3.1.0 | 2881 | zone2 | active |
| 172.20.249.51 | 3.1.0 | 2881 | zone3 | active |
| 172.20.249.52 | 3.1.0 | 2881 | zone1 | active |
+---------------+---------+------+-------+--------+
Start obproxy ok
obproxy program health check ok
Connect to obproxy ok
Initialize cluster
+-------------------------------------------------+
| obproxy |
+---------------+------+-----------------+--------+
| ip | port | prometheus_port | status |
+---------------+------+-----------------+--------+
| 172.20.249.52 | 2883 | 2884 | active |
| 172.20.249.49 | 2883 | 2884 | active |
| 172.20.249.51 | 2883 | 2884 | active |
+---------------+------+-----------------+--------+
obce-3zones running
```
上面 OBD 重启集群的时候,默认重启了所有组件(包括 `OBSERVER``OBPROXY` )。也可以通过 `-c `命令指定重启具体的组件。
有关 OBPROXY 的重启特点跟 OBSERVER 是一样的,也有工作目录和启动参数。这里就先不介绍了。后面在 OceanBase 的运维章节也会介绍 OBPROXY 的相关运维。
# 常见问题
## 机器环境初始化问题
## `ulimit` 设置不生效
+ 现象
```bash
ulimit -a
...
stack size (kbytes, -s) 1024
...
```
此时,使用 admin 用户通过 ulimit -s 命令修改栈大小,操作系统报错 `cannot modify limit: Operation not permitted`
`ulimit` 问题设置不对,可能导致进程 OBSERVER 无法启动。
+ 原因
admin 用户 ulimit 配置未生效的原因可能是由于操作系统关闭了 PAM,PAM 用于限制登录用户的 ulimit 配置,如果不开启 PAM,则会使用 SSHD 的默认值(即 1024)。
+ 解决办法
修改 SSHD 配置文件 `sshd_config` ,取消对 `UsePAM yes` 的注释。
```bash
sudo vim /etc/ssh/sshd_config
UsePAM yes
```
重启 SSHD 服务。
```bash
sudo systemctl restart sshd
```
再次修改 `ulimit.conf` 文件
```
vim /etc/security/limits.conf
* soft nofile 655360
* hard nofile 655360
* soft nproc 655360
* hard nproc 655360
* soft core unlimited
* hard core unlimited
* soft stack unlimited
* hard stack unlimited
```
重新登录检查实际值,用命令:`ulimit -a`
## OBD 部署问题
## 目录非空
+ 现象
```bash
Initializes cluster work home x
[ERROR] fail to init zone1(172.20.249.53) data path: /data is not empty
```
+ 原因
CentOS 8.0 刚初始化的文件系统里目录里会有一个默认文件夹 `lost+found`
+ 解决办法
清空刚建的文件系统目录。
`sudo /bin/rm -rf /data/* /redo/*`
## 其他通用报错
+ 现象
`obd` 命令出错。
+ 原因
查看 `obd` 命令日志。
```bash
vim ~/.obd/log/obd + R
```
+ 解决办法
根据错误描述去解决。
## OBSERVER 启动失败
## 找不到共享库
+ 现象
手动启动进程 OBSERVER ,提示 共享库找不到。
```bash
[admin@obce02 ~]$ cd oceanbase-ce/
[admin@obce02 oceanbase-ce]$ bin/observer
bin/observer: error while loading shared libraries: libmariadb.so.3: cannot open shared object file: No such file or directory
```
+ 原因
没有将 OceanBase 的 LIB 加到环境变量 `LD_LIBRARY_PATH` 里。
LIB 目录如下:
```bash
[admin@obce02 ~]$ tree oceanbase-ce/
oceanbase-ce/
├── admin
├── bin
│   └── observer -> /home/admin/.obd/repository/oceanbase-ce/3.1.0/84bd2fe27f8b8243cc57d8a3f68b4c50f94aab80/bin/observer
<....>
├── lib
│   ├── libaio.so -> /home/admin/.obd/repository/oceanbase-ce/3.1.0/84bd2fe27f8b8243cc57d8a3f68b4c50f94aab80/lib/libaio.so
│   ├── libaio.so.1 -> /home/admin/.obd/repository/oceanbase-ce/3.1.0/84bd2fe27f8b8243cc57d8a3f68b4c50f94aab80/lib/libaio.so.1
│   ├── libaio.so.1.0.1 -> /home/admin/.obd/repository/oceanbase-ce/3.1.0/84bd2fe27f8b8243cc57d8a3f68b4c50f94aab80/lib/libaio.so.1.0.1
│   ├── libmariadb.so -> /home/admin/.obd/repository/oceanbase-ce/3.1.0/84bd2fe27f8b8243cc57d8a3f68b4c50f94aab80/lib/libmariadb.so
│   └── libmariadb.so.3 -> /home/admin/.obd/repository/oceanbase-ce/3.1.0/84bd2fe27f8b8243cc57d8a3f68b4c50f94aab80/lib/libmariadb.so.3
```
+ 解决办法
将 OceanBase 的 LIB 加到环境变量 `LD_LIBRARY_PATH` 里。也可以写到 `.bash_profile` 中。
```bash
echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/oceanbase-ce/lib/' >> ~/.bash_profile
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/oceanbase-ce/lib/
```
# 附录
## A1. 生产环境三节点 OceanBase 集群部署配置文件
生产环境机器内存大于 256G 时,参考下面配置文件。
```yaml
# Only need to configure when remote login is required
user:
username: admin
# password: your password if need
key_file: /home/admin/.ssh/id_rsa.pub
port: your ssh port, default 22
# timeout: ssh connection timeout (second), default 30
oceanbase-ce:
servers:
- name: obce01
# Please don't use hostname, only IP can be supported
ip: 172.20.249.53
- name: obce02
ip: 172.20.249.55
- name: obce03
ip: 172.20.249.56
global:
# Please set devname as the network adaptor's name whose ip is in the setting of severs.
# if set severs as "127.0.0.1", please set devname as "lo"
# if current ip is 192.168.1.10, and the ip's network adaptor's name is "eth0", please use "eth0"
devname: bond0
cluster_id: 2
# please set memory limit to a suitable value which is matching resource.
# memory_limit: 200G # The maximum running memory for an observer
# system_memory: 30G # The reserved system memory. system_memory is reserved for general tenants. The default value is 30G.
minor_freeze_times: 100
minor_warm_up_duration_time: 0
freeze_trigger_percentage: 40
enable_merge_by_turn: FALSE
datafile_disk_percentage: 50 # The percentage of the data_dir space to the total disk space. This value takes effect only when datafile_size is 0. The default value is 90.
# datafile_size: 500G
syslog_level: INFO # System log level. The default value is INFO.
enable_syslog_wf: false # Print system logs whose levels are higher than WARNING to a separate log file. The default value is true.
enable_syslog_recycle: true # Enable auto system log recycling or not. The default value is false.
max_syslog_file_count: 50 # The maximum number of reserved log files before enabling auto recycling. The default value is 0.
# observer cluster name, consistent with obproxy's cluster_name
appname: obce-3zones
root_password: 0EI5N08d # root user password, can be empty
proxyro_password: uY7Yf8zx # proxyro user pasword, consistent with obproxy's observer_sys_password, can be empty
obce01:
mysql_port: 2881 # External port for OceanBase Database. The default value is 2881.
rpc_port: 2882 # Internal port for OceanBase Database. The default value is 2882.
# The working directory for OceanBase Database. OceanBase Database is started under this directory. This is a required field.
home_path: /home/admin/oceanbase-ce
# The directory for data storage. The default value is $home_path/store.
data_dir: /data
# The directory for clog, ilog, and slog. The default value is the same as the data_dir value.
redo_dir: /redo
zone: zone1
obce02:
mysql_port: 2881 # External port for OceanBase Database. The default value is 2881.
rpc_port: 2882 # Internal port for OceanBase Database. The default value is 2882.
# The working directory for OceanBase Database. OceanBase Database is started under this directory. This is a required field.
home_path: /home/admin/oceanbase-ce
# The directory for data storage. The default value is $home_path/store.
data_dir: /data
# The directory for clog, ilog, and slog. The default value is the same as the data_dir value.
redo_dir: /redo
zone: zone2
obce03:
mysql_port: 2881 # External port for OceanBase Database. The default value is 2881.
rpc_port: 2882 # Internal port for OceanBase Database. The default value is 2882.
# The working directory for OceanBase Database. OceanBase Database is started under this directory. This is a required field.
home_path: /home/admin/oceanbase-ce
# The directory for data storage. The default value is $home_path/store.
data_dir: /data
# The directory for clog, ilog, and slog. The default value is the same as the data_dir value.
redo_dir: /redo
zone: zone3
obproxy:
servers:
- 172.20.249.53
- 172.20.249.55
- 172.20.249.56
# Set dependent components for the component.
# When the associated configurations are not done, OBD will automatically get the these configurations from the dependent components.
depends:
- oceanbase-ce
global:
listen_port: 2883 # External port. The default value is 2883.
prometheus_listen_port: 2884 # The Prometheus port. The default value is 2884.
home_path: /home/admin/obproxy
# oceanbase root server list
# format: ip:mysql_port;ip:mysql_port
rs_list: 172.20.249.53:2881;172.20.249.55:2881;172.20.249.56:2881
enable_cluster_checkout: false
# observer cluster name, consistent with oceanbase-ce's appname
cluster_name: obce-3zones
obproxy_sys_password: 0MdTv1tm # obproxy sys user password, can be empty
observer_sys_password: uY7Yf8zx # proxyro user pasword, consistent with oceanbase-ce's proxyro_password, can be empty
```
## A2. 测试环境 3台ECS 模拟 6节点集群配置文件
每个机器起 2 个节点,分别监听 2881/2882 和 3881/3882 。
```yaml
# Only need to configure when remote login is required
user:
username: admin
# password: your password if need
key_file: /home/admin/.ssh/id_rsa.pub
port: your ssh port, default 22
# timeout: ssh connection timeout (second), default 30
oceanbase-ce:
servers:
- name: obce01
# Please don't use hostname, only IP can be supported
ip: 172.20.249.53
- name: obce02
ip: 172.20.249.55
- name: obce03
ip: 172.20.249.56
- name: obce04
# Please don't use hostname, only IP can be supported
ip: 172.20.249.53
- name: obce05
ip: 172.20.249.55
- name: obce06
ip: 172.20.249.56
global:
# Please set devname as the network adaptor's name whose ip is in the setting of severs.
# if set severs as "127.0.0.1", please set devname as "lo"
# if current ip is 192.168.1.10, and the ip's network adaptor's name is "eth0", please use "eth0"
devname: eth0
cluster_id: 2
# please set memory limit to a suitable value which is matching resource.
memory_limit: 10G # The maximum running memory for an observer
system_memory: 3G # The reserved system memory. system_memory is reserved for general tenants. The default value is 30G.
stack_size: 512K
cpu_count: 16
cache_wash_threshold: 1G
__min_full_resource_pool_memory: 268435456
workers_per_cpu_quota: 10
schema_history_expire_time: 1d
# The value of net_thread_count had better be same as cpu's core number.
net_thread_count: 4
major_freeze_duty_time: Disable
minor_warm_up_duration_time: 0
freeze_trigger_percentage: 40
enable_separate_sys_clog: 0
enable_merge_by_turn: FALSE
#datafile_disk_percentage: 20 # The percentage of the data_dir space to the total disk space. This value takes effect only when datafile_size is 0. The default value is 90.
datafile_size: 50G
syslog_level: WARN # System log level. The default value is INFO.
enable_syslog_wf: false # Print system logs whose levels are higher than WARNING to a separate log file. The default value is true.
enable_syslog_recycle: true # Enable auto system log recycling or not. The default value is false.
max_syslog_file_count: 10 # The maximum number of reserved log files before enabling auto recycling. The default value is 0.
# observer cluster name, consistent with obproxy's cluster_name
appname: obce-3zones
root_password: 0EI5N08d # root user password, can be empty
proxyro_password: uY7Yf8zx # proxyro user pasword, consistent with obproxy's observer_sys_password, can be empty
obce01:
mysql_port: 2881 # External port for OceanBase Database. The default value is 2881.
rpc_port: 2882 # Internal port for OceanBase Database. The default value is 2882.
# The working directory for OceanBase Database. OceanBase Database is started under this directory. This is a required field.
home_path: /home/admin/oceanbase-ce
# The directory for data storage. The default value is $home_path/store.
data_dir: /data/1
# The directory for clog, ilog, and slog. The default value is the same as the data_dir value.
redo_dir: /redo/1
zone: zone1
obce02:
mysql_port: 2881 # External port for OceanBase Database. The default value is 2881.
rpc_port: 2882 # Internal port for OceanBase Database. The default value is 2882.
# The working directory for OceanBase Database. OceanBase Database is started under this directory. This is a required field.
home_path: /home/admin/oceanbase-ce
# The directory for data storage. The default value is $home_path/store.
data_dir: /data/1
# The directory for clog, ilog, and slog. The default value is the same as the data_dir value.
redo_dir: /redo/1
zone: zone2
obce03:
mysql_port: 2881 # External port for OceanBase Database. The default value is 2881.
rpc_port: 2882 # Internal port for OceanBase Database. The default value is 2882.
# The working directory for OceanBase Database. OceanBase Database is started under this directory. This is a required field.
home_path: /home/admin/oceanbase-ce
# The directory for data storage. The default value is $home_path/store.
data_dir: /data/1
# The directory for clog, ilog, and slog. The default value is the same as the data_dir value.
redo_dir: /redo/1
zone: zone3
obce04:
mysql_port: 3881 # External port for OceanBase Database. The default value is 2881.
rpc_port: 3882 # Internal port for OceanBase Database. The default value is 2882.
# The working directory for OceanBase Database. OceanBase Database is started under this directory. This is a required field.
home_path: /home/admin/oceanbase-ce2
# The directory for data storage. The default value is $home_path/store.
data_dir: /data/2
# The directory for clog, ilog, and slog. The default value is the same as the data_dir value.
redo_dir: /redo/2
zone: zone1
obce05:
mysql_port: 3881 # External port for OceanBase Database. The default value is 2881.
rpc_port: 3882 # Internal port for OceanBase Database. The default value is 2882.
# The working directory for OceanBase Database. OceanBase Database is started under this directory. This is a required field.
home_path: /home/admin/oceanbase-ce2
# The directory for data storage. The default value is $home_path/store.
data_dir: /data/2
# The directory for clog, ilog, and slog. The default value is the same as the data_dir value.
redo_dir: /redo/2
zone: zone2
obce06:
mysql_port: 3881 # External port for OceanBase Database. The default value is 2881.
rpc_port: 3882 # Internal port for OceanBase Database. The default value is 2882.
# The working directory for OceanBase Database. OceanBase Database is started under this directory. This is a required field.
home_path: /home/admin/oceanbase-ce2
# The directory for data storage. The default value is $home_path/store.
data_dir: /data/2
# The directory for clog, ilog, and slog. The default value is the same as the data_dir value.
redo_dir: /redo/2
zone: zone3
obproxy:
servers:
- 172.20.249.54
# Set dependent components for the component.
# When the associated configurations are not done, OBD will automatically get the these configurations from the dependent components.
depends:
- oceanbase-ce
global:
listen_port: 2883 # External port. The default value is 2883.
prometheus_listen_port: 2884 # The Prometheus port. The default value is 2884.
home_path: /home/admin/obproxy
# oceanbase root server list
# format: ip:mysql_port;ip:mysql_port
rs_list: 172.20.249.53:2881;172.20.249.55:2881;172.20.249.56:2881
enable_cluster_checkout: false
# observer cluster name, consistent with oceanbase-ce's appname
# cluster_name: obce-3zones
obproxy_sys_password: 0MdTv1tm # obproxy sys user password, can be empty
# observer_sys_password: uY7Yf8zx # proxyro user pasword, consistent with oceanbase-ce's proxyro_password, can be empty
```
## 如何快速体验 OceanBase
在部署 OceanBase 社区版之前,建议您快速通过 Docker 环境看一下一个部署好的 OceanBase 社区版环境。我们提供了一个 OceanBase 社区版 Docker 镜像,您可以在您的笔记本或电脑上使用 Docker 技术快速部署并启动 OceanBase 社区版的 Docker 容器。
### 机器资源要求
OceanBase Docker 容器对资源的要求如下:
+ 机器可用内存不少于 10G 。 注意,是剩余可用内存。
+ 机器磁盘目录空间不少于 10G 。少于 10G 后面使用可能会不是很方便。如遭遇空间目录问题。
+ CPU 建议至少有 2个 逻辑 CPU 。
### 安装 Docker
Docker 是免费软件,在 Windows、Linux、Mac 系统里都可以安装运行。下载和安装地址请参考 : [https://docs.docker.com/get-docker/](https://docs.docker.com/get-docker/)
Docker 安装后,对默认的容器资源有限制,这里需要手动调整一下。下面以 Mac电脑上的 Docker 设置为例说明。
![docker setting image](https://cdn.nlark.com/yuque/0/2021/jpeg/383093/1637565008173-ed6133b9-317b-4b98-8185-904410a377d1.jpeg)
+ 常用 Docker 命令参考
```bash
# 查看docker版本
docker version
# 显示docker系统的信息
docker info
# 日志信息
docker logs
# 故障检查
service docker status
# 启动关闭docker
service docker start | stop
# 查看容器日志
docker logs -f <容器名orID>
# 清理命令,危险!!!
# 清理不用的容器
docker container prune
# 清理不用的镜像
docker image prune
# 清理不用的卷
docker volume prune
```
### 下载镜像并启动
OceanBase Docker 镜像地址:[https://hub.docker.com/r/oceanbase/obce-mini](https://hub.docker.com/r/oceanbase/obce-mini)
镜像的源码地址在 Github 上:[https://github.com/oceanbase/oceanbase/tree/master/tools/docker/mini](https://github.com/oceanbase/oceanbase/tree/master/tools/docker/mini) 。有兴趣的朋友可以直接看看。
```bash
docker search oceanbase # 搜索 oceanbase 相关镜像
docker pull oceanbase/obce-mini
```
启动 OceanBase Docker 容器。
```bash
docker run -p 2881:2881 --name obce-mini -d -e OB_HOME_PATH="/root/obce/" -e OB_TENANT_NAME="obmysql" oceanbase/obce-mini
输出:
➜ ~ docker run -p 2881:2881 --name obce-mini -d -e OB_HOME_PATH="/root/obce/" -e OB_TENANT_NAME="obmysql" oceanbase/obce-mini
45180d71f504981ed588b7de0e5abf952511f2c2f9ee5eac0446b6cf0d4dc02c
➜ ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
45180d71f504 oceanbase/obce-mini "/bin/sh -c _boot" 4 seconds ago Up 2 seconds 0.0.0.0:2881->2881/tcp, :::2881->2881/tcp obce-mini
➜ ~
```
### 查看容器启动日志
刚启动的 OceanBase 需要几分钟初始化集群。可以查看容器启动日志。
```bash
docker logs obce-mini
输出:
➜ ~ docker logs obce-mini
generate boot.yaml ...
create boot dirs and deploy OceanBase cluster ...
Package oceanbase-ce-3.1.0 is available.
install oceanbase-ce-3.1.0 for local ok
+-----------------------------------------------------------------------------+
| Packages |
+--------------+---------+---------+------------------------------------------+
| Repository | Version | Release | Md5 |
+--------------+---------+---------+------------------------------------------+
| oceanbase-ce | 3.1.0 | 2.el7 | afd11d52f83eef4b456d77969fde620c4bfba85e |
+--------------+---------+---------+------------------------------------------+
Open ssh connection ok
Remote oceanbase-ce-3.1.0-afd11d52f83eef4b456d77969fde620c4bfba85e repository install ok
Remote oceanbase-ce-3.1.0-afd11d52f83eef4b456d77969fde620c4bfba85e repository lib check !!
[WARN] 127.0.0.1 oceanbase-ce-3.1.0-afd11d52f83eef4b456d77969fde620c4bfba85e require: libaio.so.1
[WARN] 127.0.0.1 oceanbase-ce-3.1.0-afd11d52f83eef4b456d77969fde620c4bfba85e require: libmariadb.so.3
Try to get lib-repository
Package oceanbase-ce-libs-3.1.0 is available.
install oceanbase-ce-libs-3.1.0 for local ok
Use oceanbase-ce-libs-3.1.0-47300ca1ac4c62493caf3e9235b105e242e533b5 for oceanbase-ce-3.1.0-afd11d52f83eef4b456d77969fde620c4bfba85e
Remote oceanbase-ce-libs-3.1.0-47300ca1ac4c62493caf3e9235b105e242e533b5 repository install ok
Remote oceanbase-ce-3.1.0-afd11d52f83eef4b456d77969fde620c4bfba85e repository lib check ok
Cluster status check ok
127.0.0.1 initializes cluster work home
mini-ce deployed
start OceanBase cluster ...
Get local repositories and plugins ok
Open ssh connection ok
Cluster param config check ok
Check before start observer ok
Start observer ok
observer program health check ok
Connect to observer ok
Initialize cluster
Cluster bootstrap ok
Wait for observer init ok
+---------------------------------------------+
| observer |
+-----------+---------+------+-------+--------+
| ip | version | port | zone | status |
+-----------+---------+------+-------+--------+
| 127.0.0.1 | 3.1.0 | 2881 | zone1 | active |
+-----------+---------+------+-------+--------+
mini-ce running
generate init_tenant.sql ...
init tenant and sysbench database ...
boot success!
```
分析上面日志可以看出几点信息:
+ 会安装两个软件包:`oceanbase-ce-libs``oceanbase-ce-3.1.0`
+ 先初始化集群目录。
+ 然后初始化集群(`bootstrap`)。
+ 再初始化业务租户(`tenant`)。
### 分析OB 进程特点
进入容器
```bash
docker exec -it obce-mini bash
```
查看 OceanBase 社区版的 YUM 仓库
```bash
[root@45180d71f504 ~]# cat /etc/yum.repos.d/OceanBase.repo
输出:
# OceanBase.repo
[oceanbase.community.stable]
name=OceanBase-community-stable-el$releasever
baseurl=http://mirrors.aliyun.com/oceanbase/community/stable/el/$releasever/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/oceanbase/RPM-GPG-KEY-OceanBase
[oceanbase.development-kit]
name=OceanBase-development-kit-el$releasever
baseurl=http://mirrors.aliyun.com/oceanbase/development-kit/el/$releasever/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/oceanbase/RPM-GPG-KEY-OceanBase
```
查看 OBSERVER 进程特点。分析一个陌生环境的 OceanBase 集群节点进程,首先通过下面命令确定其启动位置、启动文件和启动参数等。
```bash
yum -y install sysvinit-tools
[root@45180d71f504 ~]# ps -ef|grep observer
root 85 1 99 01:50 ? 15:27:38 /root/.obd/repository/oceanbase-ce/3.1.0/afd11d52f83eef4b456d77969fde620c4bfba85e/bin/observer -r 127.0.0.1:2882:2881 -o __min_full_resource_pool_memory=268435456,memory_limit=8G,system_memory=4G,stack_size=512K,cpu_count=16,cache_wash_threshold=1G,workers_per_cpu_quota=10,schema_history_expire_time=1d,net_thread_count=4,sys_bkgd_migration_retry_num=3,minor_freeze_times=10,enable_separate_sys_clog=0,enable_merge_by_turn=False,enable_auto_leader_switch=False,enable_one_phase_commit=False,weak_read_version_refresh_interval=5s,trace_log_slow_query_watermark=10s,large_query_threshold=1s,clog_sync_time_warn_threshold=2000ms,syslog_io_bandwidth_limit=10M,enable_sql_audit=False,enable_perf_event=False,clog_max_unconfirmed_log_count=5000,autoinc_cache_refresh_interval=86400s,cpu_quota_concurrency=2,datafile_size=5G,enable_syslog_recycle=True,max_syslog_file_count=2,enable_early_lock_release=false tenant=all,default_compress_func=lz4_1.0,root_password=None -z zone1 -p 2881 -P 2882 -c 1 -d /root/obce//store -i lo -l WARN
root 663 606 0 04:41 pts/0 00:00:00 grep --color=auto observer
[root@45180d71f504 ~]# ll /proc/`pidof observer`/{cwd,exe,cmdline}
-r--r--r-- 1 root root 0 Sep 11 01:47 /proc/85/cmdline
lrwxrwxrwx 1 root root 0 Sep 11 01:47 /proc/85/cwd -> /root/obce
lrwxrwxrwx 1 root root 0 Sep 11 01:47 /proc/85/exe -> /root/.obd/repository/oceanbase-ce/3.1.0/afd11d52f83eef4b456d77969fde620c4bfba85e/bin/observer
[root@45180d71f504 ~]# cat /proc/`pidof observer`/cmdline
/root/.obd/repository/oceanbase-ce/3.1.0/afd11d52f83eef4b456d77969fde620c4bfba85e/bin/observer-r127.0.0.1:2882:2881-o__min_full_resource_pool_memory=268435456,memory_limit=8G,system_memory=4G,stack_size=512K,cpu_count=16,cache_wash_threshold=1G,workers_per_cpu_quota=10,schema_history_expire_time=1d,net_thread_count=4,sys_bkgd_migration_retry_num=3,minor_freeze_times=10,enable_separate_sys_clog=0,enable_merge_by_turn=False,enable_auto_leader_switch=False,enable_one_phase_commit=False,weak_read_version_refresh_interval=5s,trace_log_slow_query_watermark=10s,large_query_threshold=1s,clog_sync_time_warn_threshold=2000ms,syslog_io_bandwidth_limit=10M,enable_sql_audit=False,enable_perf_event=False,clog_max_unconfirmed_log_count=5000,autoinc_cache_refresh_interval=86400s,cpu_quota_concurrency=2,datafile_size=5G,enable_syslog_recycle=True,max_syslog_file_count=2,enable_early_lock_release=false tenant=all,default_compress_func=lz4_1.0,root_password=None-zzone1-p2881-P2882-c1-d
/root/obce//store-ilo-lWARN
[root@45180d71f504 ~]#
```
从上面可以看出 `observer` 进程几点信息:
+ 进程启动目录是在 `/root/obce` 下。
+ 进程可执行文件目录在 `/root/.obd/repository/oceanbase-ce/3.1.0/afd11d52f83eef4b456d77969fde620c4bfba85e/bin/` 下。这个目录是 OBD 安装 OceanBase 软件的目录,里面带了具体的版本号。目录比较长,OBD 后面版本已经将这个目录映射到 `/root/obce/bin/` 下了。
+ 进程的启动参数很长。部分参数含义后面再详细介绍。
查看进程监听端口。`observer` 进程会监听 2 个端口。一个 连接端口 2881, 一个 RPC 通信端口 2882 。
```bash
yum install -y net-tools
netstat -ntlp
输出:
[root@45180d71f504 85]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:2881 0.0.0.0:* LISTEN 85/observer
tcp 0 0 0.0.0.0:2882 0.0.0.0:* LISTEN 85/observer
```
查看 OceanBase 工作目录结构,这个很有必要。
```bash
yum -y install tree
tree /root/ob
[root@45180d71f504 ~]# tree /root/ob
/root/ob [error opening dir]
0 directories, 0 files
[root@45180d71f504 ~]# tree /root/obce/
/root/obce/
|-- admin
|-- etc
| |-- observer.config.bin
| `-- observer.config.bin.history
|-- etc2
| |-- observer.conf.bin
| `-- observer.conf.bin.history
|-- etc3
| |-- observer.conf.bin
| `-- observer.conf.bin.history
|-- log
| |-- election.log
| |-- election.log.wf
| |-- observer.log
| |-- observer.log.wf
| |-- rootservice.log
| `-- rootservice.log.wf
|-- run
| |-- mysql.sock
| `-- observer.pid
`-- store
|-- clog
| `-- 1
|-- clog_shm
|-- ilog
| `-- 1
|-- ilog_shm
|-- slog
| `-- 1
`-- sstable
`-- block_file
```
如果您是手动部署 OceanBase 节点,这个工作目录下的子目录结构是要手动维护好。否则,`observer` 可能启动失败。使用自动化部署软件 OBD 的时候,会自动创建相应目录。
| 目录路径(相对于工作目录) | 备注 |
|---------------|---------------------|
| etc etc2 etc3 | 配置文件所在目录 |
| log | 运行日志目录 |
| run | 运行输出目录,输出pid文件 |
| store | 数据(包括日志)所在总目录 |
| store/clog | commit log所在目录 |
| store/ilog | ilog 所在目录 |
| store/slog | slog所在目录 |
| store/sstable | 数据文件block file所在目录。 |
注意:这个 Docker 示例把 OceanBase 安装在 `root` 用户目录下,并以 `root` 用户运行,这个只是是学习用。生产环境不要以 `root` 用户部署和运行 OceanBase 。
# 如何规划 OceanBase 集群部署
## 集群架构规划
OceanBase 以集群形态运行,生产环境最小规模是 3 台服务器(节点)。整个集群里,业务数据会有三份,所以也叫三副本。
学习测试的时候,可以部署单副本单节点 OceanBase 集群。
这里特别说明的是,单副本跟单节点并不完全对等。单副本单节点是最小集群规模,单副本也是可以扩容为多个节点,整个集群里数据依然是一份,所以叫单副本。
生产环境,每个机器上启动一个 `observer` 进程,所以一台机器就对应一个节点。学习环境,一个机器可以启动多个 `observer` 进程,模拟多个节点。每个节点的监听端口(默认是 2881 和 2882 )、数据总目录是独立的,互不冲突。每个节点进程启动的最小内存是 10G ,空间需要至少 10G 。
所以,如果只有一台服务器,如果机器可用内存不足 10G, 则不能启动 `observer` 进程。如果可用内存在10G ~ 20G 之间,则只可以启动一个 `observer` 进程。如果可用内存在 20G ~ 30G 之间,可以启动 2 个 `observer` 进程。如果可用内存超过 30G ,则可以启动 3个 `observer` 进程。当然,内存充足的时候,也可以调大每个 `observer` 进程能获取的内存。内存越大,节点的资源能力就越大。如果有三台机器,就没必要在一个机器上模拟多个节点了。
除了要部署 `observer` 进程,还需要部署 `obproxy``obproxy` 也是单进程软件,是访问 OceanBase 的反向代理。虽然 `observer` 节点都可以直接访问,生产环境还是建议通过 `obproxy` 访问 OceanBase 集群。
`obproxy` 进程部署位置没有要求。可以部署在应用服务器上,也可以部署在独立的机器上,或者部署在 OceanBase 机器上。`obproxy` 可以部署多个,生产环境建议至少部署两个。
## 用户规划
OceanBase 本质上是一个软件,可以运行在任意用户下。OceanBase 软件包默认解压目录是在 `/home/admin/` 下,生产环境默认也是安装在用户 `admin` 下。社区版的软件 RPM 包也是这个特点,支持部署在任意用户的任意目录下。
为了安全起见,我们不建议在 `root` 用户下直接部署。所以后面都以部署在用户 `admin` 下为前提。在部署之前初始化环境的时候,可能需要修改操作系统的配置,或者设置目录的权限等,这些操作需要 `root` 用户权限。不同客户内部主机登录规范不一样,可以通过 `su` 切换到 `root` 用户,或者给 `admin` 用户增加 `sudo` 权限。
## 目录规划
`observer` 有关的目录有好几个:
+ 软件安装目录。
如果是安装 OceanBase 的 RPM 包,则需要提前创建好用户 `admin` ,并被自动安装在目录 `/home/admin/oceanbase` 下。
```bash
[root@obce00 ~]# useradd admin
[root@obce00 ~]# rpm -ivh rpm/*
准备中... ################################# [100%]
正在升级/安装...
1:oceanbase-ce-libs-3.1.0-1.el7 ################################# [ 33%]
2:oceanbase-ce-3.1.0-1.el7 ################################# [ 67%]
3:obproxy-3.1.0-1.el7 ################################# [100%]
[root@obce00 ~]# rpm -ql oceanbase-ce-3.1.0-1.el7.x86_64
/home/admin/oceanbase
/home/admin/oceanbase/bin
/home/admin/oceanbase/bin/import_time_zone_info.py
/home/admin/oceanbase/bin/observer
/home/admin/oceanbase/etc
/home/admin/oceanbase/etc/timezone_V1.log
[root@obce00 ~]# rpm -ql obproxy-3.1.0-1.el7
/home/admin/obproxy-3.1.0/bin
/home/admin/obproxy-3.1.0/bin/obproxy
/home/admin/obproxy-3.1.0/bin/obproxyd.sh
```
如果是通过OBD 软件自动化安装,则会将 RPM 包解压到 用户 HOME 目录的隐藏文件夹 `.obd` 下,如:`/.obd/repository/oceanbase-ce/3.1.0/afd11d52f83eef4b456d77969fde620c4bfba85e` 。这种方式是可以同时部署多个版本。
后面讲解部署方法会首先介绍 OBD 软件自动化部署方法。手动部署方法留在最后,供感兴趣的朋友参考。
# 如何初始化服务器环境
OceanBase 数据库是单进程软件,需要访问网络,需要打开多个文件以及开启很多 TCP 连接,所以需要修改内核参数和用户会话设置。
注意:OBProxy 软件如果独立服务器部署的话,也按这个要求初始化服务器环境。
## 内核参数修改
修改配置文件。
```bash
vim /etc/sysctl.conf
net.core.somaxconn = 2048
net.core.netdev_max_backlog = 10000
net.core.rmem_default = 16777216
net.core.wmem_default = 16777216
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.ip_local_port_range = 3500 65535
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_slow_start_after_idle=0
vm.swappiness = 0
vm.min_free_kbytes = 2097152
vm.max_map_count=655360
fs.aio-max-nr=1048576
```
让配置生效
```bash
sysctl -p
```
## 修改会话变量设置
您可以通过配置 `limits.conf` 限制修改会话限制。 OceanBase 数据库的进程涉及的限制包括线程最大栈空间大小(Stack)、最大文件句柄数(Open Files)和 core 文件大小 (Core File Size)。
您可以使用以下两种方法修改资源限制:
+ 通过启动时在会话级别修改。如:` ulimit -c unlimited ` , 只影响当前会话。如果会话断开重连了,则又是默认配置。
+ 通过配置文件 `/etc/security/limits.conf` 在全局级别修改。注意修改后,已经登录的会话需要退出重登录才生效。
更改配置文件说明。
将会话级别的最大栈空间大小设置为 `unlimited`,最大文件句柄数设置为 655350,Core 文件大小设置为 `unlimited`
修改 `/etc/security/limits.conf` 配置文件,如果已有设置值低于这个设置值
```bash
vi /etc/security/limits.conf
* soft nofile 655360
* hard nofile 655360
* soft nproc 655360
* hard nproc 655360
* soft core unlimited
* hard core unlimited
* soft stack unlimited
* hard stack unlimited
```
查看配置方法。退出当前会话,重新登录。执行以下命令,查看配置是否生效:
```bash
ulimit -a
```
## 关闭防火墙和 SELinux
不同操作系统的防火墙设置可能有点不同,下面以 CentOS 系统为例。
+ 关闭防火墙
查看防火墙状态
```bash
systemctl status firewalld
```
如果是 `inactive` 那就不用管。如果是 `active`,那就永久关闭
```bash
systemctl disable firewalld
systemctl stop firewalld
systemctl status firewalld
```
+ 关闭 SELinux
修改 SELinux 配置文件中的 `SELINUX` 选项。
注意:必须使用注释中的三个值之一。如果写错了,机器重启后操作系统会报错起不来,那时候就只能进入单用户模式修改了。
```bash
vi /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
```
配置文件修改后只会重启主机后生效,还需要使用下面命令立即生效。
```bash
setenforce 0
```
## 配置时间同步服务
OceanBase 是分布式数据库产品,是一个集群软件,对各个节点之间的时间同步性有要求。技术上要求所有节点之间的时间误差控制在 50ms 以内。实际生产环境为了稳定性和性能考虑,建议时间误差控制在 10ms 以内。通常只要节点配置时间同步服务器跟公网时间保持同步即可。实际上在企业机房里,企业会有统一的时间服务器跟机房提供的时间服务器或者直接跟公网时间服务器同步,OceanBase 节点只需要跟机房统一的时间服务器进行同步即可。
CentOS 或 RedHat 7.x 版本推荐使用 `chrony` 服务做时间源。`Chrony` 是 NTP(`Network Time Protocol`,网络时间协议,服务器时间同步的一种协议)的另一种实现,与 `ntpd` 不同,它可以更快且更准确地同步系统时钟,最大程度的减少时间和频率误差。
+ 判断是否使用 `ntpd` 同步时间。
```bash
systemctl status ntpd
Unit ntpd.service could not be found.
```
如果提示上面这个信息,表示没有使用 `ntpd`,那就继续。
如果提示有 ntpd 服务,就卸载 `ntpd` 软件。
+ 安装 `chrony` 服务
这里采用 YUM 安装方法。您也可以下载相应的 RPM 包安装。
```bash
yum -y install chrony
```
+ `chrony` 配置说明
`chrony` 服务守护进程名是 `chronyd``chronyc` 是用来监控 `chronyd` 性能和配置参数的命令行工具。
`chrony` 的主配置文件: `/etc/chrony.conf` 。配置方法如下:
```bash
vi /etc/chrony.conf
# server 后面跟时间同步服务器
# 使用pool.ntp.org 项目中的公共服务器。按 server 配置,理论上您想添加多少时间服务器都可以。
# 或者使用 阿里云的 ntp 服务器
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server ntp.cloud.aliyuncs.com minpoll 4 maxpoll 10 iburst
server ntp.aliyun.com minpoll 4 maxpoll 10 iburst
server ntp1.aliyun.com minpoll 4 maxpoll 10 iburst
server ntp1.cloud.aliyuncs.com minpoll 4 maxpoll 10 iburst
server ntp10.cloud.aliyuncs.com minpoll 4 maxpoll 10 iburst
# 如果是测试环境,没有时间同步服务器,那就选取一台配置为时间同步服务器。
# 如果选中的是本机,则取消下面 server 注释
#server 127.127.1.0
# 根据实际时间计算出服务器增减时间的比率,然后记录到一个文件中,在系统重启后为系统做出最佳时间补偿调整。
driftfile /var/lib/chrony/drift
# chronyd 根据需求减慢或加速时间调整,
# 在某些情况下系统时钟可能漂移过快,导致时间调整用时过长。
# 该指令强制 chronyd 调整时期,大于某个阀值时步进调整系统时钟。
# 只有在因 chronyd 启动时间超过指定的限制时(可使用负值来禁用限制)没有更多时钟更新时才生效。
makestep 1.0 3
# 将启用一个内核模式,在该模式中,系统时间每11分钟会拷贝到实时时钟(RTC)。
rtcsync
# Enable hardware timestamping on all interfaces that support it.
# 通过使用hwtimestamp指令启用硬件时间戳
#hwtimestamp eth0
#hwtimestamp eth1
#hwtimestamp *
# Increase the minimum number of selectable sources required to adjust
# the system clock.
#minsources 2
# 指定一台主机、子网,或者网络以允许或拒绝NTP连接到扮演时钟服务器的机器
#allow 192.168.0.0/16
#deny 192.168/16
# 即使没有同步到时间源,也要服务时间
local stratum 10
# 指定包含NTP验证密钥的文件。
#keyfile /etc/chrony.keys
# 指定日志文件的目录。
logdir /var/log/chrony
# Select which information is logged.
#log measurements statistics tracking
```
最简单的配置文件如下:
```bash
server 127.127.1.0
allow 172.20.0.0/16
local stratum 10
```
+ 常用一些命令
使用 `chrony` 时间服务是为了保证 OceanBase 集群各个节点时间尽可能保证同步,下面这些命令供参考。具体使用请查看 `chrony` 官方使用说明:[Chronyc Frequently Asked Questions](https://chrony.tuxfamily.org/faq.html)
```bash
查看时间同步活动
chronyc activity
查看时间服务器
chronyc sources
查看同步状态
chronyc sources -v
校准时间服务器:
chronyc tracking
```
使用 `clockdiff` 命令可以检查本机跟目标机器的时间同步误差,以这个结果为准。
```bash
```
## (可选)时区设置
如果时间显示跟当前实际时间差异很大的时候,请查看确认当前系统时区。
```bash
timedatectl
输出:
[root@obce00 ~]# timedatectl
Local time: 六 2021-09-11 07:37:22 CST
Universal time: 五 2021-09-10 23:37:22 UTC
RTC time: 六 2021-09-11 07:37:22
Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
NTP service: active
RTC in local TZ: yes
Warning: The system is configured to read the RTC time in the local time zone.
This mode cannot be fully supported. It will create various problems
with time zone changes and daylight saving time adjustments. The RTC
time is never updated, it relies on external facilities to maintain it.
If at all possible, use RTC in UTC by calling
'timedatectl set-local-rtc 0'.
```
查看所有可用时区。
```bash
timedatectl list-timezones
```
设置当前系统时区方法如下。设置完时区后,强制同步下系统时钟。
```bash
timedatectl set-timezone Asia/Shanghai
chronyc -a makestep
输出:
[root@obce00 ~]# chronyc -a makestep
200 OK
```
## 配置安装用户
前面分析过,建议安装部署在普通用户下,后面都以用户 `admin` 为例。
注意:给用户 `admin``sudo` 权限不是必须的,只是为了某些时候方便。您可以结合企业安全规范决定是否执行。
下面是创建用户 `admin` 并授予 `sudo` 权限的方法,供参考。
```bash
# 新增普通用户 admin
useradd admin
# 改用户密码
passwd admin
# 或下面命令指定密码,密码修改为自己的。
echo 'admin:adminPWD123' | chpasswd
```
在 CentOS 上面给 `admin` 用户 增加 `sodu` 权限有两个方法:
+ 把用户加到 用户组 `wheel` 里。
+ 把用户加到 `/etc/sudoers` 文件里。
```bash
# 如果sudo 不存在,就安装 sudo
yum install -y sudo
# 方法一:admin 加到用户组 wheel 里。
[root@obce00 ~]# usermod admin -G wheel
[root@obce00 ~]# id admin
uid=1000(admin) gid=1000(admin) groups=1000(admin),10(wheel)
# 方法二:admin 添加到 /etc/sudoers 文件中
[root@obce00 ~]# cat /etc/sudoers |grep wheel
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
# %wheel ALL=(ALL) NOPASSWD: ALL
vim /etc/sudoers
## Allow root to run any commands anywhere
admin ALL=(ALL) ALL
```
验证方法,切换到 `admin` 用户下,执行命令:`sudo date` 。输入密码后能返回结果。
## 配置 SSH 免密登录
如果您是完全手动部署 OceanBase 集群,则登录到相应节点上安装相关软件包,并启动 `observer``obproxy` 进程,则不需要配置 SSH 免密登录。
如果您是使用自动化技术部署 OceanBase 集群,则需要一台中控机。所有的命令通过中控机向 OceanBase 集群节点发出。则需要配置中控机的 OBD 运行的用户到 OceanBase 集群节点的 OBSERVER 安装的用户的 SSH 免密登录。本文示例是中控机的用户 `admin` 到 OBSERVER 节点的用户 `admin` 的免密登录。
这个配置 SSH 免密登录方法有很多,这里选择将中控机的 RSA 或 DSA 公钥复制到目标节点的 SSH 配置文件中。
+ 在中控机生成 RSA 或 DSA 公钥和私钥
```bash
ssh-keygen -t rsa
输出:
[admin@obce00 ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/admin/.ssh/id_rsa):
Created directory '/home/admin/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/admin/.ssh/id_rsa.
Your public key has been saved in /home/admin/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:7yCIks5NT8j7L1XIq+gRL3qm04cvHTSQmlaNr4gdHqc admin@obce00
The key's randomart image is:
+---[RSA 3072]----+
| + |
| = . |
| + o . . |
| +o .+ o . |
|oo.*o . S |
|.oEo+o o . |
|o o*=o= . . |
|oo+B*= . o |
| =*+=+o. . |
+----[SHA256]-----+
[admin@obce00 ~]$
[admin@obce00 ~]$ ls -al .ssh/
total 8
drwx------ 2 admin admin 38 Sep 11 14:43 .
drwx------ 4 admin admin 115 Sep 11 14:43 ..
-rw------- 1 admin admin 2602 Sep 11 14:43 id_rsa
-rw-r--r-- 1 admin admin 569 Sep 11 14:43 id_rsa.pub
```
上面命令会在用户的 HOME 目录生成文件夹 `.ssh` 。注意,不要改变文件夹以及里面文件的访问权限。
+ 打通到本机的 SSH 免密登录
复制 RSA 或 DSA 公钥到目标节点,推荐使用命令 `ssh-copy-id`
```bash
[admin@obce00 ~]$ ssh-copy-id `hostname -i`
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/admin/.ssh/id_rsa.pub"
The authenticity of host '172.20.249.50 (172.20.249.50)' can't be established.
ECDSA key fingerprint is SHA256:Zyyq5dY+05pkdqGCm6K43s97l8DUGv0LjY5t+zrdVkE.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
admin@172.20.249.50's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '172.20.249.50'"
and check to make sure that only the key(s) you wanted were added.
[admin@obce00 ~]$ ls -al .ssh
total 16
drwx------ 2 admin admin 80 Sep 11 14:44 .
drwx------ 4 admin admin 115 Sep 11 14:43 ..
-rw------- 1 admin admin 569 Sep 11 14:44 authorized_keys
-rw------- 1 admin admin 2602 Sep 11 14:43 id_rsa
-rw-r--r-- 1 admin admin 569 Sep 11 14:43 id_rsa.pub
-rw-r--r-- 1 admin admin 175 Sep 11 14:44 known_hosts
[admin@obce00 ~]$
```
## 磁盘文件系统划分
OceanBase 读写磁盘主要是三类文件:
+ 运行日志。在启动目录下的 `log` 目录里。主要记录进程 `observer` 的运行日志、选举服务的运行日志和 `rootservice` 的运行日志。主要读写特点是顺序写。
+ 数据文件。主要是指数据文件 `block_file` ,一次性初始化大小,后面可以在线扩容,但是不能缩容。主要读写特点是随机读、顺序写。偶尔密集的随机写。
+ 事务日志文件。主要是指事务和 `sstable` 相关的日志 ,包括 `clog``ilog``slog` 等。主要读写特点是顺序写。
这三个文件尽可能的分散在不同的磁盘上存储。如果物理上只有一块盘,则可以使用 `fdisk``lvm` 划分为多个逻辑盘。
下面针对机器提供的裸盘(`/dev/vdb`) 演示如何分盘。
+ 方法一是使用 `fdisk` 直接将 `/dev/vdb` 划分为两个逻辑盘 (`/dev/vdb1``/dev/vdb2` )。
这个方法的缺陷是这里 `/dev/vdb` 是云盘,后期还可以扩容,使用 `fdisk` 分盘后,扩容比较麻烦。
+ 方法二是对 `/dev/vdb` 使用 LVM 技术,划分出两个 LV 出来,一个给数据文件用,一个给日志文件。
`fdisk` 或者 `parted`,以及 LVM 技术都是磁盘划分组合的手段。这里就不详细描述方法。
不管是哪种办法,优先考虑事务日志文件的大小,生产环境建议是可用内存大小的 3-4 倍。剩余的大小再留给数据文件。如果是学习环境,总的盘大小本身就很小,可以不遵守这个规则,日志文件大小比内存大 1-2 倍也可以。
注意: OBProxy 独立部署的服务器就不用做这个文件系统划分了。OBProxy 只有运行日志目录。
\ No newline at end of file
# 如何安装 OBD
OBD 全称是 OceanBase Deploy,是 OceanBase 社区版的命令行下自动化部署软件。
根据中控机器能否连接公网,提供两个安装方法:离线和在线。二选一。
## 安装 OBD 软件(离线)
首先在中控机上部署 OBD 软件。如果中控机不能上网,则需要提前下载好 OBD 、 OBSERVER 和 OBPROXY 相关软件包。
+ 下载相关软件包
软件包地址:[https://mirrors.aliyun.com/oceanbase/community/stable/el/8/x86_64/](https://mirrors.aliyun.com/oceanbase/community/stable/el/8/x86_64/)
```bash
wget https://mirrors.aliyun.com/oceanbase/community/stable/el/8/x86_64/ob-deploy-1.1.0-1.el8.x86_64.rpm
wget https://mirrors.aliyun.com/oceanbase/community/stable/el/8/x86_64/oceanbase-ce-3.1.0-3.el8.x86_64.rpm
wget https://mirrors.aliyun.com/oceanbase/community/stable/el/8/x86_64/oceanbase-ce-libs-3.1.0-3.el8.x86_64.rpm
wget https://mirrors.aliyun.com/oceanbase/community/stable/el/8/x86_64/obclient-2.0.0-2.el8.x86_64.rpm
wget https://mirrors.aliyun.com/oceanbase/community/stable/el/8/x86_64/libobclient-2.0.0-2.el8.x86_64.rpm
wget https://mirrors.aliyun.com/oceanbase/community/stable/el/8/x86_64/obproxy-3.1.0-1.el8.x86_64.rpm
```
将上面文件都复制到中控机上临时目录。
+ 离线安装 OBD
```bash
[admin@obce00 obd]$ sudo rpm -ivh ob-deploy-1.1.0-1.el8.x86_64.rpm
[sudo] password for admin:
warning: ob-deploy-1.1.0-1.el8.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID e9b4a7aa: NOKEY
Verifying... ################# [100%]
Preparing... ################# [100%]
Updating / installing...
1:ob-deploy-1.1.0-1.el8 ################# [100%]
Installation of obd finished successfully
Please source /etc/profile.d/obd.sh to enable it
[admin@obce00 obd]$ source /etc/profile.d/obd.sh
[admin@obce00 obd]$ which obd
/usr/bin/obd
```
`ob-deploy` 软件默认安装在 `/usr/obd` 下。不同版本可能有点变化。可以通过下面命令查看位置。
```bash
rpm -ql `rpm -qa|grep ob-deploy`
```
但是 OBD 工作的文件都在当前用户 HOME 目录下:`~/.obd/`
```bash
[admin@obce00 ~]$ tree ~/.obd -L 1
/home/admin/.obd
├── cluster
├── log
├── mirror
├── obd.conf
├── plugins
├── repository
└── version
5 directories, 2 files
```
命令 `obd` 使用帮助,可以直接用 `-h` 查看。
```bash
obd -h
输出:
[admin@obce00 ~]$ obd -h
Usage: obd <command> [options]
Available commands:
cluster Deploy and manage a cluster.
mirror Manage a component repository for OBD.
repo Manage local repository for OBD.
test Run test for a running deploy deployment.
update Update OBD.
Options:
--version show program's version number and exit
-h, --help Show help and exit.
-v, --verbose Activate verbose output.
```
+ 将软件包加到离线仓库
首先要删除远程仓库,使用下面命令。
注意:下面命令要在部署运行 OBD 的操作系统用户下操作。这里是用户 `admin`
```bash
/bin/rm -rf ~/.obd/mirror/remote/OceanBase.repo
```
然后将前面的软件包都复制到本地仓库,使用下面命令。
```bash
obd mirror clone /tmp/obd/*.rpm
```
查看仓库的RPM列表。
```bash
obd mirror list local
输出:
[admin@obce00 ~]$ obd mirror list local
+-------------------------------------------------------------------------------------------+
| local Package List |
+-------------------+---------+---------+--------+------------------------------------------+
| name | version | release | arch | md5 |
+-------------------+---------+---------+--------+------------------------------------------+
| libobclient | 2.0.0 | 2.el8 | x86_64 | 358a90b4a47da193140c3bee023b2450126de4c6 |
| obclient | 2.0.0 | 2.el8 | x86_64 | 71753559d82e9f6c0b8a6d949b9a5194c6c53dc6 |
| ob-deploy | 1.1.0 | 1.el8 | x86_64 | 0c84129b699aca0b43fdfb01fb2c4439f36ff856 |
| obproxy | 3.1.0 | 1.el8 | x86_64 | d242ea5fe45222b8f61c3135ba2aaa778c61ea22 |
| oceanbase-ce | 3.1.0 | 3.el8 | x86_64 | 84bd2fe27f8b8243cc57d8a3f68b4c50f94aab80 |
| oceanbase-ce-libs | 3.1.0 | 3.el8 | x86_64 | 1c20be0df8929f843e9bdd509de4916f883d62f8 |
+-------------------+---------+---------+--------+------------------------------------------+
[admin@obce00 ~]$
```
## 安装 OBD 软件(在线)
首先在中控机上部署 OBD 软件。如果中控机能上网,则可以直接添加 OceanBase 的仓库,使用 YUM 安装。
```bash
yum install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/oceanbase/OceanBase.repo
yum install -y ob-deploy
```
查看一下 `OceanBase.repo` 内容。
```bash
cat /etc/yum.repos.d/OceanBase.repo
输出:
# OceanBase.repo
[oceanbase.community.stable]
name=OceanBase-community-stable-el$releasever
baseurl=http://mirrors.aliyun.com/oceanbase/community/stable/el/$releasever/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/oceanbase/RPM-GPG-KEY-OceanBase
[oceanbase.development-kit]
name=OceanBase-development-kit-el$releasever
baseurl=http://mirrors.aliyun.com/oceanbase/development-kit/el/$releasever/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/oceanbase/RPM-GPG-KEY-OceanBase
```
# 如何查看和修改 OceanBase 集群参数
OceanBase 以集群形态运行,提供多租户(也叫多实例)能力。集群初始化成功后,默认会有一个租户 `sys`,保存集群的所有元数据、参数等。管理 OceanBase 集群就是通过登录 `sys` 租户。
## 查看和修改 OceanBase 集群参数
查看 OceanBase 集群参数的命令是 :`show parameters [ like '%参数名特征%' ] ;``show parameters where name in ( '参数名1' , '参数名2' ) ; `
不带 `like` 子句就是查看所有参数。
下面以查看参数 `memory_limit``memory_limit_percentage` 为例。
首先这两个参数是指定进程 `observer` 启动后能获取的最大内存,如果分配不出来进程可能会启动失败或运行异常。这个内存可以指定大小,也可以指定总可用内存的比例。不管那种方法,要确保实际可以拿到的内存不少于 8G 。
这两个参数实际只有一个生效,取最低值。`memory_limit` 设置为 0 的话就是不限制。使用哪个参数控制进程 `observer` 内存大小由运维决定。生产环境,机器内存很大的时候,通常是通过 `memory_limit_percentage` 控制,默认值是 80(表示总可用内存的 80%)。
```sql
MySQL [oceanbase]> show parameters like 'memory_limit%';
+-------+----------+---------------+----------+-------------------------+-----------+-------+--------------------------------------------------------------------------------------------------------------------------------+----------+---------+---------+-------------------+
| zone | svr_type | svr_ip | svr_port | name | data_type | value | info | section | scope | source | edit_level |
+-------+----------+---------------+----------+-------------------------+-----------+-------+--------------------------------------------------------------------------------------------------------------------------------+----------+---------+---------+-------------------+
| zone1 | observer | 172.20.249.50 | 2882 | memory_limit_percentage | NULL | 80 | the size of the memory reserved for internal use(for testing purpose). Range: [10, 90] | OBSERVER | CLUSTER | DEFAULT | DYNAMIC_EFFECTIVE |
| zone1 | observer | 172.20.249.50 | 2882 | memory_limit | NULL | 8G | the size of the memory reserved for internal use(for testing purpose), 0 means follow memory_limit_percentage. Range: 0, [8G,) | OBSERVER | CLUSTER | DEFAULT | DYNAMIC_EFFECTIVE |
+-------+----------+---------------+----------+-------------------------+-----------+-------+--------------------------------------------------------------------------------------------------------------------------------+----------+---------+---------+-------------------+
2 rows in set (0.002 sec)
MySQL [oceanbase]> show parameters where name in ('memory_limit','memory_limit_percentage')\G
*************************** 1. row ***************************
zone: zone1
svr_type: observer
svr_ip: 172.20.249.50
svr_port: 2882
name: memory_limit_percentage
data_type: NULL
value: 80
info: the size of the memory reserved for internal use(for testing purpose). Range: [10, 90]
section: OBSERVER
scope: CLUSTER
source: DEFAULT
edit_level: DYNAMIC_EFFECTIVE
*************************** 2. row ***************************
zone: zone1
svr_type: observer
svr_ip: 172.20.249.50
svr_port: 2882
name: memory_limit
data_type: NULL
value: 8G
info: the size of the memory reserved for internal use(for testing purpose), 0 means follow memory_limit_percentage. Range: 0, [8G,)
section: OBSERVER
scope: CLUSTER
source: DEFAULT
edit_level: DYNAMIC_EFFECTIVE
2 rows in set (0.002 sec)
```
上面参数输出结果简单说明:
| 列名 | 列值 | 备注 |
|------------|---------------------------------------------------------------------------------------|--------------------|
| zone | zone1 | 节点的 zone 名称 |
| svr_type | observer | 节点类型 |
| svr_ip | 172.20.249.50 | 节点 IP |
| svr_port | 2882 | 节点 RPC 端口 |
| name | memory_limit_percentage | 参数名 |
| data_type | NULL | 参数类型 |
| value | 80 | 参数值 |
| info | the size of the memory reserved for internal use(for testing purpose). Range [10, 90] | 参数的描述。 这个参数的这个描述不是很准确,这是限制进程 `observer` 能分配的最大内存。 |
| section | OBSERVER | 参数归类 |
| scope | CLUSTER | 参数生效范围 |
| edit_level | DYNAMIC_EFFECTIVE | 参数生效时机:动态生效 / 需要重启 |
OB 集群参数的修改可以通过命令:`alter system set 参数名='参数值' [ server = '节点IP:节点RPC端口' ] ;` 。不指定 `server` 子句就是表示参数修改应用于所有 OceanBase 集群节点。
比如说下面调整参数 `syslog_level` 值为 `USER_ERROR`
```sql
MySQL [oceanbase]> alter system set syslog_level = 'USER_ERR' server='172.20.249.50:2882' ;
Query OK, 0 rows affected (0.021 sec)
MySQL [oceanbase]> show parameters like 'syslog_level'\G
*************************** 1. row ***************************
zone: zone1
svr_type: observer
svr_ip: 172.20.249.50
svr_port: 2882
name: syslog_level
data_type: NULL
value: USER_ERR
info: specifies the current level of logging. There are DEBUG, TRACE, INFO, WARN, USER_ERR, ERROR, six different log levels.
section: OBSERVER
scope: CLUSTER
source: DEFAULT
edit_level: DYNAMIC_EFFECTIVE
1 row in set (0.002 sec)
```
## OceanBase 集群参数文件
上面这些参数修改都是立即生效的,并且参数修改也会持久化到 OceanBase 集群节点自己的参数文件。注意不是指前面提到的 OBD 集群部署参数文件。
通常 OceanBase 集群每个节点的启动目录下会有一个目录 `etc` ,这里面保存了该节点进程的参数文件 `observer.config.bin` 。这是一个 `binary` 类型的文件,不能直接用 `cat` 命令读取,需要使用 `strings` 命令。 这个文件也不建议直接修改,而是通过上面提到的参数修改命令。
```bash
[admin@obce00 oceanbase-ce]$ pwd
/home/admin/oceanbase-ce
[admin@obce00 oceanbase-ce]$ tree -L 2
.
├── bin
│   └── observer -> /home/admin/.obd/repository/oceanbase-ce/3.1.0/84bd2fe27f8b8243cc57d8a3f68b4c50f94aab80/bin/observer
├── etc
│   ├── observer.config.bin
│   └── observer.config.bin.history
├── etc2
│   ├── observer.conf.bin
│   └── observer.conf.bin.history
├── etc3
│   ├── observer.conf.bin
│   └── observer.conf.bin.history
<省略掉无关内容>
9 directories, 20 files
```
从上图看,启动目录下有三个文件夹:`etc etc2 etc3` ,下面都有参数文件以及其历史文件备份。进程 `observer` 默认会读取文件夹 `etc` 中的参数文件,其他两个目录是参数文件的备份,这个备份路径也是通过参数 `config_additional_dir` 指定的,默认值是同一个启动目录的 `etc2``etc3` 。生产环境一般会设置到其他磁盘,安全一些。当前 OBD 版本还是把它放到同一块盘,这个并不是很有意义,用户可以自己修改这个目录。
此外,要注意的是 `etc2``etc3` 下的参数文件名跟 `etc` 下参数文件名并不完全一致,这个推测是早期开发者的失误。
```bash
MySQL [oceanbase]> show parameters like 'config_additional_dir'\G
*************************** 1. row ***************************
zone: zone1
svr_type: observer
svr_ip: 172.20.249.50
svr_port: 2882
name: config_additional_dir
data_type: NULL
value: etc2;etc3
info: additional directories of configure file
section: OBSERVER
scope: CLUSTER
source: DEFAULT
edit_level: DYNAMIC_EFFECTIVE
1 row in set (0.002 sec)
[admin@obce00 oceanbase-ce]$ strings etc/observer.config.bin | grep -n memory_limit
25:memory_limit=8G
[admin@obce00 oceanbase-ce]$ strings etc2/observer.conf.bin | grep -n memory_limit
25:memory_limit=8G
[admin@obce00 oceanbase-ce]$ strings etc3/observer.conf.bin | grep -n memory_limit
25:memory_limit=8G
```
查看实际参数文件内容可以看出,不是所有参数都在这个参数文件里。只有那些被 `alter system set ` 命令修改过的参数,以及在进程 `observer` 启动时通过 `-o` 指定的参数,才会记录在参数文件里。其他参数都是取自默认值(写在进程 `observer` 的代码里)。
## 使用 OBD 修改 OceanBase 集群参数
注意:上面直接在 OceanBase 集群里修改参数后,会立即同步到集群节点自身的参数文件中,但是不会同步到 OBD 的集群部署配置文件中(后期 OBD 可能会改进这个功能)。所以,如果使用 OBD 工具重启 OceanBase 集群的时候,默认又会带参数启动进程 `observer` 。如果前面在 OceanBase 集群里修改的参数在 OBD 集群部署配置文件中也有,并且后者的值还是老的,那就意味着那个参数又被调整回原来的设置值了。
运维需要理解这里变化的原理。
针对这个,OBD 提供两个解决思路:
+ 手动同步修改 OBD 集群部署配置文件中的参数值。以后工具可能会自动同步。
+ OBD 重启集群的时候不带参数启动节点进程。
OBD 提供命令编辑集群部署配置文件:`obd cluster edit-config` ,退出时会保存到上面工作目录中。
```bash
obd cluster edit-config obce-single
保存时输出:
oceanbase-ce-3.1.0 already installed.
Search param plugin and load ok
Parameter check ok
Save deploy "obce-single" configuration
deploy "need reload"
```
`edit-config` 命令退出后会提示 `reload` 集群配置。
```bash
[admin@obce00 ~]$ obd cluster reload obce-single
Get local repositories and plugins ok
Open ssh connection ok
Cluster status check ok
Connect to observer ok
obce-single reload
```
提示:
如果 OBD 命令运行出错,可以查看 日志。日志查看方法: `tail -n 50 ~/.obd/log/obd`
## 进程启动时指定参数
前面介绍过了, OBD 在启动集群节点进程 `observer` 的时候,会在命令行下通过 `-o` 指定参数。对于运维来说,如果某个节点的进程 `observer` 因为某种原因退出了,启动进程是当务之急。可能需要调整某个参数再启动一次。通过 OBD 工具就有点效率低下了。
所以,掌握 OceanBase 集群节点进程 `observer` 的启动方法还是很有必要的。
首先要进入到工作目录。必须在上一次启动进程 `observer` 的工作目录(假设它是正确的)下再次尝试。前面分析过,工作目录在 OBD 集群部署配置文件中指定 `home_path` 。本课程里工作目录都默认是 `/home/admin/oceanbase-ce` 。进程 `observer` 启动后会在这个目录找目录 `etc` ,找默认的参数文件 `observer.config.bin` 。启动后的日志会默认写到 `log/{observer.log, rootservice.log, election.log}` 。所以,工作目录不能错,目录的权限也不能错。
下面示例不带参数启动进程 `observer` 方法。为了模拟故障,先强行杀掉进程 `observer`
```bash
[admin@obce00 ~]$ cd
[admin@obce00 ~]$ cd oceanbase-ce/
[admin@obce00 oceanbase-ce]$ kill -9 `pidof observer`
[admin@obce00 oceanbase-ce]$ sleep 3
[admin@obce00 oceanbase-ce]$ ps -ef|grep observer
admin 35278 28904 0 11:26 pts/2 00:00:00 grep --color=auto observer
[admin@obce00 oceanbase-ce]$ pwd
/home/admin/oceanbase-ce
[admin@obce00 oceanbase-ce]$ bin/observer
bin/observer
[admin@obce00 oceanbase-ce]$ ps -ef|grep observer
admin 35280 1 99 11:26 ? 00:00:06 bin/observer
admin 35848 28904 0 11:26 pts/2 00:00:00 grep --color=auto observer
[admin@obce00 oceanbase-ce]$ netstat -ntlp
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:2881 0.0.0.0:* LISTEN 35280/bin/observer
tcp 0 0 0.0.0.0:2882 0.0.0.0:* LISTEN 35280/bin/observer
```
下面示例带参数启动进程 `observer` 方法。为了模拟故障,先强行杀掉进程 `observer`
```bash
[admin@obce00 oceanbase-ce]$ kill -9 `pidof observer`
[admin@obce00 oceanbase-ce]$ sleep 3
[admin@obce00 oceanbase-ce]$ bin/observer -o "max_syslog_file_count=15,datafile_size=60G"
bin/observer -o max_syslog_file_count=15,datafile_size=60G
optstr: max_syslog_file_count=15,datafile_size=60G
[admin@obce00 oceanbase-ce]$ ps -ef|grep observer
admin 35867 1 99 11:34 ? 00:00:09 bin/observer -o max_syslog_file_count=15,datafile_size=60G
admin 36435 28904 0 11:34 pts/2 00:00:00 grep --color=auto observer
[admin@obce00 oceanbase-ce]$ netstat -ntlp
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:2881 0.0.0.0:* LISTEN 35867/bin/observer
tcp 0 0 0.0.0.0:2882 0.0.0.0:* LISTEN 35867/bin/observer
```
# 说明
本目录是 OceanBase 开源版入门到实战教程。欢迎大家参考练习。
由于测试环境有限,不能覆盖所有客户场景,可能个别地方会有问题,欢迎大家补充。
本目录会持续更新。
## 目录
+ [第 1 章:OceanBase 数据库概述](chapter01/1.md)
+ [第 2 章:如何部署 OceanBase 社区版](chapter02/2.0.md)
+ [第 3 章:如何使用 OceanBase 社区版](chapter03/3.0.md)
+ [第 4 章:如何迁移 MySQL 数据到 OceanBase](chapter04/4.0.md)
+ [第 5 章:如何运维 OceanBase 社区版](chapter05/5.0.md)
+ [第 6 章:如何测试 OceanBase 社区版性能](chapter06/6.0.md)
+ [第 7 章:如何诊断和调优 OceanBase 社区版性能](chapter07/7.0.md)
+ [第 8 课:OceanBase 社区版生态工具介绍](chapter08/8.0.md)
## 如何联系我们
欢迎广大 OceanBase 爱好者、用户和客户有任何问题联系我们反馈:
+ 社区版官网论坛:[https://open.oceanbase.com/answer](https://open.oceanbase.com/answer)
+ 社区版项目网站提 `Issue`[https://github.com/oceanbase/oceanbase/issues](https://github.com/oceanbase/oceanbase/issues)
+ 钉钉群:群号 `33254054`
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册