撤销上一次提交 $ git revert HEAD 撤销上两次提交 ISSUE-4 解决网关服务日志中无法正确显示经过代理访问的请求端 IP 问题 $ git revert [倒数第一个提交] [倒数第二个提交]
Heap Memory -XX:MetaspaceSize Metaspace 空间初始大小,如果不设置的话,默认是20.79M。这个初始大小是触发首次 Metaspace Full GC 的阈值,例如 -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize Metaspace 最大值,默认不限制大小,但是线上环境建议设置,例如 -XX:MaxMetaspaceSize=512M GC -Xnoclassgc 表示关闭JVM对类的垃圾回收,缺省情况下,当一个类没有任何活动实例时,JVM 就会从内存中卸装该类,但是这样会使性能下降。如果关闭类垃圾回收,就可以消除由于多次装入和卸装同一个类而造成的开销 -XX:+UseParNewGC 设置年轻代为并行收集 -XX:MaxTenuringThreshold 控制新生代需要经历多少次GC晋升到老年代中的最大阈值,默认值 15 -XX:+CMSParallelRemarkEnabled CMS收集算法步骤如下:初始标记 -> 并发标记 -> 重新标记 -> 标记清除。 其中 初始标记和重新标记都需要STW,即暂停用户线程。 CMSParallelRemarkEnabled参数可以让重新标记阶段进行并行重新标记,减少暂停时间 -XX:SurvivorRatio 设置 Eden、S0、S1 分配比例,默认值是 8 -XX:SurvivorRatio=5 表示 Eden 占 50%,S0、S1 平分剩余空间 -XX:+UseCompressedOops In short, don’t turn it on, use a version which has it on by default. https://stackoverflow.com/questions/11054548/what-does-the-usecompressedoops-jvm-flag-do-and-when-should-i-use-it -XX:+DisableExplicitGC 禁止 System.gc() 触发 GC 操作,当没有开启 DisableExplicitGC 这个参数时,你会发现JVM每个小时会执行一次Full GC,这是因为JVM在做分布式GC,为RMI服务的, 可以通过 sun.
Read moreLinux 磁盘相关命令 磁盘IO dd [root@localhost ~]# dd if=/dev/zero of=./a.dat bs=8K count=1M conv=fdatasync 记录了8192+0 的读入 记录了8192+0 的写出 8589934592字节(8.6 GB)已复制,14.8606 秒,578 MB/秒 [root@localhost ~]# dd if=./a.dat of=/dev/null bs=1M count=8k iflag=direct 记录了8192+0 的读入 记录了8192+0 的写出 8589934592字节(8.6 GB)已复制,14.2462 秒,603 MB/秒 磁盘空间 df 查看磁盘各个分区的空间大小、占用、可用等信息 $ df -h Filesystem Size Used Avail Capacity iused ifree %iused Mounted on /dev/disk1s5 466Gi 10Gi 128Gi 8% 488463 4881964417 0% / devfs 192Ki 192Ki 0Bi 100% 663 0 100% /dev /dev/disk1s1 466Gi 318Gi 128Gi 72% 4557528 4877895352 0% /System/Volumes/Data /dev/disk1s4 466Gi 8.
Read more常用 Git 命令 Init 在已有目录中初始化 GIT 仓库 $ git init $ git remote add origin <仓库地址> $ git add . $ git commit -m "Initial commit" $ git push -u origin master Branch 创建分支 git checkout -b <分支名> 推送分支 git push origin <分支名> 修改分支名 git branch -m <旧分支名> <新分支名> 删除本地分支 git branch -D <分支名> 删除远程分支 git push origin --delete <分支名> 拉取远程分支 git fetch origin <分支名> 拉取远程分支并切换 git checkout -b <分支名> origin/<分支名> 当前分支会退到指定版本
Read more常用 Docker 命令记录 镜像 镜像列表按照大小排序 docker images --format "{{.ID}}\t{{.Size}}\t{{.Repository}}" | sort -k 2 -h 删除所有镜像 docker rmi -f $(docker images | awk '{print $3}') 删除所有 dangling 镜像 docker rmi -f $(docker images -a | grep "<none>" | awk '{print $3}') 导出镜像 docker save -o postgres_9.6.tar postgres:9.6 docker save postgres:9.6 | gzip > postgres_9.6.tar 导入镜像 docker load -i postgres_9.6.tar 容器 删除所有 Exited 容器 docker rm $(docker ps -a | grep Exited | awk '{print $1}') 停止并删除所有容器 docker stop $(docker ps | awk '{print $1}') docker rm -f $(docker ps -a | awk '{print $1}') 停止 dead 容器 删除实例时提示 device or resource busy
Read moreFlyway 连接 MySQL Router 后启动卡在 GET_LOCK 语句 现象 MySQL MGR + Router 部署高可用集群 Flyway 客户端使用 jdbc:mysql:loadbalance 连接 初始化 Schema History 表、或者执行多个 SQL 脚本时 当满足以上条件时,Flyway 会卡在初始化阶段,经过分析发现停顿在执行 GET_LOCK 语句时 原因 Flyway 默认在执行 DDL 脚本时不启用事务,在初始化时 Flyway 会先执行 GET_LOCK 锁定数据库,然后再执行 DDL 脚本。当使用 jdbc:mysql:loadbalance 连接时,会随机选择一个数据源,如果执行 GET_LOCK 和 执行 DDL 不是一个数据源,就会导致执行等待锁释放 解决办法 在启动时设置 group=true 参数,这样 Flyway 在初始化时就会启用事务,确保一个事务内的 DDL 都在一个数据源执行 ISSUE-3154 public class FlywayTestManual { String url="jdbc:mysql:loadbalance://192.168.51.206:3810,192.168.51.207:3810/nc_notifier?roundRobinLoadBalance=false&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true"; String user="user"; String password="pass"; @Test public void test(){ Flyway flyway = Flyway.
Read more记录在使用 Flyway 管理 Oracle 数据库脚本时遇到的一些问题,Flyway 5.2.1 - 7.7.3 都存在此问题。 1. Flyway not support Oracle 11g 异常信息 Caused by: org.flywaydb.core.internal.license.FlywayEditionUpgradeRequiredException: Flyway Enterprise Edition or Oracle upgrade required: Oracle 11.2 is no longer supported by Flyway Community Edition, but still supported by Flyway Enterprise Edition. at org.flywaydb.core.internal.database.base.Database.ensureDatabaseNotOlderThanOtherwiseRecommendUpgradeToFlywayEdition(Database.java:173) at org.flywaydb.core.internal.database.oracle.OracleDatabase.ensureSupported(OracleDatabase.java:91) at org.flywaydb.core.Flyway.execute(Flyway.java:514) at org.flywaydb.core.Flyway.migrate(Flyway.java:159) at org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer.afterPropertiesSet(FlywayMigrationInitializer.java:65) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1855) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1792) ... 19 common frames omitted 修改 Flyway 5.2.4 OracleDatabase.java 社区版本做了版本号限制 修改 Flyway 6.5.7 OracleDatabase.
Read moreFlyway 通过 SQL Patch 脚本的方式管理数据库脚本版本,开发一段时间后会积攒大量脚本。当一个版本稳定后我们希望合并成一个全量脚本 1.首先对齐程序与数据库中的脚本版本号 查看程序中脚本版本清单,例如:程序中有三个版本的脚本 V1.0.0.0__init.sql V1.0.0.1__add_user_table.sql V1.0.0.2__modify_user_table.sql 查看数据库中历史版本记录表 (默认是 flyway_schema_history) 中执行过的脚本版本,例如: versions description script success 1.0.0.0 init.sql V1.0.0.0__init.sql 1 1.0.0.1 add_user_table.sql V1.0.0.1__add_user_table.sql 1 1.0.0.2 modify_user_table V1.0.0.2__modify_user_table.sql 1 这里只摘取了关键字段,你可以看到每个版本都已经执行,并且执行都是成功的 success=1 至此:你已经对齐了程序和数据库中脚本版本号,可以开始准备合并了 2.合并程序中的SQL脚本 合并多个脚本的内容到最大版本号的文件中,例如:将 V1.0.0.0__init.sql, V1.0.0.1__add_user_table.sql, V1.0.0.2__modify_user_table.sql 合并为 V1.0.0.2__init.sql 注意: 不是简单的文件合并,而是最终执行结果的合并 3.重新打包程序 只包含合 V1.0.0.2__init.sql 脚本的程序 4.停止所有老版本的程序 包含 V1.0.0.0__init.sql,V1.0.0.1__add_user_table.sql,V1.0.0.2__modify_user_table.sql 老脚本的程序 5.删除数据库中的版本历史表 默认是 flyway_schema_history 6.重启应用程序 在程序启动时设置基线版本参数为当前版本,设置这个参数的目的是告诉 Flyway 当前已经执行过 1.0.0.2 脚本了。这之前的脚本不要再执行了。 flyway.baseline-version=1.0.0.2 注意: 如果是空库,全新安装程序,那么则不需要设置 flyway.baseline-version 参数 7.结束 查看数据库中历史版本记录表 (默认是 flyway_schema_history) 中执行过的脚本版本,例如: versions description script success 1.
Read more常用 Maven 命令 Parameters -D 指定参数,如 -Dmaven.test.skip=true 跳过单元测试; -P 指定 Profile 配置,可以用于区分环境; -e 显示maven运行出错的信息; -o 离线执行命令,即不去远程仓库更新包; -f 强制指定使用 POM 文件,或者包含 POM 文件的目录 -pl 选项后可跟随{groupId}:{artifactId}或者所选模块的相对路径(多个模块以逗号分隔) -am 表示同时处理选定模块所依赖的模块 -amd 表示同时处理依赖选定模块的模块 -rf 表示从指定模块开始继续处理 -N 表示不递归子模块 -X 显示maven允许的debug信息; -U 强制去远程更新 snapshot的插件或依赖,默认每天只更新一次。 –no-snapshot-updates 禁止更新 snapshot Dependency 显示maven依赖数 mvn dependency:tree 显示maven依赖列表 mvn dependency:list 下载依赖包的源码 mvn dependency:sources Maven Wrapper 自动安装 maven 的包装器(适合不想手动安装Maven的用户),使用插件Maven Wrapper plugin将其自动化安装指定版本的 Maven mvn -N io.takari:maven:wrapper -Dmaven=3.6.3 这个命令会在你的项目中生成如下文件,请将这些文件与源代码一起管理 mvnw: 这是 Linux Script 可执行文件,用来代替 mvn mvnw.cmd: 这是 Windows Script 可执行文件,用来代替 mvn mvn: 隐藏的文件夹,其中包含Maven Wrapper Java库及其属性文件 首次执行 mvnw 或者 mvnw.
Read more通过单个服务器压测的 QPS 估算需要的服务器数量 已知 QPS 和期望每笔耗时,估算服务器数量 服务器数量 $$ = QPS \div (1000 \div 每笔毫秒) \div 每服务器CPU个数 $$ 例如: QPS:每秒处理3200笔 每笔毫秒:50ms 每个服务器CPU个数:16 服务器数量 $$ 3200_{qps} \div (1000_{ms} \div 50_{ms}) \div 16_{cpu} = 10_{台} $$ 已知 QPS 以及服务器数量,估算每笔耗时 每笔耗时毫秒 $$ = 1000 \div ( QPS \div ( 服务器数量 \times 每服务器CPU个数 ) ) $$ 例如: QPS:每秒处理3200笔 服务器数量:10 每服务器CPU个数:16 每笔耗时毫秒 $$ 1000 \div ( 3200 \div ( 10 \times 16 ) ) = 50_{ms}$$