• mongo迁移工具之mongoshake X


    最近需要进行MongoDB中数据迁移,之前使用过阿里系的redisShake感觉不错, 这次打算使用mongoShake来进行同步

    github: https://github.com/alibaba/MongoShake

    前提条件:

         远端mongo示例需要开通oplog

         将mongo-shake安装到目的端

    1. mongo开启oplog

    a) 修改配置文件 /data/mongo/mongod.conf

    新增配置项
    
    
    replSet=single   # 这个名称可以随意, 最后可以做到辨识的目的

    b)重启mongo

    systemctl restart mongod

    首次登录会出现报错:

    show dbs;
    
    E QUERY [thread1] Error: listDatabases failed:{undefined
    "ok" : 0,
    "errmsg" : "not master and slaveOk=false",
    "code" : 13435,
    "codeName" : "NotMasterNoSlaveOk"
    }

    解决:

    需要执行初始化命令

    rs.initiate({ _id: "副本集名称", members: [{_id:0,host:"服务器的IP:Mongo的端口号"}]})
    
    例如(对应上述配置):
    rs.initiate({ _id: "single", members: [{_id:0,host:"192.168.144.249:27017"}]})
    
    
    执行完成后提示,代表执行成功:
    { "ok" : 1 }

    初始完副本集中唯一的节点,可能短时间显示为SECONDARY或OTHER。一般而言,稍等一会,就会自然恢复为primary,无需人工干预。

    rs:OTHER>
    rs:PRIMARY>
    rs:PRIMARY>

    #验证是否生成了oplog.rs表:

    2.安装mongoshake

    a)下载并解压

    wget -c https://github.com/alibaba/MongoShake/archive/refs/tags/release-v2.6.5-20210723-1.tar.gz
    直接下载二进制包, 免除编译部分
    wget https://github.com/alibaba/MongoShake/releases/download/release-v2.6.6-20220323/mongo-shake-v2.6.6.tar.gz
    mongo-shake-v2.6.6.tar.gz tar
    -zxvf mongo-share-v2.6.4-20210723-1.tar.gz cd mongoshake

    b)修改配置文件

    #源端mongo地址
    
    mongo_urls = mongodb://root:密码@192.168.144.251:27017
    
    注意,mongo的密码不能包含@等特殊字符。
    
    #目标端mongo地址
    
    tunnel.address = mongodb://root:密码@192.168.144.252:27017
    
    sync_mode = all
    
    filter.ddl_enable = true

    更多参数说明:https://github.com/alibaba/MongoShake/wiki/%E9%85%8D%E7%BD%AE%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E

    3. 启动mongoshake

    ./collector.linux -conf /opt/tools/mongo-shake-v2.6.5/collector.conf -verbose 2

    查看进程

    ps -ef |grep collector | grep -v 'grep'

    如果成功的时候, 源端会自动创建一个mongoshake库

    会发现源端自动创建了一个mongoshake库:
    
    single:PRIMARY> use mongoshake;
    
    switched to db mongoshake
    
    #有一个检查点的表
    
    single:PRIMARY> show tables;
    
    ckpt_default

    如果想同步部分的表,可以设置白名单

    filter.namespace.white=aa.t1,bb,t1,cc
    表示同步aa库汇总t1表数据,bb库t1表数据,cc库所有数据

    重点配置参数:

    mongo_urls = mongodb://username:passwd@xx.xx.xx.xxx:27017
    
    tunnel.address = mongodb://username:passwd@127.0.0.1:2701
    
    filter.namespace.white = log_4.1000003920220228

    filter.pass.special.db = admin 有些内置库正常不会迁移, 除非指定

    filter.ddl_enable = true 是否开启DDL同步

    如果想要配置同步的参数也可以修改:

    full_sync.reader.collection_parallel = 6
    # the number of document writer thread in each collection.
    # 同一个表内并发写的线程数,例如,8表示对于同一个表,将会有8个写线程进行并发写入。
    full_sync.reader.write_document_parallel = 8
    # number of documents in a batch insert in a document concurrence
    # 目的端写入的batch大小,例如,128表示一个线程将会一次聚合128个文档然后再写入。
    full_sync.reader.document_batch_size = 128
    # max number of fetching thread per table. default is 1
    # 单个表最大拉取的线程数,默认是单线程拉取。需要具备splitVector权限。
    # 注意:对单个表来说,仅支持索引对应的value是同种类型,如果有不同类型请勿启用该配置项!
    full_sync.reader.parallel_thread = 1
    # the parallel query index if set full_sync.reader.parallel_thread. index should only has
    # 1 field.
    # 如果设置了full_sync.reader.parallel_thread,还需要设置该参数,并行拉取所扫描的index,value
    # 必须是同种类型。对于副本集,建议设置_id;对于集群版,建议设置shard_key。key只能有1个field。
    full_sync.reader.parallel_index = _id
    
    # drop the same name of collection in dest mongodb in full synchronization
    # 同步时如果目的库存在,是否先删除目的库再进行同步,true表示先删除再同步,false表示不删除。
    full_sync.collection_exist_drop = true

    还有更多参数可以参考文档

    常见错误:

    1.同步的时候发生了终端, 查看mongo日志, 发现会出现   报错 Too  many  open files问题

    这是因为连接数不够用导致, 需要调大该值,

    1、cat /etc/redhat-release
    CentOS release 6.8 (Final)
    
    2、修改当前交互终端的limit值
    ulimit -n 655350.此时系统的文件句柄数为655350.
    
    3、永久修改limit值
    vim /etc/security/limits.conf
    mongod soft nofile 655360
    mongod hard nofile 655360
    
    4、centos6还有的limit限制,/etc/security/limits.conf限制实际取决于/etc/security/limits.d/90-nproc.conf的配置,也就是说哪怕/etc/security/limits.conf设置最大打开数是65535,而/etc/security/limits.d/20-nproc.conf里配的是4096,那最终结果还是用户最大只能打开4096个文件句柄,所以还要再修改20-nproc.conf
    (如果是centos7,则是/etc/security/limits.d/90-nproc.conf)
    vim /etc/security/limits.d/90-nproc.conf
    *    soft   nproc     655360
    root  soft  nproc  unlimited
    
    5、OS其他地方可能影响文件最大打开句柄都做设置
    vim /proc/sys/fs/file-max
    655360
    
    vim /etc/rc.d/rc.local
    fs.file-max=655360
    
    vim /etc/sysctl.conf
    fs.file-max=655360

    我这边的进程管理工具是systemctl, 也同时增加限制条件

    [Unit]
    Description=High-performance, schema-free document-oriented database
    After=network.target
    
    [Service]
    Type=forking
    ExecStart=/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/conf/mongodb.conf
    LimitFSIZE=infinity
    LimitCPU=infinity
    LimitAS=infinity
    
    LimitNOFILE=640000
    LimitNPROC=640000
    
    [Install]
    WantedBy=multi-user.target

    同时增大最大连接数:

    # 数据存储目录
    dbpath=/data/mongodb/data
    # 日志存储目录
    logpath=/data/mongodb/logs/mongodb.log
    # 进程文件
    pidfilepath=/data/mongodb/mongodb.pid
    # 日志追加方式存储
    logappend=true
    # 开启日志文件,默认开启
    journal=false
    
    #quiet=true
    
    port=27017
    # 是否以守护进程方式运行
    fork=true
    #fork=false
    # 不给你定IP
    bind_ip=0.0.0.0
    # 开启认证(安全模式)
    #auth=false
    auth=true
    
    storageEngine=wiredTiger
    wiredTigerCacheSizeGB=20  # 这里设置mongo最大使用的内存, 防止出现占用内存过多
    
    maxConns=20000
    # 副本集的名称
    #replSet=mongo45
    # 复制操作日志大小(MB)
    #oplogSize=10240

     如果发现buffer/cache较高, 也可以清理

    手动清理:
    > sync
    > echo 1 > /proc/sys/vm/drop_caches
    > echo 2 > /proc/sys/vm/drop_caches
    > echo 3 > /proc/sys/vm/drop_caches
    
    sync:将所有未写的系统缓冲区写到磁盘中,包含已修改的i-node、已延迟的块I/O和读写映射文件
    echo 1 > /proc/sys/vm/drop_caches:清除page cache
    echo 2 > /proc/sys/vm/drop_caches:清除回收slab分配器中的对象(包括目录项缓存和inode缓存)。slab分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的pagecache。
    echo 3 > /proc/sys/vm/drop_caches:清除pagecache和slab分配器中的缓存对象。
    /proc/sys/vm/drop_caches的值,默认为0

    定时清理:

    > vim clean.sh
    #!/bin/bash#每两小时清除一次缓存
    echo "开始清除缓存"
    sync;sync;sync #写入硬盘,防止数据丢失
    sleep 20#延迟20秒
    echo 1 > /proc/sys/vm/drop_caches
    echo 2 > /proc/sys/vm/drop_caches
    echo 3 > /proc/sys/vm/drop_caches
    
    > chmod +x clean.sh
    > crontab -e
    # 每两小时执行一次
    0 */2 * * * /opt/clean.sh
  • 相关阅读:
    Shell流程控制语句if
    Linux命令之read
    Docker容器(六)——创建docker私有化仓库
    Docker容器(五)——Docker静态化IP
    Docker容器(四)——常用命令
    python笔记
    iOS应用性能调优建议
    QQ音乐项目(OC版)
    iOS : 静态库制作
    iOS : 静态库(.framework)合并
  • 原文地址:https://www.cnblogs.com/xingxia/p/mongoshake.html
Copyright © 2020-2023  润新知