# otter&&数据库实时同步工具

#### 常见问题（避坑指南）

- ##### 无法访问管理页面或者重定向到内部IP了


请查看后面的文章


- ##### 打开channel_list.html报错

方法一：访问：http://ip:port/system_reduction.htm，然后执行一键补全


[![](https://iovhm.com/book/uploads/images/gallery/2025-09/scaled-1680-/vY9Gh5qANE0EtbEs-image-1757034135067.png)](https://iovhm.com/book/uploads/images/gallery/2025-09/vY9Gh5qANE0EtbEs-image-1757034135067.png)



方法二：重建同步配置
```
# 清空如下5个表后重新添加，因此，需要将将要同步的表配置用保存好，否则就傻逼了

# 已知问题，channel id不能从1开始



delete from data_media;
delete from data_media_pair;
delete from pipeline;
delete from pipeline_node_relation;
delete from channel;


#  重置自增 ID 非必须
ALTER TABLE `channel` AUTO_INCREMENT = 2;
ALTER TABLE `data_media` AUTO_INCREMENT = 1;
ALTER TABLE `data_media_pair` AUTO_INCREMENT = 1;
ALTER TABLE `pipeline` AUTO_INCREMENT = 1;
ALTER TABLE `pipeline_node_relation` AUTO_INCREMENT = 1;


```

- ##### otter启动不了

注意，数据库的node id必须为1，因为启动文件里面写了，否则启动不了



[![](https://iovhm.com/book/uploads/images/gallery/2025-03/scaled-1680-/UNYBqT3XJoB3GNm3-image-1742400155006.png)](https://iovhm.com/book/uploads/images/gallery/2025-03/UNYBqT3XJoB3GNm3-image-1742400155006.png)


[![](https://iovhm.com/book/uploads/images/gallery/2025-03/scaled-1680-/A83GKSX4lwkS8TQF-image-1742402728137.png)](https://iovhm.com/book/uploads/images/gallery/2025-03/A83GKSX4lwkS8TQF-image-1742402728137.png)


#### 介绍


使用微服务架构进行服务拆分后，当某些服务需要用到基础数据的时候，往往粗暴的通过RPC调用，先到基础服务查询出数据，再把所有结果传入到相关服务进行例如**in**,**like** 查询。开发测试的时候因为数据量不够，通常没什么问题，当系统运行一段时间后，数据量增多后，就会出现性能问题。


诸如经常需要用到的基础数据，比较好的做法是进行数据表冗余。在同一个数据库内直接级联查询。但是，会将产生数据同步的问题。


#### 使用otter进行数据同步

otter与canal都是阿里开源出来的数据同步工具，因为阿里巴巴业务的特殊性，卖家主要在国内，买家主要在国外，为了提升用户体验，衍生出了杭州机房和美国机房双机房，既使用工具将数据同步为一致的。


#### 这不是重复造轮子

阿里的开源一贯作风是只管开源，不管维护，otter虽然好，但是BUG一堆，因此对安装部署脚本做了一些修改：

- 管理界面只能内网访问
- 服务一旦停止后就不能重新启动


因此重新打包了镜像，将一些参数移到外部进行启时候替换。

docker-compose方式如下，k8s方式可以参考相关配置。

**重要:一定要挂载持久化数据，否则重启后同步就全部消失了**

~~**重要：这个软件的登录授权功能等于于无，因此，在设置OTTER_MANAGER_URL时，应该设置一个并不存在的域名后，然后使用host表来配置**~~

**推荐使用nginx-ingress注解认证或者nginx提供的basic认证，也可以使用IP限制**


```
# 使用ip限制

nginx.ingress.kubernetes.io/whitelist-source-range: "192.168.0.0/16,10.0.0.0/8"

```



```
# 使用basic认证
# 创建一个键值对（opaque）密钥，
# 键为 auth
# 值为 htpasswd -c auth username 生成
# 在线生成 https://www.bejson.com/encrypt/htpasswd/

# 为ingress增加注解
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: basic-auth



```


```yaml
version: '3'
services:
  otter-server:
    image: swr.cn-south-1.myhuaweicloud.com/vp-public/otter-server:4.2.18
    container_name: otter-server
    restart: always
    privileged: true
    tty: true
    ports:
      - "8080:8080"
    environment:
      - OTTER_MANAGER_MYSQL=IP:PORT
      - MYSQL_USER=user
      - MYSQL_USER_PASSWORD=password
      - MYSQL_DBNAME=otter
      - OTTER_MANAGER_URL=https://domain:port # 不支持后面带路径，即使填了没用
    volumes:
      - ./zkData:/home/admin/zkData:rw # 重要，一定要挂载持久化数据，否则重启后同步就全部消失了。

```

或者你已经在使用otter，但是并不想更换镜像，则可以使用shell进入到容器进行相关修改

```shell

# vi manager/webapp/WEB-INF/common/uris.xml
# <serverURI>http://${otter.domainName}:${otter.port}/</serverURI>
# 修改上面的管理地址为你可以访问的管理地址
# /home/admin/manager/bin/stop.sh
# /home/admin/manager/bin/startup.sh     


```

#### 初始化数据库脚本

先用 **/bin/bash** 命令行启动容器

```

# 找到数据库初始化文件
cd /home/admin/bin

# 使用mysql链接到数据库并创建数据库
create database otter;

# 恢复数据

mysql -h127.0.0.1 -uroot -ppassword < ddl.sql

# 更新2个配置

update autokeeper_cluster set SERVER_LIST='["127.0.0.1:2181"]'
update node set ip = '127.0.0.1'

```