V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
ericgui
V2EX  ›  程序员

MySQL 难题求思路:怎样用 PHP 每日内网同步一个 4.3G 的表?

  •  
  •   ericgui · Aug 17, 2017 · 7287 views
    This topic created in 3175 days ago, the information mentioned may be changed or developed.
    2 台机器,一台 Windows Server 2012,运行一个 mysql 5.0,对,你没看错,mysql 5.0

    另一台 Ubuntu,mysql 5.7

    框架 Yii2

    内网(阿里云同一安全组,默认内网)

    Windows 这个机器,有一张表,4.3G ,存的都是 PDF DOC 之类的文件,每日都有新增、更新操作,记录有最后一次操作的时间戳
    那么,需要每天把这张表,同步到 Ubuntu 机器上来,这台小鸡只有 1G 内存

    请问,应该怎么做?

    我们考虑到用 php_fork,但据说它的底层的 pcntl_fork 不适用于生产环境。
    如果单线程执行同步脚本,那要执行到什么时候啊。


    是不是还要用到 yield 关键字,用一下协程?否则我们这 1G 小鸡是不是就很容易挂了?

    第一次玩这么刺激的,求指教。谢谢
    Supplement 1  ·  Aug 18, 2017
    非常感谢大家的帮助和建议,

    我们后来研究了一下,这个可以把技术 问题,转化为业务问题。

    我们现在不同步了,而是让公司员工,把文件重新上传一下。
    每个人只负责自己那一小块业务,所以对员工工作量的压力不大。

    而且这样更灵活,老系统里有些文件是不想给客户看的。

    所以。。。。。
    Supplement 2  ·  Aug 18, 2017
    放几个链接:

    https://stackoverflow.com/questions/348363/what-is-the-best-place-for-storing-uploaded-images-sql-database-or-disk-file-sy

    http://highscalability.com/flickr-architecture

    这俩介绍了,要放在 file system 下,不要放在 db 里

    而且介绍了 flickr 的经验,flickr 在 2007 年已经都达到了 20 亿张图片
    62 replies    2017-09-21 09:45:16 +08:00
    yejinmo
        1
    yejinmo  
       Aug 17, 2017
    必须要用 PHP 么。。
    ericgui
        2
    ericgui  
    OP
       Aug 17, 2017
    @yejinmo 我们用 PHP 写的网站。

    如果不用 PHP,有其他方法么
    求赐教
    AlwaysBee
        3
    AlwaysBee  
       Aug 17, 2017
    php 的协程?
    AlwaysBee
        4
    AlwaysBee  
       Aug 17, 2017
    协程应该是可以解决的,可以处理无限大的数据
    yangqi
        5
    yangqi  
       Aug 17, 2017   ❤️ 1
    没看懂,你要是要同步 mysql 的表,然后用 php? 闲的蛋疼吗,mysql 5.0 那是 myisam 表?

    考虑 replication
    或者如果是 myisam, 直接锁表然后 rsync 表文件
    hiboshi
        6
    hiboshi  
       Aug 17, 2017
    rsync、sftp 与 php 关系不大,主要是文件同步

    他们都支持 win、linux 的
    hiboshi
        7
    hiboshi  
       Aug 17, 2017
    @hiboshi 每天定时导出,传输,写入
    GreatHumorist
        9
    GreatHumorist  
       Aug 17, 2017 via iPhone
    mysql 自身的主从同步?
    carlclone
        10
    carlclone  
       Aug 17, 2017 via Android   ❤️ 1
    居然把文件存表里,厉害
    ericgui
        11
    ericgui  
    OP
       Aug 17, 2017
    @GreatHumorist 不是主从同步,就是 2 台机器,一台同步到另一台,win 同步到 ubuntu,ubuntu 这台里的 yii2 框架,直接连到 win 机器上的 mysql 5.0
    ericgui
        12
    ericgui  
    OP
       Aug 17, 2017
    @yangqi win 机器上的 mysql 5.0 用的引擎是 innodb
    ericgui
        13
    ericgui  
    OP
       Aug 17, 2017
    @viakiba PHP 啊亲,java 不懂
    ericgui
        14
    ericgui  
    OP
       Aug 17, 2017
    @carlclone 还用 mysql 5.0 呢。。。。我们是在老系统上做了要给外挂程序,别提 多恶心了
    ericgui
        15
    ericgui  
    OP
       Aug 17, 2017
    @yangqi 那不用 php 用什么?其他语言真不会
    yangqi
        16
    yangqi  
       Aug 17, 2017
    @ericgui 最简单的就是 mysqldump + rsync, 然后导入

    要优雅一点的就设置主从同步,replication
    zeraba
        17
    zeraba  
       Aug 17, 2017 via Android
    直接 mysqldump 出来 再 mysql 导入不行么 4G 的表也不大啊 内网文件传输就不用说了吧 怎么喜欢怎么传 ftp sftp http 随便玩 1G 内存不是 1G 硬盘 能导入的
    allenhu
        18
    allenhu  
       Aug 17, 2017 via Android
    PDF 也寸数据库,这是什么样的思路
    lujiajing1126
        19
    lujiajing1126  
       Aug 17, 2017 via iPhone
    读 binlog 实时同步
    ericgui
        20
    ericgui  
    OP
       Aug 17, 2017 via iPhone
    @allenhu 亲,别喷我,真不是我干的,我也是在老系统基础上打补丁
    ericgui
        21
    ericgui  
    OP
       Aug 17, 2017 via iPhone
    @lujiajing1126 正在研究你说的,学习了,谢谢
    shiny
        22
    shiny  
    PRO
       Aug 17, 2017
    你们是直接把文件存数据库里了?
    GreatHumorist
        23
    GreatHumorist  
       Aug 17, 2017 via iPhone
    4g 不算大,我之前爬虫爬的数据 10 个 g,dump 出来内网传过去再导入不超过半小时
    GreatHumorist
        24
    GreatHumorist  
       Aug 17, 2017 via iPhone
    而且用主从同步不是更好的选择吗
    ericgui
        25
    ericgui  
    OP
       Aug 17, 2017 via iPhone
    @GreatHumorist 我要每日更新一次,这样合适吗?
    ericgui
        26
    ericgui  
    OP
       Aug 17, 2017 via iPhone
    @shiny 20 楼
    ZXCDFGTYU
        27
    ZXCDFGTYU  
       Aug 17, 2017 via iPad
    主从啊我去。。你用 php 做这个的意义何在?
    gouchaoer
        29
    gouchaoer  
       Aug 18, 2017 via Android
    主从没那么好配置,你直接写过 php 脚本放 cron 里面每天备份就完了,多简单的事。。。而且表才几个 g,你就算几个 t 也没问题。。。另外把 pdf 之类的存成 mysql 的 binary 并没有什么问题,简单好管理比存文件好,反正数量也不多
    bear2017
        30
    bear2017  
       Aug 18, 2017 via Android
    直接把文件直接存数据库!?
    同步的还是主从吧。关键你还 2 个系统,MySQL 版本还差那么大,设置主从的话,有点困难。。。
    msg7086
        31
    msg7086  
       Aug 18, 2017
    说句实话,区区 4.3G 的数据,每日才同步一次,这个随便找个脚本回来改改都行的,搞这么麻烦?
    你问单线程执行到什么时候?
    按照(我猜的)内网 1Gbps 的速度来说,就算每天你把这 4.3G 的数据全更新一遍,也只要 1 分钟就能同步完。
    别说每日一次了,每日一百次都轻轻松松跑的。

    另外文件存数据库没问题。存在磁盘上,文件系统也是数据库。我网站种子库里存了十几万种子,效率不比存文件差。
    SlipStupig
        32
    SlipStupig  
       Aug 18, 2017
    两种方案:
    1.用 binlog 设置主从同步,一天才 4g 一点也不多
    2.记录最后一天数据的 id,然后从那个地方然后定时 dump 出 sql 文件,让导入到另外一个数据库里面,如果不是实时的话,完全没问题
    cxbeat
        33
    cxbeat  
       Aug 18, 2017 via Android
    提出一个新思路:如果 io 不大的话,创建一个新表,每次读写都把操作写入新表,就只需要同步新表就行了
    miaoever
        34
    miaoever  
       Aug 18, 2017
    每天 4GB 数据量不算大。你需要: https://github.com/alibaba/DataX
    aru
        35
    aru  
       Aug 18, 2017 via iPhone
    @cxbeat 这个做法才叫坑人无极限
    wekw
        36
    wekw  
       Aug 18, 2017 via Android
    mysqldump 多大都能搞
    vtwoextb
        37
    vtwoextb  
       Aug 18, 2017
    首先说你数据库就不能存 doc pdf 这样的文件,其次要真想同步 简单的 shell 一行就可以了
    viakiba
        38
    viakiba  
       Aug 18, 2017
    @ericgui 思路都一样,就是边读取边传输,读取速度视传输而定。
    ericgui
        39
    ericgui  
    OP
       Aug 18, 2017
    @viakiba 嗯,这是目前为止最符合我预想的方案。不过这是用 java 实现的,我要用 php 实现出来,我要好好想想。谢谢。
    Alucns
        40
    Alucns  
       Aug 18, 2017
    数据库备份:只有一张表我觉得容易搞定吧,目录服务器建立一个计划任务远程去连接远程数据库,直接把当日更新的 SELECT 插入进本地数据表呀,计划任务在大半夜进行。
    文件同步直接用:rsync 也是可以用计划任务。
    Alucns
        41
    Alucns  
       Aug 18, 2017
    MYSQL 主从同步优先考虑呀,但是你这 MYSQL 版本不一至,应该是配置不了。
    clino
        42
    clino  
       Aug 18, 2017
    为什么要把文件存数据库啊...
    keepfun
        43
    keepfun  
       Aug 18, 2017
    先吧 a 鸡数据 scp 一份到 b 鸡,然后 a 鸡有新数据,先写入到 redis 队列,然后 b 从 redis 获取,在入库到 b
    xjmroot
        44
    xjmroot  
       Aug 18, 2017
    有那么复杂么,感觉就第一次同步慢点,第一次全量同步,后面都是增量啦
    增量一天能增加多少数据呢
    shingoxray
        45
    shingoxray  
       Aug 18, 2017
    非要用 PHP 解决的话,写个 PHP 文件(比如 sync.php )同时连这两个库,按时间戳把新操作的记录从 Win 鸡更新到 U 鸡。
    然后随便哪只鸡上做个任务,定时>php.exe sync.php 就可以吧?
    jyf
        46
    jyf  
       Aug 18, 2017
    用 mysql 的主从同步 但是不要用 binlog 可以考虑文本语句的那种 只要没用版本相关的语句应该没啥问题
    dangyuluo
        47
    dangyuluo  
       Aug 18, 2017
    @miaoever 问个小问题,如果仅仅是 MySQL 主从同步的话,是不是就没有必要上 datax 了?
    yw9381
        48
    yw9381  
       Aug 18, 2017
    我觉得,文件还是别放在数据库里吧,以实际的文件放在硬盘里,
    数据库记录文件的相对位置,大小,md5 这些信息。
    每天根据差异生成 sql,在小机上跑一下,小机跑的时候,自动从目标服务器吧文件同步到本机
    这样每天需要拉的数据就会小很多。对于每天的全量备份实在是划不来
    全量的话,每周,或是半月,一月来一次
    scys
        49
    scys  
       Aug 18, 2017
    #1 source: mysqldump to data.sql.gz
    #2 scp data.sql.gz to dest
    #3 dest: echo data.sql.gz | mysql

    完毕,自动化脚本,估计就 10 分钟不够,4.3G ,不够 mysqldump 塞牙缝
    janxin
        50
    janxin  
       Aug 18, 2017
    改改代码存文件不好吗...
    DRcoding
        51
    DRcoding  
       Aug 18, 2017
    Windows Server 2012 上试试 kettle 吧,PHP 还是算了。
    msg7086
        52
    msg7086  
       Aug 18, 2017
    上面这群说存文件里的,有多少人真的试过在 EXT4 和数据库里存几十万几百万文件?
    janxin
        53
    janxin  
       Aug 18, 2017
    @msg7086 数据库没试过,ext4 下面文件有 200w 个,然后呢?
    msg7086
        54
    msg7086  
       Aug 18, 2017
    @janxin 我们 ext4 下一个目录几十万文件已经卡死了。
    Felldeadbird
        55
    Felldeadbird  
       Aug 18, 2017
    这么大文件,别依赖 PHP 了、
    janxin
        56
    janxin  
       Aug 18, 2017
    @msg7086 =,=我就知道你们会这样
    msg7086
        57
    msg7086  
       Aug 18, 2017
    @janxin 以前我司有个很厉害的程序员。
    打日志按照 pid 起文件名。
    后来,每个模块都有 30000+个 log。
    后来,这个目录就没法 ls 了……
    loveCoding
        58
    loveCoding  
       Aug 18, 2017
    @msg7086 #54 存的时候按天或者按每周这样切分目录效果会有提升不
    msg7086
        59
    msg7086  
       Aug 18, 2017
    @loveCoding 切分会好很多。
    如果是大量小文件的话,存数据库效率是很好的。
    文件系统不是为了超大量文件设计的(除非用 Reiser 家族),而数据库可以轻松处理上千万上亿行数据。
    romisanic
        60
    romisanic  
       Aug 18, 2017
    如果只是数据库的同步 跟你们网站用啥做的并没有什么太大关系吧?
    ahkxhyl
        61
    ahkxhyl  
       Aug 18, 2017
    关注这个话题~
    Nitromethane
        62
    Nitromethane  
       Sep 21, 2017
    你们要买对象存储啊~否则磁盘跪了文件就真贵了~
    4.3G 的对象存储很便宜~
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   958 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 147ms · UTC 20:54 · PVG 04:54 · LAX 13:54 · JFK 16:54
    ♥ Do have faith in what you're doing.