## 如何快速体验 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 。
