1,py-mysql-elasticsearch-sync《github 工具》
簡介:
python版本的mysql導入es的插件
通過配置config.yaml文件,該插件可以將mysql的數據導入到es中。
使用:
es-sync config.xml
程序流程:
思路為:1分析mysqldump導出數據 - > 2分析binlog
首先;會執行mysqldump指令,將mysql中的數據和數據表定義提取出來。然后使用xml解析出需要使用的部分。對比自定義的mapping規則,選擇id和字段。最終批量上傳給es服務器。
其次;程序會讀取mysql的binlog,並從binlog第一行開始讀取,直到binlog最后一行,同時將程序執行的binlog位置記錄到binlog.info中,用於下次從此開始導入數據。
最后;若已經存在binlog.info。該插件不會執行第一步的操作,而是直接從binlog.info記錄的位置開始導入數據。
以下操作說明:
如下操作是將數據庫清空后,打開了數據庫binlog,然后往數據庫插入數據。數據插入完畢后,開始向es導數據。
因此遇到了409版本錯誤。 (因為mysqldump導出的數據就是binlog中對應的數據操作記錄)
安裝:
pip install py-mysql-elasticsearch-sync
注意可能會出現依賴包版本沖突 --- pip install --ignore-installed xxxx
添加開啟binlog的mysql配置
在mysql配置為恩建中添加以下配置
[mysqld_safe]
log-bin=mysql-bin
binlog_format=mixed
max_binlog_size=500M
binlog-do-db=testdata_big
binlog-ignore-db=mysql
server-id=1
查看mysql的binlog記錄位置
mysql> show variables like '%log_bin%';
+---------------------------------+-------------------------------------------------------+
| Variable_name | Value |
+---------------------------------+-------------------------------------------------------+
| log_bin | ON |
| log_bin_basename | /opt/lovelsl/MessageSoft/Mysql/data/mysql-bin |
| log_bin_index | /opt/lovelsl/MessageSoft/Mysql/data/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+-------------------------------------------------------+
6 rows in set (0.00 sec)
mysql的binlog處理
重置所有的binlog
reset master
刪除某個binlog文件之前的所有binlog文件
purge binary logs to 'bin-log.000021';
查看日志
show binary logs;
在導入數據到es之前,先完成es索引的創建,以及es索引中mapping的定義
導入文件,自動生成索引,一般被禁用。
創建索引:
一般為了安全性,禁止提交數據時自動創建索引。
curl -XPUT -H "Content-Type: application/json" "localhost:9200/testdata"
創建索引的mapping:
curl -XPUT -H "Content-Type: application/json" "127.0.0.1:9200/testdata/_mapping/nodes" -d '
{
"properties": {
"id": {
"type": "integer"
},
"node_flag": {
"type": "integer"
},
"owner_uid": {
"type": "keyword"
},
"parent_uid": {
"type": "keyword"
},
"node_name": {
"type": "keyword"
},
"group_name": {
"type": "keyword"
},
"interface": {
"type": "keyword"
},
"custum_name": {
"type": "keyword"
},
"osname": {
"type": "keyword"
},
"osversion": {
"type": "keyword"
},
"update_time": {
"type": "keyword"
},
"last_active_time": {
"type": "keyword"
},
"last_login_time": {
"type": "keyword"
},
"mac": {
"type": "keyword"
},
"last_local_ip": {
"type": "keyword"
},
"last_local_ip6": {
"type": "keyword"
},
"create_time": {
"type": "keyword"
},
"create_ip": {
"type": "keyword"
},
"long_ip": {
"type": "integer"
}
}
}'
修改es 的mapping:一般而言,mapping一旦創建,只能增加字段,而不能修改已經存在的mapping字段,但是允許增加一個字段。但一般多采用重建索引的方式。
這里由於long_ip的type為integer不能存儲ip地址對應的大整數,將修改為long
刪除索引:
[root@jiangmin /]# curl -XDELETE "localhost:9200/testdata"
注意,不要帶上type
重建索引:
curl -XPUT -H "Content-Type: application/json" "localhost:9200/testdata"
重建索引的mapping
同上,不做重復操作了
