學習日志 211224 sharding寫數(shù)據(jù) ID生成器 無key列出數(shù)據(jù)結(jié)果集合并
# insert sharding with key
## 搞個測試環(huán)境
- 最終方案是把線上庫向開發(fā)機開放代理
- 具體做法如下
- 采用NodePort類型的service, 把線上庫通過特殊端口映射出來
? - 注意如果是生產(chǎn)的話, 這個方案一般需要內(nèi)網(wǎng)和外網(wǎng)分開
? - 外網(wǎng)的防火墻不允許訪問這些特殊端口
- 因為mysql是多臺, 所以每臺需要一個獨立的NodePort 的 service
? - 實際使用時也可以只把其中特定的一臺開出來
? - 只是所有測試用例注意key必須落在對應(yīng)的那臺機器上
? - 對無key的操作有影響 數(shù)據(jù)不全
- 具體做法是為每一臺實際服務(wù)器打不同的label
? - 之后NodePort的service每個選取不同的label
? - 每個設(shè)置不同的外部端口 比如30306 30307
- 另外 使用k8s yaml對線上pod設(shè)置環(huán)境變量env
? - MY_CLUSTER_ENV online
? - 注意這里需要重新kubectl apply -f
- 在代碼中, 判斷環(huán)境變量, 決定使用哪一套連接
? - 在代碼中加日志輸出 輸出當前環(huán)境是什么
? - 通過kubectl logs檢查
- 需要關(guān)注的點
? - 其實線上的環(huán)境也可以使用test的NodePort格式的連接
? ? - 所以必須檢查日志, 確認是走了線上的連接格式
? ? - 因為測試的NodePort的service是需要在測完后刪除的
? - 我們是有slf4j的, 目前打日志都是進標準輸出, 通過kubectl logs查看
## 插入數(shù)據(jù)
- dao層寫插入語句
- controller層 新增一個PUT 插入數(shù)據(jù)
- 關(guān)鍵點 不要設(shè)置 id
? - dao層insert語句 跳過id字段
- 檢查實際插入的數(shù)據(jù)的id是什么
? - 先通過 kubectl exec
? - 使用mysql命令行客戶端登入數(shù)據(jù)庫
? - 逐個數(shù)據(jù)庫查詢
? - 實際插入的數(shù)據(jù)的id是 681097728465809408
? - 這個ID是在shardingSphere的驅(qū)動走了snowflake生成的
? - 需要關(guān)注的是snowflake的ID除2余數(shù)是否平均分配在0和1
? - 這關(guān)系到兩個數(shù)據(jù)庫實例的負載是否均衡
# Q & A
- Q: 在hyper-v里誤操作了關(guān)機(而不是保存) 重啟后minikube沒了 使用minikube start重啟后發(fā)現(xiàn)docker私有倉庫掛了
- A: 因為minikube start會重新拉鏡像, 導(dǎo)致之前手工創(chuàng)建的證書和registry都沒了
- R: 嘗試使用PV和PVC來為私有倉庫做硬盤
? - 檢查數(shù)據(jù)庫里的數(shù)據(jù)還在 證明minikube start不會刪除PV和PVC
? - 先用hostpath映射minikube node宿主目錄的方式啟動私有倉庫pod
? ? - 事先在宿主機minikube node上重新生成證書
? - 聲明兩個pvc 一個管certs一個管image
? - 把certs的pvc先掛到私有倉庫的pod 任意一個路徑下
? - bash私有倉庫的pod, 把已有的證書copy給新做的pvc掛的目錄
? - 修改k8s描述文件, 讓私有倉庫使用兩個新的pvc, 而不是宿主目錄了
? - 以上就完成了一個偷梁換柱的過程, 把原來從宿主機直接讀證書的事情換成了從pvc讀
? - 再改一遍證書
? ? - 開發(fā)機證書
? ? - minikube node上私有倉庫的證書
? ? - minikube node重啟后 /etc/hosts上私有倉庫的域名解析也沒了, 需要重建
? - 把上面所有操作搞定后 如果后續(xù)minikube虛擬機關(guān)機的話
? ? - 需要重新操作的部分就只有
? ? - 創(chuàng)建minikube node上docker使用的私有倉庫的證書
? ? - 修改minikube node上的/etc/hosts加入私有倉庫的域名解析
# 無key的列出數(shù)據(jù)
- 直接按標準mybatis寫select語句即可
? - 細節(jié)略
- 結(jié)果
? - 獲取到3條數(shù)據(jù), 有一條ID是奇數(shù)
? - bash到pod上, 1號實例里有1條數(shù)據(jù), 0號實例里2條數(shù)據(jù)
? - 看日志, actual sql是執(zhí)行了兩次, 每個實例都執(zhí)行了
? - actual sql加了排序, 看來是為了后續(xù)合并結(jié)果集時方便?
# 擴容
- 參考
? - https://shardingsphere.apache.org/document/current/en/user-manual/shardingsphere-scaling/
- 涉及的概念
? - 基于proxy做擴容 盡量不影響使用方
? ? - 我們用的JDBC模式 沒有用proxy
? - 啟用了binlog 監(jiān)聽新增變更
- 擴容和縮容的實驗就不做了
- 后續(xù)講flink的時候用flink做
? - 新建一套庫實例, 按新容量標準做
? - 用flink把舊庫數(shù)據(jù)復(fù)制到新庫
? ? - 也是基于binlog
? - 停業(yè)務(wù), 檢查flink沒有積壓后 切換數(shù)據(jù)源到新庫
? ? - 停業(yè)務(wù)模式是最簡單的
? ? - 此處停業(yè)務(wù), 最好不要是pods全下線的模式, 從業(yè)務(wù)代碼中禁寫是比較容易的
? ? - 引入一個zookeeper開關(guān)之類
? - 舊庫下線