gitextract_xcssslhk/ ├── .codecov.yml ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── any-questions-on-canal.md │ │ ├── bug-report-for-canal.md │ │ └── feature-request-of-canal.md │ └── workflows/ │ └── maven.yml ├── .gitignore ├── .mvn/ │ └── wrapper/ │ ├── maven-wrapper.jar │ └── maven-wrapper.properties ├── .travis.yml ├── LICENSE.txt ├── README.md ├── RELEASE.txt ├── SECURITY.md ├── admin/ │ ├── admin-ui/ │ │ ├── .editorconfig │ │ ├── .eslintignore │ │ ├── .eslintrc.js │ │ ├── .gitignore │ │ ├── .travis.yml │ │ ├── LICENSE │ │ ├── babel.config.js │ │ ├── build/ │ │ │ └── index.js │ │ ├── jest.config.js │ │ ├── mock/ │ │ │ ├── index.js │ │ │ ├── mock-server.js │ │ │ ├── table.js │ │ │ └── user.js │ │ ├── node/ │ │ │ └── node │ │ ├── package.json │ │ ├── pom.xml │ │ ├── postcss.config.js │ │ ├── public/ │ │ │ └── index.html │ │ ├── src/ │ │ │ ├── App.vue │ │ │ ├── api/ │ │ │ │ ├── canalCluster.js │ │ │ │ ├── canalConfig.js │ │ │ │ ├── canalInstance.js │ │ │ │ ├── nodeServer.js │ │ │ │ ├── table.js │ │ │ │ └── user.js │ │ │ ├── components/ │ │ │ │ ├── Breadcrumb/ │ │ │ │ │ └── index.vue │ │ │ │ ├── Hamburger/ │ │ │ │ │ └── index.vue │ │ │ │ ├── Pagination/ │ │ │ │ │ └── index.vue │ │ │ │ └── SvgIcon/ │ │ │ │ └── index.vue │ │ │ ├── icons/ │ │ │ │ ├── index.js │ │ │ │ └── svgo.yml │ │ │ ├── layout/ │ │ │ │ ├── components/ │ │ │ │ │ ├── AppMain.vue │ │ │ │ │ ├── Navbar.vue │ │ │ │ │ ├── Sidebar/ │ │ │ │ │ │ ├── FixiOSBug.js │ │ │ │ │ │ ├── Item.vue │ │ │ │ │ │ ├── Link.vue │ │ │ │ │ │ ├── Logo.vue │ │ │ │ │ │ ├── SidebarItem.vue │ │ │ │ │ │ └── index.vue │ │ │ │ │ └── index.js │ │ │ │ ├── index.vue │ │ │ │ └── mixin/ │ │ │ │ └── ResizeHandler.js │ │ │ ├── main.js │ │ │ ├── permission.js │ │ │ ├── router/ │ │ │ │ └── index.js │ │ │ ├── settings.js │ │ │ ├── store/ │ │ │ │ ├── getters.js │ │ │ │ ├── index.js │ │ │ │ └── modules/ │ │ │ │ ├── app.js │ │ │ │ ├── settings.js │ │ │ │ └── user.js │ │ │ ├── styles/ │ │ │ │ ├── element-ui.scss │ │ │ │ ├── index.scss │ │ │ │ ├── mixin.scss │ │ │ │ ├── sidebar.scss │ │ │ │ ├── transition.scss │ │ │ │ └── variables.scss │ │ │ ├── utils/ │ │ │ │ ├── auth.js │ │ │ │ ├── get-page-title.js │ │ │ │ ├── index.js │ │ │ │ ├── request.js │ │ │ │ ├── scrollTo.js │ │ │ │ └── validate.js │ │ │ └── views/ │ │ │ ├── 404.vue │ │ │ ├── canalServer/ │ │ │ │ ├── CanalCluster.vue │ │ │ │ ├── CanalConfig.vue │ │ │ │ ├── CanalInstance.vue │ │ │ │ ├── CanalInstanceAdd.vue │ │ │ │ ├── CanalInstanceLogDetail.vue │ │ │ │ ├── CanalInstanceUpdate.vue │ │ │ │ ├── CanalLogDetail.vue │ │ │ │ └── NodeServer.vue │ │ │ ├── dashboard/ │ │ │ │ └── index.vue │ │ │ ├── login/ │ │ │ │ └── index.vue │ │ │ └── sys/ │ │ │ └── UserInfo.vue │ │ ├── tests/ │ │ │ └── unit/ │ │ │ ├── .eslintrc.js │ │ │ ├── components/ │ │ │ │ ├── Breadcrumb.spec.js │ │ │ │ ├── Hamburger.spec.js │ │ │ │ └── SvgIcon.spec.js │ │ │ └── utils/ │ │ │ ├── formatTime.spec.js │ │ │ ├── parseTime.spec.js │ │ │ └── validate.spec.js │ │ └── vue.config.js │ ├── admin-web/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── assembly/ │ │ │ │ ├── dev.xml │ │ │ │ └── release.xml │ │ │ ├── bin/ │ │ │ │ ├── restart.sh │ │ │ │ ├── startup.bat │ │ │ │ ├── startup.sh │ │ │ │ └── stop.sh │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── alibaba/ │ │ │ │ └── otter/ │ │ │ │ └── canal/ │ │ │ │ └── admin/ │ │ │ │ ├── CanalAdminApplication.java │ │ │ │ ├── common/ │ │ │ │ │ ├── DaemonThreadFactory.java │ │ │ │ │ ├── TemplateConfigLoader.java │ │ │ │ │ ├── Threads.java │ │ │ │ │ └── exception/ │ │ │ │ │ └── ServiceException.java │ │ │ │ ├── config/ │ │ │ │ │ ├── EbeanConfig.java │ │ │ │ │ ├── SpringContext.java │ │ │ │ │ └── WebConfig.java │ │ │ │ ├── connector/ │ │ │ │ │ ├── AdminConnector.java │ │ │ │ │ ├── SimpleAdminConnector.java │ │ │ │ │ └── SimpleAdminConnectors.java │ │ │ │ ├── controller/ │ │ │ │ │ ├── CanalClusterController.java │ │ │ │ │ ├── CanalConfigController.java │ │ │ │ │ ├── CanalInstanceController.java │ │ │ │ │ ├── NodeServerController.java │ │ │ │ │ ├── PollingConfigController.java │ │ │ │ │ └── UserController.java │ │ │ │ ├── handler/ │ │ │ │ │ └── CustomExceptionHandler.java │ │ │ │ ├── model/ │ │ │ │ │ ├── BaseModel.java │ │ │ │ │ ├── CanalCluster.java │ │ │ │ │ ├── CanalConfig.java │ │ │ │ │ ├── CanalInstanceConfig.java │ │ │ │ │ ├── Model.java │ │ │ │ │ ├── NodeServer.java │ │ │ │ │ ├── Pager.java │ │ │ │ │ └── User.java │ │ │ │ └── service/ │ │ │ │ ├── CanalClusterService.java │ │ │ │ ├── CanalConfigService.java │ │ │ │ ├── CanalInstanceService.java │ │ │ │ ├── NodeServerService.java │ │ │ │ ├── PollingConfigService.java │ │ │ │ ├── UserService.java │ │ │ │ └── impl/ │ │ │ │ ├── CanalClusterServiceImpl.java │ │ │ │ ├── CanalConfigServiceImpl.java │ │ │ │ ├── CanalInstanceServiceImpl.java │ │ │ │ ├── NodeServerServiceImpl.java │ │ │ │ ├── PollingConfigServiceImpl.java │ │ │ │ └── UserServiceImpl.java │ │ │ └── resources/ │ │ │ ├── application.yml │ │ │ ├── canal-template.properties │ │ │ ├── canal_manager.sql │ │ │ ├── instance-template.properties │ │ │ ├── logback.xml │ │ │ └── public/ │ │ │ ├── index.html │ │ │ └── static/ │ │ │ ├── css/ │ │ │ │ ├── app.bb951cb3.css │ │ │ │ ├── chunk-101fc062.fad9926f.css │ │ │ │ ├── chunk-14b5f7a4.f3e06673.css │ │ │ │ ├── chunk-22553be3.f3e06673.css │ │ │ │ ├── chunk-2301924a.160e7b4a.css │ │ │ │ ├── chunk-2b9b6c5c.c89f8844.css │ │ │ │ ├── chunk-37c49cbf.efc21a9c.css │ │ │ │ ├── chunk-49959c8b.e8e2beee.css │ │ │ │ ├── chunk-4f09fed2.70ec0b86.css │ │ │ │ ├── chunk-5afa45f5.a34bb177.css │ │ │ │ ├── chunk-5b373aad.b966d36b.css │ │ │ │ ├── chunk-69386cf0.741ff14e.css │ │ │ │ ├── chunk-7ec889b7.c0585512.css │ │ │ │ ├── chunk-98f505d0.5280f88f.css │ │ │ │ ├── chunk-bd1d44ee.1528199a.css │ │ │ │ ├── chunk-da289616.c89f8844.css │ │ │ │ ├── chunk-elementUI.18b11d0e.css │ │ │ │ └── chunk-libs.5cf311f0.css │ │ │ └── js/ │ │ │ ├── app.6845b228.js │ │ │ ├── app.eee35d99.js │ │ │ ├── chunk-0dca2f22.a2bc28b8.js │ │ │ ├── chunk-101fc062.372a5ca5.js │ │ │ ├── chunk-101fc062.bc898027.js │ │ │ ├── chunk-14b5f7a4.013449e9.js │ │ │ ├── chunk-22553be3.e6d72de5.js │ │ │ ├── chunk-2301924a.1774b851.js │ │ │ ├── chunk-2b9b6c5c.cc2181b9.js │ │ │ ├── chunk-37c49cbf.64d26540.js │ │ │ ├── chunk-37c49cbf.92ebe0ae.js │ │ │ ├── chunk-49959c8b.058266cb.js │ │ │ ├── chunk-49959c8b.6d226f70.js │ │ │ ├── chunk-4f09fed2.d107437b.js │ │ │ ├── chunk-4f09fed2.ff28d88d.js │ │ │ ├── chunk-55380ff2.430ee174.js │ │ │ ├── chunk-55380ff2.681c71c9.js │ │ │ ├── chunk-5afa45f5.79ddcc04.js │ │ │ ├── chunk-5b373aad.90a2d8e7.js │ │ │ ├── chunk-69386cf0.76d77f5c.js │ │ │ ├── chunk-69386cf0.bdbe3f0c.js │ │ │ ├── chunk-7ec889b7.5f730d9b.js │ │ │ ├── chunk-7ec889b7.bd1ca803.js │ │ │ ├── chunk-98f505d0.f3096ce7.js │ │ │ ├── chunk-bd1d44ee.8c8282cc.js │ │ │ ├── chunk-bd1d44ee.8e2c4851.js │ │ │ ├── chunk-da289616.7def925e.js │ │ │ ├── chunk-elementUI.667f4c87.js │ │ │ └── chunk-libs.c04beefc.js │ │ └── test/ │ │ └── java/ │ │ └── com/ │ │ └── alibaba/ │ │ └── otter/ │ │ └── canal/ │ │ └── admin/ │ │ └── SimpleAdminConnectorTest.java │ └── pom.xml ├── charts/ │ ├── README.md │ ├── canal-admin/ │ │ ├── .helmignore │ │ ├── Chart.yaml │ │ ├── templates/ │ │ │ ├── NOTES.txt │ │ │ ├── _helpers.tpl │ │ │ ├── deployment.yaml │ │ │ ├── hpa.yaml │ │ │ ├── ingress.yaml │ │ │ ├── secret.yaml │ │ │ ├── service.yaml │ │ │ ├── serviceaccount.yaml │ │ │ └── tests/ │ │ │ └── test-connection.yaml │ │ └── values.yaml │ ├── canal-server/ │ │ ├── .helmignore │ │ ├── Chart.yaml │ │ ├── templates/ │ │ │ ├── NOTES.txt │ │ │ ├── _helpers.tpl │ │ │ ├── hpa.yaml │ │ │ ├── secret.yaml │ │ │ ├── service.yaml │ │ │ ├── serviceaccount.yaml │ │ │ ├── statefulsets.yaml │ │ │ └── tests/ │ │ │ └── test-connection.yaml │ │ └── values.yaml │ └── tests/ │ ├── admin-values.yaml │ ├── server-values.yaml │ └── test.sh ├── client/ │ ├── pom.xml │ └── src/ │ ├── main/ │ │ └── java/ │ │ └── com/ │ │ └── alibaba/ │ │ └── otter/ │ │ └── canal/ │ │ └── client/ │ │ ├── CanalConnector.java │ │ ├── CanalConnectors.java │ │ ├── CanalMQConnector.java │ │ ├── CanalMessageDeserializer.java │ │ ├── CanalNodeAccessStrategy.java │ │ ├── ConsumerBatchMessage.java │ │ ├── impl/ │ │ │ ├── ClusterCanalConnector.java │ │ │ ├── ClusterNodeAccessStrategy.java │ │ │ ├── ServerNotFoundException.java │ │ │ ├── SimpleCanalConnector.java │ │ │ ├── SimpleNodeAccessStrategy.java │ │ │ └── running/ │ │ │ ├── ClientRunningData.java │ │ │ ├── ClientRunningListener.java │ │ │ └── ClientRunningMonitor.java │ │ ├── kafka/ │ │ │ ├── KafkaCanalConnector.java │ │ │ ├── KafkaOffsetCanalConnector.java │ │ │ ├── MessageDeserializer.java │ │ │ └── protocol/ │ │ │ ├── KafkaFlatMessage.java │ │ │ └── KafkaMessage.java │ │ ├── pulsarmq/ │ │ │ └── PulsarMQCanalConnector.java │ │ ├── rabbitmq/ │ │ │ ├── AliyunCredentialsProvider.java │ │ │ └── RabbitMQCanalConnector.java │ │ └── rocketmq/ │ │ └── RocketMQCanalConnector.java │ └── test/ │ └── java/ │ ├── com/ │ │ └── alibaba/ │ │ └── otter/ │ │ └── canal/ │ │ └── client/ │ │ └── running/ │ │ ├── AbstractZkTest.java │ │ └── ClientRunningTest.java │ └── logback.xml ├── client-adapter/ │ ├── README.md │ ├── clickhouse/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── alibaba/ │ │ │ │ └── otter/ │ │ │ │ └── canal/ │ │ │ │ └── client/ │ │ │ │ └── adapter/ │ │ │ │ └── clickhouse/ │ │ │ │ ├── ClickHouseAdapter.java │ │ │ │ ├── config/ │ │ │ │ │ ├── ConfigLoader.java │ │ │ │ │ ├── MappingConfig.java │ │ │ │ │ └── MirrorDbConfig.java │ │ │ │ ├── monitor/ │ │ │ │ │ └── ClickHouseConfigMonitor.java │ │ │ │ ├── service/ │ │ │ │ │ ├── ClickHouseBatchSyncService.java │ │ │ │ │ ├── ClickHouseEtlService.java │ │ │ │ │ └── ClickHouseMirrorDbBatchSyncService.java │ │ │ │ └── support/ │ │ │ │ ├── BatchExecutor.java │ │ │ │ ├── SingleDml.java │ │ │ │ └── SyncUtil.java │ │ │ └── resources/ │ │ │ ├── META-INF/ │ │ │ │ └── canal/ │ │ │ │ └── com.alibaba.otter.canal.client.adapter.OuterAdapter │ │ │ └── clickhouse/ │ │ │ └── mytest_user.yml │ │ └── test/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── alibaba/ │ │ │ └── otter/ │ │ │ └── canal/ │ │ │ └── client/ │ │ │ └── adapter/ │ │ │ └── clickhouse/ │ │ │ ├── ClickHouseBatchSyncServiceTest.java │ │ │ ├── ClickHouseBatchSyncThreadSafeTest.java │ │ │ ├── TestConstant.java │ │ │ └── sync/ │ │ │ └── Common.java │ │ └── resources/ │ │ └── clickhouse/ │ │ ├── mytest_customer.yml │ │ └── mytest_user.yml │ ├── common/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ └── java/ │ │ │ └── com/ │ │ │ └── alibaba/ │ │ │ └── otter/ │ │ │ └── canal/ │ │ │ └── client/ │ │ │ └── adapter/ │ │ │ ├── OuterAdapter.java │ │ │ ├── ProxyOuterAdapter.java │ │ │ └── support/ │ │ │ ├── AbstractEtlService.java │ │ │ ├── AdapterConfig.java │ │ │ ├── CanalClientConfig.java │ │ │ ├── Constant.java │ │ │ ├── DaemonThreadFactory.java │ │ │ ├── DatasourceConfig.java │ │ │ ├── Dml.java │ │ │ ├── EtlResult.java │ │ │ ├── ExtensionLoader.java │ │ │ ├── FileName2KeyMapping.java │ │ │ ├── JdbcTypeUtil.java │ │ │ ├── MappingConfigsLoader.java │ │ │ ├── MessageUtil.java │ │ │ ├── OuterAdapterConfig.java │ │ │ ├── Result.java │ │ │ ├── SPI.java │ │ │ ├── URLClassExtensionLoader.java │ │ │ ├── Util.java │ │ │ └── YamlUtils.java │ │ └── test/ │ │ └── java/ │ │ └── com/ │ │ └── alibaba/ │ │ └── otter/ │ │ └── canal/ │ │ └── client/ │ │ └── adapter/ │ │ └── support/ │ │ ├── JdbcTypeUtilTest.java │ │ ├── UtilTest.java │ │ └── YamlUtilsTest.java │ ├── es6x/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ ├── com/ │ │ │ │ │ └── alibaba/ │ │ │ │ │ └── otter/ │ │ │ │ │ └── canal/ │ │ │ │ │ └── client/ │ │ │ │ │ └── adapter/ │ │ │ │ │ └── es6x/ │ │ │ │ │ ├── ES6xAdapter.java │ │ │ │ │ ├── etl/ │ │ │ │ │ │ └── ESEtlService.java │ │ │ │ │ └── support/ │ │ │ │ │ ├── ES6xTemplate.java │ │ │ │ │ └── ESConnection.java │ │ │ │ └── org/ │ │ │ │ └── elasticsearch/ │ │ │ │ └── client/ │ │ │ │ ├── RequestConvertersExt.java │ │ │ │ └── RestHighLevelClientExt.java │ │ │ └── resources/ │ │ │ ├── META-INF/ │ │ │ │ └── canal/ │ │ │ │ └── com.alibaba.otter.canal.client.adapter.OuterAdapter │ │ │ └── es6/ │ │ │ ├── biz_order.yml │ │ │ ├── customer.yml │ │ │ └── mytest_user.yml │ │ └── test/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── alibaba/ │ │ │ └── otter/ │ │ │ └── canal/ │ │ │ └── client/ │ │ │ └── adapter/ │ │ │ └── es6x/ │ │ │ └── test/ │ │ │ ├── ConfigLoadTest.java │ │ │ ├── ESTest.java │ │ │ ├── SqlParseTest.java │ │ │ ├── TestConstant.java │ │ │ └── sync/ │ │ │ ├── Common.java │ │ │ ├── LabelSyncJoinSub2Test.java │ │ │ ├── LabelSyncJoinSubTest.java │ │ │ ├── RoleSyncJoinOne2Test.java │ │ │ ├── RoleSyncJoinOneTest.java │ │ │ ├── UserSyncJoinOneTest.java │ │ │ ├── UserSyncSingleTest.java │ │ │ ├── db_schema.sql │ │ │ └── es_mapping.json │ │ └── resources/ │ │ ├── es6/ │ │ │ └── mytest_user_single.yml │ │ ├── log4j2-test.xml │ │ └── logback-test.xml │ ├── es7x/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── alibaba/ │ │ │ │ └── otter/ │ │ │ │ └── canal/ │ │ │ │ └── client/ │ │ │ │ └── adapter/ │ │ │ │ └── es7x/ │ │ │ │ ├── ES7xAdapter.java │ │ │ │ ├── etl/ │ │ │ │ │ └── ESEtlService.java │ │ │ │ └── support/ │ │ │ │ ├── ES7xTemplate.java │ │ │ │ └── ESConnection.java │ │ │ └── resources/ │ │ │ ├── META-INF/ │ │ │ │ └── canal/ │ │ │ │ └── com.alibaba.otter.canal.client.adapter.OuterAdapter │ │ │ └── es7/ │ │ │ ├── biz_order.yml │ │ │ ├── customer.yml │ │ │ └── mytest_user.yml │ │ └── test/ │ │ └── java/ │ │ └── com/ │ │ └── alibaba/ │ │ └── otter/ │ │ └── canal/ │ │ └── client/ │ │ └── adapter/ │ │ └── es7x/ │ │ └── test/ │ │ ├── ES7xTest.java │ │ ├── ESConnectionTest.java │ │ └── TestConstant.java │ ├── es8x/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── alibaba/ │ │ │ │ └── otter/ │ │ │ │ └── canal/ │ │ │ │ └── client/ │ │ │ │ └── adapter/ │ │ │ │ └── es8x/ │ │ │ │ ├── ES8xAdapter.java │ │ │ │ ├── etl/ │ │ │ │ │ └── ESEtlService.java │ │ │ │ └── support/ │ │ │ │ ├── ES8xTemplate.java │ │ │ │ └── ESConnection.java │ │ │ └── resources/ │ │ │ ├── META-INF/ │ │ │ │ └── canal/ │ │ │ │ └── com.alibaba.otter.canal.client.adapter.OuterAdapter │ │ │ └── es8/ │ │ │ ├── biz_order.yml │ │ │ ├── customer.yml │ │ │ └── mytest_user.yml │ │ └── test/ │ │ └── java/ │ │ └── com/ │ │ └── alibaba/ │ │ └── otter/ │ │ └── canal/ │ │ └── client/ │ │ └── adapter/ │ │ └── es8x/ │ │ └── test/ │ │ ├── ESConnectionTest.java │ │ └── TestConstant.java │ ├── escore/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ └── java/ │ │ │ └── com/ │ │ │ └── alibaba/ │ │ │ └── otter/ │ │ │ └── canal/ │ │ │ └── client/ │ │ │ └── adapter/ │ │ │ └── es/ │ │ │ └── core/ │ │ │ ├── ESAdapter.java │ │ │ ├── config/ │ │ │ │ ├── ESSyncConfig.java │ │ │ │ ├── ESSyncConfigLoader.java │ │ │ │ ├── SchemaItem.java │ │ │ │ └── SqlParser.java │ │ │ ├── monitor/ │ │ │ │ └── ESConfigMonitor.java │ │ │ ├── service/ │ │ │ │ └── ESSyncService.java │ │ │ └── support/ │ │ │ ├── ESBulkRequest.java │ │ │ ├── ESSyncUtil.java │ │ │ └── ESTemplate.java │ │ └── test/ │ │ └── java/ │ │ └── com/ │ │ └── alibaba/ │ │ └── otter/ │ │ └── canal/ │ │ └── client/ │ │ └── adapter/ │ │ └── es/ │ │ └── core/ │ │ └── support/ │ │ └── ESSyncUtilTest.java │ ├── hbase/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── alibaba/ │ │ │ │ └── otter/ │ │ │ │ └── canal/ │ │ │ │ └── client/ │ │ │ │ └── adapter/ │ │ │ │ └── hbase/ │ │ │ │ ├── HbaseAdapter.java │ │ │ │ ├── config/ │ │ │ │ │ ├── MappingConfig.java │ │ │ │ │ └── MappingConfigLoader.java │ │ │ │ ├── monitor/ │ │ │ │ │ └── HbaseConfigMonitor.java │ │ │ │ ├── service/ │ │ │ │ │ ├── HbaseEtlService.java │ │ │ │ │ └── HbaseSyncService.java │ │ │ │ └── support/ │ │ │ │ ├── HRow.java │ │ │ │ ├── HbaseTemplate.java │ │ │ │ ├── PhType.java │ │ │ │ ├── PhTypeUtil.java │ │ │ │ ├── Type.java │ │ │ │ └── TypeUtil.java │ │ │ └── resources/ │ │ │ ├── META-INF/ │ │ │ │ └── canal/ │ │ │ │ └── com.alibaba.otter.canal.client.adapter.OuterAdapter │ │ │ └── hbase/ │ │ │ └── mytest_person2.yml │ │ └── test/ │ │ └── java/ │ │ └── com/ │ │ └── alibaba/ │ │ └── otter/ │ │ └── canal/ │ │ └── client/ │ │ └── adapter/ │ │ └── hbase/ │ │ └── test/ │ │ └── HBaseConnectionTest.java │ ├── kudu/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── alibaba/ │ │ │ │ └── otter/ │ │ │ │ └── canal/ │ │ │ │ └── client/ │ │ │ │ └── adapter/ │ │ │ │ └── kudu/ │ │ │ │ ├── KuduAdapter.java │ │ │ │ ├── config/ │ │ │ │ │ ├── KuduMappingConfig.java │ │ │ │ │ └── KuduMappingConfigLoader.java │ │ │ │ ├── monitor/ │ │ │ │ │ └── KuduConfigMonitor.java │ │ │ │ ├── service/ │ │ │ │ │ ├── KuduEtlService.java │ │ │ │ │ └── KuduSyncService.java │ │ │ │ └── support/ │ │ │ │ ├── KuduTemplate.java │ │ │ │ └── SyncUtil.java │ │ │ └── resources/ │ │ │ ├── META-INF.canal/ │ │ │ │ └── com.alibaba.otter.canal.client.adapter.OuterAdapter │ │ │ └── kudu/ │ │ │ └── kudutest_user.yml │ │ └── test/ │ │ └── java/ │ │ └── com/ │ │ └── alibaba/ │ │ └── otter/ │ │ └── canal/ │ │ └── client/ │ │ └── adapter/ │ │ └── kudu/ │ │ └── test/ │ │ ├── KuduConnectionTest.java │ │ ├── TestConfig.java │ │ ├── TestConstant.java │ │ └── sync/ │ │ ├── Common.java │ │ └── TestSyncKudu.java │ ├── launcher/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── assembly/ │ │ │ ├── dev.xml │ │ │ └── release.xml │ │ ├── bin/ │ │ │ ├── restart.sh │ │ │ ├── startup.bat │ │ │ ├── startup.sh │ │ │ └── stop.sh │ │ ├── java/ │ │ │ └── com/ │ │ │ └── alibaba/ │ │ │ └── otter/ │ │ │ └── canal/ │ │ │ └── adapter/ │ │ │ └── launcher/ │ │ │ ├── CanalAdapterApplication.java │ │ │ ├── common/ │ │ │ │ ├── EtlLock.java │ │ │ │ ├── Mode.java │ │ │ │ └── SyncSwitch.java │ │ │ ├── config/ │ │ │ │ ├── AdapterCanalConfig.java │ │ │ │ ├── AdapterConfigHolder.java │ │ │ │ ├── BootstrapConfiguration.java │ │ │ │ ├── CuratorClient.java │ │ │ │ ├── DruidConfig.java │ │ │ │ └── SpringContext.java │ │ │ ├── loader/ │ │ │ │ ├── AdapterProcessor.java │ │ │ │ ├── CanalAdapterLoader.java │ │ │ │ └── CanalAdapterService.java │ │ │ ├── monitor/ │ │ │ │ ├── ApplicationConfigMonitor.java │ │ │ │ └── remote/ │ │ │ │ ├── ConfigItem.java │ │ │ │ ├── DbRemoteConfigLoader.java │ │ │ │ ├── RemoteAdapterMonitor.java │ │ │ │ ├── RemoteAdapterMonitorImpl.java │ │ │ │ ├── RemoteConfigLoader.java │ │ │ │ └── RemoteConfigLoaderFactory.java │ │ │ ├── prometheus/ │ │ │ │ ├── CanalAdapterExports.java │ │ │ │ └── PrometheusService.java │ │ │ └── rest/ │ │ │ └── CommonRest.java │ │ └── resources/ │ │ ├── META-INF/ │ │ │ └── spring.factories │ │ ├── application.yml │ │ ├── bootstrap.yml │ │ └── logback.xml │ ├── logger/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── alibaba/ │ │ │ └── otter/ │ │ │ └── canal/ │ │ │ └── client/ │ │ │ └── adapter/ │ │ │ └── logger/ │ │ │ └── LoggerAdapterExample.java │ │ └── resources/ │ │ └── META-INF/ │ │ └── canal/ │ │ └── com.alibaba.otter.canal.client.adapter.OuterAdapter │ ├── phoenix/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── alibaba/ │ │ │ │ └── otter/ │ │ │ │ └── canal/ │ │ │ │ └── client/ │ │ │ │ └── adapter/ │ │ │ │ └── phoenix/ │ │ │ │ ├── PhoenixAdapter.java │ │ │ │ ├── config/ │ │ │ │ │ ├── ConfigLoader.java │ │ │ │ │ ├── ConfigurationManager.java │ │ │ │ │ └── MappingConfig.java │ │ │ │ ├── monitor/ │ │ │ │ │ └── PhoenixConfigMonitor.java │ │ │ │ ├── service/ │ │ │ │ │ ├── PhoenixEtlService.java │ │ │ │ │ └── PhoenixSyncService.java │ │ │ │ └── support/ │ │ │ │ ├── BatchExecutor.java │ │ │ │ ├── PhoenixSupportUtil.java │ │ │ │ ├── SingleDml.java │ │ │ │ ├── SyncUtil.java │ │ │ │ └── TypeUtil.java │ │ │ └── resources/ │ │ │ ├── META-INF/ │ │ │ │ └── canal/ │ │ │ │ └── com.alibaba.otter.canal.client.adapter.OuterAdapter │ │ │ ├── hbase-site.xml │ │ │ └── phoenix/ │ │ │ ├── phoenix_common.properties │ │ │ └── phoenixtest_user.yml │ │ └── test/ │ │ └── java/ │ │ └── com/ │ │ └── alibaba/ │ │ └── otter/ │ │ └── canal/ │ │ └── client/ │ │ └── adapter/ │ │ └── phoenix/ │ │ └── test/ │ │ ├── PhoenixConnectionTest.java │ │ ├── TestConfigLoad.java │ │ ├── TestConstant.java │ │ └── sync/ │ │ ├── Common.java │ │ └── PhoenixSyncTest.java │ ├── pom.xml │ ├── rdb/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── alibaba/ │ │ │ │ └── otter/ │ │ │ │ └── canal/ │ │ │ │ └── client/ │ │ │ │ └── adapter/ │ │ │ │ └── rdb/ │ │ │ │ ├── RdbAdapter.java │ │ │ │ ├── config/ │ │ │ │ │ ├── ConfigLoader.java │ │ │ │ │ ├── MappingConfig.java │ │ │ │ │ └── MirrorDbConfig.java │ │ │ │ ├── monitor/ │ │ │ │ │ └── RdbConfigMonitor.java │ │ │ │ ├── service/ │ │ │ │ │ ├── RdbEtlService.java │ │ │ │ │ ├── RdbMirrorDbSyncService.java │ │ │ │ │ └── RdbSyncService.java │ │ │ │ └── support/ │ │ │ │ ├── BatchExecutor.java │ │ │ │ ├── SingleDml.java │ │ │ │ └── SyncUtil.java │ │ │ └── resources/ │ │ │ ├── META-INF/ │ │ │ │ └── canal/ │ │ │ │ └── com.alibaba.otter.canal.client.adapter.OuterAdapter │ │ │ └── rdb/ │ │ │ └── mytest_user.yml │ │ └── test/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── alibaba/ │ │ │ └── otter/ │ │ │ └── canal/ │ │ │ └── client/ │ │ │ └── adapter/ │ │ │ └── rdb/ │ │ │ └── test/ │ │ │ ├── ConfigLoadTest.java │ │ │ ├── DBTest.java │ │ │ ├── SqlParserTest.java │ │ │ ├── TestConstant.java │ │ │ └── sync/ │ │ │ ├── Common.java │ │ │ └── OracleSyncTest.java │ │ └── resources/ │ │ ├── log4j2-test.xml │ │ ├── logback-test.xml │ │ └── rdb/ │ │ └── mytest_user.yml │ └── tablestore/ │ ├── pom.xml │ └── src/ │ └── main/ │ ├── java/ │ │ └── com/ │ │ └── alibaba/ │ │ └── otter/ │ │ └── canal/ │ │ └── client/ │ │ └── adapter/ │ │ └── tablestore/ │ │ ├── TablestoreAdapter.java │ │ ├── common/ │ │ │ └── PropertyConstants.java │ │ ├── config/ │ │ │ ├── ConfigLoader.java │ │ │ └── MappingConfig.java │ │ ├── enums/ │ │ │ └── TablestoreFieldType.java │ │ ├── service/ │ │ │ ├── TablestoreEtlService.java │ │ │ └── TablestoreSyncService.java │ │ └── support/ │ │ └── SyncUtil.java │ └── resources/ │ ├── META-INF/ │ │ └── canal/ │ │ └── com.alibaba.otter.canal.client.adapter.OuterAdapter │ └── tablestore/ │ └── test.yml ├── codeformat.xml ├── codetemplates.xml ├── common/ │ ├── pom.xml │ └── src/ │ ├── main/ │ │ └── java/ │ │ └── com/ │ │ ├── alibaba/ │ │ │ └── otter/ │ │ │ └── canal/ │ │ │ └── common/ │ │ │ ├── AbstractCanalLifeCycle.java │ │ │ ├── CanalException.java │ │ │ ├── CanalLifeCycle.java │ │ │ ├── alarm/ │ │ │ │ ├── CanalAlarmHandler.java │ │ │ │ └── LogAlarmHandler.java │ │ │ ├── utils/ │ │ │ │ ├── AddressUtils.java │ │ │ │ ├── BooleanMutex.java │ │ │ │ ├── CanalToStringStyle.java │ │ │ │ ├── CommonUtils.java │ │ │ │ ├── ExecutorTemplate.java │ │ │ │ ├── FileUtils.java │ │ │ │ ├── JsonUtils.java │ │ │ │ ├── MQUtil.java │ │ │ │ ├── NamedThreadFactory.java │ │ │ │ ├── PropertiesUtils.java │ │ │ │ └── UriUtils.java │ │ │ └── zookeeper/ │ │ │ ├── ByteSerializer.java │ │ │ ├── StringSerializer.java │ │ │ ├── ZkClientx.java │ │ │ ├── ZooKeeperx.java │ │ │ ├── ZookeeperPathUtils.java │ │ │ └── running/ │ │ │ ├── ServerRunningData.java │ │ │ ├── ServerRunningListener.java │ │ │ ├── ServerRunningMonitor.java │ │ │ └── ServerRunningMonitors.java │ │ └── google/ │ │ └── common/ │ │ └── collect/ │ │ └── MigrateMap.java │ └── test/ │ └── java/ │ ├── com/ │ │ └── alibaba/ │ │ └── otter/ │ │ └── canal/ │ │ └── common/ │ │ ├── AbstractZkTest.java │ │ ├── JsonUtilsTest.java │ │ ├── ServerRunningTest.java │ │ └── utils/ │ │ └── BooleanMutexTest.java │ └── logback.xml ├── connector/ │ ├── core/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── com/ │ │ └── alibaba/ │ │ └── otter/ │ │ └── canal/ │ │ └── connector/ │ │ └── core/ │ │ ├── config/ │ │ │ ├── CanalConstants.java │ │ │ └── MQProperties.java │ │ ├── consumer/ │ │ │ └── CommonMessage.java │ │ ├── filter/ │ │ │ ├── AviaterRegexFilter.java │ │ │ ├── PatternUtils.java │ │ │ └── RegexFunction.java │ │ ├── producer/ │ │ │ ├── AbstractMQProducer.java │ │ │ ├── MQDestination.java │ │ │ └── MQMessageUtils.java │ │ ├── spi/ │ │ │ ├── CanalMQProducer.java │ │ │ ├── CanalMsgConsumer.java │ │ │ ├── ExtensionLoader.java │ │ │ ├── ProxyCanalMQProducer.java │ │ │ ├── ProxyCanalMsgConsumer.java │ │ │ ├── SPI.java │ │ │ └── URLClassExtensionLoader.java │ │ └── util/ │ │ ├── Callback.java │ │ ├── CanalMessageSerializerUtil.java │ │ ├── DateUtil.java │ │ ├── JdbcTypeUtil.java │ │ ├── MessageUtil.java │ │ └── TimeZone.java │ ├── kafka-connector/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── alibaba/ │ │ │ │ └── otter/ │ │ │ │ └── canal/ │ │ │ │ └── connector/ │ │ │ │ └── kafka/ │ │ │ │ ├── config/ │ │ │ │ │ ├── KafkaConstants.java │ │ │ │ │ └── KafkaProducerConfig.java │ │ │ │ ├── consumer/ │ │ │ │ │ ├── CanalKafkaConsumer.java │ │ │ │ │ └── KafkaMessageDeserializer.java │ │ │ │ └── producer/ │ │ │ │ ├── CanalKafkaProducer.java │ │ │ │ └── KafkaMessageSerializer.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── canal/ │ │ │ ├── com.alibaba.otter.canal.connector.core.spi.CanalMQProducer │ │ │ └── com.alibaba.otter.canal.connector.core.spi.CanalMsgConsumer │ │ └── test/ │ │ └── java/ │ │ └── com/ │ │ └── alibaba/ │ │ └── otter/ │ │ └── canal/ │ │ └── connector/ │ │ └── kafka/ │ │ └── test/ │ │ └── CanalKafkaProducerTest.java │ ├── pom.xml │ ├── pulsarmq-connector/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── alibaba/ │ │ │ │ └── otter/ │ │ │ │ └── canal/ │ │ │ │ └── connector/ │ │ │ │ └── pulsarmq/ │ │ │ │ ├── config/ │ │ │ │ │ ├── PulsarMQConstants.java │ │ │ │ │ └── PulsarMQProducerConfig.java │ │ │ │ ├── consumer/ │ │ │ │ │ └── CanalPulsarMQConsumer.java │ │ │ │ └── producer/ │ │ │ │ └── CanalPulsarMQProducer.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── canal/ │ │ │ ├── com.alibaba.otter.canal.connector.core.spi.CanalMQProducer │ │ │ └── com.alibaba.otter.canal.connector.core.spi.CanalMsgConsumer │ │ └── test/ │ │ └── java/ │ │ └── com/ │ │ └── alibaba/ │ │ └── otter/ │ │ └── canal/ │ │ └── connector/ │ │ └── pulsarmq/ │ │ └── consumer/ │ │ └── CanalPulsarMQConsumerTest.java │ ├── rabbitmq-connector/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── alibaba/ │ │ │ └── otter/ │ │ │ └── canal/ │ │ │ └── connector/ │ │ │ └── rabbitmq/ │ │ │ ├── config/ │ │ │ │ ├── RabbitMQConstants.java │ │ │ │ └── RabbitMQProducerConfig.java │ │ │ ├── consumer/ │ │ │ │ ├── CanalRabbitMQConsumer.java │ │ │ │ └── ConsumerBatchMessage.java │ │ │ └── producer/ │ │ │ ├── AliyunCredentialsProvider.java │ │ │ └── CanalRabbitMQProducer.java │ │ └── resources/ │ │ └── META-INF/ │ │ └── canal/ │ │ ├── com.alibaba.otter.canal.connector.core.spi.CanalMQProducer │ │ └── com.alibaba.otter.canal.connector.core.spi.CanalMsgConsumer │ ├── rocketmq-connector/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── alibaba/ │ │ │ └── otter/ │ │ │ └── canal/ │ │ │ └── connector/ │ │ │ └── rocketmq/ │ │ │ ├── config/ │ │ │ │ ├── RocketMQConstants.java │ │ │ │ └── RocketMQProducerConfig.java │ │ │ ├── consumer/ │ │ │ │ ├── CanalRocketMQConsumer.java │ │ │ │ └── ConsumerBatchMessage.java │ │ │ └── producer/ │ │ │ └── CanalRocketMQProducer.java │ │ └── resources/ │ │ └── META-INF/ │ │ └── canal/ │ │ ├── com.alibaba.otter.canal.connector.core.spi.CanalMQProducer │ │ └── com.alibaba.otter.canal.connector.core.spi.CanalMsgConsumer │ └── tcp-connector/ │ ├── pom.xml │ └── src/ │ └── main/ │ ├── java/ │ │ └── com/ │ │ └── alibaba/ │ │ └── otter/ │ │ └── canal/ │ │ └── connector/ │ │ └── tcp/ │ │ ├── config/ │ │ │ └── TCPConstants.java │ │ └── consumer/ │ │ └── CanalTCPConsumer.java │ └── resources/ │ └── META-INF/ │ └── canal/ │ └── com.alibaba.otter.canal.connector.core.spi.CanalMsgConsumer ├── dbsync/ │ ├── pom.xml │ └── src/ │ ├── main/ │ │ └── java/ │ │ └── com/ │ │ └── taobao/ │ │ └── tddl/ │ │ └── dbsync/ │ │ └── binlog/ │ │ ├── CharsetConversion.java │ │ ├── DirectLogFetcher.java │ │ ├── FileLogFetcher.java │ │ ├── JsonConversion.java │ │ ├── JsonDiffConversion.java │ │ ├── LogBuffer.java │ │ ├── LogContext.java │ │ ├── LogDecoder.java │ │ ├── LogEvent.java │ │ ├── LogFetcher.java │ │ ├── LogPosition.java │ │ ├── NameCache.java │ │ ├── event/ │ │ │ ├── AppendBlockLogEvent.java │ │ │ ├── BeginLoadQueryLogEvent.java │ │ │ ├── CreateFileLogEvent.java │ │ │ ├── DeleteFileLogEvent.java │ │ │ ├── DeleteRowsLogEvent.java │ │ │ ├── ExecuteLoadLogEvent.java │ │ │ ├── ExecuteLoadQueryLogEvent.java │ │ │ ├── FormatDescriptionLogEvent.java │ │ │ ├── GtidLogEvent.java │ │ │ ├── HeartbeatLogEvent.java │ │ │ ├── HeartbeatV2LogEvent.java │ │ │ ├── IgnorableLogEvent.java │ │ │ ├── IncidentLogEvent.java │ │ │ ├── IntvarLogEvent.java │ │ │ ├── LoadLogEvent.java │ │ │ ├── LogHeader.java │ │ │ ├── PreviousGtidsLogEvent.java │ │ │ ├── QueryLogEvent.java │ │ │ ├── RandLogEvent.java │ │ │ ├── RotateLogEvent.java │ │ │ ├── RowsLogBuffer.java │ │ │ ├── RowsLogEvent.java │ │ │ ├── RowsQueryLogEvent.java │ │ │ ├── StartLogEventV3.java │ │ │ ├── StopLogEvent.java │ │ │ ├── TableMapLogEvent.java │ │ │ ├── TransactionContextLogEvent.java │ │ │ ├── TransactionPayloadLogEvent.java │ │ │ ├── UnknownLogEvent.java │ │ │ ├── UpdateRowsLogEvent.java │ │ │ ├── UserVarLogEvent.java │ │ │ ├── ViewChangeEvent.java │ │ │ ├── WriteRowsLogEvent.java │ │ │ ├── XaPrepareLogEvent.java │ │ │ ├── XidLogEvent.java │ │ │ └── mariadb/ │ │ │ ├── AnnotateRowsEvent.java │ │ │ ├── BinlogCheckPointLogEvent.java │ │ │ ├── DeleteRowsCompressLogEvent.java │ │ │ ├── MariaGtidListLogEvent.java │ │ │ ├── MariaGtidLogEvent.java │ │ │ ├── QueryCompressedLogEvent.java │ │ │ ├── StartEncryptionLogEvent.java │ │ │ ├── UpdateRowsCompressLogEvent.java │ │ │ └── WriteRowsCompressLogEvent.java │ │ └── exception/ │ │ └── TableIdNotFoundException.java │ └── test/ │ ├── java/ │ │ └── com/ │ │ └── taobao/ │ │ └── tddl/ │ │ └── dbsync/ │ │ ├── FetcherPerformanceTest.java │ │ └── binlog/ │ │ ├── BaseLogFetcherTest.java │ │ ├── DirectLogFetcherTest.java │ │ ├── FileLogFetcherTest.java │ │ ├── JsonConversion_Json_ValueTest.java │ │ ├── JsonDiffConversionTest.java │ │ ├── LogEventTest.java │ │ └── event/ │ │ └── LogHeaderTest.java │ └── resources/ │ ├── binlog/ │ │ └── mysql-bin.000001 │ └── dummy.txt ├── deployer/ │ ├── pom.xml │ └── src/ │ └── main/ │ ├── assembly/ │ │ ├── dev.xml │ │ └── release.xml │ ├── bin/ │ │ ├── restart.sh │ │ ├── startup.bat │ │ ├── startup.sh │ │ └── stop.sh │ ├── java/ │ │ └── com/ │ │ └── alibaba/ │ │ └── otter/ │ │ └── canal/ │ │ └── deployer/ │ │ ├── CanalConstants.java │ │ ├── CanalController.java │ │ ├── CanalLauncher.java │ │ ├── CanalStarter.java │ │ ├── InstanceConfig.java │ │ ├── admin/ │ │ │ └── CanalAdminController.java │ │ └── monitor/ │ │ ├── InstanceAction.java │ │ ├── InstanceConfigMonitor.java │ │ ├── ManagerInstanceConfigMonitor.java │ │ └── SpringInstanceConfigMonitor.java │ └── resources/ │ ├── canal.properties │ ├── canal_local.properties │ ├── example/ │ │ └── instance.properties │ ├── logback.xml │ ├── metrics/ │ │ └── Canal_instances_tmpl.json │ └── spring/ │ ├── base-instance.xml │ ├── default-instance.xml │ ├── file-instance.xml │ ├── group-instance.xml │ ├── memory-instance.xml │ └── tsdb/ │ ├── h2-tsdb.xml │ ├── mysql-tsdb.xml │ ├── sql/ │ │ └── create_table.sql │ └── sql-map/ │ ├── sqlmap-config.xml │ ├── sqlmap_history.xml │ └── sqlmap_snapshot.xml ├── docker/ │ ├── Dockerfile │ ├── Dockerfile_admin │ ├── base/ │ │ ├── README.md │ │ ├── amd64/ │ │ │ ├── Dockerfile │ │ │ ├── Dockerfile_admin │ │ │ └── yum/ │ │ │ └── CentOS-Base.repo │ │ └── arm64/ │ │ ├── Dockerfile │ │ ├── Dockerfile_admin │ │ └── yum/ │ │ └── CentOS-Base.repo │ ├── build.sh │ ├── image/ │ │ ├── admin/ │ │ │ ├── bin/ │ │ │ │ ├── clean_log │ │ │ │ └── clean_log.sh │ │ │ └── health.sh │ │ ├── alidata/ │ │ │ ├── bin/ │ │ │ │ ├── exec_rc_local.sh │ │ │ │ ├── lark-wait │ │ │ │ └── main.sh │ │ │ ├── init/ │ │ │ │ ├── 02init-sshd.sh │ │ │ │ └── fix-hosts.py │ │ │ └── lib/ │ │ │ └── proc.sh │ │ ├── app.sh │ │ ├── app_admin.sh │ │ └── canal_manager.sql │ ├── run.sh │ └── run_admin.sh ├── driver/ │ ├── pom.xml │ └── src/ │ ├── main/ │ │ └── java/ │ │ └── com/ │ │ └── alibaba/ │ │ └── otter/ │ │ └── canal/ │ │ └── parse/ │ │ └── driver/ │ │ └── mysql/ │ │ ├── MysqlConnector.java │ │ ├── MysqlQueryExecutor.java │ │ ├── MysqlUpdateExecutor.java │ │ ├── packets/ │ │ │ ├── Capability.java │ │ │ ├── CommandPacket.java │ │ │ ├── GTIDSet.java │ │ │ ├── HeaderPacket.java │ │ │ ├── IPacket.java │ │ │ ├── MariaGTIDSet.java │ │ │ ├── MariaGtid.java │ │ │ ├── MysqlGTIDSet.java │ │ │ ├── PacketWithHeaderPacket.java │ │ │ ├── UUIDSet.java │ │ │ ├── client/ │ │ │ │ ├── AuthSwitchResponsePacket.java │ │ │ │ ├── BinlogDumpCommandPacket.java │ │ │ │ ├── BinlogDumpGTIDCommandPacket.java │ │ │ │ ├── ClientAuthenticationPacket.java │ │ │ │ ├── ClientAuthenticationSHA2Packet.java │ │ │ │ ├── QueryCommandPacket.java │ │ │ │ ├── QuitCommandPacket.java │ │ │ │ ├── RegisterSlaveCommandPacket.java │ │ │ │ ├── SemiAckCommandPacket.java │ │ │ │ └── SslRequestCommandPacket.java │ │ │ └── server/ │ │ │ ├── AuthSwitchRequestMoreData.java │ │ │ ├── AuthSwitchRequestPacket.java │ │ │ ├── DataPacket.java │ │ │ ├── EOFPacket.java │ │ │ ├── ErrorPacket.java │ │ │ ├── FieldPacket.java │ │ │ ├── HandshakeInitializationPacket.java │ │ │ ├── OKPacket.java │ │ │ ├── Reply323Packet.java │ │ │ ├── ResultSetHeaderPacket.java │ │ │ ├── ResultSetPacket.java │ │ │ └── RowDataPacket.java │ │ ├── socket/ │ │ │ ├── BioSocketChannel.java │ │ │ ├── BioSocketChannelPool.java │ │ │ ├── NettySocketChannel.java │ │ │ ├── NettySocketChannelPool.java │ │ │ ├── SocketChannel.java │ │ │ └── SocketChannelPool.java │ │ ├── ssl/ │ │ │ ├── SslInfo.java │ │ │ └── SslMode.java │ │ └── utils/ │ │ ├── BinlogDumpCommandBuilder.java │ │ ├── ByteHelper.java │ │ ├── ChannelBufferHelper.java │ │ ├── CharsetUtil.java │ │ ├── GtidUtil.java │ │ ├── LengthCodedStringReader.java │ │ ├── MSC.java │ │ ├── MySQLPasswordEncrypter.java │ │ └── PacketManager.java │ └── test/ │ └── java/ │ └── com/ │ └── alibaba/ │ └── otter/ │ └── canal/ │ └── parse/ │ └── driver/ │ └── mysql/ │ ├── CharsetUtilTest.java │ ├── MysqlConnectorTest.java │ ├── MysqlGTIDSetTest.java │ ├── UUIDSetTest.java │ ├── packets/ │ │ └── client/ │ │ └── RegisterSlaveCommandPacketTest.java │ └── utils/ │ ├── ByteHelperTest.java │ └── MySQLPasswordEncrypterTest.java ├── example/ │ ├── pom.xml │ └── src/ │ └── main/ │ ├── assembly/ │ │ ├── dev.xml │ │ └── release.xml │ ├── bin/ │ │ ├── init.sh │ │ ├── startup.bat │ │ ├── startup.sh │ │ └── stop.sh │ ├── java/ │ │ └── com/ │ │ └── alibaba/ │ │ └── otter/ │ │ └── canal/ │ │ └── example/ │ │ ├── AbstractCanalClientTest.java │ │ ├── BaseCanalClientTest.java │ │ ├── ClusterCanalClientTest.java │ │ ├── SimpleCanalClientPermanceTest.java │ │ ├── SimpleCanalClientTest.java │ │ ├── kafka/ │ │ │ ├── AbstractKafkaTest.java │ │ │ ├── CanalKafkaClientExample.java │ │ │ ├── CanalKafkaClientFlatMessageExample.java │ │ │ ├── CanalKafkaOffsetClientExample.java │ │ │ └── KafkaClientRunningTest.java │ │ └── rocketmq/ │ │ ├── AbstractRocektMQTest.java │ │ ├── CanalRocketMQClientExample.java │ │ └── CanalRocketMQClientFlatMessageExample.java │ └── resources/ │ └── logback.xml ├── filter/ │ ├── pom.xml │ └── src/ │ ├── main/ │ │ └── java/ │ │ └── com/ │ │ └── alibaba/ │ │ └── otter/ │ │ └── canal/ │ │ └── filter/ │ │ ├── CanalEventFilter.java │ │ ├── PatternUtils.java │ │ ├── aviater/ │ │ │ ├── AviaterELFilter.java │ │ │ ├── AviaterRegexFilter.java │ │ │ ├── AviaterSimpleFilter.java │ │ │ └── RegexFunction.java │ │ └── exception/ │ │ └── CanalFilterException.java │ └── test/ │ └── java/ │ └── com/ │ └── alibaba/ │ └── otter/ │ └── canal/ │ └── filter/ │ ├── AviaterFilterTest.java │ └── MutliAviaterFilterTest.java ├── instance/ │ ├── core/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── com/ │ │ └── alibaba/ │ │ └── otter/ │ │ └── canal/ │ │ └── instance/ │ │ └── core/ │ │ ├── AbstractCanalInstance.java │ │ ├── CanalInstance.java │ │ ├── CanalInstanceGenerator.java │ │ └── CanalMQConfig.java │ ├── manager/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ └── java/ │ │ │ └── com/ │ │ │ └── alibaba/ │ │ │ └── otter/ │ │ │ └── canal/ │ │ │ └── instance/ │ │ │ └── manager/ │ │ │ ├── CanalConfigClient.java │ │ │ ├── CanalInstanceWithManager.java │ │ │ ├── ManagerCanalInstanceGenerator.java │ │ │ ├── PlainCanalInstanceGenerator.java │ │ │ ├── model/ │ │ │ │ ├── Canal.java │ │ │ │ ├── CanalParameter.java │ │ │ │ └── CanalStatus.java │ │ │ └── plain/ │ │ │ ├── HttpHelper.java │ │ │ ├── PlainCanal.java │ │ │ └── PlainCanalConfigClient.java │ │ └── test/ │ │ └── java/ │ │ └── com/ │ │ └── alibaba/ │ │ └── otter/ │ │ └── canal/ │ │ └── instance/ │ │ └── manager/ │ │ └── PlainCanalConfigClientIntegration.java │ ├── pom.xml │ └── spring/ │ ├── pom.xml │ └── src/ │ ├── main/ │ │ └── java/ │ │ └── com/ │ │ └── alibaba/ │ │ └── otter/ │ │ └── canal/ │ │ └── instance/ │ │ └── spring/ │ │ ├── CanalInstanceWithSpring.java │ │ ├── SpringCanalInstanceGenerator.java │ │ └── support/ │ │ ├── PropertyPlaceholderConfigurer.java │ │ └── SocketAddressEditor.java │ └── test/ │ ├── java/ │ │ └── com/ │ │ └── alibaba/ │ │ └── otter/ │ │ └── canal/ │ │ └── instance/ │ │ └── spring/ │ │ └── integrated/ │ │ ├── DefaultSpringInstanceTest.java │ │ ├── GroupSpringInstanceTest.java │ │ └── MemorySpringInstanceTest.java │ └── resources/ │ ├── canal.properties │ ├── retl/ │ │ └── instance.properties │ └── spring/ │ ├── default-instance.xml │ ├── file-instance.xml │ ├── group-instance.xml │ └── memory-instance.xml ├── meta/ │ ├── pom.xml │ └── src/ │ ├── main/ │ │ └── java/ │ │ └── com/ │ │ └── alibaba/ │ │ └── otter/ │ │ └── canal/ │ │ └── meta/ │ │ ├── CanalMetaManager.java │ │ ├── FileMixedMetaManager.java │ │ ├── MemoryMetaManager.java │ │ ├── MixedMetaManager.java │ │ ├── PeriodMixedMetaManager.java │ │ ├── ZooKeeperMetaManager.java │ │ └── exception/ │ │ └── CanalMetaManagerException.java │ └── test/ │ └── java/ │ └── com/ │ └── alibaba/ │ └── otter/ │ └── canal/ │ └── meta/ │ ├── AbstractMetaManagerTest.java │ ├── AbstractZkTest.java │ ├── FileMixedMetaManagerTest.java │ ├── MemoryMetaManagerTest.java │ ├── MixedMetaManagerTest.java │ ├── PeriodMixedMetaManagerTest.java │ └── ZooKeeperMetaManagerTest.java ├── mvnw ├── parse/ │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── alibaba/ │ │ │ └── otter/ │ │ │ └── canal/ │ │ │ └── parse/ │ │ │ ├── CanalEventParser.java │ │ │ ├── CanalHASwitchable.java │ │ │ ├── exception/ │ │ │ │ ├── CanalHAException.java │ │ │ │ ├── CanalParseException.java │ │ │ │ ├── PositionNotFoundException.java │ │ │ │ ├── ServerIdNotMatchException.java │ │ │ │ └── ServerLogPurgedException.java │ │ │ ├── ha/ │ │ │ │ ├── CanalHAController.java │ │ │ │ └── HeartBeatHAController.java │ │ │ ├── inbound/ │ │ │ │ ├── AbstractBinlogParser.java │ │ │ │ ├── AbstractEventParser.java │ │ │ │ ├── BinlogParser.java │ │ │ │ ├── ErosaConnection.java │ │ │ │ ├── EventTransactionBuffer.java │ │ │ │ ├── HeartBeatCallback.java │ │ │ │ ├── MultiStageCoprocessor.java │ │ │ │ ├── ParserExceptionHandler.java │ │ │ │ ├── SinkFunction.java │ │ │ │ ├── TableMeta.java │ │ │ │ ├── group/ │ │ │ │ │ └── GroupEventParser.java │ │ │ │ └── mysql/ │ │ │ │ ├── AbstractMysqlEventParser.java │ │ │ │ ├── DbsyncMysqlEventParser.java │ │ │ │ ├── LocalBinLogConnection.java │ │ │ │ ├── LocalBinlogEventParser.java │ │ │ │ ├── MysqlConnection.java │ │ │ │ ├── MysqlEventParser.java │ │ │ │ ├── MysqlMultiStageCoprocessor.java │ │ │ │ ├── SlaveEntryPosition.java │ │ │ │ ├── dbsync/ │ │ │ │ │ ├── DirectLogFetcher.java │ │ │ │ │ ├── LogEventConvert.java │ │ │ │ │ └── TableMetaCache.java │ │ │ │ ├── ddl/ │ │ │ │ │ ├── DdlResult.java │ │ │ │ │ ├── DruidDdlParser.java │ │ │ │ │ └── SimpleDdlParser.java │ │ │ │ ├── local/ │ │ │ │ │ ├── BinLogFileQueue.java │ │ │ │ │ └── BufferedFileDataInput.java │ │ │ │ ├── rds/ │ │ │ │ │ ├── BinlogDownloadQueue.java │ │ │ │ │ ├── HttpHelper.java │ │ │ │ │ ├── RdsBinlogEventParserProxy.java │ │ │ │ │ ├── RdsBinlogOpenApi.java │ │ │ │ │ ├── RdsLocalBinlogEventParser.java │ │ │ │ │ ├── data/ │ │ │ │ │ │ ├── BinlogFile.java │ │ │ │ │ │ ├── DescribeBinlogFileResult.java │ │ │ │ │ │ ├── RdsBackupPolicy.java │ │ │ │ │ │ └── RdsItem.java │ │ │ │ │ └── request/ │ │ │ │ │ ├── AbstractRequest.java │ │ │ │ │ ├── DescribeBackupPolicyRequest.java │ │ │ │ │ └── DescribeBinlogFilesRequest.java │ │ │ │ └── tsdb/ │ │ │ │ ├── DatabaseTableMeta.java │ │ │ │ ├── DefaultTableMetaTSDBFactory.java │ │ │ │ ├── MemoryTableMeta.java │ │ │ │ ├── TableMetaTSDB.java │ │ │ │ ├── TableMetaTSDBBuilder.java │ │ │ │ ├── TableMetaTSDBFactory.java │ │ │ │ └── dao/ │ │ │ │ ├── MetaBaseDAO.java │ │ │ │ ├── MetaHistoryDAO.java │ │ │ │ ├── MetaHistoryDO.java │ │ │ │ ├── MetaHistoryMapper.java │ │ │ │ ├── MetaSnapshotDAO.java │ │ │ │ ├── MetaSnapshotDO.java │ │ │ │ └── MetaSnapshotMapper.java │ │ │ ├── index/ │ │ │ │ ├── AbstractLogPositionManager.java │ │ │ │ ├── CanalLogPositionManager.java │ │ │ │ ├── FailbackLogPositionManager.java │ │ │ │ ├── FileMixedLogPositionManager.java │ │ │ │ ├── MemoryLogPositionManager.java │ │ │ │ ├── MetaLogPositionManager.java │ │ │ │ ├── MixedLogPositionManager.java │ │ │ │ ├── PeriodMixedLogPositionManager.java │ │ │ │ └── ZooKeeperLogPositionManager.java │ │ │ └── support/ │ │ │ ├── AuthenticationInfo.java │ │ │ └── HaAuthenticationInfo.java │ │ └── resources/ │ │ └── ddl/ │ │ ├── derby/ │ │ │ ├── meta_history.sql │ │ │ └── meta_snapshot.sql │ │ ├── h2/ │ │ │ ├── meta_history.sql │ │ │ └── meta_snapshot.sql │ │ └── mysql/ │ │ ├── meta_history.sql │ │ └── meta_snapshot.sql │ └── test/ │ ├── java/ │ │ └── com/ │ │ └── alibaba/ │ │ └── otter/ │ │ └── canal/ │ │ └── parse/ │ │ ├── DirectLogFetcherTest.java │ │ ├── MysqlBinlogDumpPerformanceTest.java │ │ ├── MysqlBinlogEventPerformanceTest.java │ │ ├── MysqlBinlogParsePerformanceTest.java │ │ ├── helper/ │ │ │ └── TimeoutChecker.java │ │ ├── inbound/ │ │ │ ├── EventTransactionBufferTest.java │ │ │ ├── TableMetaCacheTest.java │ │ │ ├── group/ │ │ │ │ ├── DummyEventStore.java │ │ │ │ └── GroupEventPaserTest.java │ │ │ └── mysql/ │ │ │ ├── DruidDdlParserTest.java │ │ │ ├── LocalBinlogDumpTest.java │ │ │ ├── LocalBinlogEventParserTest.java │ │ │ ├── MysqlDumpTest.java │ │ │ ├── MysqlEventParserTest.java │ │ │ ├── RdsBinlogEventParserProxyTest.java │ │ │ ├── RdsBinlogOpenApiTest.java │ │ │ ├── RdsLocalBinlogDumpTest.java │ │ │ ├── SimpleDdlParserTest.java │ │ │ ├── ddl/ │ │ │ │ └── DdlResultTest.java │ │ │ └── tsdb/ │ │ │ ├── FastsqlSchemaTest.java │ │ │ ├── MemoryTableMetaTest.java │ │ │ ├── MemoryTableMeta_DDL_Test.java │ │ │ ├── MemoryTableMeta_Random_DDL_Test.java │ │ │ ├── MetaHistoryDAOTest.java │ │ │ ├── MetaSnapshotDAOTest.java │ │ │ ├── TableMetaManagerBuilderTest.java │ │ │ └── TableMetaManagerTest.java │ │ ├── index/ │ │ │ ├── AbstractLogPositionManagerTest.java │ │ │ ├── AbstractZkTest.java │ │ │ ├── FileMixedLogPositionManagerTest.java │ │ │ ├── MemoryLogPositionManagerTest.java │ │ │ ├── MetaLogPositionManagerTest.java │ │ │ ├── MixedLogPositionManagerTest.java │ │ │ ├── PeriodMixedLogPositionManagerTest.java │ │ │ └── ZooKeeperLogPositionManagerTest.java │ │ └── stub/ │ │ └── AbstractCanalEventSinkTest.java │ └── resources/ │ ├── binlog/ │ │ ├── mysql-bin.000001 │ │ ├── mysql-bin.000002 │ │ └── tsdb/ │ │ ├── mysql-bin.000001 │ │ ├── mysql-bin.000002 │ │ └── mysql-bin.000003 │ ├── ddl/ │ │ ├── alter/ │ │ │ ├── mysql_1.sql │ │ │ ├── mysql_10.sql │ │ │ ├── mysql_11.sql │ │ │ ├── mysql_12.sql │ │ │ ├── mysql_13.sql │ │ │ ├── mysql_14.sql │ │ │ ├── mysql_15.sql │ │ │ ├── mysql_16.sql │ │ │ ├── mysql_17.sql │ │ │ ├── mysql_18.sql │ │ │ ├── mysql_19.sql │ │ │ ├── mysql_2.sql │ │ │ ├── mysql_20.sql │ │ │ ├── mysql_21.sql │ │ │ ├── mysql_22.sql │ │ │ ├── mysql_23.sql │ │ │ ├── mysql_24.sql │ │ │ ├── mysql_25.sql │ │ │ ├── mysql_26.sql │ │ │ ├── mysql_27.sql │ │ │ ├── mysql_28.sql │ │ │ ├── mysql_29.sql │ │ │ ├── mysql_3.sql │ │ │ ├── mysql_30.sql │ │ │ ├── mysql_31.sql │ │ │ ├── mysql_32.sql │ │ │ ├── mysql_33.sql │ │ │ ├── mysql_34.sql │ │ │ ├── mysql_35.sql │ │ │ ├── mysql_36.sql │ │ │ ├── mysql_37.sql │ │ │ ├── mysql_38.sql │ │ │ ├── mysql_39.sql │ │ │ ├── mysql_4.sql │ │ │ ├── mysql_40.sql │ │ │ ├── mysql_41.sql │ │ │ ├── mysql_42.sql │ │ │ ├── mysql_43.sql │ │ │ ├── mysql_44.sql │ │ │ ├── mysql_45.sql │ │ │ ├── mysql_46.sql │ │ │ ├── mysql_47.sql │ │ │ ├── mysql_48.sql │ │ │ ├── mysql_49.sql │ │ │ ├── mysql_5.sql │ │ │ ├── mysql_50.sql │ │ │ ├── mysql_51.sql │ │ │ ├── mysql_52.sql │ │ │ ├── mysql_53.sql │ │ │ ├── mysql_54.sql │ │ │ ├── mysql_55.sql │ │ │ ├── mysql_56.sql │ │ │ ├── mysql_57.sql │ │ │ ├── mysql_58.sql │ │ │ ├── mysql_59.sql │ │ │ ├── mysql_6.sql │ │ │ ├── mysql_60.sql │ │ │ ├── mysql_61.sql │ │ │ ├── mysql_62.sql │ │ │ ├── mysql_63.sql │ │ │ ├── mysql_64.sql │ │ │ ├── mysql_65.sql │ │ │ ├── mysql_66.sql │ │ │ ├── mysql_67.sql │ │ │ ├── mysql_68.sql │ │ │ ├── mysql_69.sql │ │ │ ├── mysql_7.sql │ │ │ ├── mysql_70.sql │ │ │ ├── mysql_71.sql │ │ │ ├── mysql_72.sql │ │ │ ├── mysql_73.sql │ │ │ ├── mysql_74.sql │ │ │ ├── mysql_75.sql │ │ │ ├── mysql_76.sql │ │ │ ├── mysql_77.sql │ │ │ ├── mysql_78.sql │ │ │ ├── mysql_79.sql │ │ │ ├── mysql_8.sql │ │ │ ├── mysql_80.sql │ │ │ ├── mysql_9.sql │ │ │ ├── test_1.sql │ │ │ ├── test_10.sql │ │ │ ├── test_11.sql │ │ │ ├── test_12.sql │ │ │ ├── test_13.sql │ │ │ ├── test_14.sql │ │ │ ├── test_15.sql │ │ │ ├── test_16.sql │ │ │ ├── test_17.sql │ │ │ ├── test_18.sql │ │ │ ├── test_19.sql │ │ │ ├── test_2.sql │ │ │ ├── test_20.sql │ │ │ ├── test_21.sql │ │ │ ├── test_22.sql │ │ │ ├── test_23.sql │ │ │ ├── test_24.sql │ │ │ ├── test_25.sql │ │ │ ├── test_26.sql │ │ │ ├── test_27.sql │ │ │ ├── test_28.sql │ │ │ ├── test_29.sql │ │ │ ├── test_3.sql │ │ │ ├── test_30.sql │ │ │ ├── test_31.sql │ │ │ ├── test_32.sql │ │ │ ├── test_33.sql │ │ │ ├── test_34.sql │ │ │ ├── test_35.sql │ │ │ ├── test_36.sql │ │ │ ├── test_37.sql │ │ │ ├── test_38.sql │ │ │ ├── test_39.sql │ │ │ ├── test_4.sql │ │ │ ├── test_40.sql │ │ │ ├── test_41.sql │ │ │ ├── test_42.sql │ │ │ ├── test_43.sql │ │ │ ├── test_44.sql │ │ │ ├── test_45.sql │ │ │ ├── test_46.sql │ │ │ ├── test_47.sql │ │ │ ├── test_48.sql │ │ │ ├── test_49.sql │ │ │ ├── test_5.sql │ │ │ ├── test_50.sql │ │ │ ├── test_51.sql │ │ │ ├── test_52.sql │ │ │ ├── test_53.sql │ │ │ ├── test_54.sql │ │ │ ├── test_55.sql │ │ │ ├── test_56.sql │ │ │ ├── test_57.sql │ │ │ ├── test_58.sql │ │ │ ├── test_59.sql │ │ │ ├── test_6.sql │ │ │ ├── test_60.sql │ │ │ ├── test_61.sql │ │ │ ├── test_62.sql │ │ │ ├── test_63.sql │ │ │ ├── test_64.sql │ │ │ ├── test_65.sql │ │ │ ├── test_66.sql │ │ │ ├── test_67.sql │ │ │ ├── test_68.sql │ │ │ ├── test_69.sql │ │ │ ├── test_7.sql │ │ │ ├── test_70.sql │ │ │ ├── test_71.sql │ │ │ ├── test_72.sql │ │ │ ├── test_73.sql │ │ │ ├── test_74.sql │ │ │ ├── test_75.sql │ │ │ ├── test_76.sql │ │ │ ├── test_77.sql │ │ │ ├── test_78.sql │ │ │ ├── test_79.sql │ │ │ ├── test_8.sql │ │ │ ├── test_80.sql │ │ │ └── test_9.sql │ │ ├── create.sql │ │ ├── ddl_any.sql │ │ ├── ddl_create_function_index.sql │ │ ├── ddl_create_if_not_exist.sql │ │ ├── ddl_test1.sql │ │ ├── ddl_test2.sql │ │ ├── ddl_test3.sql │ │ ├── ddl_test4.sql │ │ └── table/ │ │ ├── mysql_1.sql │ │ ├── mysql_10.sql │ │ ├── mysql_11.sql │ │ ├── mysql_12.sql │ │ ├── mysql_13.sql │ │ ├── mysql_14.sql │ │ ├── mysql_15.sql │ │ ├── mysql_16.sql │ │ ├── mysql_17.sql │ │ ├── mysql_18.sql │ │ ├── mysql_19.sql │ │ ├── mysql_2.sql │ │ ├── mysql_20.sql │ │ ├── mysql_21.sql │ │ ├── mysql_22.sql │ │ ├── mysql_23.sql │ │ ├── mysql_24.sql │ │ ├── mysql_25.sql │ │ ├── mysql_26.sql │ │ ├── mysql_27.sql │ │ ├── mysql_28.sql │ │ ├── mysql_29.sql │ │ ├── mysql_3.sql │ │ ├── mysql_30.sql │ │ ├── mysql_31.sql │ │ ├── mysql_32.sql │ │ ├── mysql_33.sql │ │ ├── mysql_34.sql │ │ ├── mysql_35.sql │ │ ├── mysql_36.sql │ │ ├── mysql_37.sql │ │ ├── mysql_38.sql │ │ ├── mysql_39.sql │ │ ├── mysql_4.sql │ │ ├── mysql_5.sql │ │ ├── mysql_6.sql │ │ ├── mysql_7.sql │ │ ├── mysql_8.sql │ │ ├── mysql_9.sql │ │ ├── test_1.sql │ │ ├── test_10.sql │ │ ├── test_11.sql │ │ ├── test_12.sql │ │ ├── test_13.sql │ │ ├── test_14.sql │ │ ├── test_15.sql │ │ ├── test_16.sql │ │ ├── test_17.sql │ │ ├── test_18.sql │ │ ├── test_19.sql │ │ ├── test_2.sql │ │ ├── test_20.sql │ │ ├── test_21.sql │ │ ├── test_22.sql │ │ ├── test_23.sql │ │ ├── test_24.sql │ │ ├── test_25.sql │ │ ├── test_26.sql │ │ ├── test_27.sql │ │ ├── test_28.sql │ │ ├── test_29.sql │ │ ├── test_3.sql │ │ ├── test_30.sql │ │ ├── test_31.sql │ │ ├── test_32.sql │ │ ├── test_33.sql │ │ ├── test_34.sql │ │ ├── test_35.sql │ │ ├── test_36.sql │ │ ├── test_37.sql │ │ ├── test_38.sql │ │ ├── test_39.sql │ │ ├── test_4.sql │ │ ├── test_5.sql │ │ ├── test_6.sql │ │ ├── test_7.sql │ │ ├── test_8.sql │ │ └── test_9.sql │ ├── dummy.txt │ └── tsdb/ │ ├── derby-tsdb.xml │ ├── h2-tsdb.xml │ ├── mysql-tsdb.xml │ └── sql-map/ │ ├── sqlmap-config.xml │ ├── sqlmap_history.xml │ └── sqlmap_snapshot.xml ├── pom.xml ├── prometheus/ │ ├── pom.xml │ └── src/ │ └── main/ │ ├── java/ │ │ └── com/ │ │ └── alibaba/ │ │ └── otter/ │ │ └── canal/ │ │ └── prometheus/ │ │ ├── CanalInstanceExports.java │ │ ├── InstanceRegistry.java │ │ ├── PrometheusProvider.java │ │ ├── PrometheusService.java │ │ └── impl/ │ │ ├── EntryCollector.java │ │ ├── MetaCollector.java │ │ ├── ParserCollector.java │ │ ├── PrometheusCanalEventDownStreamHandler.java │ │ ├── PrometheusClientInstanceProfiler.java │ │ ├── SinkCollector.java │ │ └── StoreCollector.java │ └── resources/ │ └── META-INF/ │ └── services/ │ └── com.alibaba.otter.canal.spi.CanalMetricsProvider ├── protocol/ │ ├── pom.xml │ └── src/ │ ├── main/ │ │ └── java/ │ │ └── com/ │ │ └── alibaba/ │ │ └── otter/ │ │ └── canal/ │ │ └── protocol/ │ │ ├── AdminPacket.java │ │ ├── AdminProtocol.proto │ │ ├── CanalEntry.java │ │ ├── CanalPacket.java │ │ ├── CanalProtocol.proto │ │ ├── ClientIdentity.java │ │ ├── EntryProtocol.proto │ │ ├── FlatMessage.java │ │ ├── Message.java │ │ ├── SecurityUtil.java │ │ ├── exception/ │ │ │ └── CanalClientException.java │ │ └── position/ │ │ ├── EntryPosition.java │ │ ├── LogIdentity.java │ │ ├── LogPosition.java │ │ ├── MetaqPosition.java │ │ ├── Position.java │ │ ├── PositionRange.java │ │ └── TimePosition.java │ └── test/ │ └── java/ │ └── com/ │ └── alibaba/ │ └── otter/ │ └── canal/ │ └── protocol/ │ ├── ProtocolTest.java │ └── SecurityUtilTest.java ├── server/ │ ├── pom.xml │ └── src/ │ ├── main/ │ │ └── java/ │ │ └── com/ │ │ └── alibaba/ │ │ └── otter/ │ │ └── canal/ │ │ ├── admin/ │ │ │ ├── CanalAdmin.java │ │ │ ├── handler/ │ │ │ │ ├── ClientAuthenticationHandler.java │ │ │ │ ├── HandshakeInitializationHandler.java │ │ │ │ └── SessionHandler.java │ │ │ └── netty/ │ │ │ ├── AdminNettyUtils.java │ │ │ └── CanalAdminWithNetty.java │ │ ├── server/ │ │ │ ├── CanalMQStarter.java │ │ │ ├── CanalServer.java │ │ │ ├── CanalServerStarter.java │ │ │ ├── CanalService.java │ │ │ ├── embedded/ │ │ │ │ └── CanalServerWithEmbedded.java │ │ │ ├── exception/ │ │ │ │ └── CanalServerException.java │ │ │ └── netty/ │ │ │ ├── CanalServerWithNetty.java │ │ │ ├── CanalServerWithNettyProfiler.java │ │ │ ├── ClientInstanceProfiler.java │ │ │ ├── NettyUtils.java │ │ │ ├── handler/ │ │ │ │ ├── ClientAuthenticationHandler.java │ │ │ │ ├── FixedHeaderFrameDecoder.java │ │ │ │ ├── HandshakeInitializationHandler.java │ │ │ │ └── SessionHandler.java │ │ │ └── listener/ │ │ │ └── ChannelFutureAggregator.java │ │ └── spi/ │ │ ├── CanalMetricsProvider.java │ │ ├── CanalMetricsService.java │ │ └── NopCanalMetricsService.java │ └── test/ │ └── java/ │ └── com/ │ └── alibaba/ │ └── otter/ │ └── canal/ │ └── server/ │ ├── CanalServerTest.java │ └── embedded/ │ ├── BaseCanalServerWithEmbededTest.java │ ├── CanalServerWithEmbedded_FileModeTest.java │ ├── CanalServerWithEmbedded_StandaloneTest.java │ └── CanalServerWithEmbedded_StandbyTest.java ├── sink/ │ ├── pom.xml │ └── src/ │ ├── main/ │ │ └── java/ │ │ └── com/ │ │ └── alibaba/ │ │ └── otter/ │ │ └── canal/ │ │ └── sink/ │ │ ├── AbstractCanalEventDownStreamHandler.java │ │ ├── AbstractCanalEventSink.java │ │ ├── CanalEventDownStreamHandler.java │ │ ├── CanalEventSink.java │ │ ├── entry/ │ │ │ ├── EntryEventSink.java │ │ │ ├── HeartBeatEntryEventHandler.java │ │ │ └── group/ │ │ │ ├── GroupBarrier.java │ │ │ ├── GroupEventSink.java │ │ │ ├── TimelineBarrier.java │ │ │ └── TimelineTransactionBarrier.java │ │ └── exception/ │ │ └── CanalSinkException.java │ └── test/ │ └── java/ │ └── com/ │ └── alibaba/ │ └── otter/ │ └── canal/ │ └── sink/ │ ├── GroupEventSinkTest.java │ └── stub/ │ └── DummyEventStore.java └── store/ ├── pom.xml └── src/ ├── main/ │ └── java/ │ └── com/ │ └── alibaba/ │ └── otter/ │ └── canal/ │ └── store/ │ ├── AbstractCanalGroupStore.java │ ├── AbstractCanalStoreScavenge.java │ ├── CanalEventStore.java │ ├── CanalGroupEventStore.java │ ├── CanalStoreConstants.java │ ├── CanalStoreException.java │ ├── CanalStoreScavenge.java │ ├── StoreInfo.java │ ├── helper/ │ │ └── CanalEventUtils.java │ ├── memory/ │ │ └── MemoryEventStoreWithBuffer.java │ └── model/ │ ├── BatchMode.java │ ├── Event.java │ └── Events.java └── test/ └── java/ └── com/ └── alibaba/ └── otter/ └── canal/ └── store/ └── memory/ └── buffer/ ├── MemoryEventStoreBase.java ├── MemoryEventStoreMemBatchTest.java ├── MemoryEventStoreMultiThreadTest.java ├── MemoryEventStorePutAndGetTest.java └── MemoryEventStoreRollbackAndAckTest.java