ElasticSearch是目前最风靡的一款的开源框架,可用于站内搜索和日志分析。
目前,我们准备把所有文章搜索或分页都基于 ElasticSearch 实现,其“搜索速度快,有分词,高亮等功能”非常吸引人。
通常为了缓解 MySQL 的压力,我们可以尝试让 MySQL 用于写,读都从 ElasticSearch 或 Redis 来进行。然后,我们需要解决的就是数据如何从 MySQL实时或近实时同步到 ElasticSearch 中去,可以用 MySQL 的 binlog 出发,它记录了 MySQL 执行的 sql 语句(除了查询语句),可以用于恢复数据。
目前通过 binlog 实现 mysql 数据同步到 es 中的开源框架有好几个,本文介绍其中一种:go-mysql-elasticsearch,在 mac 上实践。
官方地址:https://github.com/siddontang/go-mysql-elasticsearch
1.下载
go语言中文网:https://studygolang.com/dl
下载 > 1.9 版本的对应的包,mac 版可以直接下载 pkg 后缀的执行文件,双击安装
也可以直接下载压缩包,然后解压
2.配置环境变量
分别执行以下三行命令(也可以直接克隆上面的 github 资源地址到本地)
go get github.com/siddontang/go-mysql-elasticsearch
cd
make
1.MySQL 配置
修改 MySQL 的 my.cnf 文件,mac 上是在 /etc/my.cnf
下面分别说明一下这三行配置
go-mysql-search 限定了 binlog 必须使用 ROW 模式,server-id 和 下面的配置文件中的一致。
2.go-mysql-elasticsearch 配置
目前,我们准备把所有文章搜索或分页都基于 ElasticSearch 实现,其“搜索速度快,有分词,高亮等功能”非常吸引人。
通常为了缓解 MySQL 的压力,我们可以尝试让 MySQL 用于写,读都从 ElasticSearch 或 Redis 来进行。然后,我们需要解决的就是数据如何从 MySQL实时或近实时同步到 ElasticSearch 中去,可以用 MySQL 的 binlog 出发,它记录了 MySQL 执行的 sql 语句(除了查询语句),可以用于恢复数据。
目前通过 binlog 实现 mysql 数据同步到 es 中的开源框架有好几个,本文介绍其中一种:go-mysql-elasticsearch,在 mac 上实践。
官方地址:https://github.com/siddontang/go-mysql-elasticsearch
一、安装 go 环境
1.下载
go语言中文网:https://studygolang.com/dl
下载 > 1.9 版本的对应的包,mac 版可以直接下载 pkg 后缀的执行文件,双击安装
也可以直接下载压缩包,然后解压
2.配置环境变量
- export PATH=$PATH:/usr/local/go/bin
- export GOPATH=/Users/liuyanzhao/go
二、下载 go-mysql-elasticsearch
分别执行以下三行命令(也可以直接克隆上面的 github 资源地址到本地)
go get github.com/siddontang/go-mysql-elasticsearch
cd
$GOPATH/src/github.com/siddontang/go-mysql-elasticsearch
make
三、配置
1.MySQL 配置
修改 MySQL 的 my.cnf 文件,mac 上是在 /etc/my.cnf
- binlog_format=ROW
- log-bin=mysql-bin
- server-id=1
下面分别说明一下这三行配置
go-mysql-search 限定了 binlog 必须使用 ROW 模式,server-id 和 下面的配置文件中的一致。
2.go-mysql-elasticsearch 配置
修改 go-mysql-elasticsearch/etc/river.toml
该文件是唯一配置文件
- # MySQL address, user and password
- # user must have replication privilege in MySQL.
- my_addr = "127.0.0.1:3306"
- my_user = "root"
- my_pass = "123456"
- my_charset = "utf8"
- # Set true when elasticsearch use https
- #es_https = false
- # Elasticsearch address
- es_addr = "127.0.0.1:9200"
- # Elasticsearch user and password, maybe set by shield, nginx, or x-pack
- es_user = ""
- es_pass = ""
- # Path to store data, like master.info, if not set or empty,
- # we must use this to support breakpoint resume syncing.
- # TODO: support other storage, like etcd.
- data_dir = "./var"
- # Inner Http status address
- stat_addr = "127.0.0.1:12800"
- # pseudo server id like a slave
- server_id = 1
- # mysql or mariadb
- flavor = "mysql"
- # mysqldump execution path
- # if not set or empty, ignore mysqldump.
- mysqldump = "mysqldump"
- # if we have no privilege to use mysqldump with --master-data,
- # we must skip it.
- #skip_master_data = true
- # minimal items to be inserted in one bulk
- bulk_size = 128
- # force flush the pending requests if we don't have enough items >= bulk_size
- flush_bulk_time = "200ms"
- # Ignore table without primary key
- skip_no_pk_table = false
- # MySQL data source
- [[source]]
- schema = "sens_blog"
- [[rule]]
- schema = "sens_blog"
- table = "sens_post"
- index = "blog"
- type = "post"
- filter = ["post_id", "user_id", "post_title", "post_summary", "post_thumbnail", "post_type", "post_status", "post_views", "post_likes", "comment_size", "post_date"]
- id = ["post_id"]
- [rule.field]
- post_id = "postId"
- user_id = "userId"
- post_title = "postTitle"
- post_summary = "postSummary"
- post_thumbnail = "postThumbnail"
- post_type = "postType"
- post_status = "postStatus"
- post_views = "postViews"
- post_likes = "postLikes"
- comment_size = "commentSize"
- post_date = "postDate"
上面的 schema 指的是 MySQL 数据库名,table 数据库中要同步的表名,index 是 ES 索引,type 是 ES 类型。
上面这段配置指的是 同步 MySQL sens_blog 数据库中的 sens_post 表到 ES 中,索引为 blog,类型为 post。如果索引没有创建,会自动创建。如果索引创建了,不会自动创建。
建议还是自己创建 索引
PUT 127.0.0.1:9200/blog
- {
- "settings": {
- "number_of_shards": 5,
- "number_of_replicas": 1
- },
- "mappings": {
- "post": {
- "properties": {
- "postId": {
- "type": "long"
- },
- "userId": {
- "type": "long"
- },
- "postTitle": {
- "type": "text"
- },
- "postSummary": {
- "type": "text"
- },
- "postThumbnail": {
- "type": "keyword"
- },
- "postType": {
- "type": "keyword"
- },
- "postStatus": {
- "type": "integer"
- },
- "postViews": {
- "type": "long"
- },
- "postLikes": {
- "type": "long"
- },
- "commentSize": {
- "type": "long"
- },
- "postDate": {
- "type": "date"
- }
- }
- }
- }
- }
四、启动,开始自动同步
上面配置文件修改后,保存。
执行命令:
- ./bin/go-mysql-elasticsearch -config=./etc/river.toml
然后就能开始同步。
打开 es 的 head 插件:http://127.0.0.1:9100 查看数据
如果你不小心删除了索引,想要重新同步,但是却发现无法同步之前的数据。
你可以删除 go-mysql-elasticsearch/var/master.info 即可解决问题
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏