一、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