安全
输入参数用grep来做判断的话,有个坑,就是因为grep只要有一行匹配,就会返回匹配,所以用grep来判断输入参数会被人家用多行参数来绕过。最好还是使用==或者~=来进行判断。
事务
ACID代表atomic,consistency,isolation,durable.其中一致性和可持续性是必然要保证的,然后使用事务一般是为了使用它的原子性,然后配置隔离性是为了在使用事务时能有最好的性能。
事务的隔离级别是一次连接一次配置,每次只要配置自己连接的事物隔离级别
脏读、不可重复读、幻读都是多条事务之间的互相干扰,脏读是读到别人没有commit的数据,不可重复读和幻读都是读到别人提交了的数据(其实这个从某些场合和角度看是合理的),不可重复读是读到别人对某条记录的修改,幻读是读到别人新增的记录。
标准的四个隔离级别:read uncommitted(啥都不防);read committed(防脏读);read repeatable(防脏读和不可重复读,有时候防幻读有时候又不防,所以对幻读不要抱有必然性);synchronized(全防)
MySql支持4个隔离级别,oracle只支持两个隔离级别,分别是read committed和synchronized。
ES
状态检查
注意端口号,VS是7300,ES是9200
查看集群状态
curl -XGET "http://100.100.48.224:7300/_cat/health?v&pretty"
查看哪些索引有问题
curl -XGET "http://100.100.48.224:7300/_cat/indices?v&pretty"
查看哪些shard有问题
curl -XGET "http://100.100.48.224:7300/_cat/shards?v&pretty"
查看哪些节点有问题
curl -XGET "http://100.100.48.224:7300/_cat/allocation?v&pretty"
配置文件
数据路径,在配置文件platform的es.yml里面。
问题解决
无法恢复shard,直接删除对应的shard文件。
VS中查看数据
使用前需要先关闭鉴权,把VS的vsearch.yml中设置vs.authentication: none
(注意中间空格),然后重启VS。
http://10.22.85.220:7300/_plugin/head/
KAFKA
源码debug
在kafka-run-class.sh文件里面
# 加上变量
CMP_DEBUG="-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y"
# 修改执行脚本加上$DEBUG
exec $JAVA $KAFKA_HEAP_OPTS $KAFKA_JVM_PERFORMANCE_OPTS $KAFKA_GC_LOG_OPTS $KAFKA_JMX_OPTS $KAFKA_LOG4J_OPTS $CMP_DEBUG -cp $CLASSPATH $KAFKA_OPTS "$@"
启动命令,一台机器多个kafka
./zookeeper-server-start.sh ../config/zookeeper.properties &
./kafka-server-start.sh ../config/server.properties &
./kafka-server-start.sh ../config/server-1.properties &
./kafka-server-start.sh ../config/server-2.properties &
查看kafka状态
上zk中看节点情况
创建TOPIC
注意IP能不能用localhost要看zk的配置
./kafka-topics.sh --create --zookeeper 10.64.49.110:2181 --replication-factor 2 --partitions 2 --topic testupgrade
删除TOPIC
./kafka-topics.sh --create --zookeeper 10.64.49.110:2181 --topic testupgrade
创建消息
./kafka-console-producer.sh --broker-list 10.64.49.110:9092 --topic testupgrade;
查询TOPIC状态
./kafka-topics.sh --describe --zookeeper 10.64.49.110:2181 --topic testupgrade
读取TOPIC
./kafka-console-consumer.sh --boostrap-server localhost:9092 --from-beginning --topic test
KAFKA向下兼容
在server.properties里面添加下列
inter.broker.protocol.version=0.10.0
log.message.format.version=0.10.0
连接zookeeper超时
在server.properties里面添加
zookeeper.session.timeout.ms=15000
KAFKA开启kerberos验证
先是在kerberos里面增加principle和keytab
./kadmin.local -q 'addprinc -randkey kafka-2/hadoop.hadoop.com@HADOOP.COM'
./kadmin.local -q "ktadd -k /home/zyr/kafka_2.11-2.1.0/config/user-2.keytab kafka-2/hadoop.hadoop.com@HADOOP.COM"
在kafka的config里面添加jaas.conf
KafkaServer {
com.sun.security.auth.module.Krb5LoginModule required
debug=false
keyTab="/home/zyr/kafka_2.11-2.1.0/config/user-2.keytab"
useTicketCache=false
storeKey=true
principal="kafka-2/hadoop.hadoop.com@HADOOP.COM"
useKeyTab=true;
};
KafkaClient {
com.sun.security.auth.module.Krb5LoginModule required
debug=false
keyTab="/home/zyr/kafka_2.11-2.1.0/config/user-2.keytab"
useTicketCache=false
storeKey=true
principal="kafka-2/hadoop.hadoop.com@HADOOP.COM"
useKeyTab=true;
};
Client {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="/home/zyr/kafka_2.11-2.1.0/config/user-2.keytab"
principal="kafka-2/hadoop.hadoop.com@HADOOP.COM"
useTicketCache=false
storeKey=true
debug=true;
};
把kerberos的krb5.conf拷贝到kafka的conf里面
在kafka的启动脚本kafka-server-start.sh里面倒数第二行,也就是执行kafka-run之前,添加一行增加环境变量
s
更改kafka的配置文件
listeners=SASL_PLAINTEXT://10.171.98.103:21007
sasl.kerberos.principal.to.local.rules=DEFAULT
security.inter.broker.protocol=SASL_PLAINTEXT
security.protocol=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=GSSAPI
sasl.enabled.mechanisms=GSSAPI
sasl.kerberos.service.name=kafka
sasl.kerberos.ticket.renew.jitter=0.05
sasl.kerberos.min.time.before.relogin = 60000
sasl.kerberos.ticket.renew.window.factor = 0.8
kerberos.domain.name=hadoop.hadoop.com
allow.everyone.if.no.acl.found = true
ZK
启停命令
./zkServer.sh start(stop,restart)
登录ZK
IP和端口可以通过查看zk状态获得。
./zkCli.sh -server 10.22.85.220:24002
查看所有的节点
ls /
查看ZK状态
./zkServer.sh status
ZK开启kerberos认证
先是在kerberos里面增加principle和keytab
./kadmin.local -q 'addprinc -randkey zookeeper-2/hadoop.hadoop.com@HADOOP.COM'
./kadmin.local -q "ktadd -k /home/zyr/zookeeper-3.4.13/conf/user-2.keytab zookeeper-2/hadoop.hadoop.com@HADOOP.COM"
在zk的config里面添加jaas.conf
Server {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="/home/zyr/zookeeper-3.4.13/conf/user-2.keytab"
storeKey=true
useTicketCache=false
principal="zookeeper-2/hadoop.hadoop.com@HADOOP.COM";
};
把kerberos的krb5.conf拷贝到zk的conf里面
修改zoo.conf,增加
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
jaasLoginRenew=3600000
requireClientAuthScheme=sasl
新增文件java.env,增加
export JVMFLAGS="-Djava.security.auth.login.config=${HOME}/add-ons/kafka_zookeeper/conf/jaas.conf -Djava.security.krb5.conf=${HOME}/config/kafka/krb5.conf "
Kerberos
什么是主体?
kerberos的主体就是一台一台的机器。
主体的加密分为密码和密钥:
client主体的密码,是在主KDC上创建主体时设定,然后用安全的方式通知相应的机器(可以认为是同一个人操作完主KDC的机器,又去操作client的机器),从KDC也需要同步更新一下这些主体的信息。
然后client主体在自己的机器上用kadmin登录自己的主体(client上会装kerberos的客户端,所以有kadmin工具。再因为它此时已经知道了自己的密码,所以可以登录),再创建keytabs。这样一来,KDC和client上就都同步了这个client主体的密钥也就是keytabs了。(还有另一种方式,不用这么麻烦,就是直接把keytabs从KDC的机器上拷贝到client机器上。)
一些配置项:
supported_enctypes里面配置了client到kdc的允许加密类型。kdc会选择同时兼容client和server的加密类型。(最主要的配置项,强限制client到kdc的允许加密类型,变相限制了server到kdc的加密类型)
(下面这些默认不配就好,会采用默认值)
default_tkt_enctypes是配置了client到kdc中获取tkt的加密类型,也受supported_enctypes约束。
default_tgs_enctypes、master_key_enctype 也类似。
permitted_enctypes是配置server和kdc之间的session key。因为要server到kdc兼容kdc到client的加密类型(client用TGS session key和KDC通信,用Server seesion key和server通信),也相当于受到supported_enctypes的约束。
kerberos测试方法:
先启动sbin下的./kadmin
。输入listprincs
看看。
然后启动./kadmind和./krb5kdc两个后台线程。
常用文件
数据库文件,首节点生成,其他节点通过keytab同步过去
- two Kerberos database files,
principal
, andprincipal.ok
- the Kerberos administrative database file,
principal.kadm5
- the administrative database lock file,
principal.kadm5.lock
首节点生成,然后拷贝到其他节点
- krb5.conf
- kdc.conf
- kadm5.acl
- master key stash file(.k5.HADOOP.COM)
- kpropd.acl
GRADLE
在用户目录下配置gradle.properties
systemProp.http.proxyHost=172.18.32.221
systemProp.http.proxyPort=8080
systemProp.http.proxyUser=z00480266
systemProp.http.proxyPassword=
systemProp.http.nonProxyHosts=localhost|127.0.0.*|10.*|192.168.*|*.huawei.com
systemProp.https.proxyHost=172.18.32.221
systemProp.https.proxyPort=8080
systemProp.https.proxyUser=z00480266
systemProp.https.proxyPassword=
systemProp.https.nonProxyHosts=localhost|127.0.0.*|10.*|192.168.*|*.huawei.com
需要在build.gradle文件里把maven相关的地址换成如下:
repositories {
maven {
url "http://rnd-mirrors.huawei.com/maven/"
}
}