守护进程Supervisor
在一个分布式环境中,每台机器上可能需要启动和停止多个进程,使用命令行方式一个一个手动启动和停止非常麻烦,而且查看每个进程的状态也很不方便。为此Supervisor工具应运而生,它能够对很方便的对多个进程进行简单高效中心化管理。
蓄水池抽样算法
从n个数字中随机选取m个数字作为样本,要求这n个数字每个被选到的概率都相等。但如果n是不确定的,如何保证概率仍然相等?
CXXABI_1.3.8 not found
‘CXXABI_1.3.8’ not found运行程序时,出现c++依赖缺失错误,Error: /lib64/libstdc++.so.6: version 'CXXABI_1.3.8' not found
主要问题在于没有CXXABI_1.3.8,可通过如下命令检查:
1strings /usr/lib64/libstdc++.so.6|grep CXXABI
可以看到目前包是libstdc++.so.6.0.19
下载一个较新的版本libstdc++.so.6.0.26,将其上传到/usr/lib64/目录。
备份原来的libstdc++.so.6
1mv libstdc++.so.6 libstdc++.so.6.bak
创建新的libstdc++.so.6软链接
1ln -s libstdc++.so.6.0.26 libstdc++.so.6
再次检查是否有缺失的版本,可以看到CXXABI_1.3.8有了
1strings /usr/lib64/libstdc++.so.6|grep CXXABI
再次运行程序,错误解除。
附libstdc++. ...
JVM参数配置及调优
JVM参数分类jvm 参数可分为三类:
标准参数:以 “-“ 开头的参数
非标准参数:以 “-X“ 开头的参数
不稳定参数:以”-XX“ 开头的参数
标准参数标准参数是指在各个JVM版本中基本保持不变,相对比较稳定。
标准参数统一都是以 “-“ 开头,如:
1java -classpath E:/code -Dprofile=dev HelloWorld tom jack
注意:其中HelloWorld 是被运行的 HelloWorld.class。HelloWorld 之前就是设置的JVM标准参数(-classpath、-D),HelloWorld 之后的参数(tom、jack)是用来传给 main(String[] args) 方法的args数组变量的,两者位置不要放错。
查看所有标准参数:
打开一个命令终端,执行 java -help,就可以展示所有的JVM标准参数。
非标准参数非标准参数表示不保证所有JVM实现都支持这些参数,在将来的JVM版本中可能会发生改变。非标准参数统一以 -X 开头,如 -Xmx20M 设置最大java堆大小,示例:
1java -classpa ...
Kafka快速入门
基本概念AR:分区的所有副本集合,AR=ISR+OSR
ISR:与leader副本一定程度同步的所有副本(包括leader副本)
OSR:与leader副本同步滞后过多的副本集合
HW:高水位,所有副本都同步到的offset,消费者只能拉取HW之前的消息
LEO:Log End Offset,待写入消息的offset,即最后一条消息的offset+1
安装JDK安装123456789101112131415# 解压jdk压缩包至/opttar zxvf jdk-8u181-linux-x64.tar.gz# 配置jdk环境变量vim /etc/profile# 添加如下配置export JAVA_HOME=/opt/jdk1.8.0_181 export JRE_HOME=$JAVA_HOME/jreexport PATH=$PATH:$JAVA_HOME/bin export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib# 使配置生效source /etc/profilejava -version
ZooKeeper安装12345678910111 ...
Redis五种数据类型
String键值对
12345678910> set name codehole OK > get name "codehole"> exists name (integer) 1 > del name (integer) 1 > get name (nil)
批量键值对
12345678910111213> set name1 codehole OK > set name2 holycoder OK > mget name1 name2 name3 # 返回一个列表1) "codehole" 2) "holycoder" 3) (nil) > mset name1 boy name2 girl name3 unknown > mget name1 name2 name3 1) "boy" 2) "girl" 3) "unknown"
过期时间
12345678910111213> set name c ...
Typora激活方法
前言Typora自正式版1.0.0发布后,需要付费获取激活码才能使用,beta版仍可继续免费使用。
以下方法采用非常规方法在1.0.4版本亲测激活成功,特别声明:该方法仅供学习交流,切勿用于任何商业用途。
准备首先需要获得asar的解包和打包工具,工具的使用依赖于以下环境:
python环境
node环境(可选)
源码地址:https://github.com/Mas0nShi/typoraCracker
步骤1.获取工具源代码,进入到工具的根目录。
2.安装工具所需依赖环境:
1pip install -r requirements.txt
该命令需要本机安装有Visual Studio C++ Build Tools,否则安装过程会报错。
3.找到Typora安装目录下的app.asar文件,例如:C:\Program Files\Typora\resources\app.asar。
4.执行工具解包命令:
1python typora.py "C:\Program Files\Typora\resources\app.asar" workstation ...
JUC内置锁
ReentrantReadWriteLock读锁和写锁互斥,相互阻塞写锁和写锁互斥,相互阻塞读锁和读锁不互斥,不阻塞
持有读锁的情况下去获取写锁,会导致获取写锁永久等待(重入时升级不支持)即持有写锁的情况下去获取读锁,不阻塞(重入时降级支持)
示例
12345678910111213141516171819202122232425262728293031323334353637383940414243444546@Slf4j(topic = "c.TestReadWriteLock")public class TestReadWriteLock { public static void main(String[] args) throws InterruptedException { DataContainer dataContainer = new DataContainer(); new Thread(() -> { dataContainer.read(); ...
JUC内置线程池
ThreadPoolExecutorThreadPoolExecutor是最基础的线程池类:
12345678public ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
corePoolSize 核心线程数目 (最多保留的线程数)
maximumPoolSize 最大线程数目
keepAliveTime 生存时间 - 针对救急线程
unit 时间单位 - 针对救急线程
workQueue 阻塞队列
threadFactory 线程工厂 - 可以为线程创建时起个好名字
handler 拒绝策略
工作原理
线程池中刚开始没有线程,当一个任务提交给线程池后,线程池会创建一个新线程来执行任务。
当线程数达 ...
基于ubuntu系统的k8s集群安装
主机准备
主机名
操作系统
CPU
内存
硬盘
master1
ubuntu18.04
1*2核
2G
20G
node1
ubuntu18.04
1*2核
2G
20G
node2
ubuntu18.04
1*2核
2G
20G
集群安装运行时安装(docker)切换root账号sudo su -
12345678910111213sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common gnupg2curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key --keyring /etc/apt/trusted.gpg.d/docker.gpg add -sudo add-apt-repository ...