Back to Repositories

Testing Embedded Canal Server Standby Mode in alibaba/canal

This test suite evaluates the standby functionality of Canal Server with embedded configuration, focusing on ZooKeeper integration and high-availability features. The tests verify proper initialization, parameter configuration, and failover scenarios for Canal’s embedded server implementation.

Test Coverage Overview

The test suite provides comprehensive coverage of Canal Server’s embedded standby mode functionality.

Key areas tested include:
  • ZooKeeper cluster configuration and path management
  • Canal parameter initialization and validation
  • High availability mode settings and heartbeat mechanism
  • MySQL source configuration and connection parameters
  • Memory storage and buffer configurations

Implementation Analysis

The testing approach utilizes JUnit framework with embedded server configuration to validate Canal’s standby functionality. The implementation follows a hierarchical pattern extending BaseCanalServerWithEmbededTest, incorporating ZooKeeper client initialization and cleanup.

Key patterns include:
  • Before-test initialization with ZooKeeper path cleanup
  • Parametrized canal configuration setup
  • Mixed mode meta configuration for cold backup scenarios

Technical Details

Testing tools and configuration:
  • JUnit testing framework
  • ZkClient for ZooKeeper interaction
  • Canal Parameter configuration including HA, Meta, and Index modes
  • MySQL connection parameters with specific buffer sizes
  • Memory storage mode with 32KB buffer size
  • UTF-8 character encoding
  • Configurable detection settings

Best Practices Demonstrated

The test implementation showcases several testing best practices for distributed systems.

Notable practices include:
  • Proper test isolation through ZooKeeper cleanup
  • Comprehensive parameter configuration testing
  • Clear separation of concerns in test setup
  • Detailed configuration of network and buffer parameters
  • Systematic approach to HA testing

alibaba/canal

server/src/test/java/com/alibaba/otter/canal/server/embedded/CanalServerWithEmbedded_StandbyTest.java

            
package com.alibaba.otter.canal.server.embedded;

import java.net.InetSocketAddress;
import java.util.Arrays;

import org.I0Itec.zkclient.ZkClient;
import org.junit.Before;

import com.alibaba.otter.canal.common.zookeeper.ZookeeperPathUtils;
import com.alibaba.otter.canal.instance.manager.model.Canal;
import com.alibaba.otter.canal.instance.manager.model.CanalParameter;
import com.alibaba.otter.canal.instance.manager.model.CanalParameter.HAMode;
import com.alibaba.otter.canal.instance.manager.model.CanalParameter.IndexMode;
import com.alibaba.otter.canal.instance.manager.model.CanalParameter.MetaMode;
import com.alibaba.otter.canal.instance.manager.model.CanalParameter.SourcingType;
import com.alibaba.otter.canal.instance.manager.model.CanalParameter.StorageMode;
import org.junit.Ignore;

@Ignore
public class CanalServerWithEmbedded_StandbyTest extends BaseCanalServerWithEmbededTest {

    private ZkClient zkClient = new ZkClient(cluster1);

    @Before
    public void setUp() {
        zkClient.deleteRecursive(ZookeeperPathUtils.CANAL_ROOT_NODE);
        super.setUp();
    }

    protected Canal buildCanal() {
        Canal canal = new Canal();
        canal.setId(1L);
        canal.setName(DESTINATION);
        canal.setDesc("test");

        CanalParameter parameter = new CanalParameter();

        parameter.setZkClusters(Arrays.asList("127.0.0.1:2188"));
        parameter.setMetaMode(MetaMode.MIXED); // 冷备,可选择混合模式
        parameter.setHaMode(HAMode.HEARTBEAT);
        parameter.setIndexMode(IndexMode.META);// 内存版store,需要选择meta做为index

        parameter.setStorageMode(StorageMode.MEMORY);
        parameter.setMemoryStorageBufferSize(32 * 1024);

        parameter.setSourcingType(SourcingType.MYSQL);
        parameter.setDbAddresses(Arrays.asList(new InetSocketAddress(MYSQL_ADDRESS, 3306),
            new InetSocketAddress(MYSQL_ADDRESS, 3306)));
        parameter.setDbUsername(USERNAME);
        parameter.setDbPassword(PASSWORD);
        parameter.setPositions(Arrays.asList("{\"journalName\":\"mysql-bin.000001\",\"position\":6163L,\"timestamp\":1322803601000L}",
            "{\"journalName\":\"mysql-bin.000001\",\"position\":6163L,\"timestamp\":1322803601000L}"));

        parameter.setSlaveId(1234L);

        parameter.setDefaultConnectionTimeoutInSeconds(30);
        parameter.setConnectionCharset("UTF-8");
        parameter.setReceiveBufferSize(8 * 1024);
        parameter.setSendBufferSize(8 * 1024);

        parameter.setDetectingEnable(false);
        parameter.setDetectingIntervalInSeconds(10);
        parameter.setDetectingRetryTimes(3);
        parameter.setDetectingSQL(DETECTING_SQL);

        canal.setCanalParameter(parameter);
        return canal;
    }
}