您的位置:

Mongoshake: 从延迟到优势

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