Skip to content

Java客户端 熔断与监控

He, Jiehui edited this page Sep 2, 2016 · 8 revisions

Not finished

简介

DAL采取JMX作为缺省的运行状态的监视和修改机制。通过MBean支持数据库熔断配置和操作。

JMX组件

  1. HA相关的配置和状态
  2. Markdown相关的配置和状态
  3. Timeout相关的配置和状态
  4. DatabaseSet的状态。包括名字,是否markdown和markdown的时间。该组件只支持人工markdown
  5. Datasource的状态(allinone)。包括名字,是否人工markdown和时间,是否自动markdown和时间

Markdown算法

目前只支持timeout的markdown。分两种场景

Timeout error超过比例阀值

例如设置:

  1. 百分比基数为10
  2. 百分比阀值为80%
  3. 取样时间为60(秒)
  4. 允许timeout markdown策略

则当10个请求里面有8个(80%)报错时,会自动markdown发生错误的数据库

Timeout error超过数量阀值

例如设置:

  1. 最小错误个数为5
  2. 取样的时间区间设置为60秒
  3. 允许timeout markdown策略

则当60秒内发生5个timeout相关错误时,会自动markdown发生错误的数据库

Markup算法

Dal支持在数据库频繁报告timeout错误时做markdown,并在进入markdown状态以后,过一段时间自动markup。用户可以选择配置自动markup的延迟,缺省的delay是30s。

下面的单元测试代码显示了实际运行过程中从发现错误到markdown,再到markup的过程

@Before
public void setUp(){
    DalStatusManager.getMarkdownStatus().setEnableAutoMarkDown(false);
    DalStatusManager.getTimeoutMarkdown().setEnabled(false);
    DalStatusManager.getTimeoutMarkdown().setErrorCountThreshold(5);
    DalStatusManager.getMarkdownStatus().setAutoMarkUpDelay(10);
    MarkdownManager.resetAutoMarkdowns();
}
 
@Test
public void markdownAndDisableAutoMarkdownTest() throws Exception{
    DalStatusManager.getMarkdownStatus().setEnableAutoMarkDown(true);
    DalStatusManager.getTimeoutMarkdown().setEnabled(true);
     
    Assert.assertFalse(MarkdownManager.isMarkdown(dbName));
    for (int i = 0; i < 10; i++) {
        MarkdownManager.detect(this.mockDalConnection(), 1000, this.mockTimeoutException());
    }
    Thread.sleep(1000);
    Assert.assertTrue(DalStatusManager.getMarkdownStatus().isMarkdown(dbName));
     
    // Disable auto markdown
    DalStatusManager.getMarkdownStatus().setEnableAutoMarkDown(false);
    Assert.assertFalse(DalStatusManager.getMarkdownStatus().isMarkdown(dbName));
    //Enable again    
    DalStatusManager.getMarkdownStatus().setEnableAutoMarkDown(true);
    Assert.assertFalse(DalStatusManager.getMarkdownStatus().isMarkdown(dbName));
     
    for (int i = 0; i < 4; i++) {
        MarkdownManager.detect(this.mockDalConnection(), 1000, this.mockTimeoutException());
        Assert.assertFalse(DalStatusManager.getMarkdownStatus().isMarkdown(dbName));
    }
     
    MarkdownManager.detect(this.mockDalConnection(), 1000, this.mockTimeoutException());
    Thread.sleep(1000);
    Assert.assertTrue(DalStatusManager.getMarkdownStatus().isMarkdown(dbName));
}

注意

为了防止状态不一至,每次全局的EnableAutoMarkdow状态发生改变的时候,自动重置所有Datasource的AutoMarkdown状态为false。

属性说明

Markdown属性

markdown attribute

TimeoutMarkdown属性

timeout

DatabaseSet属性

DatabaseSet

Datasource属性

Datasource

基于JMX的查询与修改

所有的属性都只能通过JMX来修改。修改的方式是找到相关属性直接在文本框中填写相应的新值即可。

##手动markdown/markup

手动的markdown/markup支持两个层面,一个是DatabaseSet(逻辑数据库),一个是DataSource(物理数据库)。

所有当前App的DatabaseSet可以JMX的com.ctrip.dal.client.DatabaseSet domain下面找到,按照名字分开显示

所有当前App的DataSource可以JMX的com.ctrip.dal.client.DataSource domain下面找到,按照名字分开显示

在JDK bin目录下面找到jconsole.exe。双击执行

console

选择对应的JVM实例

select

总体概览

overview

HAStatus

ha

Markdown

markdown

Timeout

timeout

DatabaseSet

dbSet

Datasource

datasource

Clone this wiki locally