原创 MongoDB的並行鎖機制

MongoDB的鎖機制 在MongoDB裏面有如下4中鎖: 鎖 描述 S 讀操作的共享鎖 IS 意向讀操作共享鎖 X 排它的寫鎖 IX 意向的排它寫鎖 MongoDB 鎖的兼容矩陣: IS IX

原创 WiredTiger的journal日誌實現

journal日誌是實現WiredTiger持久化的關鍵, 所有的插入、更新操作, 都會在journal裏面寫入一條日誌, 並且在服務器意外退出的時候, 通過checkpoint和該checkpoint之後的日誌, 能夠迅速的回覆服務

原创 WiredTiger hazard指針

在WiredTiger裏面, 採用Hazard pointers來管理一個內存頁是否可以被Evict, 本文分析下其實現過程。 Hazard pointers Hazard pointers是在多線程環境下實現資源無鎖訪問的一種方法,

原创 Golang下基於XORM的mysql使用

在golang中要實現對數據庫的操作, 一個比較好用的方式就是使用XORM,xorm是一個簡單而強大的Go語言ORM庫,通過它可以使數據庫操作非常簡便。 在xorm裏面,可以同時存在多個ORM引擎,一個ORM引擎稱爲Engine,一個

原创 MongoDB sharding 之 MoveChunk的實現過程

在分片集羣模式下, 有一個Balancer的類,它啓動一個名字爲Balancer的後臺線程, 用來保證不同分片之間chunk數的均勻。 每一個Mongos都有自己的Balancer, 不同的Balancer之間通過分佈式鎖來進行控制,

原创 MongoDB 分片sharding概述

當MongoDB由於存儲的數據越來越多, 由於性能原因, 或者單個主機資源限制, 垂直擴容沒有辦法進一步的時候, 我們就需要開始考慮水平擴容了。 與垂直擴容不同的是, 水平擴容不需要新添加的機器有多麼強大的功能,它的設計理念是將業務數

原创 MongoDB副本集的節點狀態轉化

MongoDB的副本集可以實現自動主從切換的過程,這個過程是相對複雜的, 本文主要介紹其實現過程。 副本集節點的狀態 在MongoDB裏面, 定義瞭如下的狀態: enum MS { RS_STARTUP = 0

原创 LINUX shell 下面調用腳本的3種方式

在LINUX下, 通過腳本執行一些命令, 通常需要執行好幾個腳本共同完成任務, 這裏的調用有3種方式: fork方式 這是最常用的方式, 直接通過: /path/xx.sh 就可以啦。 task.sh: #!/bin/shell /

原创 MongoDB CRUD以及command的代碼實現

我們在使用MongoDB的時候, 經常需要使用mongo shell或者各種語言的driver的API來進行CRUD以及數據庫管理操作的command, 那麼它是如何實現的? MongoDB wire protocol MongoDB

原创 2018年總結

2018年有過去, 在感慨歲月如白駒過溪之餘, 也要對過去一年做一個總結, 展望一下新的一年。 工作方面 過於的一年, 還是一樣的匆忙, 在分佈式雲數據庫方面, 做了一些重要的功能,並且隨着用戶量的增長, 優化了系統, 積累了很多寶貴

原创 MongoDB 單文檔原子操作的實現

transaction的支持在 MongoDB 裏面是逐漸進行的, 從3.2版本開始支持單文檔的原子操作, 這是後續的多文檔原子操作, 以及4.0 的副本集的事務, 以及後續的計劃推出的4.2的分片的事務操作的基礎。本文着重描述一下單

原创 MongoDB連接池的實現

幾乎每一種數據庫都會有連接池, 來減少頻繁的創建刪除連接的開銷, 在MongoDB裏面是通過信號量線程同步方式來對創建、銷燬進行管理。 信號量基礎 int sem_init(sem_t *sem, int pshared, unsig

原创 MongoDB更新同步的oplog位置

在MongoDB中, 副本集節點之間爲了保持一致性, 需要通過oplog的同步與回放來進行。MongoDB採用的是節點向源節點主動拉取的方式, 從源節點拉取oplog, 目的節點需要及時通知其他節點它的最新的同步到的時間點。 如上圖

原创 golang http使用踩過的坑與應對

golang對http進行了很好的封裝, 使我們在開發基於http服務的時候, 十分的方便, 但是良好的封裝, 很容易是的我們忽略掉它們底層的實現細節。 如下是我踩過的一些坑, 以及相應的解決方法。 調用http服務 通常的實踐如下:

原创 LevelDB compact 過程

LevelDB的一個重要特性就是數據的分層,由於數據的分層, 越舊的數據處在越大的層級,越新的數據在越小的層級。 在查詢數據的時候, 最先讀取MemTable裏面的數據, 然後是L0的SSTable裏面, 接着是L1, L2直到最大的