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

2023-05-16

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 <<EOF
[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

#创建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 

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


 

#重新测试下,
先删除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是否有数据同步过来 

#配置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 

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

#如果只想同步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/


 

 

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 从 JSON 数组创建标记 php mySQL Google Maps v2 android

    我正在尝试从 mySQL 数据库在 Google Maps v2 上创建标记 但它不起作用 地图确实出现了 但没有标记 谁能告诉我出了什么问题以及我需要改变什么 我也尝试过让 getDouble 为 getDouble 0 和 getDou
  • mysql计算唯一行值

    TABLE quotation id clientid 1 25 2 25 3 25 4 25 5 26 如何查询有多少个不同的客户端TABLE quotation 我不希望重复的条目被计算多次 我需要的答案是2 在 1 行中 因为唯一的非
  • 如何在 PHP MYSQL 中将数据库表和每条记录从一台数据库服务器复制到另一台数据库服务器?>

    您好 我编写了一段代码 可以将数据库表从一个服务器复制到另一个服务器 但是每个表的记录没有复制 如何编写一个可以将表和每个记录从一个数据库服务器复制到另一个数据库服务器的函数 这是我的示例代码
  • 删除 mysql 数据库中超过 3 个月的行的作业

    我们使用 mysql 服务器作为集中式日志系统 我希望有一项工作来定期删除 清理超过 3 个月的表条目 做这个的最好方式是什么 提前致谢 hinling 您是否在字段中存储项目的创建日期 If so DELETE FROM myTable
  • MySQL - 从表中删除空值行

    我有一张桌子 user 有超过 60 列 其中一列的名称是 用户名 我想删除其中的行username字段为空或NULL 我怎样才能做到这一点 谢谢你 Try this DELETE FROM user WHERE username IS N
  • 从 Yii2 中的联结表检索数据

    我试图从 Yii2 中的连接表获取数据无需额外查询 我有 2 个模型 用户 组 通过连接表 user group 关联 在 user group 表中 我想存储此关系的额外数据 管理标志 将数据添加到连接表的最佳方法是什么 link 方法接
  • MySQL 获取时间优化

    o我有一个包含 200 万个寄存器的表 但它很快就会增长得更多 基本上 该表包含具有相应描述符的图像的兴趣点 当我尝试执行选择在空间上靠近查询点的点的查询时 总执行时间花费太长 更准确地说 持续时间 获取 0 484 秒 27 441 秒
  • 更新\插入数据从grafana到mysql

    可以从grafana更新数据或插入数据到mysql 我需要使用 UI 在 mysql 中插入 更新信息 现在我已经在使用grafana 所以想知道是否有任何方法可以使用grafana来更新或插入信息 没有用于获取用户输入并将该数据插入 My
  • PHP MySQL 查询带有 %s 和 %d

    SELECT COUNT AS test FROM s WHERE id d AND tmp mail lt gt 什么是 s and d for 这些是使用的格式符号 例如经过sprintf 例子 Output SELECT COUNT
  • 如果一列没有值,MySQL 返回最大值或 null

    我尝试获取 mysql select 的最大值 但如果有一行不包含时间戳 则希望将其设置为 null empty 0 表统计数据 简化 ID CLIENT ORDER DATE CANCEL DATE 1 5 1213567200 2 5
  • 从所有表中选择

    我的数据库中有很多表都具有相同的结构 我想从所有表中进行选择 而不必像这样列出所有表 SELECT name FROM table1 table2 table3 table4 我尝试过 但这不起作用 SELECT name FROM 有没有
  • Mysql获取特定表的最后一个id

    我必须从特定的插入表中获取最后的插入 ID 可以说我有这个代码 INSERT INTO blahblah test1 test 2 VALUES test1 test2 INSERT INTO blahblah2 test1 test 2
  • 无需 cron 在后台发送邮件

    我想知道是否有一种方法可以运行 PHP 循环 以便在后台向订阅者发送几百封电子邮件 我的目标是格式化新闻通讯 单击发送 然后关闭浏览器或更改页面 当然 发送电子邮件的实际过程将在后台运行 不会因浏览器关闭而中断 我知道这可以通过 cron
  • MySQL中如何存储小数?

    我尝试过将 DECIMAL 与 2 2 一起使用 但它不允许我使用它 我只想存储一个数字 例如 7 50 或 10 50 我需要将这两个数字保留在小数点后 但是当我刷新数据库时 它会将值重置为 0 99 有什么建议么 第一个参数DECIMA
  • WHERE 条件基于 PK 的查询是否建议使用“LIMIT 1”?

    我正在查询 mySQL 数据库以检索 1 个特定行的数据 我使用表主键作为 WHERE 约束参数 E g SELECT name FROM users WHERE userid 4 userid 列是表的主键 在 mySQL 语句末尾使用
  • INNER JOIN 后从多个表获取最大日期

    我有以下两个表 table 1 ID HOTEL ID NAME 1 100 xyz 2 101 pqr 3 102 abc table 2 ID BOOKING ID DEPARTURE DATE AMOUNT 1 1 2013 04 1
  • Laravel:使用 Faker 播种多个独特的列

    介绍 怎么样 伙计们 我有一个关于模型工厂和多个独特列的问题 背景 我有一个名为 Image 的模型 该模型将语言支持存储在单独的模型中 图片文字 图片文字 has an image id栏 语言栏和文本栏 图片文字有一个约束MySQL那个
  • mysql LIKE 查询时间太长

    SQL SELECT COUNT usr id as total results FROM users as usr LEFT JOIN profile as prof ON prof uid usr uid WHERE usr usern
  • 如何在php中根据url从mysql获取数据?

    我在 mysql 数据库中有一个页表 其中包含 page name title content author 字段 我想用 php 来获取它http www domain com index php page page name http
  • 退出 PHP 脚本后终止或停止 MySQL 查询

    我在工作中运行一个统计服务器 由于运行的查询量很大 该服务器有时会变得非常慢 我们的营销团队使用它作为主要统计工具 团队中的某些人有时会在脚本结束之前退出脚本 通过关闭浏览器或选项卡 同时 SQL 查询继续执行 当有人关闭或离开 PHP 脚

随机推荐

  • 深度学习中的优化算法之SGD

    之前在https blog csdn net fengbingchun article details 75351323 介绍过梯度下降 xff0c 常见的梯度下降有三种形式 xff1a BGD SGD MBGD xff0c 它们的不同之处
  • CMake中include_directories的使用

    CMake中include directories命令用于在构建 build 中添加包含目录 其格式如下 include directories AFTER BEFORE SYSTEM dir1 dir2 将给定的目录添加到编译器 comp
  • CMake中target_link_libraries的使用

    CMake中的target link libraries命令用于指定链接给定目标和 或其依赖项时要使用的库或标志 来自链接库目标的使用要求将被传播 propagated 目标依赖项的使用要求会影响其自身源代码的编译 其格式如下 xff1a
  • CMake中install的使用

    CMake中的install命令用于指定安装时要运行的规则 xff0c 其格式如下 xff1a install TARGETS targets EXPORT lt export name gt RUNTIME DEPENDENCIES ar
  • 相机的内参和外参介绍

    注 xff1a 以下相机内参与外参介绍除来自网络整理外全部来自于 视觉SLAM十四讲从理论到实践 第2版 中的第5讲 xff1a 相机与图像 xff0c 为了方便查看 xff0c 我将每节合并到了一幅图像中 相机与摄像机区别 xff1a 相
  • Linux下常用的C/C++开源Socket库

    1 Linux Socket Programming In C 43 43 http tldp org LDP LG issue74 tougher html 2 ACE http www cs wustl edu schmidt ACE
  • C++11中unique_ptr的使用

    在C 43 43 中 xff0c 动态内存的管理是通过一对运算符来完成的 xff1a new xff0c 在动态内存中为对象分配空间并返回一个指向该对象的指针 xff0c 可以选择对对象进行初始化 xff1b delete xff0c 接受
  • 2021年校招软件测试工程师经典面试题,月薪15K你需要掌握哪些知识点?

    软件测试工程师 xff0c 和开发工程师相比起来 xff0c 前期可能不会涉及太深奥的内容 xff0c 但是涉及的面还是比较广的 面试实习生或者一年左右的岗位 xff0c 问的也主要是一些基础性的问题比较多 涉及的知识主要有MySQL数据库
  • 矩阵特征分解介绍及雅克比(Jacobi)方法实现特征值和特征向量的求解(C++/OpenCV/Eigen)

    对角矩阵 diagonal matrix xff1a 只在主对角线上含有非零元素 xff0c 其它位置都是零 xff0c 对角线上的元素可以为0或其它值 形式上 xff0c 矩阵D是对角矩阵 xff0c 当且仅当对于所有的i j Di j
  • HTTP解析库http-parser简介及使用

    http parser是一个用C编写的HTTP消息解析器 xff0c 可以解析请求和响应 xff0c 被设计用于高性能HTTP应用程序 它不会进行任何系统调用及内存分配 xff0c 它不会缓冲数据 xff0c 它可以被随时中断 根据你的体系
  • k8s之multus cni

    通常情况下在k8s中 xff0c 一个pod只有一个接口 xff0c 用于集群网络中pod和pod通信 xff0c 而multus定义了一种crd Kubernetes Network Custom Resource Definition
  • 【机器学习】浅析机器学习各大算法的适用场景

    最近在参加一个分类算法竞赛 xff0c 也正好整理各个分类机器学习算法的简单介绍 xff0c 应用场景和优缺点 资源来自网上和自己个人理解 一 逻辑回归模型 1 理解逻辑回归模型 xff08 LR xff09 逻辑回归是一种分类算法 xff
  • 【机器学习】异常检测算法之(KNN)-K Nearest Neighbors

    sklearn库里的KNN并没有直接用于异常检测 xff0c 但是包含了距离计算的函数 xff0c 所以我们应用PyOD中KNN库进行异常检测 xff0c 里面基本上也是调用sklearn的函数进行计算 xff0c 并进行了一些加工 一 图
  • 异常检测从入门到应用

    作者 xff1a 成森 64 知乎 来源 xff1a https zhuanlan zhihu com p 116235115 异常检测 Anomaly Detection 作为机器学习的一个重要分支 xff0c 实际应用领域广泛 xff0
  • Jetson Nano配置踩坑全记录

    Jetson Nano配置踩坑全记录 Jetson Nano相关参数 xff1a JetPack 4 6 xff0c cuda 10 2 xff0c SD卡内存 xff1a 512G 一 Jetson Nano系统镜像烧录 在Nvidia官
  • kubeadm的rbac

    什么是 Kubernetes RBAC 基于角色的访问控制 xff08 Role Based Access Control 即 34 RBAC 34 xff09 xff1a 使用 rbac authorization k8s io API
  • kubeadm部署dashboard-2.0.0版本

    kubeadm部署dashboard 2 0 0版本 创建dashboard的secret的私钥 root 64 yunwei CA openssl genrsa out od com key 2048 创建dashboard的secret
  • redis5.0的主从跟哨兵

    redis的主从跟哨兵 安装redis 5 0 12 下载地址 xff1a https download redis io releases 1 下载安装redis root 64 master01 cd opt root 64 maste
  • ROS运行gazebo提示“process has die”问题-已解决

    ROS运行gazebo提示 process has die 问题 已解决 解决方案概述升级gazebo方法 解决方案概述 无数次出现这个问题 xff0c 看了好多教程 xff0c 有的是把这个命令添加到 bashrc文件中 xff1a ex
  • 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 实例称为一个节点 xff0c 而集群