[TOC]
參考 :[https://cnodejs.org/topic/599e1c1fbae6f2ed6f7e4cb5](https://cnodejs.org/topic/599e1c1fbae6f2ed6f7e4cb5)
### MongoDB分片集群 **(Sharding)**
*****
Sharding cluster是一種可以水平擴展的模式,在數據量很大時特給力,實際大規模應用一般會采用這種架構去構建
**MongoDB分片群集主要有如下三個組件:**
* Shard:分片服務器,用于存儲實際的數據塊,實際生產環境中一個shard server 角色可以由幾臺服務器組成一個Peplica Set 承擔,防止主機單點故障。
* Config Server:配置服務器,存儲了整個分片群集的配置信息,其中包括chunk信息。
* Routers:前端路由,客戶端由此接入,且讓整個群集看上去像單一數據庫,前端應用可以透明使用。
**為何需要水平分片** 1)減少單機請求數,將單機負載,提高總負載 2)減少單機的存儲空間,提高總存空間
` `
#### Linux下構建
虛擬機一
| **角色** | **IP** | **端口** | **副本集名稱** |
| --- | --- | --- | --- |
| mongos| 192.168.0.174|27017| |
| shard1| 192.168.0.174|27018| rep_shard1|
| shard2| 192.168.0.174|27019| rep_shard2|
| confserver| 192.168.0.174|2000| rep_confsvr|
```
docker run -it --net=mynet --ip=192.168.0.174 -p 17017:27017 -p 17018:27018 -p 17019:27019 -p 10000:20000 -v /root/Docker/Mongodb/sd174/:/data/ --privileged=true --name mongo_v1 mongo:latest /bin/bash
```
虛擬機二
| **角色** | **IP** | **端口** | **副本集名稱** |
| --- | --- | --- | --- |
| mongos| 192.168.0.175|27017| |
| shard1| 192.168.0.175|27018| rep_shard1|
| shard2| 192.168.0.175|27019| rep_shard2|
| confserver| 192.168.0.175|2000| rep_confsvr|
```
docker run -it --net=mynet --ip=192.168.0.175 -p 27017:27017 -p 27018:27018 -p 27019:27019 -p 20000:20000 -v /root/Docker/Mongodb/sd175/:/data --privileged=true --name mongo_v2 mongo:latest /bin/bash
```
虛擬機三
| **角色** | **IP** | **端口** | **副本集名稱** |
| --- | --- | --- | --- |
| shard1| 192.168.0.176|27018| rep_shard1|
| shard2| 192.168.0.176|27019| rep_shard2|
| confserver| 192.168.0.176|2000| rep_confsvr|
```
docker run -it --net=mynet --ip=192.168.0.176 -p 37017:27017 -p 37018:27018 -p 37019:27019 -p 30000:20000 -v /root/Docker/Mongodb/sd176/:/data/ --privileged=true --name mongo_v3 mongo:latest /bin/bash
```
` `
##### 搭建配置服務器
因為Mongodb3.4版本后需要配置服務器必須配置為副本集,所以需要給**配置服務器配置副本集**
分別在三臺機器上創建config01目錄
```
>mkdir config01
```
在三臺機器上分別執行命令:
```
mongod --dbpath config01 --replSet conServer --configsvr --port 20000 --bind_ip_all
```
然后通過mongo隨意進入一個副本集成員,并為配置服務器的副本集進行配置:
```
mongo --port 20000 --host localhost
> var conf = {
_id: 'conServer',
version: 1,
members: [
{
_id: 0,
host: '192.168.0.174:20000'
},
{
_id: 1,
host: '192.168.0.175:20000'
},
{
_id: 2,
host: '192.168.0.176:20000'
}
]
};
> rs.initiate(conf);
var conf = {
_id: 'conServer',
version: 1,
members: [
{
_id: 0,
host: '192.168.0.90:27100'
},
{
_id: 1,
host: '192.168.0.90:27101'
},
{
_id: 2,
host: '192.168.0.90:27102'
}
]
};
```
至此我們的配置服務器配置完成。
` `
##### 搭建分片服務器
官方建議我們的分片服務區至少在3個或以上才能發揮出更好的性能,我們這里也創建三個分片服務器。
下面創建三個空數據庫目錄,然后啟動它們,在啟動的時候需要加上[`--shardsvr`]以表示這是一個分片服務器(沒有強制是副本集)分別在三臺機器上創建分片副本集**shardServer0**, **shardServer1**, **shardServer2**:
```
$ mkdir sd01 sd02
$ mongod --dbpath sd01 --shardsvr --port 27018 --replSet rep_shard1 --bind_ip_all
$ mongod --dbpath sd02 --shardsvr --port 27019 --replSet rep_shard2 --bind_ip_all
```
啟動每臺虛擬機的 27018 實例即分片 1 并配置副本集:
```
>mongo --port 27018 --host localhost
>var conf = {
_id: 'rep_shard1',
version: 1,
members: [
{
_id: 0,
host: '192.168.0.174:27018 '
},
{
_id: 1,
host: '192.168.0.175:27018'
},
{
_id: 2,
host: '192.168.0.176:27018'
}
]
};
> rs.initiate(conf);
var conf = {
_id: 'rep_shard3',
version: 1,
members: [
{
_id: 0,
host: '192.168.0.90:27022'
}
]
};
```
啟動每臺虛擬機的 27019 實例即分片 2 并配置副本集:
```
>mongo --port 27019 --host localhost
>var conf = {
_id: 'rep_shard2',
version: 1,
members: [
{
_id: 0,
host: '192.168.0.174:27019 '
},
{
_id: 1,
host: '192.168.0.175:27019'
},
{
_id: 2,
host: '192.168.0.176:27019'
}
]
};
> rs.initiate(conf);
```
啟動虛擬機一和虛擬機二的 27017 實例即 mongos 路由,注意這里是通過 mongos 啟動非 mongod
` `
` `
##### 搭建路由服務器
mongodb提供了一個路由工具,它會隨著我們下載包一起下載,名字為`mongos`或`mongos.exe`,通過它配置路由功能。
啟動路由我們需要加上參數[`--configdb`](https://docs.mongodb.com/manual/reference/program/mongos/),它的語法為:
```
--configdb 配置服務器副本集名稱/配置服務器1地址端口,配置服務器1地址端口...
```
啟動路由,并為路由指定一個端口,用于開放給客戶端鏈接:
```
$ mongos --configdb conServer/192.168.0.174:20000,192.168.0.175:20000,192.168.0.176:20000 --port 27017 --bind_ip_all
```
登錄虛擬機一的 mongos 終端,和普通登錄 MongoDB 一樣,只需將端口改成 mongos 的端口 27017 即可,運行以下命令將 rep_shard1 和 rep_shard2 分片加入集群,到此一個分片環境已經搭建完成:
```
sh.addShard("rep_shard1/192.168.0.174:27018,192.168.0.175:27018,192.168.0.176:27018")
sh.addShard("rep_shard2/192.168.0.174:27019,192.168.0.175:27019,192.168.0.176:27019")
```
` `
##### 驗證分片集群是否搭建成功
通過運行`sh.status()`命令可以查看分片相關信息,如有以下輸出,說明分片集群搭建成功。
` `
##### 創建新用戶
這里的登錄密碼就是config集群配置的用戶名和密碼;上面介紹的兩種登錄方式在這里也適用;這里用mongo連接的時候 端口可以不指定 因為mongo默認的啟動端口就是27017 和我們這邊設置的相同;
這里使用root用戶登錄:
```
mongo;
use admin;
db.auth('root','root');
```
登錄到任意一臺route服務器,已root用戶登錄,并創建新用戶;
```
mongo;
use admin;
db.auth('root','root');
use database01;
db.createUser(
{
user: "readWrite",
pwd: "readWrite",
roles: [ { role: "readWrite", db: "database01" } ]
}
)
```
` `
#### 單機構建分片
*****
##### 搭建配置服務
首先建立三個空的數據庫目錄,用于搭建配置服務器的副本集,并分別啟動它們,在啟動的時候需要加上我們副本集的名稱和[`--configsvr`](https://docs.mongodb.com/manual/reference/program/mongod/)來表示這是一個配置服務器,并分別指定不同的端口:
```
mkdir config01 config02 config03
mongod --dbpath C:\Users\Administrator\Desktop\Pkg\mongodb\config01 --replSet conServer --configsvr --port 10000 --bind_ip_all
mongod --dbpath C:\Users\Administrator\Desktop\Pkg\mongodb\config02 --replSet conServer --configsvr --port 10001 --bind_ip_all
mongod --dbpath C:\Users\Administrator\Desktop\Pkg\mongodb\config03 --replSet conServer --configsvr --port 10002 --bind_ip_all
```
隨便進入哪一個副本:
```
mongo --port 10000 --host localhost
```
添加其他副本集:
```
var conf = {
_id: 'conServer',
version: 1,
members: [
{
_id: 0,
host: 'localhost:10000'
},
{
_id: 1,
host: 'localhost:10001'
},
{
_id: 2,
host: 'localhost:10002'
}
]
};
rs.initiate(conf);
```
` `
##### 搭建分片服務器
創建三個空目錄,在啟動的時候需要加上[`--shardsvr`](https://docs.mongodb.com/manual/reference/program/mongod/)以表示這是一個分片服務器:
```
mkdir sh0 sh1 sh2
mongod --dbpath C:\Users\Administrator\Desktop\Pkg\mongodb\shard01 --shardsvr --port 20000
mongod --dbpath C:\Users\Administrator\Desktop\Pkg\mongodb\shard02 --shardsvr --port 20001
mongod --dbpath C:\Users\Administrator\Desktop\Pkg\mongodb\shard03 --shardsvr --port 20003
```
` `
##### 搭建路由服務器
啟動路由,并為路由指定一個端口,用于開放給客戶端鏈接:
```
mongos --configdb conServer/localhost:10000,localhost:10001,localhost:10002 --port 3000
--bind_ip_all
```
添加分片服務
```
mongo --port 3000 --host localhost
> sh.addShard('ip:20000');
> sh.addShard('ip:20001');
> sh.addShard('ip:20002');
```
如果你可以通過`rs.status()`方法中返回的`shards`字段看是否添加成功。
刪除分片
```
db.adminCommand( { removeShard: "shard0000" } )
```
` `
##### 配置片鍵
到目前為止,分片服務器已經搭建完成,但是目前分片服務器無法正常工作,我們所有的操作都將在隨機的一個主分片上操作,這是因為分片服務器不知道怎么進行分片,所以我們還需要配置片鍵來告訴分片服務器按照什么來分片。
分片是基于數據庫集合中的文檔的一個鍵進行分片的,比如選擇username鍵,那么會根據這個鍵的順序就行分片,而mongodb會自動平衡分片的數據。
Mongodb要求作為片鍵的鍵必須是索引過的,所以我們在建立片鍵之前需要對鍵進行索引,建立后片鍵就是集合中的最重要的索引。
在生產環境中建議先想好數據建構建立索引和片鍵后開始操作數據,這樣會減輕分片服務器的負載。
首先我們在需要進行分片的數據庫上開啟分片功能,通過`sh.enableSharding`方法開啟。
```
mongo --port 3000 --host localhost
sh.enableSharding('test');
```
然后在開啟分片的數據庫中的test集合插入測試數據,注意此時我們還沒有進行配置片鍵,所以所有的數據操作都在分片服務器隨機分配的一個主分片上面進行的。
```
for(var i = 0; i < 100; i++){
db.test.insert({
username: 'user' + i,
idNum: i
})
}
```
這時候以username為片鍵,通過[`sh.shardCollection`](https://docs.mongodb.com/manual/reference/method/sh.shardCollection/)方法進行建立,它的語法為:
```
sh.shardCollection(namespace, key, unique, options)
```
首先給我們要建立的片鍵建立索引:
```
> db.test.ensureIndex({'username': 1});
```
然后建立片鍵:
```
> sh.shardCollection('test.test', {username:1});
```
等待幾分鐘后,可以通過`sh.status`方法查看數據分片的情況了,可以從中很清楚的看見哪些數據在哪個分片服務器上面,并且通過[`explain`](https://wuyizhou.com/2017/08/mongodb-index-one.html)方法來查看我們查詢的過程中哪些分片服務器參與了查詢。
### 分片
[分片](https://s0docs0mongodb0com.icopy.site/manual/reference/glossary/#term-sharding)是一種用于在多臺計算機之間分配數據的方法. MongoDB使用分片來支持具有非常大的數據集和高吞吐量操作的部署.
### MongoDB分片集群
MongoDB分片[群集](https://s0docs0mongodb0com.icopy.site/manual/reference/glossary/#term-sharded-cluster)由以下組件組成:
```
* 碎片:每個碎片包含碎片數據的子集. 每個分片都可以部署為[副本集]
* mongos:`mongos`充當查詢路由器,在客戶端應用程序和分片群集之間提供接口.
* config服務器:配置服務器存儲集群的元數據和配置設置. 從MongoDB 3.4開始,必須將配置服務器部署為副本集(CSRS).
```
### 分片key
MongoDB使用分片[鍵]在各個分片之間分發集合的文檔. 分片[鍵](https://s0docs0mongodb0com.icopy.site/manual/reference/glossary/#term-shard-key)由目標集合中每個文檔中存在的一個或多個字段組成.
1. 在分片集合時選擇分片鍵. 分片后不能更改分片鍵的選擇. 分片集合只能有*一個分片*密鑰. 請參閱分片[密鑰規范](https://s0docs0mongodb0com.icopy.site/manual/core/sharding-shard-key/#sharding-shard-key-creation).
2. 要分片非空集合,該集合必須具有以分片鍵開頭的[索引]. 對于空集合,如果集合尚不具有指定分片鍵的適當索引,則MongoDB會創建索引.
3. 分片密鑰的選擇會影響分片群集的性能,效率和可伸縮性. 選擇分片密鑰可以使具有最佳硬件和基礎結構的群集成為瓶頸.[分片]密鑰及其后備索引的選擇也會影響群集可以使用的[分片策略](https://s0docs0mongodb0com.icopy.site/manual/sharding/#sharding-strategy).

- Unity3D
- Unity3D學習路線
- U3D基礎
- UGUI
- 數據結構和算法
- 算法時間復雜度
- 二叉樹
- B樹 & B+樹
- 紅黑樹
- 跳躍表
- Lecod算法題目
- C++-排序算法
- sort排序
- 冒泡排序
- 選擇排序
- 插入排序
- 快速排序
- 希爾排序
- 堆排序
- 歸并排序
- 遞歸算法
- LSMs和B tree
- mysql引擎
- 匯編程序
- 匯編入門 Hello World
- 匯編語言整數加減法
- 寄存器的使用和說明
- 匯編語言常用知識點
- 匯編語言中的幾個偽指令
- 匯編語言數據類型以及數據定義
- 匯編語言計算數組和字符串長度
- 匯編語言中寄存器加[]的意思
- 匯編語言中$符號的用法
- 匯編語言系統調用(System Calls)
- 匯編語言push和pop指令
- 匯編語言尋址操作
- 匯編語言進階
- GNUx86-64匯編
- C/C++調用匯編函數
- 用匯編理解C函數的調用過程和返回值
- 從匯編的角度看C++
- C/C++
- C++-編程入門
- C/C++環境搭建
- JsonCPP的使用
- 連接數據庫
- 連接mysql
- connector
- C API
- 連接sqlite3
- 使用sqlite3步驟
- 使用Clion
- thread-多線程
- 初識thread
- detach陷阱
- 事實
- 陷阱總結
- 剪切板操作
- 剪切板基本操作
- 剪切板詳細api
- 文件操作
- 桌面右鍵菜單批處理
- Resource Hacker
- 獲取指定輸入法
- 學習網站
- C++11中的匿名函數(lambda函數,lambda表達式)
- sleep和usleep的區別
- 使用std::unique_ptr 管理 FILE 指針
- typedef的用法
- strtuct中的char*和char數組
- 各個平臺不同類型占用字節數
- C++進階
- C++淺拷貝和深拷貝的區別
- C++類型強制轉換
- C++11寫的定時器
- C調用java函數
- C++11 特性
- 二進制兼容
- GDB的基礎命令
- GDB調試死鎖
- 核心底層代碼
- 線程池的實現
- 線程池的應用場景
- C++協程庫
- C++定時器原理
- 通信協議
- Socket5協議
- https 協議
- TCP-擁塞控制
- C++-STL
- map/unordered_map/hash_map區別
- 初始化vector
- STL算法
- Effective STL
- 條款5:盡量使用區間成員函數代替它們的單元素兄弟
- 條款9:在刪除選項中仔細選擇
- 條款13:盡量使用vector和string來代替動態分配的數組
- 條款14:使用reserve來避免不必要的重新分配
- 條款16: 如何將vector和string的數據傳給遺留的API
- 條款17:使用“交換技巧”來修整過剩容量
- 條款18:避免使用vector<bool>
- 條款30:確保目標區間足夠大
- 編輯器
- VS Code
- 配置C++
- 命令行編譯
- CMake
- CMake 升級
- cmake-基本操作
- 設置入口
- 修改vs運行時庫
- CMake生成sln
- CMake設置輸出目錄
- CMake添加GDB調試
- 使靜態庫和動態庫同時存在
- C/C++網絡編程
- 網絡基礎
- 5種網絡IO模型總結
- 條件變量
- 設置阻塞socket超時時間
- ccnet
- 一個reactor單線程庫
- ccnet從單線程轉變為多線程
- IO多路復用
- IO多路復用的理解
- EPOLL
- select示例代碼
- epoll 示例代碼
- iocp示例代碼
- muduo庫
- muduo編譯
- Libevent的簡單使用
- 編譯libevent
- Libevent幾個簡單的api
- Libevent 定時器
- Libevent通用的編程技法
- Libevent簡單的Server/Client
- Boost庫學習
- Boost庫編譯
- 利用Boost 實現線程池
- boost::asio
- boost::mutex
- Boost解析Json
- Boost.Asio的一些想法
- win32t網絡編程
- 簡單的c/s socket通信
- 回響
- 迭代服務器跟客戶端
- 進行類創建
- socket文件傳輸
- 簡單的udp
- Reactor模型與Proactor模型
- Actor和CSP模型
- 大量的timewait
- EPOLL的bug
- C++-界面
- MFC
- mfc小知識
- MFC呂鑫
- 初識mfc
- 初始化
- 消息映射
- 組合鍵 與(&)運算
- WIN32+MFC自定義消息
- 對話框的相關消息
- DestroyWindow
- GDI
- 初窺
- 坐標
- 創建畫筆
- CDC
- CPaintDC
- CPen
- CBursh
- CFont
- CBitmap
- LoadImage
- CMemDC
- 自適應
- 雙緩沖問題
- 閃爍問題
- 小型軟件開發
- 記事本
- 圖形架構軟件
- 提綱圖形
- 操作
- 重載關閉按鈕
- 自定義消息
- 自繪按鈕
- 自繪基礎知識
- 自繪按鈕提綱
- 步驟
- 自會下拉列表
- 自繪下拉列表
- 自繪菜單欄
- MFC函數類
- SetTimer
- 高級控件應用
- 高級控件開發提綱
- 菜單欄
- 網絡通信協議
- 提綱
- sizeof====strlen
- 堆 == 棧
- Socket
- 基本代碼
- UDP協議
- Win32
- 窗口操作
- 創建窗口,自定義按鈕
- 給按鈕加背景圖
- 給窗口加背景
- 貼圖
- DLL組件創建
- HOOK鉤子
- MinGW
- duilib
- 地址
- 屬性列表
- 第一個duilib項目
- DUI自帶的完整
- ListControl
- TreeView
- 重設窗口大小
- 計算DPI
- HandleMessage跟MessageHandle
- CEF
- cef環境搭建
- cefsimple簡單流程
- 優化CEF
- P2P
- stun搭建
- QT5
- QT5環境安裝
- QT信號與槽的概念
- QT工程CMakeLists.txt文件的編寫
- QT32位
- libShadowQT
- GoflywayQT
- 計劃
- Protocol Buffer
- ProtoBuf安裝
- 包管理器
- vcpkg
- conan
- xmake
- C++面試總結
- 基礎
- 分布式鎖
- C++重載、覆蓋與多態性
- 20道必須掌握道C++面試題
- 傳值、傳地址、傳引用總結
- 50道面試題 (1)
- 50道面試題 (2)
- 內聯函數的作用以及使用限制
- vector的resize用法
- 虛函數/虛表/虛基類
- 公司面試
- 面試:簡單算法題目
- 面試:GetMemory
- 2021-3/11號面試記錄(lihe)
- leetcode
- leetcode331-驗證二叉樹的前序序列化
- leetcode141. 環形鏈表
- C/C++程序員面試秘籍
- 鏈表
- 使用C/C++實現atoi和itoa函數
- mysql面試題
- 協程解析
- 協程解析一(ucontext解析)
- 協程解析二(云風的coroutine)
- 進程、線程、協程
- 自己制作一個協程庫
- C語言中兩個指針間的運算
- Windows中一些宏的含義
- C++書籍在線觀看
- 安裝TeamTalk
- Lua和C/C++互相調用
- android環境配置
- TCP/IP
- 三次握手四次揮手
- 有限狀態機
- 游戲開發
- UE4
- 開發一個fps的游戲
- 環境安裝,讓人物跑起來
- 增加血條和護甲
- 再生盔甲和傷害功能
- 最后一戰
- 最后一戰安裝部署
- 登錄流程 LS & BS & CS
- 最后一戰-游戲場景服務器SS
- 降臨
- 降臨安裝部署
- skynet
- skynet安裝部署
- lua-protobuc庫--skynet使用自定義protobuf
- pbc庫--skynet使用自定義protobuf
- 掃雷
- 仙劍奇俠傳
- 爐石傳說
- unity環境搭建
- 尋路算法
- 音視頻
- WebRTC
- webrtc源碼下載
- webrtc 編譯
- gn和ninja文件作用
- webrtc 源碼目錄結構
- WebRTC實時互動入門
- web 服務
- nodejs 搭建http服務
- nodejs 搭建https服務
- webrtc 獲取音視頻設備
- webrtc 音視頻采集
- webrtc 音視頻約束
- webrtc 瀏覽器視頻特效
- webrtc 從視頻中獲取圖片
- webrtc 只采集音頻數據
- webrtc MediaStream和獲取視頻約束
- webrtc 媒體流的錄制
- webrtc 捕獲桌面
- webrtc 信令服務器
- webrtc 傳輸基本知識
- webrtc NAT
- webrtc ICE
- webrtc 媒體能力協商
- webrtc 端到端鏈接的基本流程
- webrtc SDP
- webrtc STUN/TURN
- webrtc 客戶端信令消息
- webrtc 視頻通話實現
- webrtc 傳輸速率控制
- webrtc 統計信息
- webrtc IOS
- Kamailio
- webrtc的分析
- Webrtc音視頻會議之Mesh/MCU/SFU三種架構
- RTSP / RTP / RTCP協議
- RTMP / RTSP / WebRTC之間的關系
- webrtc源碼
- PeerConnection解析
- FFmpeg
- FFmpeg命令行的使用
- ffmpeg命令語法
- FFmpeg設備采集
- FFmpeg生成水印
- FFmpeg畫中畫和視頻多宮格
- FFmpeg定時截圖
- FFmpeg基本概念
- FFmpeg基本模塊
- ffmpeg 濾鏡處理
- ffmpeg流的指定
- FFmpeg相關api
- 基本函數
- 打印音視頻信息
- 抽取音視頻數據
- 捕捉攝像頭并推流
- FFmpeg拉流截圖
- vs2017編譯錯誤
- 自定義跨平臺FFmpeg播放器
- ffmpeg拉流并且使用qt
- ffmpeg讀取攝像頭并且推流
- ASS和SRT字幕有何區別
- 解決ffmpeg 在avformat_find_stream_info執行時間太長
- sws_getContext()處理AV_PIX_FMT_NONE 幀格式引起的core dump
- OWT系列
- owt-server
- owt-server 編譯運行
- owt-server模塊
- owt-client-javascript解析
- owt-client-android
- owt-android編譯運行
- owt-client-android系列分析
- owt-conference
- Licode
- licode安裝
- licode 系列
- basic example client
- basic example server
- 音視頻基礎概念
- 視頻播放中的碼率的概念
- 幀率
- nginx-rtmp 模塊搭建與使用
- RTMP分析
- RTMP規范
- RTMP流媒體播放過程
- 一段簡單的CMakeLists.txt
- Go
- Go Base
- Go 環境安裝
- mod
- Go 流程控制
- interface convert to string/int/float64
- Go mod拉取私有倉庫
- VSCode配置go環境
- Go 設置代理
- Viper讀取配置文件
- vim打造成go的ide
- Go 交叉編譯
- GO 簡單功能
- Golang發起http請求
- Go 定時任務
- websocket協議
- Golang的定時器
- JWT認證
- Google Protobuf 請求參數為空的案例
- Go文件下載
- Go 服務熱更新方案
- Go 靜態服務器
- gocolly的使用
- golang中獲取字符串長度的幾種方法
- hugo搭建靜態博客
- go利用reids實現分布式鎖
- Go 代理
- Go 簡單http代理
- Go SS代理流程
- Go AES加密和解密的三種模式實現(CBC/ECB/CFB)
- Go 負載均衡
- Go 標準庫
- reflect.Type和reflect.Value
- container & list & ring & heap
- Context
- http 請求
- Go base64
- Go struct <=> json
- Go切片合并
- Go 包的使用
- pprof包的使用
- Go Grpc
- ymal 配置文件
- 日志包 logrus / zap
- Go 命令行多指令操作
- Cobra/viper 命令行解析
- Go sync/atomic
- zap日志
- Go 進階
- Go sync.Mutex詳解
- 使用自定義頭和protobuf解決沾包問題
- 使用 build tag 來自定義構建配置
- 使用valgrind檢測程序是否內存泄露
- Go參數傳遞是值傳遞還是引用傳遞
- Go 切片/數組
- Channel的使用
- Go Interface詳解
- GO-IM系統
- IM架構
- Go搭建一個http服務器
- mattermost-server
- matter編譯部署
- mattermost配置
- matter詳解
- Goim
- Centrifugo
- Tinode
- cgo入門
- GO語言中使用C語言
- reflect.StringHeader和reflect.SliceHeader
- Cgo使用libevent庫實現一個定時器
- cgo遍歷C結構體數組
- Go和C之間的類型轉換
- Elasticsearch
- Elasticsearch安裝
- etcd的使用
- etcd 安裝
- Docker
- Docker 安裝部署
- 修改Docker鏡像源
- 使用Dockerfile構建部署項目
- 使用Dockerfile多階段構建
- Dockerfile指令解析
- Volume
- 創建一個images
- Docker容器管理
- Shipyard
- Portainer
- lazydocker-docker 終端ui管理
- Docker 容器-ssh登錄
- Dockerfile CMD啟動命令
- Docker 容器獨立ip
- 清理 Docker文件
- Docker-Composer
- Docker遠程訪問
- Docker 遠程訪問API設置
- Docker 結合IDEA使用
- Docker 使用錯誤
- Docker鏡像瘦身
- Docker查看退出碼 exitCode
- Docker安裝寶塔
- Docker創建calibre-web
- Docker不能使用gdb調試的解決方案
- k8s
- K8s安裝部署
- 安裝部署coreDNS
- web管理之一 Dashboard
- dashboard的yaml文件
- 集群監控 heapster
- 資源監控 metrics
- web管理之二 Prometheus
- idea k8s插件
- 第一個 k8s應用
- k8s將pod在master上運行
- k8s網絡通信模型
- Deployment和Pod區別
- Statefulset的基本使用
- k8s的持久化存儲 PersistentVolume
- Ingress基本用法
- k8s錯誤處理
- 角色權限
- busybox k8s的調試工具
- nfs的安裝和使用
- Kafka
- kafka介紹
- Redis
- Redis的安裝
- Redis主從配置
- Redis數據類型
- Redis-Set
- Redis-Hash
- Redis設計與實現
- 第一節:sds
- 第二節:鏈表的實現
- 第三節:字典的實現(一) - 基本原理
- 第四節:字典的實現(二) - 哈希算法
- 第五節:字典的實現(三) - 哈希沖突解決方案
- 第六節:字典的實現(四) - rehash原理
- 第七節:跳躍表
- 第七節:整數集合
- 第八節:壓縮列表
- 第九節:對象
- 總結
- Redis源碼分析
- 配置VScode調試Redis源碼
- VScode調試Redis源碼,指針顯示的問題
- Redis模塊概述
- Redis的五個數據類型
- sds字符串分析
- adlist分析
- ziplist壓縮列表
- quicklist
- dict字典--hashtable
- zskiplist-跳躍表
- sparkline微線圖
- Redis源碼的一些基礎知識總結
- 在redis中遇見redisObject struct
- acl庫編寫Redis客戶端
- hireids操作
- 當內存耗盡時,redis怎么做
- 如何保證redis的高并發及高可用?
- 使用redis實現分布式鎖
- Redis管道技術測試
- MongoDB
- MongoDB安裝
- MongoDB免安裝版
- Mongodb C Driver驅動安裝
- MongoDB知識點
- MongoDB基礎
- MongodB原子操作
- MongoDB索引
- MongoDB主從/副本集
- MongoDB分片集群
- MongoDB性能檢測
- MongoDB構建模式
- Mongo-cxx-driver
- mongo-c-driver
- MongoDB用戶操作
- MySQL
- MySQL安裝
- 一個機器多個MySQL
- 創建遠程鏈接
- 字段編輯
- 存儲過程
- MySQL嚴格模式
- Mysql 丟失Root密碼
- 中國全省市表
- 高性能MySQL
- MySQL并發控制
- MySQL基準測試
- MySQL服務器性能剖析
- MySQLSchema與數據類型優化
- MySQL創建高性能索引
- MySQL復制
- MySQL-高可用
- MySQL引擎
- DB
- Oracle
- ORACLE9i安裝
- Oracle存儲過程
- Oracle 存儲過程基礎組件
- Oracle存儲過程示例
- Other Language
- Python
- python編程通用概念
- python安裝
- pycharm-docker調試
- Python安裝AES加密
- python安裝pip
- 錯誤
- py框架
- Django
- 開始一個項目
- 路由
- 模型層
- 創建博客文章模型
- Django Shell
- 初識Django Admin模塊
- 實現博客數據返回頁面
- 初始Django視圖與模板
- boot靜態頁面
- django分頁
- Django設置
- djangocms
- 語言特性
- 切片
- PHP
- php外部擴展
- 添加C擴展
- 添加外部C擴展
- 添加redis
- redis
- 下載
- 封裝
- 外部訪問配置
- redis基本操作
- 框架
- TP5
- Model
- 自動寫入時間戳
- Laravel
- 安裝
- TP3.2
- CACHE緩存
- create
- curl
- 文件下載
- 模塊名字
- 常用工具
- 功能代碼
- 檢測磁盤剩余空間
- 靜態類
- 消除html標簽
- 檢測手機號
- 毫秒 == 日期格式
- jQuery
- 找子元素
- php網絡編程
- socket
- socket_server.php
- socket_client.php
- websocket
- websocket_server.php
- websocket_client.html
- websocket_unit.js
- swoole
- 環境依賴及安裝
- 搭環境
- windows搭建apache+php7
- nginx做成服務順便配置php
- Lua
- Lua環境安裝
- lua api
- lua_pop & lua_settop
- lua_next
- JAVA
- Java通用編程概念
- Java環境安裝
- 編譯遇到的問題
- 請求接口
- java變量類型
- Android
- IDEA 配置 gradle
- Rust
- Rust編程通用概念
- Rust安裝
- 更換crates源
- 寫一個hello world
- 變量可變性
- 數據類型
- Struct+方法語法
- 賦值
- tokio網絡框架
- tokio安裝
- EchoServer
- 實現Future
- 組合器
- shadowsocket-rust
- shadowsocket-rust安裝
- Scheme
- 環境搭建及基本語法
- JavaScript
- NodeJs
- React
- React-Native
- 使用pkg打包
- Nginx
- Nginx-反向代理
- OpenResty初探
- OpenResty做一個postman
- lua沒有continue
- nginx 配置靜態服務器
- 將luarocks整合進openresty,并安裝lfs
- Git
- GitHub基本操作
- Github跟本地的配置和操作
- GitHub搜索
- Github鏡像
- git修改遠程倉庫
- Git基本操作
- 安裝gitlab
- VC工程的.gitignore
- Git 設置代理
- Git克隆部分文件
- Linux
- 用戶操作
- 防火墻操作
- 壓縮
- Linux時間同步
- CURL
- Linux samba文件共享
- 使用cat創建新文件并追加內容
- htop / glances / dstat
- IPC錯誤
- nc的使用
- 核與線程 CPU 4核8線程 的解釋
- Linux 使用 MLDonkey 下載 ed2k
- Linux技巧
- LINUX技巧-查找文件行中值重復的行
- tcpdump 抓包
- 日志查找
- nethogs 查看網絡流量
- 系統中加入庫目錄
- 將root權限的文件改為用戶權限
- linux 打開文件數 too many open files 解決方法
- 查看系統CPU/GPU/磁盤io
- 快速刪除大量文件的方法
- Linux-文件傳輸
- 安裝 nvidia 驅動
- 改造VIM
- 通過vimplus項目一鍵配置vim
- 自定義vim配置C++IDE
- 終端配色
- VIM+項目管理
- vimplus快捷鍵
- 自動切換輸入法
- Shell編程
- shell腳本守護進程
- if [ $# -eq 0 ]該語句是什么含義?
- 從命令行提示輸入,和自動輸入,自動交互
- grep指令
- cut指令
- awk指令
- xargs
- 使用except自動交互
- Ubuntu
- 界面安裝
- 更換源
- Ubuntu安裝docker
- Ubuntu18 安裝qt
- 更新密鑰
- Ubuntu開啟遠程登錄
- Ubuntu16.04界面無法啟動
- apt-get install 沒有自動安裝
- dpkg: 處理軟件包 nginx (--configure)時出錯
- ubuntu下瀏覽器使用代理
- Ubuntu把放大縮小按鈕移動到左邊
- wine 安裝錯誤
- Ubuntu下安裝Microsoft to do
- 在Ubuntu上使用ssh連接另外一臺機器出問題
- 解決windows和ubuntu16.04虛擬機拖放問題
- 解決apt-get /var/lib/dpkg/lock-frontend 問題
- Ubuntu安裝cinnamon
- sudo apt-get update錯誤
- googlechrome
- Ubuntu16.04安裝xmind
- Ubuntu下載迅雷
- Linux護眼寶
- 查看Ubuntu安裝的界面
- 使用aria2
- CentOS7使用yum安裝gcc
- System
- MAC
- 安裝軟件
- mac基本操作
- 安裝pod
- 改造終端
- VIM配置
- Chroom瀏覽器https訪問
- mac攝像頭打不開
- Mac與Windows或Linux的鍵鼠共享神器Synergy
- Windows
- 小工具
- bat文件的使用
- bat把exe文件做成單擊右鍵可運行的
- copy
- 注冊 dll
- 鏡像==分區
- choco
- BaiduPCS-go
- tail日志查看命令
- 右鍵菜單沒有選項
- Proxy SwitchyOmega
- Google云服務器配置
- 百度網盤不限速
- 遠程桌面
- 百度地圖離線開發
- 查看端口
- SC命令使用
- 開發
- TIME_WAIT過多導致服務不能被訪問
- 修改win的默認編碼
- 百度網盤二維碼刷新不出來
- 移動端
- Object-C
- 錄音跟播放
- 視頻的采集跟播放
- Swift
- Swift編程通用概念
- Switf環境安裝
- Swift Package Manager(SPM)
- 手動導入庫
- PerfectTemplate的使用
- PerfectTemplate環境搭建
- ios直播開發
- Simple-RTMP-Server
- Mac上安裝ffmpeg環境
- 推流拉流
- 仿直播app開發
- 框架搭建
- 開發流程
- React-Native
- React-native環境安裝
- 分布式追蹤系統
- Jaeger 客戶端庫
- LightStep 的使用
- 軟件
- PhpStorm
- 安裝ThinkStrom
- 添加xdebug
- Clion
- C++開發配置
- 激活碼
- 在linux上制作桌面圖標
- Vagrant
- VMWare
- VirtualBox
- proxifier + Shadowshocks
- Cmder
- Navicate For MongoDB
- MinDoc
- GitHub速度慢
- 科學
- VMware虛擬機磁盤操作占用過高問題
- PhotoShop+Premiere下載
- ActionView安裝部署
- 讀書筆記
- 博客
- hexo
- 部署
- jekyll
- 在線編譯器
- 書屋
- 如何閱讀一本書
- 個人發展
- Linux高性能服務器讀書筆記
- TCP/IP協議族
- IP協議
- TCP協議詳解
- TCP協議的擁塞控制
- 安全測試
- 常見web安全漏洞
- 程序設計
- log日志設計
- 爬蟲項目
- Python3.7的安裝
- Scrapy的安裝和使用
- Colly框架
- Crawlab是一款款里爬蟲的web框架
- 英文學習