docker + canal + canal-adapter + es 实现 数据库到es 数据转化增量同步

需求

众所周知,mysql是用来存储数据的,适合查询,但是遇上全文搜索和排序之类的,就变得超级慢,尤其面对大数据量时,针对大结果集分组排序,mysql就不再合适,所以可以考虑将mysql 数据同步至es中,用es来做全文搜索和排序分组等,中间会涉及同步数据问题,就用canal来解决

docker

  es:
    build:
      context: ./services/elasticsearch
      args:
        ELASTICSEARCH_VERSION: ${ELASTICSEARCH_VERSION}
        ELASTICSEARCH_PLUGINS: ${ELASTICSEARCH_PLUGINS}
    container_name: es
    environment:
      - TZ=$TZ
      - discovery.type=single-node
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    volumes:
      - ${DATA_DIR}/esdata:/usr/share/elasticsearch/data
      - ${ELASTICSEARCH_CONF_FILE}:/usr/share/elasticsearch/config/elasticsearch.yml
    hostname: elasticsearch
    restart: always
    ports:
      - "${ELASTICSEARCH_HOST_PORT_C}:9200"
      - "${ELASTICSEARCH_HOST_PORT_S}:9300"

  kibana:
    image: kibana:${KIBANA_VERSION}
    container_name: kibana
    environment:
      TZ: "$TZ"
      elasticsearch.hosts: http://es:9200
      I18N_LOCALE: "${KIBANA_I18N_LOCALE}"
    hostname: kibana
    depends_on:
      - es
    restart: always
    ports:
      - "${KIBANA_HOST}:5601"
    canal:
      image: canal/canal-server:v1.1.5
      container_name: canal
      volumes:
        - ${DATA_DIR}/canal/instance.properties:/home/admin/canal-server/conf/example/instance.properties
        - ${DATA_DIR}/canal/canal.properties:/home/admin/canal-server/conf/canal.properties canal/canal-server
      ports:
        - 11111:11111
        - 8329:8329
      restart: always

    canal-adapter:
      image: slpcat/canal-adapter:v1.1.5
      container_name: canal-adapter
      volumes:
        - ${DATA_DIR}/canal-adapter/conf:/opt/canal-adapter/conf
      ports:
        - 8439:8439
      restart: always
    networks:
      default:
        driver: bridge
        ipam:
          driver: default
          # 解除下面的注释可以设置网段,用于nginx等容器固定容器IP
     #config: #  - subnet: 10.0.0.0/24

canal.properties

#################################################
#########         common argument        #############
#################################################
# tcp bind ip
canal.ip =
# register ip to zookeeper
canal.register.ip =
canal.port = 11111
canal.metrics.pull.port = 11112
# canal instance user/passwd
# canal.user = canal
# canal.passwd = E3619321C1A937C46A0D8BD1DAC39F93B27D4458

# canal admin config
#canal.admin.manager = 127.0.0.1:8329
canal.admin.port = 11110
canal.admin.user = admin
canal.admin.passwd = 4ACFE3202A5FF5CF467898FC58AAB1D615029441
# admin auto register
#canal.admin.register.auto = true
#canal.admin.register.cluster =
#canal.admin.register.name =

canal.zkServers =
# flush data to zk
canal.zookeeper.flush.period = 1000
canal.withoutNetty = false
# tcp, kafka, rocketMQ, rabbitMQ, pulsarMQ
canal.serverMode = tcp
# flush meta cursor/parse position to file
canal.file.data.dir = ${canal.conf.dir}
canal.file.flush.period = 1000
## memory store RingBuffer size, should be Math.pow(2,n)
canal.instance.memory.buffer.size = 16384
## memory store RingBuffer used memory unit size , default 1kb
canal.instance.memory.buffer.memunit = 1024 
## meory store gets mode used MEMSIZE or ITEMSIZE
canal.instance.memory.batch.mode = MEMSIZE
canal.instance.memory.rawEntry = true

## detecing config
canal.instance.detecting.enable = false
#canal.instance.detecting.sql = insert into retl.xdual values(1,now()) on duplicate key update x=now()
canal.instance.detecting.sql = select 1
canal.instance.detecting.interval.time = 3
canal.instance.detecting.retry.threshold = 3
canal.instance.detecting.heartbeatHaEnable = false

# support maximum transaction size, more than the size of the transaction will be cut into multiple transactions delivery
canal.instance.transaction.size =  1024
# mysql fallback connected to new master should fallback times
canal.instance.fallbackIntervalInSeconds = 60

# network config
canal.instance.network.receiveBufferSize = 16384
canal.instance.network.sendBufferSize = 16384
canal.instance.network.soTimeout = 30

# binlog filter config
canal.instance.filter.druid.ddl = true
canal.instance.filter.query.dcl = false
canal.instance.filter.query.dml = false
canal.instance.filter.query.ddl = false
canal.instance.filter.table.error = false
canal.instance.filter.rows = false
canal.instance.filter.transaction.entry = false
canal.instance.filter.dml.insert = false
canal.instance.filter.dml.update = false
canal.instance.filter.dml.delete = false

# binlog format/image check
canal.instance.binlog.format = ROW,STATEMENT,MIXED 
canal.instance.binlog.image = FULL,MINIMAL,NOBLOB

# binlog ddl isolation
canal.instance.get.ddl.isolation = false

# parallel parser config
canal.instance.parser.parallel = true
## concurrent thread number, default 60% available processors, suggest not to exceed Runtime.getRuntime().availableProcessors()
#canal.instance.parser.parallelThreadSize = 16
## disruptor ringbuffer size, must be power of 2
canal.instance.parser.parallelBufferSize = 256

# table meta tsdb info
canal.instance.tsdb.enable = true
canal.instance.tsdb.dir = ${canal.file.data.dir:../conf}/${canal.instance.destination:}
canal.instance.tsdb.url = jdbc:h2:${canal.instance.tsdb.dir}/h2;CACHE_SIZE=1000;MODE=MYSQL;
canal.instance.tsdb.dbUsername = canal
canal.instance.tsdb.dbPassword = canal
# dump snapshot interval, default 24 hour
canal.instance.tsdb.snapshot.interval = 24
# purge snapshot expire , default 360 hour(15 days)
canal.instance.tsdb.snapshot.expire = 360

#################################################
#########         destinations        #############
#################################################
canal.destinations = example
# conf root dir
canal.conf.dir = ../conf
# auto scan instance dir add/remove and start/stop instance
canal.auto.scan = true
canal.auto.scan.interval = 5
# set this value to 'true' means that when binlog pos not found, skip to latest.
# WARN: pls keep 'false' in production env, or if you know what you want.
canal.auto.reset.latest.pos.mode = false

canal.instance.tsdb.spring.xml = classpath:spring/tsdb/h2-tsdb.xml
#canal.instance.tsdb.spring.xml = classpath:spring/tsdb/mysql-tsdb.xml

canal.instance.global.mode = spring
canal.instance.global.lazy = false
canal.instance.global.manager.address = ${canal.admin.manager}
#canal.instance.global.spring.xml = classpath:spring/memory-instance.xml
canal.instance.global.spring.xml = classpath:spring/file-instance.xml
#canal.instance.global.spring.xml = classpath:spring/default-instance.xml

##################################################
#########           MQ Properties      #############
##################################################
# aliyun ak/sk , support rds/mq
canal.aliyun.accessKey =
canal.aliyun.secretKey =
canal.aliyun.uid=

canal.mq.flatMessage = true
canal.mq.canalBatchSize = 50
canal.mq.canalGetTimeout = 100
# Set this value to "cloud", if you want open message trace feature in aliyun.
canal.mq.accessChannel = local

canal.mq.database.hash = true
canal.mq.send.thread.size = 30
canal.mq.build.thread.size = 8

##################################################
#########              Kafka              #############
##################################################
kafka.bootstrap.servers = 127.0.0.1:9092
kafka.acks = all
kafka.compression.type = none
kafka.batch.size = 16384
kafka.linger.ms = 1
kafka.max.request.size = 1048576
kafka.buffer.memory = 33554432
kafka.max.in.flight.requests.per.connection = 1
kafka.retries = 0

kafka.kerberos.enable = false
kafka.kerberos.krb5.file = ../conf/kerberos/krb5.conf
kafka.kerberos.jaas.file = ../conf/kerberos/jaas.conf

# sasl demo
# kafka.sasl.jaas.config = org.apache.kafka.common.security.scram.ScramLoginModule required \\n username=\"alice\" \\npassword="alice-secret\";
# kafka.sasl.mechanism = SCRAM-SHA-512
# kafka.security.protocol = SASL_PLAINTEXT

##################################################
#########             RocketMQ         #############
##################################################
rocketmq.producer.group = test
rocketmq.enable.message.trace = false
rocketmq.customized.trace.topic =
rocketmq.namespace =
rocketmq.namesrv.addr = 127.0.0.1:9876
rocketmq.retry.times.when.send.failed = 0
rocketmq.vip.channel.enabled = false
rocketmq.tag = 

##################################################
#########             RabbitMQ         #############
##################################################
rabbitmq.host =
rabbitmq.virtual.host =
rabbitmq.exchange =
rabbitmq.username =
rabbitmq.password =
rabbitmq.deliveryMode =


##################################################
#########               Pulsar         #############
##################################################
pulsarmq.serverUrl =
pulsarmq.roleToken =
pulsarmq.topicTenantPrefix =

instance.properties

#################################################
## mysql serverId , v1.0.26+ will autoGen
# canal.instance.mysql.slaveId=0

# enable gtid use true/false
canal.instance.gtidon=false

# position info
canal.instance.master.address=mysql:3306
canal.instance.master.journal.name=
canal.instance.master.position=
canal.instance.master.timestamp=
canal.instance.master.gtid=

# rds oss binlog
canal.instance.rds.accesskey=
canal.instance.rds.secretkey=
canal.instance.rds.instanceId=

# table meta tsdb info
canal.instance.tsdb.enable=true
#canal.instance.tsdb.url=jdbc:mysql://127.0.0.1:3306/canal_tsdb
#canal.instance.tsdb.dbUsername=canal
#canal.instance.tsdb.dbPassword=canal

#canal.instance.standby.address =
#canal.instance.standby.journal.name =
#canal.instance.standby.position =
#canal.instance.standby.timestamp =
#canal.instance.standby.gtid=

# username/password
canal.instance.dbUsername=root
canal.instance.dbPassword=123456
canal.instance.connectionCharset = UTF-8
# enable druid Decrypt database password
canal.instance.enableDruid=false
#canal.instance.pwdPublicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALK4BUxdDltRRE5/zXpVEVPUgunvscYFtEip3pmLlhrWpacX7y7GCMo2/JM6LeHmiiNdH1FWgGCpUfircSwlWKUCAwEAAQ==

# table regex
canal.instance.filter.regex=sass_www17\\.dt_sell_5,sass_www17\\.dt_company,sass_www17\\.dt_school,sass_www17\\.dt_member
# table black regex
canal.instance.filter.black.regex=mysql\\.slave_.*
# table field filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
#canal.instance.filter.field=test1.t_product:id/subject/keywords,test2.t_company:id/name/contact/ch
# table field black filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
#canal.instance.filter.black.field=test1.t_product:subject/product_image,test2.t_company:id/name/contact/ch

# mq config
canal.mq.topic=example
# dynamic topic route by schema or table regex
#canal.mq.dynamicTopic=mytest1.user,topic2:mytest2\\..*,.*\\..*
canal.mq.partition=0
# hash partition config
#canal.mq.enableDynamicQueuePartition=false
#canal.mq.partitionsNum=3
#canal.mq.dynamicTopicPartitionNum=test.*:4,mycanal:6
#canal.mq.partitionHash=test.table:id^name,.*\\..*
#
# multi stream for polardbx
canal.instance.multi.stream.on=false
#################################################
  • canal.destinations 要与 canal.mq.topic 一致
  • canal.instance.filter.regex 一定要指定 不然不会进行同步
  • canal.instance.dbUsername canal.instance.dbPassword canal.instance.master.address=mysql:3306 需要自己填写

canal-adapter

配置文件路径

  • canal-adapter/conf/application.yml
  • canal-adapter/conf/es7/ceshi.yml

application.yml

server:
  port: 8439
spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
    default-property-inclusion: non_null

canal.conf:
  mode: tcp
  flatMessage: true
  zookeeperHosts:
  syncBatchSize: 1000
  retries: 0
  timeout:
  accessKey:
  secretKey:
  consumerProperties:
    # canal tcp consumer
    canal.tcp.server.host: canal:11111
    canal.tcp.batch.size: 500
    canal.tcp.username:
    canal.tcp.password:
  srcDataSources:
    defaultDS:
      url: jdbc:mysql://mysql:3306/sass_www17?useUnicode=true&useSSL=false
      username: root
      password: 123456
  canalAdapters:
    - instance: example # canal instance Name or mq topic name
      groups:
        - groupId: g1
          outerAdapters:
            - name: logger
            - name: es7 # 该版本发现只能是es7/es6
              hosts: es:9300 # 127.0.0.1:9200 for rest mode
              properties:
                mode: transport # transport # or rest
                cluster.name: docker-cluster

ceshi.yml

dataSourceKey: defaultDS
destination: example
groupId: g1
esMapping:
  _index: default_view_courses
  _id: _id
  _type: _doc
  upsert: true
  #  pk: id
  sql: "SELECT a.itemid as _id, a.itemid, a.areaid, a.catid, a.typecatid, a.typeid , a.req_id, b.userid AS school_userid, b.company AS school_zh_name, b.companyen AS school_name , b.thumb AS school_logo, b.homepage AS school_url, b.linkurl AS school_zh_url, b.username, b.ranking AS school_ranking , a.schoolid AS college_id, c.title AS college_name, a.ranking, a.titleen , a.url, a.mintitle, a.duration, a.durationunit, a.price , a.priceunit, a.uniacid FROM dt_sell_5 a LEFT JOIN dt_company b ON b.username = a.username LEFT JOIN dt_school c ON c.itemid = a.schoolid"
  #  objFields:
  #    _labels: array:;
  # etlCondition: " WHERE `dt_sell_5`.`status` IN (1, 2, 3) AND (`dt_company`.`groupid` >= 6 OR (`dt_member`.`groupid` > 4 AND `dt_member`.`regid` >= 6)) AND `dt_company`.`groupid` NOT IN (11, 15) AND `dt_sell_5`.`typeid` IN (0, 1, 2, 3, 4, 5)"
  commitBatch: 3000

一键启动服务

docker compose up -d

查看canal log

[root@localhost dnmp]# docker compose  logs canal
WARN[0000] /root/dnmp/docker-compose.yml: `version` is obsolete 
canal  | DOCKER_DEPLOY_TYPE=VM
canal  | ==> INIT /alidata/init/02init-sshd.sh
canal  | ==> EXIT CODE: 0
canal  | ==> INIT /alidata/init/fix-hosts.py
canal  | ==> EXIT CODE: 0
canal  | ==> INIT DEFAULT
canal  | Generating SSH1 RSA host key: [  OK  ]
canal  | Starting sshd: [  OK  ]
canal  | Starting crond: [  OK  ]
canal  | ==> INIT DONE
canal  | ==> RUN /home/admin/app.sh
canal  | ==> START ...
canal  | start canal ...
canal  | start canal successful
canal  | ==> START SUCCESSFUL ...
canal  | DOCKER_DEPLOY_TYPE=VM
canal  | ==> INIT /alidata/init/02init-sshd.sh
canal  | ==> EXIT CODE: 0
canal  | ==> INIT /alidata/init/fix-hosts.py
canal  | ==> EXIT CODE: 0
canal  | ==> INIT DEFAULT
canal  | Starting sshd: [  OK  ]
canal  | Starting crond: [  OK  ]
canal  | ==> INIT DONE
canal  | ==> RUN /home/admin/app.sh
canal  | ==> START ...
canal  | start canal ...
canal  | start canal successful
canal  | ==> START SUCCESSFUL ...
canal  | DOCKER_DEPLOY_TYPE=VM
canal  | ==> INIT /alidata/init/02init-sshd.sh
canal  | ==> EXIT CODE: 0
canal  | ==> INIT /alidata/init/fix-hosts.py
canal  | ==> EXIT CODE: 0
canal  | ==> INIT DEFAULT
canal  | Starting sshd: [  OK  ]
canal  | Starting crond: [  OK  ]
canal  | ==> INIT DONE
canal  | ==> RUN /home/admin/app.sh
canal  | ==> START ...
canal  | start canal ...
canal  | start canal successful
canal  | ==> START SUCCESSFUL ...

canal启动成功,查看配置的实例日志

查看example的日志

docker compose exec canal sh
cd /home/admin/canal-server/logs/example
tail -f example.log

sh-4.1# tail -f example.log 
2024-05-28 10:45:46.070 [main] INFO  c.a.otter.canal.instance.spring.CanalInstanceWithSpring - start CannalInstance for 1-example 
2024-05-28 10:45:46.409 [main] WARN  c.a.o.canal.parse.inbound.mysql.dbsync.LogEventConvert - --> init table filter : ^sass_www17\.dt_company$|^sass_www17\.dt_sell_5$|^sass_www17\.dt_school$|^sass_www17\.dt_member$
2024-05-28 10:45:46.409 [main] WARN  c.a.o.canal.parse.inbound.mysql.dbsync.LogEventConvert - --> init table black filter : ^mysql\.slave_.*$
2024-05-28 10:45:47.273 [destination = example , address = mysql/172.18.0.6:3306 , EventParser] WARN  c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - ---> begin to find start position, it will be long time for reset or first position
2024-05-28 10:45:47.331 [main] INFO  c.a.otter.canal.instance.core.AbstractCanalInstance - start successful....
2024-05-28 10:45:47.528 [destination = example , address = mysql/172.18.0.6:3306 , EventParser] WARN  c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - prepare to find start position just last position
 {"identity":{"slaveId":-1,"sourceAddress":{"address":"mysql","port":3306}},"postion":{"gtid":"","included":false,"journalName":"mysql-bin.000003","position":258012,"serverId":1,"timestamp":1716864048000}}
2024-05-28 10:45:49.840 [destination = example , address = mysql/172.18.0.6:3306 , EventParser] WARN  c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - ---> find start position successfully, EntryPosition[included=false,journalName=mysql-bin.000003,position=258012,serverId=1,gtid=,timestamp=1716864048000] cost : 2216ms , the next step is binlog dump

查看canal-adapter 日志

docker compose logs -f canal-adapter

canal-adapter  | 2024-05-30 10:37:26.450  INFO 7 --- [           main] o.elasticsearch.plugins.PluginsService   : loaded plugin [org.elasticsearch.percolator.PercolatorPlugin]
canal-adapter  | 2024-05-30 10:37:26.450  INFO 7 --- [           main] o.elasticsearch.plugins.PluginsService   : loaded plugin [org.elasticsearch.script.mustache.MustachePlugin]
canal-adapter  | 2024-05-30 10:37:26.450  INFO 7 --- [           main] o.elasticsearch.plugins.PluginsService   : loaded plugin [org.elasticsearch.transport.Netty4Plugin]
canal-adapter  | 2024-05-30 10:37:28.840  INFO 7 --- [           main] c.a.o.c.c.a.e.c.c.ESSyncConfigLoader     : ## Start loading es mapping config ... 
canal-adapter  | 2024-05-30 10:37:28.907  INFO 7 --- [           main] c.a.o.c.c.a.e.c.c.ESSyncConfigLoader     : ## ES mapping config loaded
canal-adapter  | 2024-05-30 10:37:29.167  INFO 7 --- [           main] c.a.o.c.a.l.loader.CanalAdapterLoader    : Load canal adapter: es7 succeed
canal-adapter  | 2024-05-30 10:37:29.174  INFO 7 --- [           main] c.a.o.c.c.core.spi.ExtensionLoader       : extension classpath dir: /opt/canal-adapter/plugin
canal-adapter  | 2024-05-30 10:37:29.229  INFO 7 --- [           main] c.a.o.c.a.l.loader.CanalAdapterLoader    : Start adapter for canal-client mq topic: example-g1 succeed
canal-adapter  | 2024-05-30 10:37:29.229  INFO 7 --- [           main] c.a.o.c.a.l.loader.CanalAdapterService   : ## the canal client adapters are running now ......
canal-adapter  | 2024-05-30 10:37:29.238  INFO 7 --- [       Thread-3] c.a.o.c.a.l.loader.AdapterProcessor      : =============> Start to connect destination: example <=============
canal-adapter  | 2024-05-30 10:37:29.287  INFO 7 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8439 (http) with context path ''
canal-adapter  | 2024-05-30 10:37:29.294  INFO 7 --- [           main] c.a.o.c.a.l.CanalAdapterApplication      : Started CanalAdapterApplication in 12.077 seconds (JVM running for 13.25)
canal-adapter  | 2024-05-30 10:37:29.496  INFO 7 --- [       Thread-3] c.a.o.c.a.l.loader.AdapterProcessor      : =============> Subscribe destination: example succeed <=============

canal-adapter 同步操作

update

canal-adapter  | 2024-05-30 10:53:29.522  INFO 7 --- [pool-1-thread-1] c.a.o.c.c.a.logger.LoggerAdapterExample  : DML: {"data":[{"itemid":487795,"catid":636,"mycatid":0,"typeid":0,"areaid":16,"elite":0,"mintitle":"俄罗斯21212测试","title":null,"titleen":"","letter_order":0,"style":"","fee":0.0,"introduce":"","n1":"","n2":"","n3":"","v1":"","v2":"","v3":"","brand":"","unit":"","price":0.0,"minamount":0.0,"amount":0.0,"days":0,"tag":"","keyword":"","pptword":"","hits":0,"thumb":"","thumb1":"","thumb2":"","username":"usyd","groupid":0,"company":"","vip":0,"validated":0,"truename":"","telephone":"","mobile":"","address":"","email":"","msn":"","qq":"","ali":"","skype":"","totime":0,"editor":"admin","edittime":1709621826,"editdate":"2024-03-05","addtime":1709621793,"adddate":"2024-03-05","ip":"192.168.2.101","template":"0","status":3,"linkurl":"","filepath":"","note":"","level":0,"duration":"","academicreq":"","ranking":0,"programnote":"","subjects":"","immigrate":0,"careeroptions":"","jobcareer":"","salary":"","salarycn":"","careerppt":"","employrate":0.0,"priceunit":"","url":"","ieltstotal":0.0,"toefltotal":0.0,"entrymonth":"","star":null,"companyranking":0,"seo_title":null,"tagids":null,"prologue":"","assocode":null,"schoolid":4,"evaluate":"","baidushoufou":0,"baiduurlsubmit":"","baiduxzsubmit":"","baiduxzoriginalsubmit":"","baidumipsubmit":"","baidumsubmit":"","baiduxzlssubmit":"","cricode":"","subdivision":"","academicreqen":"","degree":"","req_id":0,"coursetype":0,"anysubject":0,"typecatid":",6925,","ieltslistening":0.0,"ieltsreading":0.0,"ieltsspeaking":0.0,"ieltswriting":0.0,"toefllistening":0,"toeflreading":0,"toeflspeaking":0,"toeflwriting":0,"ptelistening":0,"ptereading":0,"pteoverall":0,"ptespeaking":0,"petwriting":0,"gpa":0.0,"background":"","campuses":"","firstdate":"","tags":"","gpatype":"","specificdegree":0.0,"workexp":"","premastersupport":"","languageexpired":0,"psesupport":0,"porfessionalqualification":"","practice":"","applytips":"","languageapply":"","applydeadline":"","interview":"","writtenexam":"","writingsample":"","studyproposal":"","ps":"","rl":"","cv":"","courselist":"","gpacert":"","portfolio":"","deposit":"","defer":"","atas":"","gmat":"","degreetitle":"","coursename":"","applicationfees":0,"durationunit":"","duolinguo":"","credits":"","gre":"","syllabus":"","prologuecn":"","creator":"","destinationschool":"","alevel":"","ossd":"","ib":0.0,"bchighshool":0.0,"sat":0,"act":0,"foundation":0.0,"gaokao":0.0,"cet6":"","maxduration":0.0,"ageragegpa":0.0,"teachingtype":"","location":"","state":"","agent":0,"stem":0,"numberofcourse":0,"numberofterm":0,"limitednumber":0,"limitedunit":0,"averagetoefl":0.0,"averageielts":0.0,"averagegre":0.0,"averagegmat":0.0,"averagelsat":0.0,"essay":"","shortanswer":"","optionalessay":"","videoessay":"","qualificationassess":"","lsat":"","mcat":"","schoolid1":"","schoolidzh1":"","schoolid2":"","schoolidzh2":"","toeflehomeedition":"","toeflmybest":"","ieltsindicator":"","ieltsonline":"","pteonline":"","duolinguoliteracy":"","duolinguoproduction":"","duolinguoconversation":"","duolinguocomprehension":"","languagereq":"","test1":"","uniacid":66,"sync_id":91773}],"database":"sass_www17","destination":"example","es":1717037609000,"groupId":"g1","isDdl":false,"old":[{"areaid":15}],"pkNames":["itemid"],"sql":"","table":"dt_sell_5","ts":1717037609520,"type":"UPDATE"}

insert

canal-adapter  | 2024-05-30 10:55:13.312  INFO 7 --- [pool-1-thread-1] c.a.o.c.c.a.logger.LoggerAdapterExample  : DML: {"data":[{"itemid":487807,"catid":636,"mycatid":0,"typeid":0,"areaid":16,"elite":0,"mintitle":"俄罗斯21212测试","title":null,"titleen":"","letter_order":0,"style":"","fee":0.0,"introduce":"","n1":"","n2":"","n3":"","v1":"","v2":"","v3":"","brand":"","unit":"","price":0.0,"minamount":0.0,"amount":0.0,"days":0,"tag":"","keyword":"","pptword":"","hits":0,"thumb":"","thumb1":"","thumb2":"","username":"usyd","groupid":0,"company":"","vip":0,"validated":0,"truename":"","telephone":"","mobile":"","address":"","email":"","msn":"","qq":"","ali":"","skype":"","totime":0,"editor":"admin","edittime":1709621826,"editdate":"2024-03-05","addtime":1709621793,"adddate":"2024-03-05","ip":"192.168.2.101","template":"0","status":3,"linkurl":"","filepath":"","note":"","level":0,"duration":"","academicreq":"","ranking":0,"programnote":"","subjects":"","immigrate":0,"careeroptions":"","jobcareer":"","salary":"","salarycn":"","careerppt":"","employrate":0.0,"priceunit":"","url":"","ieltstotal":0.0,"toefltotal":0.0,"entrymonth":"","star":null,"companyranking":0,"seo_title":null,"tagids":null,"prologue":"","assocode":null,"schoolid":4,"evaluate":"","baidushoufou":0,"baiduurlsubmit":"","baiduxzsubmit":"","baiduxzoriginalsubmit":"","baidumipsubmit":"","baidumsubmit":"","baiduxzlssubmit":"","cricode":"","subdivision":"","academicreqen":"","degree":"","req_id":0,"coursetype":0,"anysubject":0,"typecatid":",6925,","ieltslistening":0.0,"ieltsreading":0.0,"ieltsspeaking":0.0,"ieltswriting":0.0,"toefllistening":0,"toeflreading":0,"toeflspeaking":0,"toeflwriting":0,"ptelistening":0,"ptereading":0,"pteoverall":0,"ptespeaking":0,"petwriting":0,"gpa":0.0,"background":"","campuses":"","firstdate":"","tags":"","gpatype":"","specificdegree":0.0,"workexp":"","premastersupport":"","languageexpired":0,"psesupport":0,"porfessionalqualification":"","practice":"","applytips":"","languageapply":"","applydeadline":"","interview":"","writtenexam":"","writingsample":"","studyproposal":"","ps":"","rl":"","cv":"","courselist":"","gpacert":"","portfolio":"","deposit":"","defer":"","atas":"","gmat":"","degreetitle":"","coursename":"","applicationfees":0,"durationunit":"","duolinguo":"","credits":"","gre":"","syllabus":"","prologuecn":"","creator":"","destinationschool":"","alevel":"","ossd":"","ib":0.0,"bchighshool":0.0,"sat":0,"act":0,"foundation":0.0,"gaokao":0.0,"cet6":"","maxduration":0.0,"ageragegpa":0.0,"teachingtype":"","location":"","state":"","agent":0,"stem":0,"numberofcourse":0,"numberofterm":0,"limitednumber":0,"limitedunit":0,"averagetoefl":0.0,"averageielts":0.0,"averagegre":0.0,"averagegmat":0.0,"averagelsat":0.0,"essay":"","shortanswer":"","optionalessay":"","videoessay":"","qualificationassess":"","lsat":"","mcat":"","schoolid1":"","schoolidzh1":"","schoolid2":"","schoolidzh2":"","toeflehomeedition":"","toeflmybest":"","ieltsindicator":"","ieltsonline":"","pteonline":"","duolinguoliteracy":"","duolinguoproduction":"","duolinguoconversation":"","duolinguocomprehension":"","languagereq":"","test1":"","uniacid":66,"sync_id":91773}],"database":"sass_www17","destination":"example","es":1717037713000,"groupId":"g1","isDdl":false,"old":null,"pkNames":["itemid"],"sql":"","table":"dt_sell_5","ts":1717037713311,"type":"INSERT"}

delete

canal-adapter  | 2024-05-30 10:55:50.495  INFO 7 --- [pool-1-thread-1] c.a.o.c.c.a.logger.LoggerAdapterExample  : DML: {"data":[{"itemid":487807,"catid":636,"mycatid":0,"typeid":0,"areaid":16,"elite":0,"mintitle":"俄罗斯21212测试","title":null,"titleen":"","letter_order":0,"style":"","fee":0.0,"introduce":"","n1":"","n2":"","n3":"","v1":"","v2":"","v3":"","brand":"","unit":"","price":0.0,"minamount":0.0,"amount":0.0,"days":0,"tag":"","keyword":"","pptword":"","hits":0,"thumb":"","thumb1":"","thumb2":"","username":"usyd","groupid":0,"company":"","vip":0,"validated":0,"truename":"","telephone":"","mobile":"","address":"","email":"","msn":"","qq":"","ali":"","skype":"","totime":0,"editor":"admin","edittime":1709621826,"editdate":"2024-03-05","addtime":1709621793,"adddate":"2024-03-05","ip":"192.168.2.101","template":"0","status":3,"linkurl":"","filepath":"","note":"","level":0,"duration":"","academicreq":"","ranking":0,"programnote":"","subjects":"","immigrate":0,"careeroptions":"","jobcareer":"","salary":"","salarycn":"","careerppt":"","employrate":0.0,"priceunit":"","url":"","ieltstotal":0.0,"toefltotal":0.0,"entrymonth":"","star":null,"companyranking":0,"seo_title":null,"tagids":null,"prologue":"","assocode":null,"schoolid":4,"evaluate":"","baidushoufou":0,"baiduurlsubmit":"","baiduxzsubmit":"","baiduxzoriginalsubmit":"","baidumipsubmit":"","baidumsubmit":"","baiduxzlssubmit":"","cricode":"","subdivision":"","academicreqen":"","degree":"","req_id":0,"coursetype":0,"anysubject":0,"typecatid":",6925,","ieltslistening":0.0,"ieltsreading":0.0,"ieltsspeaking":0.0,"ieltswriting":0.0,"toefllistening":0,"toeflreading":0,"toeflspeaking":0,"toeflwriting":0,"ptelistening":0,"ptereading":0,"pteoverall":0,"ptespeaking":0,"petwriting":0,"gpa":0.0,"background":"","campuses":"","firstdate":"","tags":"","gpatype":"","specificdegree":0.0,"workexp":"","premastersupport":"","languageexpired":0,"psesupport":0,"porfessionalqualification":"","practice":"","applytips":"","languageapply":"","applydeadline":"","interview":"","writtenexam":"","writingsample":"","studyproposal":"","ps":"","rl":"","cv":"","courselist":"","gpacert":"","portfolio":"","deposit":"","defer":"","atas":"","gmat":"","degreetitle":"","coursename":"","applicationfees":0,"durationunit":"","duolinguo":"","credits":"","gre":"","syllabus":"","prologuecn":"","creator":"","destinationschool":"","alevel":"","ossd":"","ib":0.0,"bchighshool":0.0,"sat":0,"act":0,"foundation":0.0,"gaokao":0.0,"cet6":"","maxduration":0.0,"ageragegpa":0.0,"teachingtype":"","location":"","state":"","agent":0,"stem":0,"numberofcourse":0,"numberofterm":0,"limitednumber":0,"limitedunit":0,"averagetoefl":0.0,"averageielts":0.0,"averagegre":0.0,"averagegmat":0.0,"averagelsat":0.0,"essay":"","shortanswer":"","optionalessay":"","videoessay":"","qualificationassess":"","lsat":"","mcat":"","schoolid1":"","schoolidzh1":"","schoolid2":"","schoolidzh2":"","toeflehomeedition":"","toeflmybest":"","ieltsindicator":"","ieltsonline":"","pteonline":"","duolinguoliteracy":"","duolinguoproduction":"","duolinguoconversation":"","duolinguocomprehension":"","languagereq":"","test1":"","uniacid":66,"sync_id":91773}],"database":"sass_www17","destination":"example","es":1717037750000,"groupId":"g1","isDdl":false,"old":null,"pkNames":["itemid"],"sql":"","table":"dt_sell_5","ts":1717037750494,"type":"DELETE"}
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 1

我想了解一下,就这一套东西,最低要在什么服务器配置才跑得起来

2周前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!