tonglin0325的个人主页

Ubuntu16.04安装protobuf

1.proto2

1.protobuf的github地址

1
2
https://github.com/protocolbuffers/protobuf

去releases下载需要的版本

1
2
https://github.com/protocolbuffers/protobuf/releases

选择2.5.0的版本

1
2
https://github.com/protocolbuffers/protobuf/releases/tag/v2.5.0

下载

1
2
wget https://github.com/protocolbuffers/protobuf/releases/download/v2.5.0/protobuf-2.5.0.tar.gz

编译安装

1
2
3
4
5
6
./autogen.sh
./configure
make
make check
sudo make install

安装完毕,查看版本

1
2
3
protoc --version
libprotoc 2.5.0

参考google的javatutorial

1
2
https://developers.google.com/protocol-buffers/docs/javatutorial

pb的数据类型如下

1
2
https://developers.google.com/protocol-buffers/docs/proto

全文 >>

Ubuntu16.04安装openldap和phpldapadmin

安装openldap,参考:

1
2
3
https://www.alibabacloud.com/blog/how-to-install-openldap-and-phpldapadmin-on-ubuntu-16-04_594318
https://www.cnblogs.com/hzw97/p/11592244.html#_lab2_3_0

先卸载干净

1
2
sudo apt remove --purge slapd ldap-utils

再安装

1
2
sudo apt-get install slapd ldap-utils

设置管理员密码,直接确定,后面配置admin的时候会再次配置

配置ldap admin账号密码

1
2
sudo dpkg-reconfigure slapd

配置dc

组织名

设置admin账号密码

database选择MDB

查看ldap状态

1
2
sudo systemctl status slapd

全文 >>

JVM调优常用命令

1.查看java进程,jps命令可以列出正在运行的虚拟机进程

1
2
3
4
jps -l
1005373 sun.tools.jps.Jps
1000153 org.apache.flume.node.Application

2.查看flume进程java虚拟机的统计信息

1
2
3
4
jstat -gcutil 1028479
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
71.69 0.00 25.63 0.14 96.56 89.78 116 1.074 0 0.000 1.074

某springboot web服务进程java虚拟机的统计信息

1
2
3
4
jstat -gcutil 29
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
76.84 0.00 47.11 55.27 96.06 93.04 28 17.787 4 8.589 26.376

对应指标的中文含义

S0:Survivor0的占用比例
S1:Survivor1的占用比例
E:新生代Eden区的占用比例
O:老年代的占用比例
M:方法区的占用比例
CCS:压缩类空间的占用比例
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间

3.查看jvm使用的是什么垃圾收集器

1
2
3
4
5
6
java -XX:+PrintCommandLineFlags -version
-XX:InitialHeapSize=2147483648 -XX:MaxHeapSize=32210157568 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

使用的是并行垃圾收集器

全文 >>

Nexus上传jar包

添加maven proxy

比如中央仓库

1
2
https://repo1.maven.org/maven2/

比如cloudera的仓库

1
2
https://repository.cloudera.com/artifactory/cloudera-repos

maven-central

maven-cloudera

全文 >>

Zk学习笔记——权限控制

参考:从Paxos到Zookeeper分布式一致性原理和实践

使用的zk依赖是cdh5.16.2的3.4.5

1
2
3
4
5
6
7
<!-- zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.5-cdh5.16.2</version>
</dependency>

Zookeeper提供了多种权限控制模式,分别是world,auth,digest,ip和super。

下面介绍模式scheme中的digest

使用如下语句对zk session添加权限,其中的username:password是账号密码

1
2
zk1.addAuthInfo("digest", "username:password".getBytes());

如果操作zk节点没有权限的话,会抛出NoAuthException

1
2
Exception in thread "main" org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /app6

代码

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
package com.bigdata.zookeeper;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;

public class AuthExample {

private static ZooKeeper zk1;
private static ZooKeeper zk2;

public static void main(String[] args) throws Exception {
// zk1 session
zk1 = new ZooKeeper("master:2181", 5000, null);
zk1.addAuthInfo("digest", "username:password".getBytes());
// 创建一个节点
String path = "/app6";
zk1.create(path, "123".getBytes(), ZooDefs.Ids.CREATOR_ALL_ACL, CreateMode.EPHEMERAL);

// zk2 session无权限
zk2 = new ZooKeeper("master:2181", 5000, null);
// System.out.println(new String(zk2.getData(path, false, null)));

// zk2 session有权限
zk2.addAuthInfo("digest", "username:password".getBytes());
System.out.println(new String(zk2.getData(path, false, null)));
}

}

没有权限的话,zkui也会报错

使用zookeeper-client访问

1
2
3
lintong@master:/opt/cloudera/parcels/CDH/bin$ ./zookeeper-client
Connecting to localhost:2181

查看,仍然没有权限

1
2
3
4
5
[zk: localhost:2181(CONNECTED) 0] ls /
[cluster, controller, brokers, zookeeper, admin, isr_change_notification, log_dir_event_notification, ngdata, controller_epoch, kafka-manager, solr, app6, consumers, hive_zookeeper_namespace_hive, latest_producer_id_block, app2, config, app1, hbase, app4, app3]
[zk: localhost:2181(CONNECTED) 1] ls /app6
Authentication is not valid : /app6

设置密码并查看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[zk: localhost:2181(CONNECTED) 3] addauth digest username:password

[zk: localhost:2181(CONNECTED) 7] get /app6
123
cZxid = 0x139e88
ctime = Sun Aug 02 23:38:30 CST 2020
mZxid = 0x139e88
mtime = Sun Aug 02 23:38:30 CST 2020
pZxid = 0x139e88
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0

全文 >>

guava学习笔记

1.CaseFormat

CaseFormat是guava中用于字符串格式转换的工具有以下几种类型

UPPER_CAMEL,比如 UpperCamel

UPPER_UNDERSCORE,比如 UPPER_UNDERSCORE

LOWER_CAMEL,比如 lowerCamel

LOWER_HYPHEN,比如 lower-hyphen

LOWER_UNDERSCORE,比如 lower_underscore

全文 >>

Elasticsearch学习笔记——别名

别名是一个指针或者名称,可以对应一个或者多个具体的索引。

别名的创建,这样就给一个名为es的索引添加了一个别名:alias_test

1
2
3
lintong@lintongdeMacBook-Pro ~ $ curl -XPUT 'http://master:9200/es/_alias/alias_test'
{"acknowledged":true}%

添加了别名之后,在查询es索引的时候

1
2
curl 'http://master:9200/alias_test/_search?q=_id:1'

就等同于

1
2
curl 'http://master:9200/es/_search?q=_id:1'

别名的删除

1
2
3
lintong@lintongdeMacBook-Pro ~ $ curl -XDELETE 'http://master:9200/es/_alias/alias_test'
{"acknowledged":true}%

全文 >>

Kafka学习笔记——存储结构

1,由cdh安装的kafka的默认存储路径如图所示在/var/local/kafka/data,一般会进行修改

kafka配置参考:apache kafka系列之server.properties配置文件参数说明

路径下文件如下

如果是多个路径的话,使用,进行分隔,比如/data01/kafka/data,/data02/kafka/data,注意data的权限需要是kafka用户和kafka组

对应kafka manager上的topic

具体的topic的目录下的文件

1
2
3
4
lintong@master:/var/local/kafka/data/test_topic-0$ ls
00000000000000000187.index 00000000000000000187.snapshot leader-epoch-checkpoint
00000000000000000187.log 00000000000000000187.timeindex

其中

187就是这个日志数据文件开始的offset

00000000000000000187.log是日志数据文件

可以使用解码命令查看日志片段中的内容

1
2
3
4
5
6
7
8
/opt/cloudera/parcels/KAFKA/bin/kafka-run-class kafka.tools.DumpLogSegments --files ./00000000000000000187.log
20/07/19 17:28:55 INFO utils.Log4jControllerRegistration$: Registered kafka:type=kafka.Log4jController MBean
Dumping ./00000000000000000187.log
Starting offset: 187
baseOffset: 187 lastOffset: 187 count: 1 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 0 CreateTime: 1595149737820 size: 71 magic: 2 compresscodec: NONE crc: 1738564593 isvalid: true
baseOffset: 188 lastOffset: 188 count: 1 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 71 CreateTime: 1595149744449 size: 74 magic: 2 compresscodec: NONE crc: 3794338178 isvalid: true
baseOffset: 189 lastOffset: 189 count: 1 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 145 CreateTime: 1595149757514 size: 75 magic: 2 compresscodec: NONE crc: 3084259622 isvalid: true

log.segment.bytes设置是1G,如果log文件的大小达到1G之后会生成另外一个log文件

该参数在1.0.1及以下的kafka有bug,可能会影响消费者消费topic的数据,但是不影响生产者,参考:https://issues.apache.org/jira/browse/KAFKA-6292

当kafka的broker读取segment文件的时候,会判断当前当前读取的segment的偏移量position在继续读取一段HEADER_SIZE_UP_TO_MAGIC之后和该segment文件最大可读取的偏移量end之间的大小

当调高了log.segment.bytes=2G,注意此处2G=有符号INT的最大值=2147483647,有可能导致position+HEADER_SIZE_UP_TO_MAGIC的大小超过int最大值,从而成为负数,小于end,返回null,并导致从log文件的末尾开始读取数据

参考kafka 1.0.1版本源码:https://github.com/apache/kafka/blob/1.0.1/clients/src/main/java/org/apache/kafka/common/record/FileLogInputStream.java

全文 >>

分布式协议——Paxos、Raft和ZAB

参考:分布式系统协议Paxos、Raft和ZAB

Paxos算法是一种提高分布式系统容错率的一致性算法

Paxos 算法的步骤是这样:

1.首先有两种角色,一个是“提议者”,一个是“接受者”。提议者可以向接受者提出提议,然后接受者表达意见。

2.因为存在多个提议者,如果同时表达意见会出现意见不一致的情况,所以首先需要尽快选出一个领导者,让意见统一。

3.然后领导者会给接受者发出提议,如果一个提议被大多数接受者接纳,这个提议就通过了。

全文 >>