Maven下载构建测试
随意写一个Maven项目,依赖一个不存在的构建时的测试记录
使用 mvn compile 命令测试
没有配置镜像的测试
Maven 的 settings.xml 中没有配置
一、没有配置repository
使用默认的中央仓库
依赖snapshot版本的构建
直接拒绝,因为中央仓库不支持snapshot,不会连到中央仓库
1 | [ERROR] Failed to execute goal on project csv2excel: Could not resolve dependencies for project com.wwh.csv2excel:csv2excel:jar:0.1-SNAPSHOT: Could not find artifact com.wwh.csv2excel:csv2excel:jar:0.7-SNAPSHOT -> [Help 1] |
依赖非snapshot版本的构建
尝试去中央服务器下载,然后提示不存在
1 | [ERROR] Failed to execute goal on project csv2excel: Could not resolve dependencies for project com.wwh.csv2excel:csv2excel:jar:0.1-SNAPSHOT: Could not find artifact com.wwh.csv2excel:csv2excel:jar:0.8 in central (https://repo.maven.apache.org/maven2) -> [Help 1] |
二、 配置了一个repository,且支持snapshot
1 | <repositories> |
依赖snapshot版本的构建
尝试去配置的仓库下载,然后提示不存在
1 | [ERROR] Failed to execute goal on project csv2excel: Could not resolve dependencies for project com.wwh.csv2excel:csv2excel:jar:0.1-SNAPSHOT: Could not find artifact com.wwh.csv2excel:csv2excel:jar:1.2-SNAPSHOT in nexusRep (http://nexus.vvsmart.com:8081/nexus/content/groups/public) -> [Help 1] |
依赖非snapshot版本的构建
先从配置的仓库下载,再尝试去中央仓库下载,然后提示无法解析
1 | Downloading from nexusRep: http://nexus.vvsmart.com:8081/nexus/content/groups/public/com/wwh/csv2excel/csv2excel/1.4/csv2excel-1.4.pom |
三、 配置了多个repository,且支持snapshot
配置三个repository,地址实际上是不存在的,这里只验证下载构建的顺序
1 | [INFO] --------------------------------[ jar ]--------------------------------- |
结论
如果repository不支持snapshot的构建,则不会去这个仓库下载
优先使用配置的repository,按照配置的顺序进行下载,最后再用mavne的中央仓库
配置了镜像的测试
1 | <mirror> |
一个地址镜像全部仓库
一、没有配置repository
依赖snapshot版本的构建
默认走到了中央仓库,这个直接被拒绝了,因为没有开启snapshot,提示无法解析,不会连接到镜像服务器
1 | [ERROR] Failed to execute goal on project csv2excel: Could not resolve dependencies for project com.wwh.csv2excel:csv2excel:jar:0.1-SNAPSHOT: Could not find artifact com.wwh.csv2excel:csv2excel:jar:0.4-SNAPSHOT -> [Help 1] |
依赖非snapshot版本的构建
会尝试去镜像地址下载,然后提示不存在
1 | [ERROR] Failed to execute goal on project csv2excel: Could not resolve dependencies for project com.wwh.csv2excel:csv2excel:jar:0.1-SNAPSHOT: Could not find artifact com.wwh.csv2excel:csv2excel:jar:0.3 in nexus (http://nexus.vvsmart.com:8081/nexus/content/groups/public) -> [Help 1] |
二、 配置了一个repository,且支持snapshot
都会连接到镜像地址,然后提示不存在
repository的id的影响
repository的id为central时
依赖一个不存在的snapshot版本的构建时,尝试去镜像地址下载
1 | [ERROR] Failed to execute goal on project csv2excel: Could not resolve dependencies for project com.wwh.csv2excel:csv2excel:jar:0.1-SNAPSHOT: Could not find artifact com.wwh.csv2excel:csv2excel:jar:0.5-SNAPSHOT in nexus (http://nexus.vvsmart.com:8081/nexus/content/groups/public) -> [Help 1] |
repository的id为test时
依赖一个不存在的snapshot版本的构建时,尝试去镜像地址下载
1 | [ERROR] Failed to execute goal on project csv2excel: Could not resolve dependencies for project com.wwh.csv2excel:csv2excel:jar:0.1-SNAPSHOT: Could not find artifact com.wwh.csv2excel:csv2excel:jar:0.6-SNAPSHOT in nexus (http://nexus.vvsmart.com:8081/nexus/content/groups/public) -> [Help 1] |
结论
Maven也会先判断本地的repository是否支持snapshot,再决定是否需要去该仓库下载,再连到镜像服务器
是否需要将repository的id设置为central( 为了覆盖超级POM中央仓库的配置)并不重要,反正都会走的镜像服务器中,只要有任意一个仓库支持snapshot就可以了
且配置了镜像之后,repository的Url并不重要,反正不会用到
Kafka 2.11-0.10.1.0 故障分析与处理
问题描述
线上环境每过一段时间(一个月左右) kafka就会故障无法访问,三个服务器都正常,kafka进程正常,但是会出现一个节点和其他两个节点断开的情况,表现形式上类似脑裂,日志中显示正常节点无法连接到故障的节点
出现问题 就不会再自动恢复了
重启故障节点即可解决这个问题
环境信息
集群
三台机器组成的kafka集群
- 192.168.1.217 RD-MQ-01
- 192.168.1.218 RD-MQ-02
- 192.168.1.219 RD-MQ-03
kafka 版本
kafka_2.11-0.10.1.0
zookeeper 版本
3.4.10-4181
ZK独立部署,不与其他程序共用
java 版本
1 | [root@RD-MQ-01 ~]# java -version |
操作系统版本
CentOS 6.8
1 | [root@RD-MQ-02 bin]# uname -a |
相关配置
kafka
1 | ############################# Server Basics ############################# |
错误日志
开发环境下出现了该问题时相关日志信息
217上的kafka日志
1 | [2020-04-22 10:43:36,369] WARN [ReplicaFetcherThread-1-219], Error in fetch kafka.server.ReplicaFetcherThread$FetchRequest@5641fe72 (kafka.server.ReplicaFetcherThread) |
218上的kafka日志
1 | [2020-04-22 10:59:42,687] WARN [ReplicaFetcherThread-1-219], Error in fetch kafka.server.ReplicaFetcherThread$FetchRequest@1722c608 (kafka.server.ReplicaFetcherThread) |
219上的kafka日志
1 | [root@RD-MQ-03 logs]# tail -f server.log |
ZK 日志
zk日志正常,zk数据文件正常(大小正常,有定期清理)
问题排查记录
检查网络
实际上这三个机器都是互通的
ping
1 | # 217 |
telnet
telnet 也是通的
1 | [root@RD-MQ-02 ~]# telnet 192.168.1.219 9092 |
netstat
1 | [root@RD-MQ-02 ~]# netstat -an | grep 219:9092 |
连接一直在建立,然后关闭
检查Zookeeper
ZK 能正常操作读写数据
在ZK中能看到3个kafka的brokers
1 | [zk: 192.168.1.218:5181(CONNECTED) 4] ls /brokers/ids |
检查kafka manager
只能查询到 Brokers 信息
无法查看topic 和 Consumers
使用kafka命令查看
topic list
分别在三个机器上查看topic信息,都能列出
1 | ./kafka-topics.sh --list --zookeeper 192.168.1.217:5181 |
topic describe
挑选一个测试队列【st.topic.yery.test】 查看详情:
1 | [root@RD-MQ-01 bin]# ./kafka-topics.sh --zookeeper 192.168.1.217:5181 --topic st.topic.yery.test --describe |
consumer-groups list
查看消费者
1 | [root@RD-MQ-02 bin]# ./kafka-consumer-groups.sh --bootstrap-server 192.168.1.217:9092 --list |
consumer-groups describe
僵死,无法列出消费者的相关信息
1 | [root@RD-MQ-02 bin]# ./kafka-consumer-groups.sh --bootstrap-server 192.168.1.217:9092 --group dp.device.consumer --describe |
换一个消费者组
能看到两个分区的消费信息,实际上应该是32个分区
1 | [root@RD-MQ-01 bin]# ./kafka-consumer-groups.sh --bootstrap-server 192.168.1.217:9092,192.168.1.218:9092,192.168.1.219:9092 --group by.consumer.online.storage --describe |
使用Kafka命令行工具测试
用命令行生产者 和 消费者 进行测试
消费者
无法消费到数据任何,没有错误
1 | ./kafka-console-consumer.sh --bootstrap-server 192.168.1.217:9092,192.168.1.218:9092,192.168.1.219:9092 --topic by.topic.install.car.device --from-beginning |
生产者
发送数据报错
1 | [root@RD-MQ-02 bin]# ./kafka-console-producer.sh --broker-list 192.168.1.217:9092,192.168.1.218:9092 --topic by.topic.install.car.device |
查进程信息
进程占用的文件句柄数
217
1 | [root@RD-MQ-01 opt]# lsof -p 13517 | wc -l |
218
1 | [root@RD-MQ-02 ~]# lsof -p 13557 | wc -l |
219
1 | [root@RD-MQ-03 ~]# lsof -p 81068 | wc -l |
可以看到219占用了非常多的文件句柄数
网络端口9092查看
217
存在很多 time_wait 状态的连接
1 | tcp 0 0 ::ffff:192.168.1.217:9092 ::ffff:192.168.1.215:47810 ESTABLISHED 13517/java |
1 | [root@RD-MQ-01 ~]# netstat -antp | grep 9092 | wc -l |
218
基本正常
1 | tcp 0 0 ::ffff:192.168.1.218:9092 ::ffff:192.168.1.216:48369 ESTABLISHED 13557/java |
1 | [root@RD-MQ-02 ~]# netstat -antp | grep 9092 | wc -l |
219
存在大量 CLOSE_WAIT 状态的连接
1 | tcp 247 0 ::ffff:192.168.1.219:9092 ::ffff:192.168.1.217:58837 CLOSE_WAIT 81068/java |
数量远多于其他两台
1 | [root@RD-MQ-03 opt]# netstat -antp | grep 9092 | wc -l |
查线程堆栈内存信息
使用内存
基本正常
217
1 | ps aux|grep java|grep "kafka"|awk '{print $6}' |
218
1 | ps aux|grep java|grep "kafka"|awk '{print $6}' |
219
1 | ps aux|grep java|grep "kafka"|awk '{print $6}' |
jstack
在219上找到死锁
1 | Found one Java-level deadlock: |
jmap
dump 219 上的堆内存信息
1 | jmap -dump:format=b,file=kafka-219-jmap.dump 81068 |
先保留现场,必要时再进行分析,文件大小:665M
相关资料
匹配度高的
KAFKA-3994
https://issues.apache.org/jira/browse/KAFKA-3994
executor-Heartbeat线程 与 kafka-request-handler线程 互锁
死锁信息与我们发现的有一点差异,没有group-metadata-manager线程
版本比我们用低一个版本
影响版本:0.10.0.0
修复版本:0.10.1.1, 0.10.2.0
KAFKA-4399
https://issues.apache.org/jira/browse/KAFKA-4399
死锁信息与我们发现的有一个差异,没有executor-Heartbeat线程
影响版本:0.10.1.0
修复版本:0.10.1.1,0.10.2.0
KAFKA-4478
https://issues.apache.org/jira/browse/KAFKA-4478
心跳执行器、组元数据管理器、请求处理器 相互锁死了
这个的死锁堆栈信息与我们碰到的一致
影响版本:0.10.1.0
修复版本:无 (在bug 3994中被解决了)
KAFKA-4562
https://issues.apache.org/jira/browse/KAFKA-4562
死锁情况与我们的一样
影响版本:0.10.1.0
修复版本:无 (在bug 3994中被解决了)
相关性高的
邮件列表一
https://users.kafka.apache.narkive.com/7ekMKZSX/deadlock-using-latest-0-10-1-kafka-release
3个线程的死锁堆栈信息,和我们的一样,文件句柄耗尽
作者已经很肯定 KAFKA-3994中的补丁可以很好地解决该问题。
关联:KAFKA-3994
邮件列表二
https://users.kafka.apache.narkive.com/mP9QlK2j/connectivity-problem-with-controller-breaks-cluster
从描述的问题来看,我们的一致
关联:KAFKA-4477
KAFKA-4477
https://issues.apache.org/jira/browse/KAFKA-4477
我们的故障节点 ISR 也减少了,也有文件句柄数和死锁相关的描述
影响版本:0.10.1.0
修复版本:0.10.1.1
结论
Kafka程序内部死锁导致了集群的故障问题
根据官方文档这个问题在issues [KAFKA-4399] 中被解决了
可以通过将现有的kafka升级至 kafka 0.10.1.1 来解决该问题
kafka 0.10.1.1 发版说明
https://archive.apache.org/dist/kafka/0.10.1.1/RELEASE_NOTES.html.
官方发版说明中已经记录解决了bug [KAFKA-4399]
- [KAFKA-3994] - Deadlock between consumer heartbeat expiration and offset commit.
- [KAFKA-4399] - Deadlock between cleanupGroupMetadata and offset commit
升级
kafka服务端
服务器端升级一个小版本到 0.10.1.1
https://archive.apache.org/dist/kafka/0.10.1.1/RELEASE_NOTES.html.
这个版本主要是修复bug,没有什么新的改变,这样我们的数据应该是完全兼容的,只需要更换服务端的包,复制配置文件,之后逐个重启kafka服务即可。
官方升级说明文档
http://kafka.apache.org/0101/documentation.html#upgrade
程序的客户端
全部的 生产者 和 消费者 都升级一个小版本到 0.10.1.1
1 | <!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients --> |
这样相关的代码应该都无需修改,Api不会有什么改动,只需要升级依赖包即可
修改父项目的pom文件依赖,子项目梳理一下,重新打包部署即可
其他问题
可能存在一些项目使用的是更老版本的API 和 连接方式等,如不是直连kafka而是老的连接zk的,这部分的项目需要修改代码
升级步骤记录
下载文件
1 | wget https://archive.apache.org/dist/kafka/0.10.1.1/kafka_2.11-0.10.1.1.tgz |
这里选择的scala 版本是 2.11,之前装的也是2.11的
解压到新目录
使用原来的配置位置
注意:数据文件(log)的位置
准备生产者和消费者
先准备一个生产者,产生数据
1 | ./kafka-console-producer.sh --broker-list 192.168.1.217:9092,192.168.1.218:9092,192.168.1.219:9092 --topic st.topic.yery.test |
在准备一个消费者,消费数据
1 | ./kafka-console-consumer.sh --bootstrap-server 192.168.1.217:9092,192.168.1.218:9092,192.168.1.219:9092 --topic st.topic.yery.test --from-beginning |
升级过程保持不变
停止节点219
先关闭节点219,观察集群状态:
217 218 报错了,但是集群整体运行正常
测试验证
生产者能正常产生数据
消费者能正常消费数据
消费者会打印一个警告
进入kafka manager 可以查看到只有两个 Broker(217、218)
查看topic st.topic.yery.test 的信息
所有Partition 的leader都分到217 和 218 上
In Sync Replicas 只有(217,218)
修改配置文件
复制原配置文件到kafka_2.11-0.10.1.1
1 | cd kafka_2.11-0.10.1.0 |
在219启动新版本的kafka
直接启动219 (0.10.1.1版本的)
查看219日志,可以看到在恢复数据
数据恢复完成之后 会加入集群
加入集群后,217 和 218 会打印日志,将分区ISR从[217,218] 扩大到 [217,218,219]
在kafka manager 上可以看到Broker 219 加入了集群
查看topic [st.topic.yery.test] 的信息
Partition 的leader分到217,218 和 219 三台上了
In Sync Replicas 有(217,218,219)
再次验证测试
此时命令行 生产数据 消费数据都是正常的
应用程序测试
直接验证binlog程序
程序在不升级kafka客户端包版本的情况下测试
在数据库中修改 by_device 表的记录x,将记录x的remark修改为‘kafka update’
可以在缓存管理中看到记录x的remark改成了‘kafka update’
对应的队列 qa.topic.binlog.base-by_device
Sum of partition offsets 也加了1,表明消息发送消费正常
程序在不升级kafka-clients 包的情况下,也没有问题
再升级217 和 218
用同样的步骤更换 217 和 218 上的kafka程序,配置文件就用原来的对应的配置文件
逐个关闭kafka程序再启动,等待数据库恢复,集群恢复到正常状态
验证老数据
升级完成之后再从头开始消费队列[st.topic.yery.test]的数据
1 | ./kafka-console-consumer.sh --bootstrap-server 192.168.1.217:9092,192.168.1.218:9092,192.168.1.219:9092 --topic st.topic.yery.test --from-beginning |
数据正常,升级完成
补充
升级说明
从0.8.x,0.9.x,0.10.0.x,0.10.1.x或0.10.2.x升级到0.11.0.0
http://kafka.apache.org/0102/documentation.html#upgrade
Kafka 0.11.0.0引入了新的消息格式版本以及有线协议更改。通过遵循以下建议的滚动升级计划,可以保证升级期间不会停机。但是,请在升级之前查看0.11.0.0中的显着更改。
从版本0.10.2开始,Java客户端(生产者和消费者)已经具有与较早的代理进行通信的能力。版本0.11.0的客户可以与版本0.10.0或更高版本的代理通信。但是,如果您的代理早于0.10.0,则必须先升级Kafka群集中的所有代理,然后再升级客户端。版本0.11.0代理支持0.8.x和更高版本的客户端。
###################################
升级之后的问题
这是一个坑,升级之后还是有死锁问题,一个新的死锁
由于 DelayedProduce 和 GroupMetadata 导致的死锁
1 | Found one Java-level deadlock: |
bug:
https://issues.apache.org/jira/browse/KAFKA-5970
修复版本:
0.11.0.2, 1.0.0
在 0.10.X 版本中没有看到有修复该问题,且在0.11.x版本中又看到有内存泄漏问题,~~~
好在这个问题出现的概率非常低,只在测试环境出现过1次
IPv4地址分类 ABC类IP划分
IP地址
IPv4网络使用32位地址,即32个bit位(表示0和1),每8位分成1个部分,共4个部分,再将二进制的数转成10进制,以点分十进制表示
如:192.168.1.1 = 11000000.10101000.00000001.00000001
从数字的角度来说,一个8位的2进制数字最大为255,故IP地址最大为:255.255.255.255
IPv4地址的总是为 2的32次方 = 4294967296 ,只有40多亿,其中还有部分要挪作他用,所以后来又出了IPv6(
IPv6 地址为 128 位长度, 是 IPv4 地址的 4 倍)
IP地址
地址格式为:IP地址=网络地址+主机地址 或 IP地址=网络地址+子网地址
网络地址 + 主机地址 = 32位 构成一个完整的IP地址
最初设计互联网络时,为了便于寻址以及层次化构造网络,每个IP地址包括两个标识码(ID),即网络ID和主机ID。同一个物理网络上的所有主机都使用同一个网络ID,网络上的一个主机(包括网络上工作站,服务器和路由器等)有一个主机ID与其对应。IP地址根据网络ID的不同分为5种类型,A类地址、B类地址、C类地址、D类地址和E类地址。
子网掩码
简单的说就说分隔 网络地址 和 子网地址用的
如果子网的bit位为1则表示这一位被掩盖住了,是网络地址
书写形式有:255.255.255.0 或者 24 这两个是一个意思,表示这个ip地址的前面24位被淹盖住了,比如地址:192.168.1.1/24 ,其网络地址是:192.168.1,主机地址只能是 1~254
分类 | 前缀 | 范围 | 私有地址 | 默认掩码 | 说明 |
---|---|---|---|---|---|
A类地址 | 0 | 0.0.0.0 ~ 126.255.255.255 | 10.0.0.0 ~ 10.255.255.255 | 255.0.0.0 | |
B类地址 | 10 | 128.0.0.0 ~ 191.255.255.255 | 172.16.0.0 ~ 172.31.255.255 | 255.255.0.0 | |
C类地址 | 110 | 192.0.0.0 ~ 223.255.255.255 | 192.168.0.0 ~ 192.168.255.255 | 255.255.255.0 | |
D类地址 | 1110 | 224.0.0.0 ~ 239.255.255.255 | 239.0.0.0 ~ 239.255.255.255 (本地管理组) | 组播地址 | |
E类地址 | 11110 | 240.0.0.0 ~ 247.255.255.255 | 保留 |
1.A类IP地址
一个A类IP地址由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0”, 地址范围从1.0.0.0 到126.0.0.0。可用的A类网络有126个,每个网络能容纳1亿多个主机。
【十进制】 126 = 【二进制】01111110
127 是保留地址,127.0.0.1 给内部回送函数,而数字0则表示该地址是本地宿主机,不能传送
2.B类IP地址
一个B类IP地址由2个字节的网络地址和2个字节的主机地址组成,网络地址的最高位必须是“10”,地址范围从128.0.0.0到191.255.255.255。可用的B类网络有16382个,每个网络能容纳6万多个主机 。
【十进制】 128 = 【二进制】10000000
【十进制】 191 = 【二进制】10111111
3.C类IP地址
一个C类IP地址由3字节的网络地址和1字节的主机地址组成,网络地址的最高位必须是“110”。范围从192.0.0.0到223.255.255.255。C类网络可达209万余个,每个网络能容纳254个主机。
【十进制】 192 = 【二进制】11000000
【十进制】 223 = 【二进制】11011111
4.D类地址用于多点广播
D类IP地址第一个字节以“1110”开始,它是一个专门保留的地址。它并不指向特定的网络,目前这一类地址被用在多点广播(Multicast)中。多点广播地址用来一次寻址一组计算机,它标识共享同一协议的一组计算机。
5.E类IP地址
以“11110”开始,为将来使用保留。
全零(“0.0.0.0”)地址对应于当前主机。全“1”的IP地址(“255.255.255.255”)是当前子网的广播地址。
广播地址
广播地址
广播地址(Broadcast Address)是专门用于同时向网络中所有工作站进行发送的一个地址。在使用TCP/IP 协议的网络中,主机标识段host ID 为全1 的IP 地址为广播地址,广播的分组传送给host ID段所涉及的所有计算机。例如,对于10.1.1.0 (255.255.255.0 )网段,其广播地址为10.1.1.255 (255 即为2 进制的11111111 ),当发出一个目的地址为10.1.1.255 的分组(封包)时,它将被分发给该网段上的所有计算机。
类型
广播地址应用于网络内的所有主机
1)受限广播
它不被路由发送,但会被送到相同物理网络段上的所有主机
IP地址的网络字段和主机字段全为1就是地址255.255.255.255
2)直接广播
网络广播会被路由,并会发送到专门网络上的每台主机
IP地址的网络字段定义这个网络,主机字段通常全为1,如 192.168.10.255
广播和地址
- TCP/IP协议栈中, 传输层只有UDP可以广播.
- 只能对同一子网内部广播, 广播数据包不经过路由器.
- UDP的广播地址为255.255.255.255
- 在winsock实现中, 有一个选项对应是否允许广播.必须调用setsockopt打开该选项.
- 打开后, 用sendto向255.255.255.255发送的数据包全部广播.
很多局域网都定义了一个特殊的保留地址, 称为广播地址. 当信息头中目的地址域的内容为广播地址时, 该帧被局域网上所有计算机接收. 这个过程称为广播.
maven打包可运行的jar
一:maven-jar-plugin
1 | <build> |
maven-jar-plugin用于生成META-INF/MANIFEST.MF文件的部分内容
com.xxg.Main
指定MANIFEST.MF中的Main-Class
排除目录
1 | <plugin> |
排除文件,可以用通配符
1 | <plugin> |
二:maven-assembly-plugin
1 | <plugin> |
这里没有指定
1 | <descriptor>src/main/assembly/assembly.xml</descriptor> |
而是用的
1 | <descriptorRefs> |
这个jar-with-dependencies是assembly预先写好的一个,组装描述引用(assembly descriptor)
默认的compile scope范围是会打进jar包的,而且依赖也全部会打进去,所有有些包打完之后有可能会很大,可将scope范围改成provided,就不会打进去了。
指定打包输出的文件名
1 | <configuration> |
常规做法
一般项目都比较大,不会打成一个jar包,一般都是打成一个tar包,里面包含启动脚本,配置文件等
使用assembly插件
一般目录结构如下:
1 | │ |
pom中配置assembly 插件
1 | <plugin> |
assembly.xml
1 | <assembly> |
mysql 时区问题
问题
插入时间到数据库中,会少13个小时(有时候是11个小时)
读取出来,则会自动加上少了的时间,读到的Date对象是正常的
环境
Linux
1 | # uname -a |
1 | # cat /etc/centos-release |
Mysql 版本
5.7.20
1 | show variables like "%time_zone%"; |
Variable name | Value |
---|---|
system_time_zone | CST |
time_zone | SYSTEM |
原因
CTS 时区问题
mysql的驱动版本换成了:
mysql-connector-java 6.0.2
应该是6.X的版本更新了时区的判断方式,导致的
时间类型
GMT
格林威治标准时间
UTC
世界协调时间
DST
夏日节约时间
CST时间
CST却同时可以代表如下 4 个不同的时区:
Central Standard Time (USA) UT-6:00
Central Standard Time (Australia) UT+9:30
China Standard Time UT+8:00
Cuba Standard Time UT-4:00
可见,CST可以同时表示美国,澳大利亚,中国,古巴四个国家的标准时间。
解决版本
一 更换驱动版本
换成之前一直用的的 5.1.45
二 连接串指定时区
serverTimezone
1 | jdbc.url=jdbc:mysql://192.168.1.211:3306/analysis?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai |
三 mysql中指定
1 | # vim /etc/my.cnf |
经纬度坐标小数位与精度的对应关系
纬度不变 精度相差1的情况
测试结果如下:
小数点后6位,精度:0.1米
0.10139558886691133
小数点后5位,精度:1米
1.0139558860891593
小数点后4位,精度:10米
10.139558845411655
小数点后3位,精度:101米
101.39558846680167
小数点后3位(经纬度同时改变1),精度:150米
150.4837860345681
小数点后2位,精度:1014米
1013.9558844430293
测试代码:
1 | public class DistanceCalcUtil { |
保存全国的经纬度点3位小数
在地图上测距,画一个大概覆盖全国的矩形
宽:4000000 米
高:2500000 米
换算成经纬度点,大概10亿个
初步估计保存全国的经纬度(小数点保留3位,精度约100米)大概需要保存10亿条记录
应用启停脚本
以SpringBoot 应用为例子
startup.sh
1 | #!/bin/sh |
shutdown.sh
1 | #!/bin/bash |