# canal2redis **Repository Path**: brkxlight/canal2redis ## Basic Information - **Project Name**: canal2redis - **Description**: 基于canal client实现mysql到redis的数据同步 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2020-10-28 - **Last Updated**: 2024-10-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## canal2redis 基于canal client实现mysql向redis的数据同步 文件目录 -bin |-startup.sh |-stop.sh -conf # 要不要加conf目录呢 |-application.yml -jar包 -生成的日志文件 1. 通过canal client获取binlog, 并将增量数据同步给redis,存储的类型为 hash 1.5 redis存储类型修改为string类型的json字符串, 由于hash类型,每个自动都要set一次,而string类型则是一个key set一次,所以效率会高很多倍 2. 使用druid数据源,连接mysql获取全量数据,并同步给redis 3. jedis连接redis集群和单机使用不同的客户端,添加了一个工具类来进行判断, 4. 全量同步时,如果数据量大于一万,则开启多线程 5. spring boot项目通过maven打成jar包,配置文件和jar包放同一目录, 6. 添加了shell脚本用于启动和停止应用程序 7. 支持连接单机模式的canal和zk模式下的canal 8. 支持一个库下多个表的增量和全量同步,key名为 prefix+table+id(主键) 9. 添加了配置项,用于将字段名转为小写 10. 当某个字段的值为空时,则存入空串 11. 修改了mysql的连接池大小和连接超时时间 3. 进行全量同步时,要拒绝其他全量同步,也要暂停增量同步 4. 日志生成,异常处理,统计同步时间,同步数据 5. 目前仅支持一个库,一个表,可以尝试令其支持多个表,而这可能需要多个配置文件,于是也就需要获取其他配置文件的配置 6. 程序逻辑的优化, 增量同步和全量同步使用同一个redis连接 TRUNCATE 的操作,因为没有binlog来读,所以不会进行增量同步,需要手动删数据 ## 压力测试 全量同步 200 w 数据用时约 123s 增量同步 update 20 w 数据用时约 55s 程序还没有做时间统计,所以只是大概看了下时间 大概是因为测试用的表字段比较少,所以同步得比较快 company 2518415 5m34.44s jobs 6586918 1h43m13.92s 另一组数据,将company表导入到mysql用了4分多钟, 但将jobs表导入mysql用了 在做全量同步的时候出现连接超时,应该是因为这里获得的线程数是6, int threadCount = Runtime.getRuntime().availableProcessors(); 但默认的连接池大小是3,导致另外三个线程连接超时, 改成6了以后就没有再出现那个异常了, 但可用线程数根据环境会有变动的,所以索性将连接超时时间改为无限 ## 账号密码等信息 10.100.3.156 jobs/jobs online.jobs,company 'jyjobs'=>[ 'driver'=>'MYSQL', 'host'=>'10.100.3.156', 'port'=>'3306', 'database'=>'online', 'username'=>'jobs', 'password'=>'jobs', 'charset'=>'GBK', 'dbtype'=>'MYSQL', 'options'=>[ \PDO::ATTR_CASE =>\PDO::CASE_LOWER, ] ], 10.100.6.114:7000 10.100.6.114:7001 10.100.6.114:7002 10.100.6.115:7000 10.100.6.115:7001 10.100.6.115:7002 密码 123456 10.100.2.242:3306 jyjobs/jyjobs canal/canal jyjobs/company,jyjobs 10.100.2.243 root/123456 pa.CaseExtraInfo max,min,mysql索引, es xpack, jvm 256m select min(CaseID),max(CaseID) from jyjobs.jyjobs; select * from jyjobs.jyjobs where CaseID >= 41203139 and CaseID < 41203139+10000; 对于company表是COID, CaseExtraInfo是caseid 9.68s 43786 company