跳转到主要内容

otter

介绍

使用微服务架构进行服务拆分后,当某些服务需要用到基础数据的时候,往往粗暴的通过RPC调用,先到基础服务查询出数据,再把所有结果传入到相关服务进行例如in,like 查询。开发测试的时候因为数据量不够,通常没什么问题,当系统运行一段时间后,数据量增多后,就会出现性能问题。

诸如经常需要用到的基础数据,比较好的做法是进行数据表冗余。在同一个数据库内直接级联查询。但是,会将产生数据同步的问题。

使用otter进行数据同步

otter与cacnl都是阿里开源出来的数据同步工具,因为阿里巴巴业务的特殊性,卖家主要在国内,买家主要在国外,为了提升用户体验,衍生出了杭州机房和美国机房双机房,既使用工具将数据同步为一致的。

这不是重复造轮子

阿里的开源一贯作风是只管开源,不管维护,otter虽然好,但是BUG一堆,因此对安装部署脚本做了一些修改:

  • 管理界面只能内网访问
  • 服务一旦停止后就不能重新启动

因此重新打包了镜像,将一些参数移到外部进行启时候替换。

docker-compose方式如下,k8s方式可以参考相关配置。

重要:一定要挂载持久化数据,否则重启后同步就全部消失了

重要:这个软件的登录授权功能等于于无,因此,在设置OTTE_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



version: '3'
services:
  otter-server:
    image: swr.cn-south-1.myhuaweicloud.com/vp-park/otter-server:latest
    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
      - OTTE_MANAGER_URL=https://domain:port
    volumes:
      - ./zkData:/home/admin/zkData:rw # 重要,一定要挂载持久化数据,否则重启后同步就全部消失了。

或者你已经在使用otter,确并不想更换镜像则可以


# 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'

打开channel_list.html报错

# 清空如下5个表后重新添加,因此,需要将将要同步的表配置用保存好,否则就傻逼了

delete from data_media_pair;
delete from data_media;
delete from pipeline_node_relation;
delete from pipeline;
delete from channel;