elasticsearch浅入

以下的所有操作是发生在centos7.5下的,另请先自行准备docker环境,下面将会用docker来安装一个单节点的elasticsearch,有很多文章说elasticsearch不可以用root用户,但是我用的就是root用户,至于为什么不可以,还有至于为什么又可以,学识浅微,目前并不知道,等以后该系列更新到一定程度后,我想我就可以解答了吧。



前奏

# 搜索镜像 docker search elasticsearch

在dockerhub中搜索镜像,运行后却发现docker没运行起来。
elasticsearch浅入
文章图片

# 重新加载某个服务的配置文件,如果新安装了一个服务,归属于 systemctl 管理,要是新服务的服务程序配置文件生效,需重新加载 systemctl daemon-reload# 重启docker服务 systemctl restart docker


启动docker服务后我们再来搜索一下elasticsearch镜像,能看到列出十分多的镜像,出于安全考虑,将会选择官方的elasticsearch镜像。
elasticsearch浅入
文章图片



由于镜像是在国外的,下载速度将会十分的慢,将docker镜像源改为国内,并用阿里云镜像加速器。修改的方法就是vim /etc/docker/daemon.conf,创建一个文件,然后重启docker服务。
elasticsearch浅入
文章图片

# vim /etc/docker/daemon.conf # 修改docker国内镜像源 # 使用阿里云镜像加速器{ "registry-mirrors": ["http://f2d6cb40.m.daocloud.io"] }

重启docker服务后,以后的docker pull将会经过加速,下载速度十分可观。



创建网络是为了让相关服务能在同一个网络下进行通信
# 创建网络 docker network create esnet




为了不影响后面的步骤,我直接关闭了防火墙,也可以根据需要开放相关端口
# 查看防火墙状态 firewall-cmd --state# 关闭防火墙 systemctl stop firewalld.service




安装
# 拉取镜像 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.6.1

拉取官方推出的最新版本7.6.1镜像
elasticsearch浅入
文章图片

# 查看本地的镜像 docker images

查看镜像,注意IMAGE ID,这个将用来创建容器
elasticsearch浅入
文章图片




启动一个单节点的Elasticsearch集群(41072cdeebc5即为镜像ID)
docker run -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms256m -Xmx256m" --network esnet -dit -p 9200:9200 -p 9300:9300 --name ES_01 41072cdeebc5

elasticsearch浅入
文章图片

--name:给容器起个名字,方便我们可以对容器进行辨认。如 ES_01即为这个容器的名字

-e:为容器设置环境变量。如 “discovery.type=single-node”(据官方介绍,设置这个参数是单节点集群,便于开发或测试,并且可以绕过bootstrap checks,如果不设置为单节点,将会有非常多坑,后面会详述这些坑);如 ES_JAVA_OPTS="-Xms256m -Xmx256m" (调整 JVM 内存大小,限制初始内存和最大内存,默认初始占用2G内存空间)

-p:端口映射,前者是宿主机端口,后者是容器内的端口。如 9200:9200(默认进行web通信使用9200端口,将宿主机的9200映射到容器内ES的9200端口,供htpp访问),如 9300:9300(分布式下各结点之间的通信使用9300端口,供tcp访问)

--network:指定网络名,用于多个服务通信与隔离,比方说用kibana连接elasticsearch就需要两者在同一个网络下

-dit:Docker容器后台运行,就必须有一个前台进程,主线程结束,容器会退出。所以如果docker run -d image 这样启动容器后,你在用docker ps 往往看不到容器正在运行,其实它启动过,然后马上又停止了,但是如果你给它一个前台进程,它会一直running,即必须有交互,所以一般可以用这个组合参数防止启动容器后不久就自动关闭了。



访问
# 进入容器 docker exec -it ES_01 /bin/bash# 进入config目录 cd config/# 配置elasticsearch.yml vi elasticsearch.yml




下面是elasticsearch.yml的配置内容
# ======================== Elasticsearch Configuration ========================= # # NOTE: Elasticsearch comes with reasonable defaults for most settings. #Before you set out to tweak and tune the configuration, make sure you #understand what are you trying to accomplish and the consequences. # # The primary way of configuring a node is via this file. This template lists # the most important settings you may want to configure for a production cluster. # # Please consult the documentation for further information on configuration options: # https://www.elastic.co/guide/en/elasticsearch/reference/index.html # # ---------------------------------- Cluster ----------------------------------- # # Use a descriptive name for your cluster: # cluster.name: "docker-cluster" # # ------------------------------------ Node ------------------------------------ # # Use a descriptive name for the node: # node.name: node-1 # # Add custom attributes to the node: # #node.attr.rack: r1 # # ---------------------------------- Network ----------------------------------- # # Set the bind address to a specific IP (IPv4 or IPv6): # network.host: 0.0.0.0 # # Set a custom port for HTTP: # http.port: 9200 # # For more information, consult the network module documentation. # # --------------------------------- Discovery ---------------------------------- # # Pass an initial list of hosts to perform discovery when this node is started: # The default list of hosts is ["127.0.0.1", "[::1]"] # #discovery.seed_hosts: ["host1", "host2"] # # Bootstrap the cluster using an initial set of master-eligible nodes: # #cluster.initial_master_nodes: ["node-1", "node-2"] cluster.initial_master_nodes: ["node-1"] # # For more information, consult the discovery and cluster formation module documentation. ## 开启跨域访问,默认为fase http.cors.enabled: true# 跨域访问允许的域名地址 http.cors.allow-origin: "*"




访问http://localhost:9200/,出现图片里的情况即为成功访问
elasticsearch浅入
文章图片





一个衷心的建议,有坑的时候,一定要先查看日志,根据报错信息找到问题所在
docker logs [OPTIONS] CONTAINERID

Options:
–details:显示更多的信息
-f, --follow:跟踪实时日志
–since string:显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
–tail string:从日志末尾显示多少行日志, 默认是all
-t, --timestamps:显示时间戳
–until string:显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)



  • 坑一:
    修改docker镜像源时,很多文章是让人vim /etc/docker/daemon.json,但是会遇到重启docker服务出错,而改成.conf就不会报错,应该是操作系统不同的原因,遇到这种情况可以都尝试一下。

  • 坑二:
    Docker容器后台运行,就必须有一个前台进程。如果容器启动后不久就自动关闭,那么也可以尝试docker run -d <镜像> tail -f /dev/null,让前台进程不能结束,来保证不会自动关闭容器。

  • 坑三:
    对初学者来说,由于对docker使用的不熟练,并不清楚就算容器关闭了,容器也依然存在,那么这时候,就不可以创建同名的容器,除非删除了这个容器或重命名容器。
    elasticsearch浅入
    文章图片
# 杀死所有正在运行的容器(注意这只是杀死了,该容器还是存在的) docker kill $(docker ps -a -q)# 删除所有已经停止的容器 docker rm $(docker ps -a -q)#显示所有的容器,过滤出Exited状态的容器,取出这些容器的ID docker ps -a|grep Exited|awk '{print $1}'#根据容器的状态,删除Exited状态的容器 docker rm $(docker ps -qf status=exited)


  • 坑四:max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
    在/etc/sysctl.conf文件末尾增加配置vm.max_map_count=262144
# 修改/etc/sysctl.conf文件 vi /etc/sysctl.conf# 执行命令sysctl -p让配置生效 sysctl -p




应用
下面将举个例子来应用elasticsearch,将介绍怎么将mysql的数据实时导入elasticsearch中。为了让数据能同步到elasticsearch,需要开启mysql的binlog日志,且需要使用ROW模式。
# 检查mysql是否已经开启了binlog show variables like 'log_bin';




如果没有开启,需要在my.cnf中配置,可以通过下面命令找到mysql的路径
select @@basedir;




如果还是找不到文件的位置,可以执行下面命令,可以得到mysql的配置文件的默认加载顺序
# 需要退出mysql交互界面,在命令行的终端输入 mysql --help | grep 'Default options' -A 1

可以看到mysql优先加载/etc/my.cnf中的配置。
所以需要在/etc/my.cnf中mysqld节添加开启binlog的配置
elasticsearch浅入
文章图片




编辑my.cnf文件,增加以下内容
# vim /etc/my.cnf# 如果文件内已经有[mysqld]的话就不用加这句,没有的话就需要加入组名[mysqld] [mysqld] # binlog日志的基本文件名,以及其存储路径 log-bin=/var/lib/mysql/mysql-bin # 配置serverid(5.7及以上版本需要配置该参数,表示单个节点的id,单个节点可以随意写,多个节点不能重复) server-id=1




【elasticsearch浅入】完成编辑后需要重启mysql服务
# 重启mysql服务 systemctl restart mysqld.service




查看binlog的日志模式是否为ROW模式
# 查看当前binlog的日志模式 show variables like 'binlog_format%';

elasticsearch浅入
文章图片




如果不是ROW模式可以在/etc/my.cnf通过增加/修改下面的语句成对应的模式,修改完成后重启mysql服务即可。
# 设置为ROW模式 binlog_format=ROW# 设置为STATEMENT模式 binlog_format=STATEMENT# 设置为MIXED模式 binlog_format=MIXED




先定义一张表,用于演示mysql的数据导入到elasticsearch中,那么就定义一张最常见的用户表吧。
CREATE TABLE `user` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR(45) COLLATE UTF8MB4_UNICODE_CI NOT NULL, `pwd` VARCHAR(255) COLLATE UTF8MB4_UNICODE_CI NOT NULL, `created_at` INT(8) UNSIGNED NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_name` (`name`), KEY `idx_created_at` (`created_at`) )ENGINE=INNODB DEFAULT CHARSET=UTF8MB4 COLLATE = UTF8MB4_UNICODE_CI;

插入几条数据,方便之后快乐的玩耍
INSERT INTO `user` (`id`, `name`, `pwd`, `created_at`) VALUES ('2', '牛B', '555', '1559318400'); INSERT INTO `user` (`id`, `name`, `pwd`, `created_at`) VALUES ('3', '牛C', '555', '1573441871'); INSERT INTO `user` (`id`, `name`, `pwd`, `created_at`) VALUES ('4', '牛X', '555', '1558329240');

elasticsearch浅入
文章图片




下面开始进行导入数据,我使用的是go-mysql-elasticsearch开源库,根据官方项目的README.md步骤进行开箱即用。
# ①:进入项目主目录 cd $GOPATH/src/github.com/siddontang/go-mysql-elasticsea# ②:在主目录键入下面命令,编译运行makefile文件,对工具进行编译和安装 make# ③:修改配置文件$GOPATH/src/github.com/siddontang/go-mysql-elasticsea/etc/river.toml,具体配置的内容在下面会附上 vim etc/river.toml# ④:运行,工具将会把数据库的内容导入elasticsearch中 ./bin/go-mysql-elasticsearch -config=./etc/river.toml




导入完成之后,控制台并没有结束,还一直在监听msyql数据库的变化,比如这时候如果表新增了一条记录,那么也会实时同步导入到elasticsearch中,并且控制台也会打印一条日志信息,表示binlog有了变化(如下图中红框中的日志信息,为能明显表示前后差异,中间用空白来表现前后的binlog的变化)
elasticsearch浅入
文章图片

下面是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的ip地址 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" stat_path = "/metrics"# pseudo server id like a slave server_id = 1001# 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 = https://www.it610.com/article/false# 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]] # mysql数据库名 schema = "test" # 数据库"test"库下的某张表 tables = ["user"]# Below is for special rule mapping# Very simple example # # desc t; # +-------+--------------+------+-----+---------+-------+ # | Field | Type| Null | Key | Default | Extra | # +-------+--------------+------+-----+---------+-------+ # | id| int(11)| NO| PRI | NULL|| # | name| varchar(256) | YES|| NULL|| # +-------+--------------+------+-----+---------+-------+ # # The table `t` will be synced to ES index `test` and type `t`. [[rule]] schema = "test" table = "user" # ES中index名 index = "user" # ES中的文档类型 type = "testtype"




在浏览器输入下面命令
# 其中{{index}}是指es中对应的index名,比如我上面设置的是index = "user" http://localhost:9200/{{index}}/_search?size=1000

数据导入成功,也能通过访问api请求到数据
elasticsearch浅入
文章图片




参考资料和扩展阅读
https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html#docker-cli-run-dev-mode
https://www.jianshu.com/p/a024dc5ade92
https://blog.csdn.net/qq_33448670/article/details/79904446
https://www.cnblogs.com/powerbear/p/11298135.html
https://www.cnblogs.com/hellxz/p/11057234.html
https://segmentfault.com/a/1190000019444936?utm_source=tag-newest
https://cloud.tencent.com/developer/article/1469924
https://segmentfault.com/a/1190000016750051
https://blog.csdn.net/qq_32101993/article/details/100021002
https://www.cnblogs.com/chenxitag/p/12320868.html
https://blog.csdn.net/u012976879/article/details/84290768
https://blog.51cto.com/11962757/2089883
https://www.jianshu.com/p/15d6241e7844
https://www.cnblogs.com/heqiuyong/p/10324934.html
https://blog.csdn.net/dog_one/article/details/97959389
https://www.jianshu.com/p/8e7e288c41b1
https://github.com/siddontang/go-mysql-elasticsearch
https://zhuanlan.zhihu.com/p/38288475
https://www.cnblogs.com/LiT-26647879-510087153/p/12433009.html

    推荐阅读