暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

OceanBase 学习笔记73:如何创建用户租户?

2992

OceanBase 数据库面向多租户设计。 在一个大集群中,您可以创建很多租户,不同的部门使用不同的租户。租户和租户之间资源已经进行了隔离,保障了相互之间访问不受影响,类似于数据库中的实例。

背景

MySQL 是一个单租户的模式,所有用户在一套资源池下进行使用,这可能会导致一种故障。当用户负载非常高时,应用将用尽数据库的所有资源,导致数据库管理员无法连接数据库,也无法执行一些高优先级的控制命令。例如无法执行 kill 命令“杀死”超时的查询,或者一些管理平台也无法连接到数据库等。

OceanBase 数据库默认会自动创建 sys 租户,sys 租户负责一部分 OceanBase 数据库的管理工作,并且能够访问系统元数据表,sys 自动预留了一定的资源。

创建租户

  1. 使用系统租户的 root 用户(root@sys)连接 OceanBase 数据库。如下所示,您可使用 OBClient 或 MySQL 客户端进行连接:

    obclient -hxxxx -uroot@sys -P${port_num} -p -Doceanbase -A
    # 或
    mysql -hxxxx -uroot@sys -P${port_num} -p -Doceanbase -A
    

    OBClient 的详细信息,请参考 OBClient 文档

    注意

    只有 root@sys 用户拥有创建租户的权限。

  2. 查询集群内各 Server 的资源占用情况,例如:

    obclient> SELECT * FROM oceanbase.GV$OB_SERVERS;
    +-----------------+----------+-------+----------+--------------+------------------+--------------+------------------+--------------+--------------+-------------------+-------------------+-----------------+--------------------+------------------+-------------------------+--------------+-------------------------+-----------------------+
    | SVR_IP          | SVR_PORT | ZONE  | SQL_PORT | CPU_CAPACITY | CPU_CAPACITY_MAX | CPU_ASSIGNED | CPU_ASSIGNED_MAX | MEM_CAPACITY | MEM_ASSIGNED | LOG_DISK_CAPACITY | LOG_DISK_ASSIGNED | LOG_DISK_IN_USE | DATA_DISK_CAPACITY | DATA_DISK_IN_USE | DATA_DISK_HEALTH_STATUS | MEMORY_LIMIT | DATA_DISK_ABNORMAL_TIME | SSL_CERT_EXPIRED_TIME |
    +-----------------+----------+-------+----------+--------------+------------------+--------------+------------------+--------------+--------------+-------------------+-------------------+-----------------+--------------------+------------------+-------------------------+--------------+-------------------------+-----------------------+
    | 172.xxx.xxx.228 |     2882 | zone1 |     2881 |            8 |                8 |            1 |                1 |  10737418240 |   2684354560 |        5368709120 |        2684354560 |       134217728 |        10737418240 |        83886080  | NORMAL                  |  17179869184 | NULL                    | NULL                  |
    +-----------------+----------+-------+----------+--------------+------------------+--------------+------------------+--------------+--------------+-------------------+-------------------+-----------------+--------------------+------------------+-------------------------+--------------+-------------------------+-----------------------+
    | 172.xxx.xxx.229 |     2882 | zone2 |     2881 |            8 |                8 |            1 |                1 |  10737418240 |   2684354560 |        5368709120 |        2684354560 |       134217728 |        10737418240 |        83886080  | NORMAL                  |  17179869184 | NULL                    | NULL                  |
    +-----------------+----------+-------+----------+--------------+------------------+--------------+------------------+--------------+--------------+-------------------+-------------------+-----------------+--------------------+------------------+-------------------------+--------------+-------------------------+-----------------------+
    | 172.xxx.xxx.230 |     2882 | zone3 |     2881 |            8 |                8 |            1 |                1 |  10737418240 |   2684354560 |        5368709120 |        2684354560 |       134217728 |        10737418240 |        83886080  | NORMAL                  |  17179869184 | NULL                    | NULL                  |
    +-----------------+----------+-------+----------+--------------+------------------+--------------+------------------+--------------+--------------+-------------------+-------------------+-----------------+--------------------+------------------+-------------------------+--------------+-------------------------+-----------------------+
    3 row in set
    
  3. 查询集群内各租户的资源分配情况,例如:

    obclient> SELECT * FROM oceanbase.GV$OB_UNITS;
    +-----------------+----------+---------+-----------+-------+---------+---------+-------------+----------+----------+-------------+---------------+-----------------+------------------+--------+----------------------------+
    | SVR_IP          | SVR_PORT | UNIT_ID | TENANT_ID | ZONE  | MAX_CPU | MIN_CPU | MEMORY_SIZE | MAX_IOPS | MIN_IOPS | IOPS_WEIGHT | LOG_DISK_SIZE | LOG_DISK_IN_USE | DATA_DISK_IN_USE | STATUS | CREATE_TIME                |
    +-----------------+----------+---------+-----------+-------+---------+---------+-------------+----------+----------+-------------+---------------+-----------------+------------------+--------+----------------------------+
    | 172.xxx.xxx.228 |     2882 |       1 |         1 | zone1 |       1 |       1 |  2684354560 |    10000 |    10000 |           1 |    2684354560 |        85075438 |        83886080  | NORMAL | 2022-11-08 14:24:01.960562 |
    | 172.xxx.xxx.229 |     2882 |       1 |         1 | zone2 |       1 |       1 |  2684354560 |    10000 |    10000 |           1 |    2684354560 |        85075438 |        83886080  | NORMAL | 2022-11-08 14:24:01.960562 |
    | 172.xxx.xxx.230 |     2882 |       1 |         1 | zone3 |       1 |       1 |  2684354560 |    10000 |    10000 |           1 |    2684354560 |        85075438 |        83886080  | NORMAL | 2022-11-08 14:24:01.960562 |
    +-----------------+----------+---------+-----------+-------+---------+---------+-------------+----------+----------+-------------+---------------+-----------------+------------------+--------+----------------------------+
    3 row in set
    
  4. 创建资源单元

    obclient> CREATE RESOURCE UNIT unit1
       max_cpu = 1,
       min_cpu = 1,
       memory_size = 2684354560,
       max_iops = 10000,
       min_iops = 10000,
       iops_weight = 1,
       log_disk_size = 2684354560;
    

    创建资源单元的 SQL 语句详细介绍请参考 创建资源单元

  5. 创建资源池

    obclient> CREATE RESOURCE POOL pool1
       UNIT = 'unit1',
       UNIT_NUM = 1,
       ZONE_LIST = ('zone1','zone2','zone3');
    

    其中:

    • UNIT_NUM 表示在集群的一个 Zone 里面包含的资源单元个数。该值小于等于一个 Zone 中的 OBServer 的个数。

    • ZONE_LIST 表示资源池的 Zone 列表,显示该资源池的资源在哪些 Zone 中被使用。

    • 如果在某个 Zone 内找不到足够剩余资源的机器来创建资源单元,资源池会创建失败。

    有关该 SQL 语句的详细信息,请参考 创建资源池

  6. 创建租户

    obclient> CREATE TENANT IF NOT EXISTS tenant1
       charset='utf8mb4',
       comment 'mysql tenant/instance',
       primary_zone='RANDOM',
       resource_pool_list = ('pool1') set ob_tcp_invited_nodes = '%';
    

    有关该 SQL 语句的详细信息,请参考 新建租户

  7. 修改密码

    使用新创建租户的 root 用户(root@tenant1)连接 OceanBase 数据库,之后您需执行如下命令为 root 用户创建密码:

    # 使用 root@tenant1 连接 OceanBase 数据库
    obclient -hxxxx -uroot@tenant1 -P${port_num} -p -Doceanbase -A
    
    # 修改密码
    obclient> ALTER USER username IDENTIFIED BY 'password';
    # 举例如下
    obclient> ALTER USER root IDENTIFIED BY 'Xc****Db';
    

    命令详细介绍请参考 修改用户密码

创建用户

首次使用新租户连接 OceanBase 数据库时,您必须使用 root 用户。成功连接后,您可执行如下命令创建新用户连接 OceanBase 数据库。

obclient> CREATE USER IF NOT EXISTS test IDENTIFIED BY '**1***';

详细信息请参考 创建用户

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论