You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kyuubi.apache.org by GitBox <gi...@apache.org> on 2021/08/24 10:28:18 UTC

[GitHub] [incubator-kyuubi] yaooqinn commented on pull request #974: [KYUUBI #962] Support multiple engines under USER share level

yaooqinn commented on pull request #974:
URL: https://github.com/apache/incubator-kyuubi/pull/974#issuecomment-904520407


   #### 一些想法
   
   ##### 什么是引擎池?
   
   一个引擎池是面向一个租户的,不同的用户使用不同的引擎池。一个引擎池是在一个目录下或者根据相应的目录过滤条件可发现的引擎集合。
   
   假设我们为tom和jerry两位用户开启了引擎池。前者的大小为2,后者的大小为3。
   
   所以,tom的引擎池看起来是这样的
   
   ```
   kyuubi_USER/tom/engine-pool-0/serviceUri=ip:port;version=1.3.0;sequence=..../data
   kyuubi_USER/tom/engine-pool-1/serviceUri=ip:port;version=1.3.0;sequence=..../data
   ```
   
   而jerry的引擎池则看起来是这样的
   
   ```
   kyuubi_USER/jerry/engine-pool-0/serviceUri=ip:port;version=1.3.0;sequence=..../data
   kyuubi_USER/jerry/engine-pool-1/serviceUri=ip:port;version=1.3.0;sequence=..../data
   kyuubi_USER/jerry/engine-pool-2/serviceUri=ip:port;version=1.3.0;sequence=..../data
   ```
   
   注意,这里的整个“目录”设计规则和Kyuubi目前的规则没有任何的区别。其中,
   
    - 第一层目录为server space加下划线再加share level,这里的share_level会是USER/Server。
    - 第二层目录为用户名
    - 第三层目录为subDomain。这里使我们需要关注的重点,因为引擎池化的逻辑主要围绕这一层目录的查找、创建暂开。我们可以复用和拓展现有的并发控制逻辑。在我们给的例子中’engine-pool-‘没有特别的含义,我们后面可以将它设置为参数或者hardcode的字符串前缀。而后缀则是0到pool size -1的自然数序列。如上面的例子所示,tom的引擎池会产生2个subDomain的目录。
   - 剩余的目录就和现在的设计一样了,需强调的是和以前一样一个目录下依然只维护一个engine实例
   
   
   ##### 引擎池大小控制
   
   - `kyuubi.engine.pool.size.threshold`, 引入该参数为服务端参数,由服务端控制引擎池的绝对上限。如果用户的设置超过这个设置值,则报错或者取该值
   - `kyuubi.engine.pool.size`,引入该参数为用户和服务端都可设置的参数,参数取值范围在`kyuubi.engine.pool.size.threshold`以下。当服务端统一或者用用户默认参数设置该值时,服务端会在统计当前存在subDomain目录数,即当前池大小,如果还未达预期,则递增一个subDomain目录并在该目录下创建一个引擎。
   
   引擎的生命周期和现在的实现不变,可依据现在的缓存方式进行自我缓存,当生命周期到达上限,则自己退出并删除自己所属的subDomain
   
   
   ##### 引擎的创建和复用 (RANDOM)
   
   在 RANDOM 模式下,一切都是随机的,引擎的复用和引擎的创建在这个 POLICY 下是等价的。
   
   举例,当jerry 在随机算法下使用连接池,假设 engine pool 的中间值为如下所示的状态,槽0和2已经有 engine 实例,而槽1 还未被初始化
   
   ```
   kyuubi_USER/jerry/engine-pool-0/serviceUri=ip:port;version=1.3.0;sequence=..../data
   kyuubi_USER/jerry/engine-pool-1/
   kyuubi_USER/jerry/engine-pool-2/serviceUri=ip:port;version=1.3.0;sequence=..../data
   ```
   此时,当 jerry 尝试连接时,
   
   - jerry 显示配置sub.domain,几个特例
     - sub.domain=engine-pool-0, 复用连接池内槽0的实例
     - sub.domain=engine-pool-1,**只需对 engine-pool-1 加锁**,直接创建槽1的实例,“手动”完成初始化,并连接
     - sub.domain=someothers,绕过引擎池的使用
   - jerry 未配置sub.domain, 则随机算法生成 engine-pool-x 
     - 当x=0时,复用连接池内槽0的实例
     - 当x=1时,只需对 engine-pool-1 加锁,创建槽1的实例,完成初始化
     - 当x=2时,复用连接池内槽1的实例
   - jerry 使用其他模式,照旧
   
   
   ##### 两个 Kyuubi Server 对某用户配置了不同的 kyuubi.engine.pool.size 值怎么办?
   
   假如 Server1 为4,Server2 为 5,则Server1,在[0, 3]区间内随机,而Server2可在[0, 4]之间取值。两者不存在耦合关系,当然最好的实践还是配置相同的参数值
   
   ##### kyuubi.engine.pool.size 是否对用户暴露,暴露后用户连接每次 kyuubi.engine.pool.size 不一致怎么办?不合理设置怎么办?
   
   理论上可以对用户直接暴露,
   当用户设置不合理时,比如过大,则由kyuubi.engine.pool.size.threshold 控制
   当用户设置不一致时,比如增加,则 pool size 可随机增加。抑或减小,则新区间外的引擎将因随机不到而自我回收。


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@kyuubi.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org