V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ericgui
V2EX  ›  程序员

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

  •  
  •   ericgui · 2017-08-17 22:36:42 +08:00 · 6638 次点击
    这是一个创建于 2443 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 小鸡是不是就很容易挂了?

    第一次玩这么刺激的,求指教。谢谢
    第 1 条附言  ·  2017-08-18 13:48:13 +08:00
    非常感谢大家的帮助和建议,

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

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

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

    所以。。。。。
    第 2 条附言  ·  2017-08-18 14:09:07 +08:00
    放几个链接:

    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 条回复    2017-09-21 09:45:16 +08:00
    yejinmo
        1
    yejinmo  
       2017-08-17 22:41:30 +08:00
    必须要用 PHP 么。。
    ericgui
        2
    ericgui  
    OP
       2017-08-17 22:42:14 +08:00
    @yejinmo 我们用 PHP 写的网站。

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

    考虑 replication
    或者如果是 myisam, 直接锁表然后 rsync 表文件
    hiboshi
        6
    hiboshi  
       2017-08-17 22:46:44 +08:00
    rsync、sftp 与 php 关系不大,主要是文件同步

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

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

    另外文件存数据库没问题。存在磁盘上,文件系统也是数据库。我网站种子库里存了十几万种子,效率不比存文件差。
    SlipStupig
        32
    SlipStupig  
       2017-08-18 06:15:17 +08:00
    两种方案:
    1.用 binlog 设置主从同步,一天才 4g 一点也不多
    2.记录最后一天数据的 id,然后从那个地方然后定时 dump 出 sql 文件,让导入到另外一个数据库里面,如果不是实时的话,完全没问题
    cxbeat
        33
    cxbeat  
       2017-08-18 08:24:22 +08:00 via Android
    提出一个新思路:如果 io 不大的话,创建一个新表,每次读写都把操作写入新表,就只需要同步新表就行了
    miaoever
        34
    miaoever  
       2017-08-18 08:44:02 +08:00
    每天 4GB 数据量不算大。你需要: https://github.com/alibaba/DataX
    aru
        35
    aru  
       2017-08-18 08:50:45 +08:00 via iPhone
    @cxbeat 这个做法才叫坑人无极限
    wekw
        36
    wekw  
       2017-08-18 09:03:11 +08:00 via Android
    mysqldump 多大都能搞
    vtwoextb
        37
    vtwoextb  
       2017-08-18 09:15:18 +08:00
    首先说你数据库就不能存 doc pdf 这样的文件,其次要真想同步 简单的 shell 一行就可以了
    viakiba
        38
    viakiba  
       2017-08-18 09:24:17 +08:00
    @ericgui 思路都一样,就是边读取边传输,读取速度视传输而定。
    ericgui
        39
    ericgui  
    OP
       2017-08-18 09:39:52 +08:00
    @viakiba 嗯,这是目前为止最符合我预想的方案。不过这是用 java 实现的,我要用 php 实现出来,我要好好想想。谢谢。
    Aluhao
        40
    Aluhao  
       2017-08-18 09:43:48 +08:00
    数据库备份:只有一张表我觉得容易搞定吧,目录服务器建立一个计划任务远程去连接远程数据库,直接把当日更新的 SELECT 插入进本地数据表呀,计划任务在大半夜进行。
    文件同步直接用:rsync 也是可以用计划任务。
    Aluhao
        41
    Aluhao  
       2017-08-18 09:45:10 +08:00
    MYSQL 主从同步优先考虑呀,但是你这 MYSQL 版本不一至,应该是配置不了。
    clino
        42
    clino  
       2017-08-18 09:54:53 +08:00
    为什么要把文件存数据库啊...
    fenglangjuxu
        43
    fenglangjuxu  
       2017-08-18 10:01:38 +08:00
    先吧 a 鸡数据 scp 一份到 b 鸡,然后 a 鸡有新数据,先写入到 redis 队列,然后 b 从 redis 获取,在入库到 b
    xjmroot
        44
    xjmroot  
       2017-08-18 10:29:58 +08:00
    有那么复杂么,感觉就第一次同步慢点,第一次全量同步,后面都是增量啦
    增量一天能增加多少数据呢
    shingoxray
        45
    shingoxray  
       2017-08-18 10:53:39 +08:00
    非要用 PHP 解决的话,写个 PHP 文件(比如 sync.php )同时连这两个库,按时间戳把新操作的记录从 Win 鸡更新到 U 鸡。
    然后随便哪只鸡上做个任务,定时>php.exe sync.php 就可以吧?
    jyf
        46
    jyf  
       2017-08-18 10:59:27 +08:00
    用 mysql 的主从同步 但是不要用 binlog 可以考虑文本语句的那种 只要没用版本相关的语句应该没啥问题
    dangyuluo
        47
    dangyuluo  
       2017-08-18 11:14:38 +08:00
    @miaoever 问个小问题,如果仅仅是 MySQL 主从同步的话,是不是就没有必要上 datax 了?
    yw9381
        48
    yw9381  
       2017-08-18 11:17:14 +08:00
    我觉得,文件还是别放在数据库里吧,以实际的文件放在硬盘里,
    数据库记录文件的相对位置,大小,md5 这些信息。
    每天根据差异生成 sql,在小机上跑一下,小机跑的时候,自动从目标服务器吧文件同步到本机
    这样每天需要拉的数据就会小很多。对于每天的全量备份实在是划不来
    全量的话,每周,或是半月,一月来一次
    scys
        49
    scys  
       2017-08-18 11:29:31 +08:00
    #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  
       2017-08-18 11:33:09 +08:00
    改改代码存文件不好吗...
    DRcoding
        51
    DRcoding  
       2017-08-18 11:35:52 +08:00
    Windows Server 2012 上试试 kettle 吧,PHP 还是算了。
    msg7086
        52
    msg7086  
       2017-08-18 11:36:08 +08:00
    上面这群说存文件里的,有多少人真的试过在 EXT4 和数据库里存几十万几百万文件?
    janxin
        53
    janxin  
       2017-08-18 11:42:32 +08:00
    @msg7086 数据库没试过,ext4 下面文件有 200w 个,然后呢?
    msg7086
        54
    msg7086  
       2017-08-18 13:59:06 +08:00
    @janxin 我们 ext4 下一个目录几十万文件已经卡死了。
    Felldeadbird
        55
    Felldeadbird  
       2017-08-18 13:59:32 +08:00
    这么大文件,别依赖 PHP 了、
    janxin
        56
    janxin  
       2017-08-18 14:09:08 +08:00
    @msg7086 =,=我就知道你们会这样
    msg7086
        57
    msg7086  
       2017-08-18 14:12:22 +08:00
    @janxin 以前我司有个很厉害的程序员。
    打日志按照 pid 起文件名。
    后来,每个模块都有 30000+个 log。
    后来,这个目录就没法 ls 了……
    loveCoding
        58
    loveCoding  
       2017-08-18 14:16:03 +08:00
    @msg7086 #54 存的时候按天或者按每周这样切分目录效果会有提升不
    msg7086
        59
    msg7086  
       2017-08-18 14:21:39 +08:00
    @loveCoding 切分会好很多。
    如果是大量小文件的话,存数据库效率是很好的。
    文件系统不是为了超大量文件设计的(除非用 Reiser 家族),而数据库可以轻松处理上千万上亿行数据。
    romisanic
        60
    romisanic  
       2017-08-18 16:14:08 +08:00
    如果只是数据库的同步 跟你们网站用啥做的并没有什么太大关系吧?
    ahkxhyl
        61
    ahkxhyl  
       2017-08-18 16:32:54 +08:00
    关注这个话题~
    Nitromethane
        62
    Nitromethane  
       2017-09-21 09:45:16 +08:00
    你们要买对象存储啊~否则磁盘跪了文件就真贵了~
    4.3G 的对象存储很便宜~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1003 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 19:56 · PVG 03:56 · LAX 12:56 · JFK 15:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.