mysql增量同步到greenplum
采⽤⼯具:maxwell+Kafka+bireme
maxwell:maxwell能实时解析MySQL的binlog,并输出json格式的数据发送到Kafka(还⽀持其它的消息中间件),具体参见:
Kafka: ⼀种消息中间件,在该⽅案中主要⽤于消息中转,具体参见
bireme:⽀持Greenplum的数据增量同步⼯具,在写⼊Greenplum的过程中,由于采⽤Copy模式,所以性能较⾼,具体参见
⼤致原理就是:利⽤maxwell把mysql binlog解析成json,然后⽤kafka创建topic,然后⽤bireme消费,从⽽达到增量,增量的前提是先把数据全量同步⼀次,然后再增量。
全量同步初始化个⼈推荐dbswitch⼯具,个⼈测试使⽤体验最佳,可以⾃动创建表结构,同步速度也很快。
操作步骤:
1.下载并搭建Kafka服务
2.下载并搭建maxwell服务,修改配置使其能够连接MySQL并能向kafka写⼊数据
3.下载并搭建bireme服务,修改配置使其能读取kafka的数据并能向Greenplum写⼊数据
kafka:
(1)下载安装:
wget mirrors.hust.edu/apache/kafka/2.5.0/kafka_2.12-2.
tar -xzf kafka_2.12-2. -C /usr/local
(2)配置server.properties,我的简单配置如下:
[root@szwpldb1080 config]# cat server.properties |grep -vE '^#|^$'mysql下载starting the server
broker.id=0
numwork.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
log.dirs=/tmp/kafka-logs
num.partitions=1
transaction.plication.factor=1
transaction.state.log.min.isr=1
log.cleanup.policy=delete
log.segment.bytes=1073741824
balance.delay.ms=0
advertised.host.name=172.18.1.150
(3)制作kafka启停脚本(提前安装好java):
#!/usr/bin/env bash
# chkconfig: 23452080
#description: start and stop server
ZOOP_HOME=/usr/local/kafka_2.12-2.5.0/bin
JAVA_HOME=/usr/java/jdk1.8.0_221/
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
SVR_NAME=kafka
case $1in
start)
echo "starting $ZOOP_HOME/$SVR_NAME ..."
$ZOOP_HOME/kafka-server-start.sh /usr/local/kafka_2.12-2.5.0/config/server.properties > /tmp/kafka.logs.out&
;;
stop)
echo "stopping $PRO_HOME/$SVR_NAME ..."
ps -ef|grep *.$SVR_NAME* |grep -v grep |awk '{print $2}' | sed -e "s/^/kill -9 /g" | sh -
;;
restart)
"$0" stop
sleep 3
"$0" start
;;
status)
ps -ef|grep *.$SVR_NAME*
;
;
logs)
tail -f /tmp/zookeeper.logs.out
;;
*)
echo "Example: server-$SVR_NAME [start|stop|restart|status|logs]" ;;
esac
添加到 /etc/rc.d/init.d ,然后就可以直接service kafka xxx来管理,或者添加到systemd下⾯,确保服务正常启动安装zookerper,然后启动kafka。
我的zookeeper简单配置如下:
[root@szwpldb1080 config]# cat zookeeper.properties |grep -Ev '^$|^#'
dataDir=/tmp/zookeeper
clientPort=2181
maxClientCnxns=0
zookeeper启停脚本
#!/usr/bin/env bash
# chkconfig: 23452080
#description: start and stop server
ZOOP_HOME=/usr/local/kafka_2.12-2.5.0/bin
JAVA_HOME=/usr/java/jdk1.8.0_221/
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
SVR_NAME=zookeeper
case $1in
start)
echo "starting $ZOOP_HOME/$SVR_NAME ..."
$ZOOP_HOME/zookeeper-server-start.sh /usr/local/kafka_2.12-2.5.0/config/zookeeper.properties > /tmp/zookeeper.logs.out&
;;
stop)
echo "stopping $PRO_HOME/$SVR_NAME ..."
ps -ef|grep *.$SVR_NAME* |grep -v grep |awk '{print $2}' | sed -e "s/^/kill -9 /g" | sh -
;;
restart)
"$0" stop
sleep 3
"$0" start
;;
status)
ps -ef|grep *.$SVR_NAME*
;;
logs)
tail -f /tmp/zookeeper.logs.out
;;
*)
echo "Example: server-$SVR_NAME [start|stop|restart|status|logs]" ;;
esac
(4)检查状态:
[root@szwpldb1080 config]# jps
1762 Kafka
18521 QuorumPeerMain
30383 Jps
maxwell:
(1)docker镜像下载
docker pull zendesk/maxwell
(2)在源端mysql建好⽤户设置好权限,测试maxwell:
docker run -ti --rm zendesk/maxwell bin/maxwell --user='xxxx' --password='xxxx' --host='' --producer=stdout
看到⽇志输出正常,可以放后台运⾏:
docker run -d --rm zendesk/maxwell bin/maxwell --user='xx' \
--password='xx' --host='' --port=3306\
--producer=kafka --kafka.bootstrap.servers=':9092'\
--kafka_topic=syncdb --log_level=debug --output_ddl
然后创建kafka topic:
bin/kafka-topics.sh --create --topic syncdb --zookeeper localhost:2181 --partitions 1 --replication-factor 2
topic名字与maxwell创建的topic⼀致,并且由于maxwell可以解析所有binlog,但是bireme⼯具只能同步dml,因此没有加 --output_ddl 具体maxwell参数⽤法可以参考:
检查kafka消费情况:
[root@szwpldb1080 bin]# ./kafka-topics.sh --zookeeper localhost:2181 --describe --topic syncdb
Topic:syncdb PartitionCount:1 ReplicationFactor:1 Configs:
Topic: syncdb Partition: 0 Leader: 0 Replicas: 0 Isr: 0
[root@szwpldb1080 bin]#./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic syncdb --from-beginning
看到kafka能接收maxwell产⽣的json⽂件,表⽰没问题。
bireme
安装配置都很简单,此处略过。
主要是修改以下2个配置⽂件。
config.properties
maxwell1.properties
然后监控 :8080或者监控bireme⽇志就可以了。
总结:
只能同步DML语句,⽆法处理DDL,对⽐⼏款开源的⼯具已经同步⽅式,我觉得我这种是最舒服的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论