前置知识点
主从复制
、 binlog
、 canal
、正则
、 docker
、java
前置工具
- docker
- otter-all (canal1.1.5)
场景描述(增量同步)
目前项目中使用的是mysql5.5,计划升级为mysql8.1,版本跨度较大,市面上可靠工具选择较少。otter符合预期,使用过程中除GitHub issues中提到的问题外(上述otter-all中已经修复),未发现其他异常。目前同步一切正常。
存量同步直接mysqldump。然后记录binlog位置(canal配置中用到)
安装otter
docker pull zhangkaifunny/otter-all
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
sh run.sh
(注意加粗部分)
成功启动后,会出现http://xxx:8080,直接访问,然后点击退出,使用admin\admin登录。
具体操作
-
配置数据源
正常配置为有权限的用户即可,点击验证连接数据源出现恭喜,数据库通过验证!
表示成功,避免出现某些查询不可用建议保持编码、字符集一致。
-
配置数据表(用到正则)
- 单表 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(用到主从复制、binlog 相关知识)
- gtid位点,以行为例,注意结尾
;
再使用mysqldump时binlog中可以看到,也可以直接查询,此处不做解释。
{"journalName":"mariadb-bin.009643","position":245};
- 注意一个canal仅可以绑定一个pipeline,否者会提示
canal已经被其他pipeline所关联
- 机器配置(略),使用默认
- 同步管理
- channel管理
同步模式可以看官方解释,我的场景是行记录模式。 - pipeline管理
- 映射关系管理 - 可以字段映射
- 全量同步
- 其他可能性
- channel管理
异常处理注意事项
- 查找此处的信息,更新至canal gtid 位点,再修复问题后可以优雅的继续同步
{"journalName":"mariadb-bin.009732","position":235250167};
附录
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