使用monstache同步MongoDB数据到ElasticSearch

monstache同步数据需要MongoDB开启复制集,原理是mongodb复制集会把所有写操作记录在oplog日志文件中,monstache读取日志,把所有的操作同步到ES中。
mongodb复制集节点建议单数,本次我是在一台服务器上创建,一主二从三个节点。双数节点需要配置选举节点,一个复制集最多五十个节点,选举节点最多7个(好像是)

1.安装docker

#安装
yum install docker -y
#启动docker服务
systemctl start docker.service

2.配置MongoDB复制集

mongodb版本为5.05 复制集共三节点在同一个服务器上

1)创建mongo目录
#先创建mongodb文件目录(客户端创建更方便)
# 进入opt目录
cd /opt
# 在opt目录下创建文件夹mongo
mkdir mongo
# 进入mongo目录
cd /opt/mongo
#  在mongo目录下创建文件夹m1,m2,m3
mkdir m1
# 进入m1文件夹(m2,m3同)
cd /opt/mongo/m1 
# 在m1目录下创建文件夹log,conf,db
mkdir log conf db 
# 给log文件夹授权,log 文件夹需要提权 因为mongodb会创建日志文件
chmod 777 log

结构如图:
结构tu

2)配置mongod.conf文件

节点m2,m3配置与下面m1相同

cd /opt/mongo/m1/conf 
# 创建配置文件
vim mongod.conf
#将下面内容复制到mongod.conf中,注意粘贴要在插入模式下,否则会丢几个字母不好排查。

storage:
  dbPath: /data/db
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:
systemLog:
  destination: file
  logAppend: true
  path: /data/log/mlogs
# where to write logging data.
# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0
# how the process runs
security:
  #开启认证
  authorization: enabled
  # 指定keyfile认证
  clusterAuthMode: keyFile 
  keyFile: /data/conf/mongodb.keyfile
  
#operationProfiling:
replication:
  oplogSizeMB: 10240
#复制集名称:可修改,三个节点要一致
  replSetName: rs1

创建keyFile认证秘钥

# 进入mongo下的conf文件夹
cd /opt/mongo/conf
# 生成keyfile文件,keyfile文件只生成一次  拷贝到每个节点上使用
openssl rand -base64 736 > /opt/mongo/m1/conf/mongodb.keyfile
# mongodb.keyfile必须授权600和999,否则后续启动不了MongoDB容器
# 给m1的mongodb.keyfile文件授权
chmod 600 mongodb.keyfile
# 给m1的mongodb.keyfile文件授权
chown 999 mongodb.keyfile

# 将mongodb.keyfile文件复制到从节点的conf文件夹下,并授权
# 给从节点的mongodb.keyfile文件授权
chmod 600 mongodb.keyfile
# 给从节点的mongodb.keyfile文件授权
chown 999 mongodb.keyfile
3)启动容器
#m1
docker run  -p 27027:27017 --restart always \
--name="m1" \
-v /opt/mongo/m1:/data \
-v /opt/mongo/m1/db:/data/db \
-v /etc/localtime:/etc/localtime \
-d mongo:5.0.5 \
--config /data/conf/mongod.conf
#m2
docker run  -p 27028:27017  \
--name="m2" \
-v /opt/mongo/m2:/data \
-v /opt/mongo/m2/db:/data/db \
-v /etc/localtime:/etc/localtime \
-d mongo:5.0.5 \
--config /data/conf/mongod.conf
#m3
docker run  -p 27029:27017 \
--name="m3" \
-v /opt/mongo/m3:/data \
-v /opt/mongo/m3/db:/data/db \
-v /etc/localtime:/etc/localtime \
-d mongo:5.0.5 \
--config /data/conf/mongod.conf

#docker ps 查看已启动容器
docker ps

# 进入容器
docker exec -it m1 bash
#进入mongo命令行
mongo 
#配置复制集
myconf = {"_id":"rs1","members":[{"_id":0,"host":"ip:27027"},{"_id":1,"host":"ip:27028"},{"_id":2,"host":"ip:27029"}]}
# 初始化配置文件
rs.initiate(myconf)  
# 查看集群状态
rs.status()
# 在从节点上想查询需要执行
# MongoDB server version: 5.0.1 已经弃用rs.slaveOk()
#注意: WARNING: slaveOk() is deprecated and may be removed in the next major release. Please use secondaryOk() instead.
# 意思是rs.slaveOk()已经弃用,使用rs.secondaryOk()
rs.secondaryOk()

# 先创建 admin用户 可以操作admin库并且继续创建其他用户
use admin
db.createUser( {user: "admin",pwd: "skxk1320",roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]})
db.auth("admin", "skxk1320")
# 登录admin用户后继续创建用户root权限
db.createUser({user:"root",pwd:"skxk1320",roles:["root"]})
db.auth("root", "skxk1320")
#创建个集合试下
db.createCollection("test")

注意: 远程连接需要在云服务器安全组中开放27027,27028,27029三个端口

容器启动报错查看日志 docker logs m1

3.安装ElasticSearch

  • 拉取镜像
docker pull elasticsearch:7.8.0
  • 创建目录

config配置目录 data数据目录 plugins插件目录(ik)

如图
在这里插入图片描述

#注意:data文件夹给上777权限
chmod 777 /opt/elasticsearch/data
echo "http.host: 0.0.0.0" >> /opt/elasticsearch/config/elasticsearch.yml
  • 启动容器
#注意: -e ES_JAVA_OPTS="-Xms84m -Xmx512m" 为es启动内存 生产环境下要多配置
docker run --name es -p 9200:9200  -p 9300:9300 \
 -e "discovery.type=single-node" \
 -e ES_JAVA_OPTS="-Xms2048m -Xmx4096m" \
 -v /opt/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
 -v /opt/elasticsearch/data:/usr/share/elasticsearch/data \
 -v /opt/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
 -d elasticsearch:7.8.0
  • 云服务器安全组开放9200端口

  • 验证是否成功

浏览器访问Ip:9200 (测试服务器马上就到期了)
在这里插入图片描述

4.搭建Monstache环境

1)安装Git

从github上拉取Monstache项目,需要安装git

yum install -y git
#安装后查看版本 yum安装的git版本较低,但是够用,新版本下载压缩包安装
git --version
2)安装go环境

monstache是go语言开发,编译需要go环境

  • 下载Go语言包并安装
#使用yum方式安装 我的版本为1.18.9,会自动配置好环境
yum install go -y
#安装monstache
#进入安装目录
cd /usr/local/
#从Git库中下载安装包。
git clone https://github.com/rwynn/monstache.git
#进入monstache目录。
cd monstache
#切换到rel6版本(默认是6) es7.x对应的是rel6
git checkout rel6
#安装
go install
#查看版本 (我当前回版本 6.7.11)
monstache -v
3)配置monstache配置文件
  • 创建目录和配置文件
cd /usr/local/monstache/
vim config.toml
  • 把下面的内容复制到config.toml里面,注意如果不是插入模式,第一行容易丢字符
#这一行要放在上面
verbose = true  

#mongodb的链接地址 monstache与mongodb和es在同一服务器,所以写的localhost
mongo-url = "mongodb://root:skxk1320@localhost:27027"

#es的链接地址
elasticsearch-urls = ["http://localhost:9200"]

#要监听的mongodb的集合格式是 库名.集合名,可以写多个,也可以使用正则来匹配多个,相应配置项为 namespace-regex
#这个好像没啥用,但是别人是这样写的 随便一个库名.集合名
direct-read-namespaces = ["test.hello"]

enable-oplog = true
#es用户(没有可不填)
elasticsearch-user = ""

#es密码(没有可不填)
elasticsearch-password = ""

#monstache最多开几个线程同步到es,默认为4
elasticsearch-max-conns = 4

#mongodb删除集合或库时是否同步删除es中的索引
dropped-collections = true
dropped-databases = true

#记录同步位点,便于下次从该位置同步
resume = true

#指定恢复策略。仅当resume为true时生效,默认为0-基于时间戳的变更流恢复
resume-strategy = 0

#生产环境记录日志必不可少,monstache默认是输出到标准输出的,这里指定它输出到指定的日志文件(这个也是踩坑踩出来的哦!)
[logs]
info = "/home/admin/logs/monstore-center/info.log"
warn = "/home/admin/logs/monstore-center/wran.log"
error = "/home/admin/logs/monstore-center/error.log"
trace = "/home/admin/logs/monstore-center/trace.log"

#设置日志切割参数,下面的配置意思是:每个日志文件超过500M会被切割,最大保存最近60个日志文件,会压缩历史日志
[log-rotate]
max-size = 500
max-age = 60
compress = true

#高可用模式下需要配置集群名称,集群名称一样的进程会自动加入一个集群内,要注意这是个集群是高可用的,而不是负载均衡的。(看到其他文档里说这个参数是es集群的名称,其实并不是,自定义值)
#cluster-name = 'HA-im'

#此项目用的默认配置,自动同步所有库所有集合,省事,就不用配置mapping了
#mapping定义mongodb数据到es的索引名称和type,namespace是库名.集合名
#这里需要注意一件事:最好是在es中创建好你要的索引结构,关闭es的自动创建索引功能,不然monstace会给mongodb中所有的集合都创建一个索引。我这里就对应了两个索引
#[[mapping]]
#namespace = "test.hello"
#index = "li_index"
#
#[[mapping]]
#namespace = "ec-imcenter.im_ch"
#index = "im_ch"
#type = "im_ch"
4)启动monstache

nohup &可以让程序后台运行,否则断开连接就关闭了,-f是监控模式,显式的打印日志,加了没啥用,可以先不加nohup查看下效果

nohup monstache -f config.toml &
5)安装kibana看一下效果
  • 拉取镜像

  • 创建kibana配置文件

#创建目录
mkdir -p /opt/elasticsearch/kibana
#创建配置文件
vim kibana.yml
  • 把下面内容复制进去
server.name: kibana
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://云服务器ip:9200"]
i18n.locale: "zh-CN"
xpack.monitoring.enabled : true
xpack.reporting.capture.browser.chromium.disableSandbox: true
  • 启动容器
docker run -d  --name kibana  -p 5601:5601 -v /opt/elasticsearch/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml kibana:7.8.0

访问浏览器 ip:9200查询一下就行了
至此,结束。

参考:https://blog.csdn.net/qq_38066812/article/details/122475897
https://help.aliyun.com/document_detail/171650.html?spm=5176.22414175.sslink.10.2b8f676319F1BU

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值