tonglin0325的个人主页

分屏工具xpanes

参考:https://www.ctolib.com/greymd-tmux-xpanes.html

1
2
brew install tmux-xpanes

 或者

1
2
3
4
5
6
7
# Install `add-apt-repository` command, if necessary.
$ sudo apt install software-properties-common

$ sudo add-apt-repository ppa:greymd/tmux-xpanes
$ sudo apt update
$ sudo apt install tmux-xpanes

使用

1
2
xpanes -c "ssh {}" xxxx-{52..60}

 

MySQL自增id不连续问题

项目中有一张表是记录人员,在每个新用户调用接口认证通过了之后,会有一个往该表插入这个新用户信息的操作。

但是在线上环境中,发现该表的自增id不连续,且间隔都是差了2,比如上一个人的id是10,下一个人的id就是12,而在前端页面中,一个用户认证通过后,会调用3个接口,初步排查是MySQL并发操作导致了自增id不连续的情况

在这篇文章中,列举了导致自增id不连续的几个原因,这次遇到的就是第一种情况,因为个人的信息中我设置了唯一索引,参考:MySQL实战45讲Day38—-自增主键不是连续的原因

<1>、唯一键冲突是导致自增主键id不连续的第一种原因

<2>、事务回滚是导致自增主键id不连续的第二种原因

<3>、批量申请自增id的策略是导致自增主键id不连续的第三种原因

在这篇文章中提到了MySQL默认的innodb_autoinc_lock_mode=1,当innodb_autoinc_lock_mode=1和innodb_autoinc_lock_mode=2的情况下,自增id可能会出现不连续

在innodb_autoinc_lock_mode=0的时候,自增id是连续的,但是会导致锁表,影响并发性能

参考:INNODB自增主键的一些问题

再谈MySQL auto_increment空洞问题

全文 >>

Ubuntu16.04安装zkui

1.git clone

1
2
git clone git@github.com:DeemOpen/zkui.git

2.打包

1
2
mvn clean install

3.复制config.cfg到target目录,并修改zk地址

4.配置 supervisor zkui.conf

1
2
3
4
5
6
7
8
9
[program:zkui]
directory=/home/lintong/software/zkui/target
command = java -jar zkui-2.0-SNAPSHOT-jar-with-dependencies.jar
user = lintong
autostart = false
autoresart = true
stderr_logfile = /var/log/supervisor/zkui.stderr.log
stdout_logfile = /var/log/supervisor/zkui.stdout.log

5.启动zookeeper

6.启动zkui

全文 >>

antlr解析hive语句

hive是使用antlr来解析的

parser要做的事情,是从无结构的字符串里面,解码产生有结构的数据结构(a parser is a function accepting strings as input and returning some structure as output),参考 Parser_combinator wiki

parser分成两种,一种是parser combinator,一种是parser generator,区别可以参考 王垠的文章——对 Parser 的误解

 

1.parser combinator是需要手写parser,a parser combinator is a higher-order function that accepts several parsers as input and returns a new parser as its output,比如Thrift的Parser

1
2
https://github.com/apache/thrift/blob/master/compiler/cpp/src/thrift/main.cc

 

2.parser generator是需要你用某种指定的描述语言来表示出语法,然后自动把他们转换成parser的代码,比如Antlr里面的g4语法文件calciteftl语法文件,hue使用的jison以及flexcup等,缺点是由于代码是生成的,排错比较困难

使用了Antlr的parser有Hive,Presto,Spark SQL

美团点评的文章

1
2
https://tech.meituan.com/2014/02/12/hive-sql-to-mapreduce.html

以及hive源码的测试用例

全文 >>

Elasticsearch学习笔记——索引模板

在索引模板里面,date类型的字段的format支持多种类型,在es中全部会转换成long类型进行存储,参考

1
2
https://zhuanlan.zhihu.com/p/34240906

一个索引模板范例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
{
"order": 0,
"index_patterns": [
"ssssssssssssssss_test*"
],
"settings": {
"index": {
"codec": "best_compression",
"routing": {
"allocation": {
"require": {
"box_type": "master"
},
"total_shards_per_node": "3"
}
},
"refresh_interval": "60s",
"unassigned": {
"node_left": {
"delayed_timeout": "900m"
}
},
"number_of_shards": "3",
"number_of_replicas": "1"
}
},
"mappings": {
"_default_": {
"_source": {
"enabled": true
},
"dynamic_templates": [
{
"string_template": {
"mapping": {
"type": "keyword"
},
"match_mapping_type": "string",
"match": "*"
}
}
],
"properties": {
"a1": {
"search_analyzer": "ik_max_word",
"analyzer": "ik_max_word",
"type": "text"
},
"a2": {
"type": "float"
},
"a3": {
"type": "integer"
},
"untitled": {
"type": "float"
},
"a4": {
"type": "long"
},
"a5": {
"type": "double"
},
"a6": {
"type": "ip"
},
"a8": {
"type": "keyword"
}
},
"_all": {
"enabled": false
}
}
},
"aliases": {}
}

 

Elasticsearch6.2.1安装elasticsearch-sq插件

参考

1
2
https://github.com/NLPchina/elasticsearch-sql

1.下载插件

1
2
wget https://github.com/NLPchina/elasticsearch-sql/releases/download/6.2.1.0/elasticsearch-sql-6.2.1.0.zip

2.安装

1
2
./bin/elasticsearch-plugin instal file:///home/lintong/下载/elasticsearch-sql-6.2.1.0.zip

如果遇到 Exception in thread “main” java.lang.IllegalArgumentException: Unknown properties in plugin descriptor: [jvm, site]

解压zip文件,然后修改 plugin-descriptor.properties 文件

去掉下面两行后重新压缩成zip,然后再安装

1
2
3
site=
jvm=

全文 >>

MySQL学习笔记——乐观锁和悲观锁

场景:两个用户同时读取了数据库中的一条记录,此时用户A对其中一个字段的值进行了修改操作并进行了提交,后来用户B也对这个字段进行了修改,用户B的提交将会覆盖用户A提交的值

乐观锁悲观锁

悲观锁

每次去取数据,很悲观,都觉得会被别人修改,所以在拿数据的时候都会上锁。

简言之,共享资源每次都只给一个线程使用,其他线程阻塞,等第一个线程用完后再把资源转让给其他线程。

select … for update,synchronized和ReentranLock等都是悲观锁思想的体现。 

乐观锁

每次去取数据,都很乐观,觉得不会被被人修改。

因此每次都不上锁,但是在更新的时候,就会看别人有没有在这期间去更新这个数据,如果有更新就重新获取,再进行判断,一直循环,直到拿到没有被修改过的数据。

CAS(Compare and Swap 比较并交换)就是乐观锁的一种实现方式,比如使用version字段或者修改时间字段来判断数据是否被修改,如果返回的受影响行数为 1,表示更新成功;如果返回的受影响行数为 0,表示更新失败(数据已被其他事务修改),可以选择重试或中断操作。

 

参考:

Mysql 事务及数据的一致性处理

全文 >>

Nginx使用笔记

1.请求转发

比如说我要将127.0.0.1/topics上的所有请求转发到xxx:xxx/上

修改 sudo vim /etc/nginx/nginx.conf

1
2
3
4
5
6
7
8
9
10
server {
listen 80;
server_name 127.0.0.1;
location /topics {
#root html;
#index index.html index.htm;
proxy_pass http://xxx:xxx;
}
}

2.代理前端和后端服务

3.Nginx使用本地缓存

4.代理

1.正向代理和反向代理

正向代理:代理服务器位于客户端和目标服务器之间,代表客户端向目标服务器发送请求。客户端需要配置代理服务器。

用途: 访问控制、内容过滤、匿名浏览、缓存。我们用来kexue上网的工具就属于正向代理。

反向代理:代理服务器位于客户端和目标服务器之间,代表服务器处理客户端请求。客户端不知道反向代理的存在。

用途: 负载均衡、安全防护、缓存、SSL加速。比如使用Nginx,HAProxy,Apache HTTP Server等作为反向代理。

2.透明代理和非透明代理

透明代理和非透明代理都是正向代理,位于客户端和目标服务器之间,代理客户端向目标服务器发送请求。

透明代理:网络管理员在网络边界部署透明代理来过滤不良内容。用户浏览网站时,代理自动拦截和检查内容,而用户并不知道代理的存在。

非透明代理:用户配置浏览器使用非透明代理,以便匿名访问互联网。用户在浏览器中手动设置代理服务器地址和端口。

5.X-Forwarded-For,X-Real-IP和Remote Address

X-Forwarded-For通常用于标识通过 HTTP 代理或负载均衡器的原始客户端 IP 地址。X-Forwarded-For 是一个 HTTP 扩展头部。HTTP/1.1(RFC 2616)协议并没有对它的定义,它最开始是由 Squid 这个缓存代理软件引入,用来表示 HTTP 请求端真实 IP。如今它已经成为事实上的标准,被各大 HTTP 代理、负载均衡等转发服务广泛使用,并被写入 RFC 7239(Forwarded HTTP Extension)标准之中。示例值: X-Forwarded-For: client1, proxy1, proxy2

**X-Real-IP **有些反向代理服务器(如 Nginx)会将原始客户端 IP 地址放在这个头字段中。X-Real-IP,这是一个自定义头部字段。X-Real-IP 通常被 HTTP 代理用来表示与它产生 TCP 连接的设备 IP,这个设备可能是其他代理,也可能是真正的请求端。需要注意的是,X-Real-IP 目前并不属于任何标准。示例值:X-Real-IP: 203.0.113.195

Remote Address 是指服务器端看到的客户端的IP地址,即发起请求的源 IP 地址。在网络通信中,remote address 通常用于识别和追踪请求的来源。在不同的代理和负载均衡场景中,remote address 的值可能会发生变化。

参考:聊聊HTTP的X-Forwarded-For 和 X-Real-IP

1.直接访问

如果客户端直接访问服务器而没有经过任何代理或负载均衡器,remote address 将是客户端的 IP 地址。例如,如果客户端的 IP 地址是 203.0.113.195,服务器将看到:

1
2
Remote Address: 203.0.113.195

2.经过正向代理

当请求经过正向代理(包括透明代理和非透明代理)时,remote address 可能会有所不同:

  • 透明代理: 客户端不知道代理的存在,remote address 仍然显示为客户端的 IP 地址。
  • 非透明代理: 客户端知道代理的存在并进行配置,remote address 显示为代理服务器的 IP 地址,而原始客户端的 IP 地址通常会添加到 X-Forwarded-For 头字段中(如果代理服务器配置了添加 X-Forwarded-For 头字段的话)。

经过非透明代理的请求:

1
2
3
Remote Address: 198.51.100.1 (代理服务器 IP)
X-Forwarded-For: 203.0.113.195 (原始客户端 IP)

全文 >>