以下的所有操作是发生在centos7.5下的,另请先自行准备docker环境,下面将会用docker来安装一个单节点的elasticsearch,有很多文章说elasticsearch不可以用root用户,但是我用的就是root用户,至于为什么不可以,还有至于为什么又可以,学识浅微,目前并不知道,等以后该系列更新到一定程度后,我想我就可以解答了吧。
前奏
# 搜索镜像
docker search elasticsearch
在dockerhub中搜索镜像,运行后却发现docker没运行起来。
文章图片
# 重新加载某个服务的配置文件,如果新安装了一个服务,归属于 systemctl 管理,要是新服务的服务程序配置文件生效,需重新加载
systemctl daemon-reload# 重启docker服务
systemctl restart docker
启动docker服务后我们再来搜索一下elasticsearch镜像,能看到列出十分多的镜像,出于安全考虑,将会选择官方的elasticsearch镜像。
文章图片
由于镜像是在国外的,下载速度将会十分的慢,将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镜像
文章图片
# 查看本地的镜像
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/
,出现图片里的情况即为成功访问文章图片
坑
一个衷心的建议,有坑的时候,一定要先查看日志,根据报错信息找到问题所在
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
【elasticsearch浅入】完成编辑后需要重启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的变化)
文章图片
下面是
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请求到数据
文章图片
参考资料和扩展阅读
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
推荐阅读
- Redis|Redis性能解析--Redis为什么那么快()
- 程序设计|IT业比较好的几个社区论坛
- 1. GRPC的使用
- Redis事务处理不回滚
- 数据库|replication-manager之switchover剖析
- API Gateway 技术选型
- java|什么拜占庭将军问题(比特币是如何解决的?——深入浅出分布式共识性(一))
- 中间件|中间件 — Apache POI & EasyExcel(POI读写03和07版本excel、EasyExcel读写07版本excel)
- Springboot整合RabbitMQ--初学者探路者