學(xué)習(xí)日志 220105 flink mysql connector 問(wèn)題解決
# 220105
- 問(wèn)題3
? - SQL錯(cuò)誤 不能是(?
? - 數(shù)據(jù)類型錯(cuò)誤 沒(méi)有DATETIME 改用 TIMESTAMP(3)
? - 目前使用數(shù)據(jù)類型有 BIGINT TIMESTAMP(原DATETIME) STRING(原TEXT)
- 問(wèn)題4
? - The primary key is necessary when enable 'Key: 'scan.incremental.snapshot.enabled'
? - 加上PRIMARY KEY聲明
- 問(wèn)題5
? - Flink doesn't support ENFORCED mode
? - https://cwiki.apache.org/confluence/display/FLINK/FLIP+87%3A+Primary+key+constraints+in+Table+API
? - Primary key validity checks
? - 在PRIMARY KEY聲明后加 NOT ENFORCED
? - 類似 `PRIMARY KEY(id) NOT ENFORCED,`
- 問(wèn)題6
? - 主進(jìn)程退出 退出碼 -17
? - 修改依賴
? ? - 示例中依賴是 org.apache.flink:flink-table-planner-blink_${scala.binary.version}
? ? - 改為 org.apache.flink:flink-table-planner_2.12
? ? - 版本號(hào)也升級(jí)為 1.14.2(當(dāng)前最新)
- 問(wèn)題7
? - Illegal reflective access by org.apache.flink.api.java.ClosureCleaner
? - https://stackoverflow.com/questions/60754821/illegal-reflective-access-by-org-apache-flink-api-java-closurecleaner
? - 降低運(yùn)行環(huán)境到 java8
? - 暫時(shí)無(wú)視? 只是警告
- 問(wèn)題8
? - log4j:WARN No appenders could be found for logger
? - 加log4j.properties 從 playgrounds里copy一個(gè)出來(lái)
? - 這個(gè)打包進(jìn)jar會(huì)不會(huì)影響在flink集群上運(yùn)行?
? - 參考 https://www.cnblogs.com/upupfeng/p/14489664.html
? - 應(yīng)該不影響
- 問(wèn)題9
? - Currently Flink MySql CDC connector only supports MySql whose version is larger or equal to 5.7, but actual is 5.6.
? - 方案一 重裝mysql 太麻煩了 不用
? ? - 1, 刪除mysql相關(guān)的service和sts
? ? - 2, 刪除mysql相關(guān)的pvc
? ? - 3, 重新編寫(xiě)k8s描述文件 升級(jí)mysql版本
? ? - 4, 重新執(zhí)行DDL 重新插入數(shù)據(jù)
? ? - 5, 重啟依賴mysql的服務(wù) springbootdemo
? - 方案二 升級(jí)
? ? - 參考 https://dev.mysql.com/doc/refman/5.7/en/docker-mysql-getting-started.html#docker-upgrading
? ? - 1, 關(guān)閉mysql集群? 重新apply -f應(yīng)該自動(dòng)關(guān)閉舊pod
? ? - 2, 編寫(xiě)k8s描述文件 升級(jí) 重新 apply -f
? ? - 3, 用exec執(zhí)行mysql_upgrade
? ? - 4, 重啟集群
? ? ? - `kubectl rollout restart sts/mycluster-mysql`
? ? ? - `kubectl rollout status sts/mycluster-mysql`
? ? - 5, 檢查java應(yīng)用使用數(shù)據(jù)的情況
? ? ? - springbootdemo的搜索功能正常
? - 開(kāi)發(fā)環(huán)境 重新運(yùn)行flink
- 問(wèn)題10
? ```
? Source: TableSourceScan(table=[[default_catalog, default_database, test_doc]], fields=[id, gmt_create, gmt_modify, doc]) -> WatermarkAssigner(rowtime=[gmt_modify], watermark=[(gmt_modify - 5000:INTERVAL SECOND)]) -> Sink: Sink(table=[default_catalog.default_database.print_table], fields=[id, gmt_create, gmt_modify, doc]) (8/16)#0 (5a897800a4d82dbaa5072840701c1041) switched from INITIALIZING to FAILED with failure cause: java.lang.NoSuchMethodError: org.apache.flink.api.connector.source.SourceReaderContext.metricGroup()Lorg/apache/flink/metrics/MetricGroup;
? ```
? - switched from INITIALIZING to FAILED with failure cause
? - java.lang.NoSuchMethodError: org.apache.flink.api.connector.source.SourceReaderContext.metricGroup()
? - 參考 https://ververica.github.io/flink-cdc-connectors/master/content/quickstart/mysql-postgres-tutorial.html
? - 只支持flink 1.13
? - flink 降到 1.13.5
- 問(wèn)題11
? - 又出現(xiàn)了問(wèn)題6的現(xiàn)象
? - 之前問(wèn)題6的修改 把 table-planner 從blink版本改到了不是blink的版本
? - 這個(gè)實(shí)際上是不行的, 還是要改回去
? - 問(wèn)題6的正確解決方法是問(wèn)題10的方法, 也就是把flink降到13.5
- 問(wèn)題12
? - Cannot read the binlog filename and position via 'SHOW MASTER STATUS'
? - mysql數(shù)據(jù)庫(kù)沒(méi)開(kāi)binlog 或者binlog格式不是row
? - 參考 https://www.jianshu.com/p/0a47e387de51
? - 查找my.cnf位置
? ? - 參考 https://stackoverflow.com/questions/38490785/where-is-mysql-5-7-my-cnf-file
? ? - mysqld --help --verbose|grep cnf
? ? - 有三個(gè)位置 挨個(gè)查一下 發(fā)現(xiàn)用的是第二個(gè) 即 /etc/mysql/my.cnf
? - 查看my.cnf中是否已有binlog相關(guān)配置
? ? - 沒(méi)有
? - 修改k8s描述文件
? ? - `cat << EOF >> /etc/mysql/my.cnf`
? ? - 支持多行命令 在yaml里換行接著寫(xiě)就行
? ? - 使用變量 ${HOSTNAME##*-} 來(lái)設(shè)置server_id
? ? - 設(shè)置initContainers的image為 busybox:1.28
? ? - 目前的段落如下
? ? ? ```
? ? ? initContainers:
? ? ? - name: enable-binlog
? ? ? ? image: busybox:1.28
? ? ? ? command:
? ? ? ? ? - sh
? ? ? ? ? - "-c"
? ? ? ? ? - |
? ? ? ? ? ? cat << EOF >> /etc/mysql/my.cnf
? ? ? ? ? ? server_id=${HOSTNAME##*-}
? ? ? ? ? ? log_bin=mysql-bin
? ? ? ? ? ? binlog_format=ROW
? ? ? ? ? ? expire_logs_days=30
? ? ? ? ? ? binlog_do_db=test_db
? ? ? ? ? ? EOF
? ? ? ```
? - 失敗 檢查日志
? ? - `kubectl logs mycluster-mysql-1 -c enable-binlog`
? ? - 指定initContainer 查看日志
? ? - sh: can't create /etc/mysql/my.cnf: nonexistent directory
? - 解決 /etc/mysql/my.cnf不存在的問(wèn)題
? ? - 參考 https://stackoverflow.com/questions/68646958/my-cnf-in-kubernetes-configmap-is-not-recognized-by-mysql-pod
? ? - 參考 https://www.jianshu.com/p/eec2fd2d7080
? ? - 參考 https://kubernetes.io/zh/docs/tasks/run-application/run-replicated-stateful-application/
? ? - 這里需要詳細(xì)說(shuō)明 見(jiàn)下一節(jié)
??
### 正確的配置mysql的方案
- 首先我們需要排除錯(cuò)誤的選項(xiàng)
? - 使用initContainers直接修改/etc/mysql/my.cnf
? - 原因 initContainers和實(shí)際的container并不是同一個(gè) 改了也互不影響
- 正確方案
? - mysql 的my.cnf會(huì)加載 /etc/mysql/conf.d目錄下的所有文件
? ? - `cat /etc/mysql/my.cnf|grep include`
? ? - 利用這個(gè)特性 我們可以mount一個(gè)volume到指定位置
? - k8s支持emptyDir 形式的volume 可以在initContainers和真正的container之間共享
? ? ```
? ? ? volumes:
? ? ? ? - name: conf
? ? ? ? ? emptyDir: { }
? ? ```
? ? - 也就是說(shuō), 我們按如下順序處理
? ? - 先把這個(gè)volume mount給initContainer
? ? - 從initContainer里往這個(gè)volume寫(xiě)一些文件
? ? - 再把這個(gè)volume mount到實(shí)際container的/etc/mysql/conf.d 目錄
? - 技術(shù)細(xì)節(jié)如下
? - mount volume conf給initContainer
? ? ```
? ? ? ? volumeMounts:
? ? ? ? ? - name: conf
? ? ? ? ? ? mountPath: /mnt/conf.d
? ? ```
? - 通過(guò)initContainer的command 多行指令寫(xiě)入配置文件 這里利用了yaml的|(豎線)特性
? ? ```
? ? ? ? command:
? ? ? ? ? - sh
? ? ? ? ? - "-c"
? ? ? ? ? - |
? ? ? ? ? ? cat << EOF > /mnt/conf.d/my.cnf
? ? ? ? ? ? [mysqld]
? ? ? ? ? ? server_id=${HOSTNAME##*-}
? ? ? ? ? ? log_bin=mysql-bin
? ? ? ? ? ? binlog_format=ROW
? ? ? ? ? ? expire_logs_days=30
? ? ? ? ? ? binlog_do_db=test_db
? ? ? ? ? ? EOF
? ? ```
? ? - 注意幾點(diǎn)
? ? - yaml的|豎線之下 保持縮進(jìn) 實(shí)際指行時(shí)這些縮進(jìn)會(huì)被移除
? ? - `<< EOF` 和 最后一行的 `EOF` 配對(duì) 表示中間的內(nèi)容從使用cat 指令輸出
? ? - 第一行 直接跟上 `>` 重定向輸出到文件 這里注意這段并不是放在最后
? ? - 根據(jù)mysql配置文件的格式, 必須指定 `[mysqld]` 區(qū)塊
? ? ? - 否則mysql會(huì)報(bào)錯(cuò) 登錄時(shí)也會(huì)報(bào)一行提示說(shuō)部分配置未能解析
? ? - 可以通過(guò)之前說(shuō)的查看initContainers日志的方法檢查
? - 在真正的container中, 把上述volume conf , mount 到 /etc/mysql/conf.d
? ? ```
? ? ? ? volumeMounts:
? ? ? ? - name: conf
? ? ? ? ? mountPath: /etc/mysql/conf.d
? ? ```?
? - 重新apply -f
- 校驗(yàn)
? - 登錄pod 的 bash, 再用mysql登錄數(shù)據(jù)庫(kù)
? - use test_db;
? - show master status;
? - 有輸出binlog文件和位點(diǎn)表示成功
- flink運(yùn)行校驗(yàn)
? - 進(jìn)程會(huì)持續(xù)運(yùn)行 不會(huì)退出
? - 日志中有類似如下的輸出
? ? ```
? ? 7> +I[681163714816618496, 2021-12-24T07:40:57.483, 2021-12-24T07:40:57.483, test content 002]
? ? 7> +I[681097728465809408, 2021-12-24T03:18:46.044, 2021-12-24T03:18:46.044, test content 001]
? ? ```
? - 表示相應(yīng)的數(shù)據(jù)變更已經(jīng)被CDC捕獲了 并輸出到了print的table上
- TODO
? - 接入elasticsearch的sink