canal番外篇-otter

前置知识点

主从复制binlogcanal正则dockerjava

前置工具

  • docker
  • otter-all (canal1.1.5)

场景描述(增量同步)

目前项目中使用的是mysql5.5,计划升级为mysql8.1,版本跨度较大,市面上可靠工具选择较少。otter符合预期,使用过程中除GitHub issues中提到的问题外(上述otter-all中已经修复),未发现其他异常。目前同步一切正常。
存量同步直接mysqldump。然后记录binlog位置(canal配置中用到)

  • Caused by: java.lang.NoSuchFieldError: MYSQL #1068
安装otter
  1. docker pull zhangkaifunny/otter-all
  2. mkdir otter && cd otter && touch run.sh
    输入如下信息:
#!/bin/bash

function usage() {
    echo "Usage:"
    echo "  run.sh [CONFIG]"
    echo "example:"
    echo "  run.sh NODE -e OTTER_MANAGER=127.0.0.1:8080"
    exit
}

function check_port() {
    local port=$1
    local TL=$(which telnet)
    if [ -f $TL ]; then
        data=`echo quit | telnet 127.0.0.1 $port| grep -ic connected`
        echo $data
        return
    fi

    local NC=$(which nc)
    if [ -f $NC ]; then
        data=`nc -z -w 1 127.0.0.1 $port | grep -ic succeeded`
        echo $data
        return
    fi
    echo "0"
    return
}

function getMyIp() {
    case "`uname`" in
        Darwin)
         myip=`echo "show State:/Network/Global/IPv4" | scutil | grep PrimaryInterface | awk '{print $3}' | xargs ifconfig | grep inet | grep -v inet6 | awk '{print $2}'`
         ;;
        *)
         myip=`ip route get 1 | awk '{print $NF;exit}'`
         ;;
  esac
  echo $myip
}

NET_MODE=""
case "`uname`" in
    Darwin)
        bin_abs_path=`cd $(dirname $0); pwd`
        ;;
    Linux)
        bin_abs_path=$(readlink -f $(dirname $0))
        NET_MODE="--net=host"
        ;;
    *)
        NET_MODE="--net=host"
        bin_abs_path=`cd $(dirname $0); pwd`
        ;;
esac
BASE=${bin_abs_path}
if [ "$1" == "-h" ] ; then
    usage
elif [ "$1" == "help" ] ; then
    usage
fi

DATA="$BASE/data"
mkdir -p $DATA
RUN_MODE=$1
CONFIG=${@:2}
VOLUMNS="-v $DATA/mysql:/var/lib/mysql -v $DATA/zkData:/home/admin/zkData -v $DATA/logs:/home/admin/manager/logs"
PORTLIST="8080 8081 2181 2088 2089 2090"

PORTS=""
for PORT in $PORTLIST ; do
    #exist=`check_port $PORT`
    exist="0"
    if [ "$exist" == "0" ]; then
        PORTS="$PORTS -p $PORT:$PORT"
    else
        echo "port $PORT is used , pls check"
        exit 1
    fi
done
MEMORY="-m 4096m"
LOCALHOST=`getMyIp`
cmd="docker run -d -it -h $LOCALHOST $CONFIG --name=otter-all $VOLUMNS $NET_MODE $PORTS $MEMORY zhangkaifunny/otter-all:v1"
echo $cmd
eval $cmd
  1. sh run.sh (注意加粗部分)

成功启动后,会出现http://xxx:8080,直接访问,然后点击退出,使用admin\admin登录。

具体操作

  1. 配置数据源
    正常配置为有权限的用户即可,点击验证连接数据源出现恭喜,数据库通过验证!表示成功,避免出现某些查询不可用建议保持编码、字符集一致。
    canal番外篇-otter_第1张图片canal番外篇-otter_第2张图片

  2. 配置数据表(用到正则)

  • 单表 schema name: db_a, table name: table_a
  • 多表 schema name: db_a, table name: (table_a|table_b|table_c)
  • 其他正则,例如schema name: db_a,table name: .* ,.*表示所有表
    canal番外篇-otter_第3张图片
    canal番外篇-otter_第4张图片
  1. 配置canal(用到主从复制、binlog 相关知识)
  • gtid位点,以行为例,注意结尾;
    再使用mysqldump时binlog中可以看到,也可以直接查询,此处不做解释。
{"journalName":"mariadb-bin.009643","position":245};
  • 注意一个canal仅可以绑定一个pipeline,否者会提示canal已经被其他pipeline所关联
    canal番外篇-otter_第5张图片
  1. 机器配置(略),使用默认
  2. 同步管理
    • channel管理
      同步模式可以看官方解释,我的场景是行记录模式。canal番外篇-otter_第6张图片
    • pipeline管理
      canal番外篇-otter_第7张图片 - 映射关系管理
    • 可以字段映射
    • 全量同步
    • 其他可能性
异常处理注意事项
  1. 查找此处的信息,更新至canal gtid 位点,再修复问题后可以优雅的继续同步
{"journalName":"mariadb-bin.009732","position":235250167};

canal番外篇-otter_第8张图片

附录
mysqldump demo
mysqldump --single-transaction --flush-logs --master-data=2 --no-create-info --triggers --routines --events --user=root -p eudemon eudemon_clue_checks eudemon_clue_inspection_company eudemon_clue_inspection_log eudemon_questions_exercises eudemon_questions_exercises_title eudemon_users > dump20230616.sql

你可能感兴趣的:(Canal,canal)