1 Star 1 Fork 0

GiPIG/canal

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

Canal                     English

简介

Build Status Go Report Card License

canal 支持到redis2.x到 5.x 和向前兼容且具有mixed(rdb+aof)协议的复制工具

场景

  • Redis数据的跨机房同步
  • 异构数据的迁移;比如Redis到mysql,MQ,ES等

设计

模拟redis slave,然后去dump redis master的rdb和aof(后续补上架构设计图)

特性

  • 支持redis 2.x 到 5.x的数据同步
  • 支持全量同步和增量同步(断点续传)
  • 支持故障转移
  • 更快

内部使用情况

  • 2k+ redis实例数据同步,基本跑满网卡。

使用


go get github.com/yametech/canal

基本使用

package main

import (
	"github.com/yametech/canal"
	"log"
	"os"
	"time"
)

type printer struct{}

func (p *printer) Command(cmd *canal.Command) error {
	log.Printf("[PRINTER] cmd=%v\n", cmd)
	return nil
}

func main() {
	log.SetOutput(os.Stdout)

	cfg, err := canal.NewConfig(
		"127.0.0.1:6379",
		canal.DialKeepAlive(time.Hour*16800),
		canal.DialWithLocalPort(6379), // 使用本地固定端口作为slave
	)


	if err != nil {
		panic(err)
	}

	repl, err := canal.NewCanal(cfg)
	if err != nil {
		panic(err)
	}

	defer repl.Close()

	if err := repl.Run(&printer{}); err != nil {
		panic(err)
	}
}

断点续传使用


// starting from the location of an instance example
package main

import (
	"github.com/yametech/canal"
	"log"
	"os"
	"time"
)

type printer struct{}

func (p *printer) Command(cmd *canal.Command) error {
	log.Printf("[PRINTER] cmd=%v\n", cmd)
	return nil
}

func main() {
	log.SetOutput(os.Stdout)

	cfg, err := canal.NewConfig(
		"127.0.0.1:8888",
		canal.DialKeepAlive(time.Minute*5),
	)

	if err != nil {
		panic(err)
	}

	repl, err := canal.FromOffsetCanal(cfg, "0cc79e52c7cdcaa58535bb2ce23f46ee1343246c", 111)
	if err != nil {
		panic(err)
	}

	defer repl.Close()

	if err := repl.Run(&printer{}); err != nil {
		panic(err)
	}
}

故障转移使用


//
type printer struct{}

func (p *printer) Command(cmd *canal.Command) error {
	// log.Printf("[PRINTER] cmd=%s\n", cmd.String())
	return nil
}

func main() {
	log.SetOutput(os.Stdout)

	cfg, err := canal.NewConfig(
		"127.0.0.1:6379",
		canal.DialKeepAlive(time.Minute*5),
		// canal.DialPassword(""),
	)
	if err != nil {
		panic(err)
	}
	// 自动找主
	cfg.ReplMaster()

	repl, err := canal.NewCanal(cfg)
	if err != nil {
		panic(err)
	}

	defer repl.Close()

	if err := repl.Run(&printer{}); err != nil {
		panic(err)
	}
}


TODO

  • 支持c/s结构,grpc跨平台使用
  • redis6.x
  • 支持etcd,zk,consul等存储位点
  • 支持集群版本
  • 支持自动维护redis Topology结构

空文件

简介

redis replication canal slave 展开 收起
Go 等 2 种语言
取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/laik_lj/canal.git
git@gitee.com:laik_lj/canal.git
laik_lj
canal
canal
master

搜索帮助