Elasticsearch7.9集群部署,head插件,canal同步mysql数据到es,亲自测试,无坑

Elasticsearch集群部署 

1、服务器规划
10.4.7.11 node1
10.4.7.12 node2
10.4.7.13 node3

1. 集群相关
     一个运行中的 Elasticsearch 实例称为一个节点,而集群是由一个或者多个拥有相同 cluster.name 配置的
    节点组成,它们共同承担数据和负载的压力。当有节点加入集群中或者从集群中移除节点时,集群将会重新平均
    分布所有的数据。当一个节点被选举成为主节点时,它将负责管理集群范围内的所有变更,例如增加、删除索引,
    或者增加、删除节点等。而主节点并不需要涉及到文档级别的变更和搜索等操作,所以当集群只拥有一个主节点
    的情况下,即使流量的增加它不会成为瓶颈。 任何节点都可以成为主节点。我们的示例集群就只有一个节点,所
    以它同时也成为了主节点。作为用户,我们可以将请求发送到 集群中的任何节点 ,包括主节点。 每个节点都知
    道任意文档所处的位置,并且能够将我们的请求直接转发到存储我们所需文档的节点。 无论我们将请求发送到哪
    个节点,它都能负责从各个包含我们所需文档的节点收集回数据,并将最终结果返回給客户端。 Elasticsearch 
    对这一切的管理都是透明的。

解释: 
status 字段指示着当前集群在总体上是否工作正常。
它的三种颜色含义如下:
   green:所有的主分片和副本分片都正常运行。
   yellow:所有的主分片都正常运行,但不是所有的副本分片都正常运行。
   red:有主分片没能正常运行
   
1. 分片:
     一个分片是一个底层的工作单元 ,它仅保存了全部数据中的一部分。一个分片是一个 Lucene 的实例,它本身
    就是一个完整的搜索引擎。我们的文档被存储和索引到分片内,但是应用程序是直接与索引而不是与分片进行交互。
  Elasticsearch 是利用分片将数据分发到集群内各处的。分片是数据的容器,文档保存在分片内,分片又被分配到
    集群内的各个节点里。 当你的集群规模扩大或者缩小时, Elasticsearch 会自动的在各节点中迁移分片,使得数据
    仍然均匀分布在集群里。
    
     一个分片可以是 主 分片或者 副本 分片。 索引内任意一个文档都归属于一个主分片,所以主分片的数目决定着
    索引能够保存的最大数据量。一个索引必须创建主分片,副本分片可以没有。
  分片和主流关系型数据库的表分区的概念有点类似。

2. 副本:
  一个副本分片只是一个主分片的拷贝。副本分片作为硬件故障时保护数据不丢失的冗余备份,并为搜索和返回文档等读操作提供服务。

  如果主分片有3个,那么一个副本replica就对应有1X3=3个replica shard副本分片。
     副本分片数量计算公式 = 副本数量repilca num X 主分片数量primary shard num
  在索引建立的时候就已经确定了主分片数,但是副本分片数可以随时修改。也就是说分片数量不允许修改,副本数量可以修改。

3. 分片与副本的关系:
   每个主分片(primary shard)不会和副本分片(replica shard)存在于同一个节点中,有效的保证es的数据高可用性。
   例如1:比如一个索引有3个分片和1副本,那么一共就有3*2=6个分片,3个是主分片,3个是副本分片,每个主分片都会对应一个副本分片。
   例如2:只有2个节点,但是有3个分片和2个副本,这样的情况就会导致分片无法完全分配,因为主分片和副本分片不能存在于同一个节点中。
 

#三台都要执行初始化配置
[root@localhost ~]# vim /etc/sysctl.conf
vm.max_map_count=655360
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=1
net.ipv4.tcp_fin_timeout=30
net.ipv4.ip_forward=1

[root@localhost ~]# sysctl -p  #修改完执行使其生效

[root@localhost ~]# vim /etc/security/limits.conf
#新增内容如下:
*    soft    nofile    655360
*    hard    nofile    655360
*    soft    memlock    unlimited
*    hard    memlock    unlimited
*    soft    nproc    65535
*    hard    nproc    65535
*    -       as    unlimited

2.安装es
[root@localhost ~]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.9.3-linux-x86_64.tar.gz
[root@localhost ~]# mkdir -p /app /data/elasticsearch
[root@localhost ~]# tar -zxf elasticsearch-7.9.3-linux-x86_64.tar.gz -C /app
[root@localhost app]# ln -sv /app/elasticsearch-7.9.3 /app/elasticsearch

#修改配置文件
[root@localhost elasticsearch]# vi /app/elasticsearch/config/elasticsearch.yml
cluster.name: es-cluster   #集群名称
node.name: node1
network.host: 10.4.7.11
http.port: 9200
transport.tcp.port: 9300
discovery.seed_hosts: ["10.4.7.11", "10.4.7.12", "10.4.7.21"]
cluster.initial_master_nodes: ["10.4.7.11", "10.4.7.12", "10.4.7.21"]
discovery.zen.minimum_master_nodes: 1
indices.query.bool.max_clause_count: 10240

cluster.max_shards_per_node: 10000
gateway.recover_after_nodes: 1
bootstrap.memory_lock: true
bootstrap.system_call_filter : false

#开启x-pack安全验证
xpack.security.enabled: true
xpack.security.audit.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
path.data: /data/elasticsearch
path.logs: /app/elasticsearch/logs

#调整内存大小
[root@localhost elasticsearch]# egrep -v "#|^$" /app/elasticsearch/config/jvm.options|head -2
-Xms2g
-Xmx2g

#修改elasticsearch自带jdk的路径变量,在文件最前面
[root@localhost app]# vi /app/elasticsearch/bin/elasticsearch
export JAVA_HOME=/app/elasticsearch/jdk
export PATH=$JAVA_HOME/bin:$PATH

#修改配置文件中node.name并且授权es用户目录权限
[root@localhost app]# useradd es && chown -R es.es /app/elasticsearch* && chown -R es.es /data/elasticsearch

# 开启x-pack安全验证
#生成证书
[root@localhost ~]# /app/elasticsearch/bin/elasticsearch-certutil cert -out /app/elasticsearch/config/elastic-certificates.p12 -pass ""

#以es用户启动服务
su -c '/app/elasticsearch/bin/elasticsearch -d' es

3.node2,node3安装
[root@localhost ~]# mkdir -p /app /data/elasticsearch
[root@localhost ~]# scp -rp 10.4.7.11:/app/elasticsearch-7.9.3/ /app/
[root@localhost ~]# ln -sv /app/elasticsearch-7.9.3 /app/elasticsearch
[root@localhost ~]# useradd es && chown -R es.es /app/elasticsearch* && chown -R es.es /data/elasticsearch

#node2,node3启动es
[root@localhost ~]# su -c '/app/elasticsearch-7.9.3/bin/elasticsearch -d' es

4.三台都起来了,设置密码,这里是手动设置指定的密码,如果三台都没起来,设置密码会报错,
下面都是一些用户设置密码,统一设置密码为:Elastic123
[root@k8s-node1 config]# /app/elasticsearch/bin/elasticsearch-setup-passwords interactive


设置集群分片最大数
[root@localhost ~]curl -XPUT  -u elastic:Elastic123 -H "Content-Type: application/json" http://10.4.7.11:9200/_cluster/settings -d '{"transient": {"cluster": {"max_shards_per_node":10000}}}'

5.安装head插件,只需要再集群之间任何一台安装就可以了
[root@localhost ~]# curl -sL -o /etc/yum.repos.d/khara-nodejs.repo  https://copr.fedoraproject.org/coprs/khara/nodejs/repo/epel-7/khara-nodejs-epel-7.repo
[root@localhost ~]# yum install -y nodejs nodejs-npm
[root@localhost ~]# npm --version
[root@localhost ~]# node --version


6. 安装grunt ,grunt是一个很方便的构建工具,可以进行打包压缩,测试,执行,5.0里的
head插件就是通过grunt启动的,
下载地址:https://github.com/mobz/elasticsearch-head
下载zip包
# 进入 elasticsearch-head 文件夹,执行命令
[root@localhost ~]# unzip elasticsearch-head-master.zip 
[root@localhost ~]# cd elasticsearch-head-master/

#设置淘宝源,安装会快点
[root@localhost elasticsearch-head-master]# npm config set registry http://registry.npm.taobao.org
[root@localhost elasticsearch-head-master]# npm install -g grunt-cli
[root@localhost elasticsearch-head-master]# npm install

7. Gruntfile.js 文件
修改 elasticsearch-head 目录下的 Gruntfile.js 文件,在 options 属性内增加 hostname,设置为 0.0.0.0
connect: {
    server: {
        options: {
            hostname: '0.0.0.0',   #添加这行,注意逗号。
            port: 9100,
            base: '.',
            keepalive: true
        }
    }
  }

#修改head服务器连接es地址,添加es集群的任何节点。
[root@localhost elasticsearch-head-master]# vi _site/app.js 
原来
this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://localhost:9200";
修改localhost为:
this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://10.4.7.21:9200";

8.运行head启动node.js,必须在elasticsearch-head-master目录下
[root@localhost elasticsearch-head-master]# nohup grunt server > grunt.log 2>&1 &

9.es各个节点在elasticsearch.yml添加下面内容。
[root@localhost app]# vi /app/elasticsearch/config/elasticsearch.yml
#添加es-head可以跨域连接
http.cors.enabled: true
http.cors.allow-origin: "*"

#配置es-head验证Authorization
http.cors.allow-methods: OPTIONS, HEAD, GET, POST, PUT, DELETE
http.cors.allow-headers: Authorization,X-Requested-With,X-Auth-Token,Content-Type, Content-Length 

10,重启es集群各个节点
#配置es启动服务脚本
[root@localhost ~]# ps aux|grep elasticsearch | grep -v grep |awk '{print $2}'|xargs kill -9 2>/dev/null 
[root@localhost ~]# su -c '/app/elasticsearch-7.9.3/bin/elasticsearch -d' es


11.浏览器登录es-head,配置es什么节点就访问什么ip,使用用户密码验证
http://10.4.7.21:9100/?auth_user=elastic&auth_password=Elastic123

12.如果记不得之前的账号,可以创建新的账号,具有超级用户内置角色。
#创建用户
[root@localhost opt]# /app/elasticsearch/bin/elasticsearch-users useradd admin -p Admin123 -r superuser
[root@localhost opt]# /app/elasticsearch/bin/elasticsearch-users list
admin          : superuser

[root@localhost opt]# curl -u admin:Admin123 http://10.4.7.11:9200/_nodes/process?pretty

#基本操作
查看集群状态
[root@localhost ~]# curl -u elastic:Elastic123 -XGET http://10.4.7.11:9200/_cat/health?v

#查看节点状态
[root@localhost ~]# curl -u elastic:Elastic123 -XGET http://10.4.7.11:9200/_cat/nodes?v

#查看索引状态
[root@localhost ~]# curl -u elastic:Elastic123 -XGET http://10.4.7.11:9200/_cat/indices?v

#查看es集群
[root@localhost ~]# curl -u elastic:Elastic123 -XGET http://10.4.7.11:9200/_cluster/health?pretty
{
  "cluster_name" : "es-cluster",
  "status" : "green",   #状态为green
  "timed_out" : false,
  "number_of_nodes" : 3,
  "number_of_data_nodes" : 3,
  "active_primary_shards" : 4,   #4个主分片
  "active_shards" : 10,        #10个分片
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}

#查看分片
[root@localhost ~]# curl -u elastic:Elastic123 -XGET http://10.4.7.11:9200/_cat/shards

13.备份security索引,担心删除,无法登录使用。
#查看以前的security的索引
[root@localhost nodes]# curl -u admin:Admin123 -XGET http://10.4.7.11:9200/.security-*

#删除security索引
[root@localhost nodes]# curl -u admin:Admin123 -X DELETE http://10.4.7.11:9200/.security-*

#创建备份目录,每个es集群节点都要添加。
[root@localhost ~]# mkdir -p /data/es-backups/
[root@localhost ~]# chown -R es.es /data/es-backups/

#添加内容到配置文件里
[root@localhost ~]# vi /app/elasticsearch/config/elasticsearch.yml
#备份配置目录
path.repo: ["/data/es-backups/"]

#重启es各个节点
[root@localhost ~]# ps aux|grep elasticsearch | grep -v grep |awk '{print $2}'|xargs kill -9 2>/dev/null 
[root@localhost ~]# su -c '/app/elasticsearch-7.9.3/bin/elasticsearch -d' es

14.安装es的分词器
安装包地址:https://github.com/medcl/elasticsearch-analysis-ik/releases,
需要注意
  要下载与自己版本一致的,版本不一致的可能会有问题。

在es的安装地址下,plugins文件夹中创建目录ik
解压安装包到ik文件夹中
https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.9.3/elasticsearch-analysis-ik-7.9.3.zip

#安装ik分词器插件,先在10.4.7.11上操作,然后拷贝es集群其他节点。
[root@localhost ~]# wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.9.3/elasticsearch-analysis-ik-7.9.3.zip
[root@localhost ~]# mkdir /app/elasticsearch/plugins/analysis-ik/
[root@localhost ~]# cp /root/elasticsearch-analysis-ik-7.9.3.zip /app/elasticsearch/plugins/analysis-ik
[root@localhost ~]# cd /app/elasticsearch/plugins/analysis-ik
[root@localhost analysis-ik]# unzip elasticsearch-analysis-ik-7.9.3.zip 
[root@localhost analysis-ik]# chown -R es.es /app/elasticsearch*

#拷贝
[root@localhost plugins]# scp -rp /app/elasticsearch/plugins/analysis-ik 10.4.7.12:/app/elasticsearch/plugins/
[root@localhost plugins]# scp -rp /app/elasticsearch/plugins/analysis-ik 10.4.7.21:/app/elasticsearch/plugins/

#重启es各个节点
[root@localhost ~]# chown -R es.es /app/elasticsearch*
[root@localhost ~]# ps aux|grep elasticsearch | grep -v grep |awk '{print $2}'|xargs kill -9 2>/dev/null 
[root@localhost ~]# su -c '/app/elasticsearch/bin/elasticsearch -d' es

#查看日志,会有下面信息输出
[root@localhost ~]# tailf -200 /app/elasticsearch/logs/es-cluster.log 
[2022-01-21T03:59:00,462][INFO ][o.e.p.PluginsService     ] [node1] loaded module [x-pack-security]
[2022-01-21T03:59:00,462][INFO ][o.e.p.PluginsService     ] [node1] loaded module [x-pack-sql]
[2022-01-21T03:59:00,464][INFO ][o.e.p.PluginsService     ] [node1] loaded module [x-pack-stack]
[2022-01-21T03:59:00,464][INFO ][o.e.p.PluginsService     ] [node1] loaded module [x-pack-voting-only-node]
[2022-01-21T03:59:00,466][INFO ][o.e.p.PluginsService     ] [node1] loaded module [x-pack-watcher]
[2022-01-21T03:59:00,467][INFO ][o.e.p.PluginsService     ] [node1] loaded plugin [analysis-ik]  #这里插件

ik分词器提供3种分词模式
1: default : 把需要分词的文本一个词一个词来拆分。
2:ik_smart :将需要分词的文本做最大颗粒的拆分。
3:ik_max_word:将需要分词的文本最小颗粒的拆分,尽量分更多的词。

#测试分词器的,
[root@localhost opt]# curl -u elastic:Elastic123 -H "Content-Type: application/json" -XGET http://10.4.7.12:9200/_analyze?pretty -d '
{
  "text": "美国留给?",     # 对这个text类型文本进行分词                   
  "analyzer": "ik_max_word"  #指定ik分词模式
}'
{
  "tokens" : [
    {
      "token" : "美国",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "留给",
      "start_offset" : 2,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 1
    }
  ]
}

#对于ik分词器是:索引时使用ik_max_word将搜索内容进行最细颗粒度分词,搜索时使用ik_smart最粗颗粒分词,提高搜索精确度。
#下面创建一个xc_course索引库,定义映射关系。相当于mysql的表结构
[root@localhost ~]# curl -u elastic:Elastic123 -H "Content-Type: application/json" -XPOST http://10.4.7.11:9200/xc_course/doc/ -d '
{
    "properties": {
           "name": {
              "type": "text",    #name字段类型为文本
              "analyzer": "ik_max_word",   #指定name的字段索引分词器
              "search_analyzer": "ik_smart"  #指定name的字段搜索分词器
           },
           "description": {
              "type": "text"
           },
           "studymodel": {
              "type": "keyword"  #精确匹配,不进行分词。
           },
           "pic": {
              "type": "text",
              "index": false     #指定pic字段关闭索引。
           }
        }
}'

#对xc_source索引添加文档
[root@localhost ~]# curl -u elastic:Elastic123 -H "Content-Type: application/json" -XPOST http://10.4.7.11:9200/xc_course/doc/ -d '
{
  "name":"Bootstrap开发框架",
  "description":"Bootstrap是由Twitter推出的一个前台页面开发框架,在行业之中使用较为广泛。此开发框架包含了大量的CSS、JS程序代码,可以帮助开发者(尤其是不擅长页面开发的程序人员)轻松的实现一个不受浏览器限制的精美界面效果。",
  "studymodel":"201001",
  "pic": "haha"
}'


15.安装canal,同步mysql数据到es,mysql必须开启binlog日志,canal-deployer服务相当于slave节点,canal-deployer会通过io线程去读取mysql的binlog日志。
#先安装mysql
[root@localhost ~]# cat mysql_install.sh 
#!/bin/bash
id mysql 2>&1 >/dev/null
if [ $? -eq 0 ];then
  echo "mysql user is exists"
else
  useradd  -s /sbin/nologin  -M mysql
fi

rm -rf /home/mysql_data
rm -rf /usr/local/mysql
cd /usr/local/src
wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz
tar -zxf mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz
mv mysql-5.7.17-linux-glibc2.5-x86_64 /usr/local/mysql
mkdir -pv /home/mysql_data/{data,logs,tmp,mysql-bin}
chown -R mysql.mysql /usr/local/mysql
chown -R mysql.mysql /home/mysql_data/

cat >/etc/my.cnf < [client]
port = 3306
socket = /usr/local/mysql/mysql.sock
default_character_set=utf8

[mysql]
prompt="\u@\h [\d]>" 
no-auto-rehash
default_character_set=utf8

[mysqld]
character_set_server = utf8
user = mysql
basedir = /usr/local/mysql
datadir = /home/mysql_data/data
tmpdir = /home/mysql_data/tmp
port = 3306
server-id = 26
socket = /usr/local/mysql/mysql.sock 
event_scheduler = 0
open_files_limit = 65535
log_error = /home/mysql_data/logs/error.log
binlog_format = row
log-bin = /home/mysql_data/mysql-bin/mysqlbin-log
max_binlog_size = 1024M
sync_binlog = 1
expire_logs_days = 7
EOF

/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf   --initialize
\cp -rf /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld 
/etc/init.d/mysqld start 
chkconfig --add mysqld
chkconfig mysqld on

#执行脚本

[root@localhost ~]# chmod +x mysql_install.sh 
[root@localhost ~]# ./mysql_install.sh 
[root@localhost ~]# echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
[root@localhost ~]# source /etc/profile

.修改初始密码
查看初始密码:

[root@localhost ~]# grep "password" /home/mysql_data/logs/error.log  
2017-05-08T07:49:40.620503Z 1 [Note] A temporary password is generated for root@localhost: q=8jh*JpNar)
初始密码为: q=8jh*JpNar) 每次初始化密码都不会相同;

[root@localhost ~]# mysql -uroot -p -S /usr/local/mysql/mysql.sock 初始密码

mysql > alter user 'root'@'localhost' identified by '123456';   #修改密码为:123456
mysql > flush privileges;

#接下来需要创建一个拥有从库权限的账号,用于订阅binlog
# 这里创建的账号为canal,并且设置密码

root@localhost [(none)]>GRANT all privileges ON *.* TO 'canal'@'%' identified by 'canal123';
Query OK, 0 rows affected, 1 warning (0.01 sec)

root@localhost [statement]>GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'root'@'127.0.0.1' identified by 'root123';
Query OK, 0 rows affected, 1 warning (0.02 sec)

root@localhost [(none)]>FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.04 sec)

#创建好测试用的数据库statement,之后创建一张表track
建表语句如下:
root@localhost [(none)]>create database statement;
Query OK, 1 row affected (0.01 sec)

root@localhost [(none)]>use statement
root@localhost [statement]>CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(256) COLLATE utf8mb4_unicode_ci NOT NULL,
  `detail` text COLLATE utf8mb4_unicode_ci NOT NULL,
  `age` int(3) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

#插入一些数据,用于后面测试
root@localhost [statement]>insert into user values(1,"xixi","货在哪过",33);
Query OK, 1 row affected (0.01 sec)

root@localhost [statement]>insert into user values(2,"gege","你是谁",34);
Query OK, 1 row affected (0.01 sec)

root@localhost [statement]>insert into user values(3,"haha","万岁啊",35);
Query OK, 1 row affected (0.02 sec)


#安装kibana
[root@localhost opt]# wget https://artifacts.elastic.co/downloads/kibana/kibana-7.9.2-linux-x86_64.tar.gz
[root@localhost opt]# tar -zxf kibana-7.9.2-linux-x86_64.tar.gz 
[root@localhost opt]# ln -sv kibana-7.9.2-linux-x86_64 kibana
[root@localhost opt]# cd kibana/config/
[root@localhost config]# cat kibana.yml |egrep -v '^#|^$'
server.port: 5601
server.host: "10.4.7.22"
server.name: "es-kibana"
elasticsearch.hosts: ["http://10.4.7.11:9200","http://10.4.7.12:9200","http://10.4.7.21:9200"]
elasticsearch.username: "elastic"
elasticsearch.password: "Elastic123"

#启动kibana
[root@localhost opt]# nohup ./kibana/bin/kibana  --allow-root >/dev/null &

访问 kibana 页面,输入es账号:"elastic" ,密码: "Elastic123" 登入
http://10.4.7.22:5601/
复制代码
效果如下,这里点击 Explore on my own,或者选择最左侧上方的三个横杠,下面选择"Management"的Dev Tools

Elasticsearch7.9集群部署,head插件,canal同步mysql数据到es,亲自测试,无坑_第1张图片

#创建user索引,为了同步mysql的user表数据到es,在kibana的web界面操作
PUT user
{
  "settings": {
    "index": {
      "number_of_shards": "1",
      "number_of_replicas": "1"
    }
  },
  "mappings": {
    "properties": {
      "age": {
        "type": "integer"
      },
      "id": {
        "type": "long"
      },
      "name": {
        "type": "text",
        "analyzer": "ik_smart"
      },
      "detail": {
        "type": "text",
        "analyzer": "ik_max_word"
      }
    }
  }
}

#部署canal
需要下载 canal 的各个组件 canal-deployer、canal-adapter、canal-admin,、
下载地址:
https://github.com/alibaba/canal/releases

各组件简单介绍
canal-server(canal-deploy):
    可以直接监听MySQL的binlog,把自己伪装成MySQL的从库,只负责接收数据,并不做处理

canal-adapter:
    相当于canal的客户端,会从canal-server中获取数据,然后对数据进行同步,可以同步到MySQL、Elasticsearch和HBase等存储中去。

canal-admin:
    为canal提供整体配置管理、节点运维等面向运维的功能,提供相对友好的 WebUI 操作界面,方便更多用户快速和安全的操作。


#安装 canal-server,首先配置jdk
[root@localhost opt]# tar -zxf openjdk-11.0.1_linux-x64_bin.tar.gz 
[root@localhost opt]# ln -sv jdk-11.0.1/ jdk

#文件最后添加两行内容
[root@localhost opt]# vi /etc/profile
export JAVA_HOME=/opt/jdk
export PATH=$JAVA_HOME/bin:$PATH

[root@localhost opt]# source /etc/profile
 [root@localhost opt]# wget https://github.com/alibaba/canal/releases/download/canal-1.1.5-alpha-1/canal.deployer-1.1.5-SNAPSHOT.tar.gz
[root@localhost opt]# mkdir -p canal-deployer
[root@localhost opt]# tar -zxf canal.deployer-1.1.5-SNAPSHOT.tar.gz -C canal-deployer/
[root@localhost opt]# cd canal-deployer/

#canal.properties配置文件定义了canal相关参数
[root@localhost opt]# cat /opt/canal-deployer/conf/canal.properties 
。。。。。。。。。。。。。。。。。。。。。。。
#########               destinations            #############
#################################################
canal.destinations = example  #这里的example,表示使用example这个实例。可以配置多个实例,用逗号隔开。
# conf root dir
canal.conf.dir = ../conf
# auto scan instance dir add/remove and start/stop instance
canal.auto.scan = true
canal.auto.scan.interval = 5
# set this value to 'true' means that when binlog pos not found, skip to latest.
# WARN: pls keep 'false' in production env, or if you know what you want.
canal.auto.reset.latest.pos.mode = false

canal.instance.tsdb.spring.xml = classpath:spring/tsdb/h2-tsdb.xml
#canal.instance.tsdb.spring.xml = classpath:spring/tsdb/mysql-tsdb.xml

canal.instance.global.mode = spring
canal.instance.global.lazy = false
canal.instance.global.manager.address = ${canal.admin.manager}
#canal.instance.global.spring.xml = classpath:spring/memory-instance.xml
canal.instance.global.spring.xml = classpath:spring/file-instance.xml
#canal.instance.global.spring.xml = classpath:spring/default-instance.xml
。。。。。。。。。。。。。。。。。。。。。。


#配置example实例配置文件,如果配置其他的,就创建实例名称跟配置文件。
[root@localhost canal-deployer]# cat conf/example/instance.properties 
#################################################
canal.instance.mysql.slaveId=22   #跟mysql的serverid不一样就可以
# position info
canal.instance.master.address=10.4.7.22:3306   #指定连接mysql地址
# username/password
canal.instance.dbUsername=canal      #canal连接mysql的用户
canal.instance.dbPassword=canal123   #canal连接mysql的密码
canal.instance.connectionCharset = UTF-8
# table regex
#canal.instance.filter.regex=.*\\..*    #匹配mysql的所有库下的所有表
canal.instance.filter.regex=statement\\..*   #匹配statement库下的所有表

#启动canal-server服务,
在连接canal时,发现连接失败,去查canal日志canal_stdout.log发现有:
Unrecognized VM option ‘UseCMSCompactAtFullCollection’
据说是jdk版本在8以上就不可以,后来又参照了链接
发现可以删除startup.sh中的参数解决:

[root@localhost canal-server]# ./bin/startup.sh 

#查看日志,会有下面信息输出
[root@localhost canal-server]# tailf -200 logs/canal/canal.log 

#安装adapter
#配置文件修改
[root@localhost opt]# wget https://github.com/alibaba/canal/releases/download/canal-1.1.5-alpha-1/canal.adapter-1.1.5-SNAPSHOT.tar.gz
[root@localhost opt]# mkdir -p canal-adapter
[root@localhost opt]# tar -zxf canal.adapter-1.1.5-SNAPSHOT.tar.gz -C canal-adapter
[root@localhost opt]# cd canal-adapter
[root@localhost canal-adapter]# cat conf/application.yml 
[root@localhost canal-adapter]# cat conf/application.yml 
server:
  port: 8081  #adapter服务端口为8081
spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
    default-property-inclusion: non_null

canal.conf:
  mode: tcp # kafka rocketMQ
  canalServerHost: 10.4.7.22:11111  #canal-deployer服务地址
#  zookeeperHosts: slave1:2181
#  mqServers: 127.0.0.1:9092 #or rocketmq
#  flatMessage: true
  batchSize: 500
  syncBatchSize: 1000
  retries: 0
  timeout:
  accessKey:
  secretKey:
  username:
  password:
  vhost:
  srcDataSources:
    defaultDS:
      url: jdbc:mysql://10.4.7.22:3306/statement?useUnicode=true   #连接mysql的statement库
      username: canal     #在mysql上授权的用户访问statement数据库
      password: canal123  #用户密码
  canalAdapters:
  - instance: example  # canal instance Name or mq topic name
    groups:
    - groupId: g1
      outerAdapters:
      - name: es7
        key: es71   #这个很重要,必须设置,下面配置要调用。
        hosts: 10.4.7.11:9200,10.4.7.12:9200,10.4.7.21:9200   # es集群地址,逗号分隔。
        properties:
          mode: rest     #设置rest模式 
          security.auth: elastic:Elastic123   #  登录es的账号密码,如果没有设置就注释
          cluster.name: es-cluster    #es集群名称

#到conf/es7目录下新建user.yml文件,定义mysql数据到es数据的映射字段
[root@localhost es7]# cat conf/es7/user.yml 
dataSourceKey: defaultDS   #这里defaultDS就是conf/application.yml里定义连接mysql的那个字段。
outerAdapterKey: es71    #这个很重要,必须设置跟conf/application.yml的里key一样
destination: example    # # canal instance Name or mq topic name
groupId: g1
esMapping:
  _index: user    #这里的索引对应前面statement库下面的表user,在es必须提前创建好,索引类似等于mysql的表,懂的
  _type: _doc
  _id: _id
  upsert: true
#  pk: id
  sql: "select id as _id,name,detail,age from user"   #这里track表相关的字段的sql语句。
 # etlCondition: "where id>={}"    ##etl的条件参数,可以将之前没能同步的数据同步,数据量大的话可以用logstash,
  commitBatch: 3000

#启动adapter,如果启动不起来,需要修改startup.sh的下面内容,有些参数错误。
if [ -n "$str" ]; then
        JAVA_OPTS="-server -Xms256m -Xmx256m -Xmn256m -XX:SurvivorRatio=2 -XX:PermSize=96m -XX:MaxPermSize=256m -Xss256k -XX:-UseAdaptiveSizePolicy -XX:MaxTenuringThreshold=15 -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled  -XX:+UseCMSInitiatingOccupancyOnly -XX:+HeapDumpOnOutOfMemoryError"
else

#启动adapter
[root@localhost canal-adapter]# ./bin/startup.sh

#查看日志
[root@localhost canal-adapter]# tailf logs/adapter/adapter.log 
        ... 43 common frames omitted
2022-01-24 17:52:41.593 [main] INFO  c.a.o.canal.adapter.launcher.loader.CanalAdapterLoader - Start adapter for canal instance: example succeed
2022-01-24 17:52:41.594 [main] INFO  c.a.o.canal.adapter.launcher.loader.CanalAdapterService - ## the canal client adapters are running now ......
2022-01-24 17:52:41.612 [main] INFO  org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8081"]
2022-01-24 17:52:41.613 [Thread-2] INFO  c.a.o.canal.adapter.launcher.loader.CanalAdapterWorker - =============> Start to connect destination: example <=============
2022-01-24 17:52:41.670 [main] INFO  org.apache.tomcat.util.net.NioSelectorPool - Using a shared selector for servlet write/read
2022-01-24 17:52:41.716 [main] INFO  o.s.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port(s): 8081 (http) with context path ''
2022-01-24 17:52:41.830 [main] INFO  c.a.otter.canal.adapter.launcher.CanalAdapterApplication - Started CanalAdapterApplication in 20.873 seconds (JVM running for 22.881)
2022-01-24 17:52:41.888 [Thread-2] INFO  c.a.o.canal.adapter.launcher.loader.CanalAdapterWorker - =============> Start to subscribe destination: example <=============
2022-01-24 17:52:41.930 [Thread-2] INFO  c.a.o.canal.adapter.launcher.loader.CanalAdapterWorker - =============> Subscribe destination: example succeed <=============

# adapter管理REST接口
#查询所有订阅同步的canal instance或MQ topic,
[root@localhost canal-adapter]# curl http://10.4.7.22:8081/destinations
[{"destination":"example","status":"on"}]  #当前只有example实例开启

#查询数据同步开关状态,指定的实例example
[root@localhost canal-adapter]# curl http://10.4.7.22:8081/syncSwitch/example
{"stauts":"on"}

#如果是单机模式则使用本地锁来控制开关,控制开启或者关闭
[root@localhost ~]# curl -XPUT http://10.4.7.22:8081/syncSwitch/example/on
{"code":20000,"message":"实例: example 开启同步成功"}
 
#关闭
[root@localhost canal-adapter]# curl -XPUT http://10.4.7.22:8081/syncSwitch/example/off
{"code":20000,"message":"实例: example 关闭同步成功"}

#手动ETL来测试mysql数据通过canal同步到es集群里。
第一步:登录mysql,插入数据
[root@localhost data]# mysql -uroot -p123456 -S /usr/local/mysql/mysql.sock
root@localhost [(none)]>use statement;
Database changed

root@localhost [statement]>insert into user values(39,"haha","万岁啊",39);
Query OK, 1 row affected (0.04 sec)

root@localhost [statement]>insert into user values(40,"haha","万岁啊",40);
Query OK, 1 row affected (0.01 sec)

#同时查看adapter的log,

[root@localhost canal-adapter]# tailf logs/adapter/adapter.log 

Elasticsearch7.9集群部署,head插件,canal同步mysql数据到es,亲自测试,无坑_第2张图片

#这个时候查看es集群是否有数据,通过kibana的查看
GET /user/_search

Elasticsearch7.9集群部署,head插件,canal同步mysql数据到es,亲自测试,无坑_第3张图片
 

#重新测试下,
先删除user表所有数据,先添加三行数据,canal服务当前是启动的,因此会实时同步到es集群上
root@localhost [statement]>delete from user;
Query OK, 18 rows affected (0.10 sec)

root@localhost [statement]>insert into user values(1,"haha","万岁啊",1);
Query OK, 1 row affected (0.04 sec)

root@localhost [statement]>insert into user values(2,"haha","万岁啊",2);
Query OK, 1 row affected (0.03 sec)

root@localhost [statement]>insert into user values(3,"haha","万岁啊",3);

#kibana查看es是否有数据同步过来 

Elasticsearch7.9集群部署,head插件,canal同步mysql数据到es,亲自测试,无坑_第4张图片

#配置canal全量同步mysql的数据,就是说,mysql一直在写数据,而canal意外停止服务了,默认是会导致新增的mysql数据是不同步到es集群上
所以当canal服务重启后,会同步之前新增的mysql数据到es集群里。

#先停止canal-adapter服务
[root@localhost canal-adapter]# ./bin/stop.sh 

#mysql新增数据
[root@localhost data]# mysql -uroot -p123456 -S /usr/local/mysql/mysql.sock
root@localhost [(none)]>use statement;
Database changed

root@localhost [statement]>insert into user values(4,"haha","万岁啊",4);
Query OK, 1 row affected (0.06 sec)

root@localhost [statement]>insert into user values(5,"haha","万岁啊",5);
Query OK, 1 row affected (0.07 sec)

root@localhost [statement]>insert into user values(6,"haha","万岁啊",6);
Query OK, 1 row affected (0.00 sec)

root@localhost [statement]>insert into user values(7,"haha","万岁啊",7);
Query OK, 1 row affected (0.00 sec)

##到conf/es7目录下新建user.yml文件,定义mysql数据到es数据的映射字段
[root@localhost canal-adapter]# vi conf/es7/user.yml 
dataSourceKey: defaultDS
outerAdapterKey: es71
destination: example
groupId: g1
esMapping:
  _index: user
  _type: _doc
  _id: _id
  upsert: true
#  pk: id
  sql: "select id as _id,name,detail,age from user"
  etlCondition: "where id>={}"  #新增这行
  commitBatch: 3000

#启动canal-adapter服务
[root@localhost canal-adapter]# ./bin/startup.sh 

#同时查看adapter的log,最后面会看到同步canal服务停止后,mysql新增的数据
[root@localhost canal-adapter]# tailf logs/adapter/adapter.log 

Elasticsearch7.9集群部署,head插件,canal同步mysql数据到es,亲自测试,无坑_第5张图片

 #用kibana查看user的索引,mysql的user表所有数据都再es上面

Elasticsearch7.9集群部署,head插件,canal同步mysql数据到es,亲自测试,无坑_第6张图片

#如果只想同步statement数据库的user表的id为2之后的数据同步到es里,params等于后面的值,就是定义的 {}的值,表示条件: id >= 2 
[root@localhost ~]# curl  http://10.4.7.22:8081/etl/es7/es71/user.yml -X POST -d "params=2"
{"succeeded":true,"resultMessage":"导入ES 数据:6 条"}
 

16.安装canal-admin
[root@localhost opt]# tar -zxf canal.admin-1.1.5-SNAPSHOT.tar.gz -C canal-admin/
[root@localhost opt]# cd canal-admin/conf/

#导入文件,创建数据库canal_manager 
[root@localhost conf]#  mysql -uroot -p123456 -S /usr/local/mysql/mysql.sock < canal_manager.sql 
[root@localhost conf]# mysql -uroot -p123456 -S /usr/local/mysql/mysql.sock

#配置canal-admin服务
[root@localhost conf]# cat application.yml 
server:
  port: 8089   #canal-admin服务端口
spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8

spring.datasource:
  address: 10.4.7.22:3306   #mysql地址
  database: canal_manager   #canal-admin的服务数据库,管理es的集群
  username: canal           #mysql上授权用户对canal_manager数据库
  password: canal123        #mysql上用户密码
  driver-class-name: com.mysql.jdbc.Driver
  url: jdbc:mysql://${spring.datasource.address}/${spring.datasource.database}?useUnicode=true&characterEncoding=UTF-8&useSSL=false
  hikari:
    maximum-pool-size: 30
    minimum-idle: 1

canal:
  adminUser: admin
  adminPasswd: admin

#启动canal-admin服务,如果启动不起来,需要修改startup.sh 文件,参数有问题
str=`file -L $JAVA | grep 64-bit`
if [ -n "$str" ]; then
        JAVA_OPTS="-server -Xms256m -Xmx256m"  #修改下
else
        JAVA_OPTS="-server -Xms256m -Xmx256m"  #修改下
fi

JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC -XX:MaxGCPauseMillis=250"  #修改下
JAVA_OPTS=" $JAVA_OPTS -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Dfile.encoding=UTF-8"
CANAL_OPTS="-DappName=canal-admin"

for i in $base/lib/*;
    do CLASSPATH=$i:"$CLASSPATH";
done

#启动canal-admin
[root@localhost canal-admin]# ./bin/startup.sh 

#查看端口
[root@localhost canal-admin]# ss -lnt|grep 8089

#添加canal-deployer服务,配置地址跟端口就在canal_local.properties定义好的服务。
[root@localhost canal-deployer]# cat conf/canal_local.properties 
# register ip
canal.register.ip =

# canal admin config
canal.admin.manager = 127.0.0.1:8089
canal.admin.port = 11110
canal.admin.user = admin
canal.admin.passwd = 4ACFE3202A5FF5CF467898FC58AAB1D615029441
# admin auto register
canal.admin.register.auto = true
canal.admin.register.cluster = canal-server #修改这行,设置名字。

#重启canal-deployer服务
[root@localhost canal-deployer]# ./bin/stop.sh 

[root@localhost canal-deployer]# ./bin/startup.sh

#浏览器登录canal-admin,默认账号:admin ,密码为:123456,点击新建server

http://10.4.7.22:8089/

Elasticsearch7.9集群部署,head插件,canal同步mysql数据到es,亲自测试,无坑_第7张图片
 

Elasticsearch7.9集群部署,head插件,canal同步mysql数据到es,亲自测试,无坑_第8张图片Elasticsearch7.9集群部署,head插件,canal同步mysql数据到es,亲自测试,无坑_第9张图片 

#基于fs来备份还原
1.注册共享仓库,10.4.7.22作为fs备份存储
#安装nfs服务,下一篇文件会更新,

你可能感兴趣的:(运维,elasticsearch,linux,大数据)