一、Mongoshake延遲
Mongoshake是一個用於MongoDB數據複製的工具,由於MongoDB的讀寫分離問題,Mongoshake複製時會有一定程度的延遲。延遲的主要原因是Mongoshake使用了MongoDB的oplog進行複製,而oplog是基於MongoDB的寫操作而產生的。所以當Mongoshake沒有及時接收到寫操作時,就會導致延遲。
為了避免延遲的問題,我們可以採用以下方法:
1. 增加主庫的連接數量
mongoshake:
mongodb_uri: "mongodb://localhost:27017"
source_config:
batch_size: 1000
batch_timeout: 1s
read_concurrency: 4
conn_pool_size: 20
2. 調整Mongoshake的batch_size
mongoshake:
mongodb_uri: "mongodb://localhost:27017"
source_config:
batch_size: 5000
batch_timeout: 1s
read_concurrency: 4
conn_pool_size: 10
3. 調整Mongoshake的batch_timeout
mongoshake:
mongodb_uri: "mongodb://localhost:27017"
source_config:
batch_size: 1000
batch_timeout: 5s
read_concurrency: 4
conn_pool_size: 10
二、Mongoshake大量寫入延遲
當MongoDB有大量寫入操作時,Mongoshake容易出現延遲。Mongoshake本身採用了多線程的方式進行數據複製,但是由於數據寫入的速度過快,出現了大量寫入操作堆積的情況,進而導致Mongoshake複製處理緩慢。
對於大量寫入的情況,我們可以採用以下方法:
1. 調整Mongoshake的read_concurrency參數
mongoshake:
mongodb_uri: "mongodb://localhost:27017"
source_config:
batch_size: 1000
batch_timeout: 1s
read_concurrency: 8
conn_pool_size: 10
2. 增加Mongoshake的線程數
mongoshake:
mongodb_uri: "mongodb://localhost:27017"
source_config:
batch_size: 1000
batch_timeout: 1s
read_concurrency: 4
conn_pool_size: 10
num_producer_threads: 16
三、Mongoshake阿里雲
如果您的MongoDB部署在阿里雲上,可以直接使用阿里雲RDS版MongoDB提供的數據遷移服務來完成數據遷移任務。這樣可以避免上面提到的Mongoshake的延遲和大量寫入延遲的問題。
四、Mongoshake使用教程
以下是Mongoshake的使用教程:
1. 準備工作
安裝Mongoshake:
wget https://github.com/mongodb/mongo-go-driver/releases/download/v1.4.4/mongo-go-driver-1.4.4.linux-amd64.tar.gz
tar -zxvf mongo-go-driver-1.4.4.linux-amd64.tar.gz
cp mongo-go-driver-1.4.4.linux-amd64/bin/mongoshake /usr/local/bin/
安裝MongoDB:
sudo apt install mongodb
2. 配置Mongoshake
mongoshake:
mongodb_uri: "mongodb://localhost:27017"
source_config:
batch_size: 1000
batch_timeout: 1s
read_concurrency: 4
conn_pool_size: 10
3. 啟動Mongoshake
mongoshake -f /path/to/config.yaml
五、Mongoshake分片索引
Mongoshake支持分片索引的複製,只需要在複製源的配置文件中添加索引名稱即可:
mongoshake:
mongodb_uri: "mongodb://localhost:27017"
source_config:
batch_size: 1000
batch_timeout: 1s
read_concurrency: 4
conn_pool_size: 10
sharding_indexes:
- index_name
六、Mongoshake 數據丟失
Mongoshake作為MongoDB的數據複製工具,理論上是不會出現數據丟失的情況。但是當出現宕機、網絡不通等原因,Mongoshake會出現數據複製不完整的情況。針對這種情況,可以採用以下方法:
1. 強制重新複製
mongoshake -f /path/to/config.yaml -reset
2. 增加超時時間
mongoshake:
mongodb_uri: "mongodb://localhost:27017"
source_config:
batch_size: 1000
batch_timeout: 5s
read_concurrency: 4
conn_pool_size: 10
max_error_time: 30m
七、Mongoshake 索引順序
Mongoshake複製時會暫停索引的創建,等待所有數據被複制完成後再進行索引的創建。這種方式可以減少MongoDB的索引開銷。如果需要修改索引順序,可以在Mongoshake配置文件中設置:
mongoshake:
mongodb_uri: "mongodb://localhost:27017"
source_config:
batch_size: 1000
batch_timeout: 1s
read_concurrency: 4
conn_pool_size: 10
create_indexes: true # true表示會創建所有索引,false表示不創建索引,為默認值
index_sort_order: 1 # 索引創建順序,1表示按默認順序,2表示倒序
八、Mongoshake相較於複製集的優點
1. 支持多種同步方式
Mongoshake支持多種同步方式,如增量同步和全量同步。而MongoDB的複製集只能進行增量同步。
2. 易於擴展
當MongoDB需要進行橫向擴展時,Mongoshake提供了分片索引的功能,而MongoDB的複製集則需要重新構建一個複製集。
3. 更好的容錯能力
當MongoDB出現網絡故障、宕機等情況時,Mongoshake能夠保證數據不會丟失,而MongoDB的複製集則需要手動切換主從節點,容錯性不如Mongoshake。
九、Mongoshake kafka
將Mongoshake與Apache Kafka結合可以實現MongoDB數據變更的實時同步。下面是一個示例:
mongoshake:
mongodb_uri: "mongodb://localhost:27017"
source_config:
batch_size: 1000
batch_timeout: 1s
read_concurrency: 4
conn_pool_size: 10
sink:
kafka:
brokers: "localhost:9092"
topic_prefix: "mongoshake."
十、Mongoshake MySQL
Mongoshake也支持MySQL的數據遷移,目前支持的版本是MySQL 5.7。
安裝方法:
安裝go-mysql-elasticsearch:
go get github.com/siddontang/go-mysql-elasticsearch
創建配置文件:
addr: ":3306"
user: root
password:
tables:
-
name: test.user
elastic_host: "http://localhost:9200"
elastic_user: "user"
elastic_password: "password"
elastic_index: "test_user"
運行Mongoshake:
go-mysql-elasticsearch -config=mysql.yaml
原創文章,作者:PHDV,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/145117.html