原创 Docker 技術原理淺析

Docker 技術原理淺析 1.簡介 簡單介紹Docker使用的核心技術 利用Linux的Namespace功能,實現資源的隔離 利用Linux的cgroups功能,實現資源的限制 利用AUFS棧式疊加的文件系統(聯合掛載),實現dock

原创 Mysql 常見面試題

Mysql 常見面試題 1.索引 1.什麼是索引? 索引是對數據庫中一個或者多個值進行排序的數據結構,以便實現快速查詢 2.Mysql索引是如何實現的? mysql索引使用的是B+樹,主要是查詢效率高,時間複雜度是O(log N),可以充分

原创 k8s最佳實踐:業務丟包問題排查

k8s最佳實踐:業務丟包問題排查 一.問題描述 有用戶反饋大量圖片加載不出來。 圖片下載走的 k8s ingress,這個 ingress 路徑對應後端 service 是一個代理靜態圖片文件的 nginx deployment,這個 de

原创 k8s 最佳實踐:解決長連接服務擴容失效

Kubernetes 最佳實踐:解決長連接服務擴容失效 1.問題背景 在現網運營中,有很多場景爲了提高效率,一般都採用建立長連接的方式來請求。我們發現在客戶端以長連接請求服務端的場景下,K8S的自動擴容會失效。 原因是客戶端長連接一直保留在

原创 k8s 最佳實踐:處理內存碎片化

k8s 最佳實踐:處理內存碎片化 內存碎片化造成的危害 節點的內存碎片化嚴重,導致docker運行容器時,無法分到大的內存塊,導致start docker失敗。最終導致服務更新時,狀態一直都是啓動中 在長時間運行的Linux操作系統中,系統

原创 k8s最佳實踐:部分業務POD內存持續泄露問題

K8S部分業務POD內存持續泄露問題 1.前言 線上K8S集羣有極少量的PHP業務,它們的POD內存持續走高直到OOM,相信與特殊代碼場景有關,需要展開分析。 我從POD的內存監控原理入手,分析到底內存用到了哪些地方。 2.分析過程 第

原创 k8s最佳實踐:cgroup kmem的內存泄露問題

k8s最佳實踐:cgroup kmem的內存泄露問題 1.前言 這篇文章的全稱應該叫:[在某些內核版本上,cgroup 的 kmem account 特性有內存泄露問題],如果你遇到過 pod 的 "cannot allocated mem

原创 Mysql鎖機制及原理簡析

Mysql鎖機制及原理簡析 一.前言 1.什麼是鎖? 鎖是計算機協調多個進程或線程併發訪問某一資源的機制。 鎖保證數據併發訪問的一致性、有效性; 鎖衝突也是影響數據庫併發訪問性能的一個重要因素。 鎖是Mysql在服務器層和存儲引擎層的的併

原创 SSL協議工作原理

SSL協議工作原理 在現代,A和B之間要進行安全,省心的網絡通信,需要經過以下幾個步驟 通過CA體系交換public key 通過非對稱加密算法,交換用於對稱加密的密鑰 通過對稱加密算法,加密正常的網絡通信 在實際中,非對稱加密只會用來

原创 Mysql集羣方案簡介

Mysql集羣方案簡介 集羣的好處 高可用性:故障檢測及遷移,多節點備份。 可伸縮性:新增數據庫節點便利,方便擴容。 負載均衡:切換某服務訪問某節點,分攤單個節點的數據庫壓力。 集羣要考慮的風險 網絡分裂:羣集還可能由於網絡故障而拆分

原创 TCP/IP面試要點淺析

TCP/IP面試要點淺析 一.TCP基本認識 1.TCP頭部格式 序列號 在建立連接時由計算機生成的隨機數作爲初始值,通過SYN包傳輸給接收端 每發送一次數據,就累加一次該數據字節數的大小 用來解決網絡包亂序的問題 確認應答號

原创 【系統設計】如何設計一個Pastebin.com?

如何設計一個Pastebin.com? 1.用例 我們將問題的範疇限定在如下用例 用戶 輸入一段文本,然後得到一個隨機生成的鏈接 過期設置 默認的設置是不會過期的 可以選擇設置一個過期的時間 用戶 輸入一個 paste 的

原创 【系統設計】如何設計 Twitter 時間線和搜索?

如何設計 Twitter 時間線和搜索? 1.業務場景 業務場景如下: 用戶發佈推文 服務將推文推送給關注者,發送推送通知和電子郵件 用戶查看用戶時間線(來自用戶的活動) 用戶查看主頁時間線(用戶關注的人的活動) 用戶搜索關鍵字

原创 Golang 面試題(3) 兩個協程輪流打印字母和數字

Golang面試編程題3 實現兩個協程輪流輸出A 1 B 2 C 3 .... Z 26 方案1:有緩衝的chan func ChannelFunc() { // 思想:兩個g,一個輸出數字,一個輸出字母,重點是如何控制兩個g的打印順序

原创 Golang 面試題 (2) 大切片分割成指定大小的小切片

Golang面試編程題2 實現一個函數可以根據指定的size切割切片爲多個小切片 func main() { lenth := 11 size := 5 list := make([]int, 0, lenth) for i :=