MongoDB 和 Elasticsearch 同步方式有两种,一种为搭建集群,另一种为配置MongoDB的副本集,本案在docker上部署,所以选择配置副本集方式。
说明:为了能够使得 MongoDB 和 Elasticsearch 同步,我们必须针对 MongoDB 部署一个 replica set。Monstache 使用 MongoDB 的 oplog 作为事件源。 你将需要确保通过部署副本集将 MongoDB 配置为生成操作日志。
1、部署步骤
1、elasticsearch:7.9.3
docker pull elasticsearch:7.9.3
配置文件:elasticsearch.yml 自己创建:/opt/elasticsearch/config/elasticsearch.yml
cluster.name: "docker-cluster"
network.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
注:如果启动 elasticsearch 后会自己挂掉,需要先创建 /opt/elasticsearch/data 并且赋予777权限
docker run --name elasticsearch -d --restart always
-v/opt/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
-v /opt/elasticsearch/plugins:/usr/share/elasticsearch/plugins
-v /opt/elasticsearch/data:/usr/share/elasticsearch/data
-e ES_JAVA_OPTS="-Xms512m -Xmx512m"
-e "discovery.type=single-node"
-p 9200:9200 -p 9300:9300 elasticsearch:7.9.3
2、kibana
docker pull kibana:7.9.3
注:先 ip address 查看docker内部的IP命令 我这里是172.17.0.1
sudo docker run --name kibana -d --restart always
-e ELASTICSEARCH_HOSTS=http://172.17.0.1:9200
-p 5601:5601 -d kibana:7.9.3
3、elasticsearch-head
docker pull mobz/elasticsearch-head:5
docker run --name elasticsearch-head -d --restart always
-p 9100:9100 mobz/elasticsearch-head:5
这三个启动后先访问,查看是否成功
4、MongoDB
docker pull mongo:4.1.2
需要启动三个mongo节点 注:你的内存需要足够 不然启动后会挂掉 我踩过的坑
docker run --name m0 -p 37017:27017 -d mongo --replSet "rs"
docker run --name m1 -p 47017:27017 -d mongo --replSet "rs"
docker run --name m2 -p 57017:27017 -d mongo --replSet "rs"
docker ps //查看启动的容器
连接任意一个节点,进行副本集配置
进入容器
docker exec -it 026f9b1c557e /bin/bash
连接三个节点中的任意一个,注意ip地址为宿主机ip(ifconfig命令查询),我当前的为 192.168.164.133 ,注 : 这里127.0.0.1 不行
mongo --host 192.168.164.133 --port 37017
此时已连接到其中一个节点,下面进行副本集配置
键入命令
rs.initiate({
_id:"rs",
members:[
{_id:0,host:"192.168.164.133:37017"},
{_id:1,host:"192.168.164.133:47017"},
{_id:2,host:"192.168.164.133:57017"}
]})
响应类似下面,注意此时命令提示符已经发生变化,由原来的 > 变成了 rs:SECONDARY>
{
"ok" : 1,
"operationTime" : Timestamp(1522810920, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1522810920, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
查看副本集配置信息
查看副本集状态 rs.status()
这里要注意这个值,决定你mongo的主备状态
到这里,你就可以选择一个数据库可视化工具去连接Mongo了
5、monstache
docker pull rwynn/monstache
编写monstache配置文件, 设置mydb的同步策略 /opt/monstache/config/monstache.config.toml
注 : 这里127.0.0.1 不行 两个ip必须是宿主机ip
# ip地址注意要修改
mongo-url = "mongodb://192.168.164.133:37017"
# ip地址注意要修改
elasticsearch-urls = ["http://192.168.164.133:9200"]
# mydb指的是需要同步的数据库
direct-read-namespaces = ["mydb.*"]
elasticsearch-user = "elastic"
elasticsearch-password = "pwd"
elasticsearch-max-conns = 4
dropped-collections = true
dropped-databases = true
resume = true
resume-strategy = 0
verbose = true
cluster-name = 'docker-cluster'
编写monstache启动文件docker-compose.yml,执行docker-compose up -d 新增运行monstache实例
version: '3.3'
services:
monstache:
image: rwynn/monstache
restart: always
container_name: monstache
volumes:
- /opt/monstache/config/monstache.config.toml:/app/monstache.config.toml
command: -f /app/monstache.config.toml
查询配置结果
docker logs -f monstache
如果看到和我这里一样的信息,恭喜你,配置成功!!!
6、测试同步
成功!!!!!!!!
注:本文转载需标明出处
参考:
mongodb同步elasticSearch方案评估 | 俊瑶先森
Elasticsearch:同步 MongoDB 数据到 Elasticsearch_Elastic-程序员秘密_monstache - 程序员秘密