elasticsearch浅入

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


前奏

# 搜索镜像
docker search elasticsearch

在dockerhub中搜索镜像,运行后却发现docker没运行起来。
在这里插入图片描述

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

# 重启docker服务
systemctl restart docker

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

elasticsearch浅入_第1张图片

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

在这里插入图片描述

# 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浅入_第2张图片

# 查看本地的镜像
docker images

查看镜像,注意IMAGE ID,这个将用来创建容器
在这里插入图片描述



启动一个单节点的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

在这里插入图片描述

--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浅入_第3张图片



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

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使用的不熟练,并不清楚就算容器关闭了,容器也依然存在,那么这时候,就不可以创建同名的容器,除非删除了这个容器或重命名容器。
    在这里插入图片描述
# 杀死所有正在运行的容器(注意这只是杀死了,该容器还是存在的)
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的配置
在这里插入图片描述




编辑my.cnf文件,增加以下内容

# vim /etc/my.cnf

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



完成编辑后需要重启mysql服务

# 重启mysql服务
systemctl restart mysqld.service



查看binlog的日志模式是否为ROW模式

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

在这里插入图片描述



如果不是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');

在这里插入图片描述



下面开始进行导入数据,我使用的是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浅入_第4张图片

下面是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 = 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浅入_第5张图片



参考资料和扩展阅读

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

你可能感兴趣的:(中间件)