场景介绍
大规模数据库集群通常会同时包含很多业务数据,不同业务有不同的数据表,可以通过资源管理功能创建多个资源池来实现不同业务的资源隔离。DWS支持将不同业务用户分配给不同资源池,以便减少业务之间资源(CPU资源、内存资源、IO资源和存储资源)竞争。
但随着业务规模不断扩大,集群系统中的业务数目越来越多,通过划分多个资源池来管理越来越难以控制资源竞争。由于DWS的分布式架构,业务数据被分散存储在多个节点上即每个表都会分布在数据库集群的所有DN节点上,因此每次数据表操作都可能会涉及所有DN节点,导致网络压力增大和系统资源大量消耗,仅通过扩大集群规模也很难解决,DWS建议用户划分多个逻辑集群来解决业务数量扩大带来的网络压力和资源消耗问题。
通过划分独立的逻辑集群,将新增的业务分配到独立的逻辑集群上,这样新增业务对原有业务的影响会很小。而原有逻辑集群中的业务规模如果扩大,也可以通过对原有逻辑集群扩容来解决。
如图 跨逻辑集群访问数据所示,假设某企业原有业务数据表都在原物理集群dws-demo(绿色部分),切换到逻辑集群lc1(蓝色部分)后,物理集群再通过扩容方式,新增一套新的逻辑集群lc2,原有业务数据表统一切换到逻辑集群lc1,新的业务数据表统一写入到逻辑集群lc2,实现新老业务的数据隔离。而新的逻辑集群lc2关联的用户u2,通过授权可以跨逻辑集群访问逻辑集群lc1的表。
图 跨逻辑集群访问数据
创建集群并准备表数据
- 参见创建专属集群章节创建集群。
- 连接数据库后,以系统管理员dbadmin创建表name,并插入2条数据。
CREATE TABLE name (id int, name varchar(20));
INSERT INTO name VALUES (1,'joy'),(2,'lily');
转换成逻辑集群lc1
须知:
转换期间,用户可执行增删改查等简单DML语句,执行数据库对象等复杂DDL语句会阻塞业务,请选择业务低峰窗口期进行。
- 登录DWS管理控制台,在左导航栏选择“集群 > 专属集群”,单击指定集群名称进入“集群详情”页面。
- 打开“逻辑集群开关”按钮。
- 左导航栏选择“逻辑集群管理”进入逻辑集群页面。
- 单击右上角“添加逻辑集群”,输入逻辑集群名称lc1,单击“确定”。
切换期间当前集群不可用,请耐心等待约2分钟(转换时间因业务数据量大小不同,有所差异),待逻辑集群页面出现lc1,表示转换成功。
添加逻辑集群
扩容节点到弹性集群elastic_group中
- 返回集群管理页面,在指定集群所在行操作列选择“更多 >节点变更> 扩容”。
- 跳转至扩容页面,可选择扩容3个节点;选择扩容到逻辑集群,即“elastic_group”。确认无误后,勾选“我已确认”,并单击“下一步:确认”。
- 单击“提交”,并单击“确定”。请耐心等待约10分钟,扩容成功。
添加逻辑集群lc2
- 在集群管理页面,单击指定集群名称进入“集群详情”页面,在左导航栏单击“逻辑集群管理”。
- 进入逻辑集群页面,单击右上角“添加逻辑集群”,从右侧勾选3个节点到左侧列表中,并输入逻辑集群名称lc2,单击“确定”。
请耐心等待约2分钟,逻辑集群添加成功。
创建逻辑集群关联用户并实现跨逻辑查询数据
- 以系统管理员连接数据库,执行以下SQL语句查询原业务表name。
验证转换后,业务数据查询正常。
SELECT * FROM name;
- 执行以下语句创建u1关联逻辑集群lc1,u2关联逻辑集群lc2。
CREATE USER u1 NODE GROUP "lc1" password '{password} ';
CREATE USER u2 NODE GROUP "lc2" password ' {password} ';
- 以用户u1登录数据库,创建新表u1.t1并插入两条数据,同时授权用户u2可以访问该表。
CREATE TABLE u1.t1 (id int, name varchar(20));
INSERT INTO u1.t1 VALUES (1,'joy'),(2,'lily');
GRANT USAGE ON SCHEMA u1 TO u2;
GRANT SELECT ON TABLE u1.t1 TO u2;
- 以用户u2登录数据库,查询原业务表t1数据,提示无权访问逻辑集群lc1。结果表明,即使用户u1已经授权了u2可以访问该表,但是由于这张表在不同的逻辑集群,所以仍然无法访问,证明逻辑集群间数据隔离。
SELECT * FROM u1.t1;
- 切回系统管理员dbadmin窗口,将逻辑集群lc1的访问权限授予用户u2。
GRANT USAGE ON NODE GROUP lc1 TO u2;
- 再次切到用户u2窗口,查询表t1成功。结果验证绑定了逻辑集群lc2的用户可以跨逻辑集群查询到原业务表t1。实现逻辑集群间的数据共享。
SELECT * FROM u1.t1;