Kerberos介绍和安装

简介

Kerberos认证机制

Kerberos是一种网络认证协议,在非安全网络通信环境下,服务器使用Kerberos以安全的方式向另一个服务器证明其身份。

Kerberos的核心是密钥分发中心(KDC),由两个相互独立的逻辑部件:认证服务器(Authentication Server)和票据授权服务器(Ticket Granting Service)。Kerberos持有一个记载每个Kerberos用户的密钥数据库,而且每个密钥只有相对应的Kerberos用户和KDC知道。两个实体通讯,KDC会为他们产生一个临时会话密钥,将其交互信息进行加密。

Kerberos协议流程
  1. 用户向认证服务器AS请求一个票据和密钥,该票据于密钥的作用是与TGS进行会话
  2. AS查询该请求用户的唯一标识是否在数据库中,若存在,生成一个会话密钥,用于客户端与TGS会话,并使用C-AS会话密钥进行加密,同时生成用户访问TGS时的票据许可TGT
  3. 用户通过解密AS的返回信息后获得与TGS会话的密钥,随后向TGS发起请求,并发送会话密钥与票据许可
  4. TGS收到请求后利用会话密钥进行解密,并验证用户身份,回发消息
  5. 用户将返回的信息解密,获得与应用服务器进行会话的密钥,向远端的应用服务器发起请求,提交许可票据
  6. 应用服务器收到用户请求,认证其许可票据信息,与此同时用户收到应用系统的返回信息,验证其是否合法,从而对远端服务器进行身份确认

KDC-SERVR环境搭建(都在root帐号下操作-ubuntu.16)

进入Master机器,执行以下命令:

apt-get install krb5-admin-server krb5-kdc

  • krb5-admin-server: kdc管理员程序,可以让使用者远程管理kdc数据库
  • krb5-kdc: kdc主程序
  • krb5-user: Kerberos的客户端命令,对于ticket的操作等

输入realm,自定义


输入kdcserver所在机器的hostname

初始化超级管理员密码,输入kadmin.local,没有报错,表示安装成功。

kdb5_util create -r SC.COM -s

修改KDC默认配置

查看/etc/krb5.conf,确认配置没问题

启动服务

KDC-CLIENT环境搭建(都在root帐号下操作-ubuntu.16)

apt-get install krb5-user


验证安装成功

回到kdc-serve机器,添加用户。

回到kdc-client,验证用户

keytab的作用

进入kdc-server kadmin.local,为kdc-client添加密钥keytab

拷贝到client机器上

回到client,新增hdfs帐号,确认hdfs.keytab是hdfs用户可以访问的,输入命令kinit加载密钥。klist查看。

CDH 介绍和搭建过程(离线安装)

什么是CDH(Cloudera's Distribution, including Apache Hadoop)

CDH hadoop体系搭建脚手架,集成了体系的众多组件,如:Flume、Hbase、Hiv、Hdfs等
Cloudera Management:
Cloudera Manager是一个拥有集群自动化安装、中心化管理、集群监控、报警功能的一个工具(软件),使得安装集群从几天的时间缩短在几个小时内,运维人员从数十人降低到几人以内,极大的提高集群管理的效率。
cloudera manager有四大功能:
  (1)管理:对集群进行管理,如添加、删除节点等操作。
  (2)监控:监控集群的健康情况,对设置的各种指标和系统运行情况进行全面监控。
  (3)诊断:对集群出现的问题进行诊断,对出现的问题给出建议解决方案。
  (4)集成:对hadoop的多组件进行整合。

CDH安装

在线安装不考虑,不过,如果你的网速够快,对外网的网速也够快,就可以用在线安装的方式。
下面说说离线安装的事情。
在说安装之前我们先了解下CDH的几个安装必须的文件:

CDH-5.7.1-1.cdh5.7.1.p0.11-el5.parcel.sha1
CDH-5.7.1-1.cdh5.7.1.p0.11-el6.parcel

版本号在el5上。el标识红帽子一系列的linux系统。安装时候注意自己系统,不要下错对应版本。

manifest.json

存储了其他组件版本信息

CDH 环境检查

java 环境:集群的每台机器都需要安装java环境。注意:jdk版本号必须和CDH版本号对应上。意思是,CDH每个版本都有对应的jdk版本号,不能台新也不能太久。当jdk版本号错误会出现一些奇怪的问题。

JAVA—CountDownLatch

应用篇

CountDownLatch是一个java的同步工具类。

public static void main(String[] args) throws InterruptedException {
    int n = 100;
    CountDownLatch doneSignal = new CountDownLatch(n);
    Executor e = Executors.newFixedThreadPool(10);
    for (int i = 0; i < n; ++i) {
        e.execute(new WorkerRunnable(doneSignal, i));
    }
    doneSignal.await();
    System.out.println("Over");
    System.exit(0);
}

public static class WorkerRunnable implements Runnable {

    private final CountDownLatch doneSignal;
    private final int i;

    public WorkerRunnable(CountDownLatch doneSignal, int i) {
        this.doneSignal = doneSignal;
        this.i = i;
    }

    public void run() {
        System.out.println("工作中" + i  + ": " + System.currentTimeMillis());
        doneSignal.countDown();
    }
}

执行结果


可见CountDownLatch可以保证所有线程执行完毕后再退出程序。这个线程数和N的大小有关。
把N改为5,执行结果如下。System.exit改为如下。
System.exit(-1);

线程提前返回。countDown减1,当count为0的时候,结束等待。


进阶篇

为了更好的理解countDownLatch内部实现原理,我们将从源码解析的角度解读countDownLatch锁机制。

NIFI使用(三)Data Provenance 的重要应用

前言

NIFI是一个强大的数据处理工具,APACHE的顶级项目,什么叫顶级?我也不知道,有兴趣的自己了解下。开始主要是如何使用NIFI,会用了再谈原理。
工具的作用在于减少人的劳作,增加劳动力,工具同时也是使大多数人变的不愿意思考的元凶。我们应该怀着超越该工具的思想去学习,站在巨人的肩膀上。

这章节主要粗略讲下在Data Provenance(数据出处)的应用,开发阶段如果我们需要确认数据流通方式,数据流通过程中都是用什么样的形式传输,就需要用到Data Provenance。这里只对应用进行说明,对它的存储原理,数据加密处理等等不做说明。


右键一个Processor,下面以ConvertAvroToJSON的为例:

点击View data provenance 调出页面

左边感叹号点击后面再说,是详细信息,先说下列表,关于Type网关有说明http://nifi.apache.org/docs/nifi-docs/html/user-guide.html#provenance_events

FlowFileUuid,当流程启动时,第一个节点产生一个uuid会伴随这个数据一直走下去。size,数据块大小。最后是3个连着的圈指关系图谱,就是该条数据做过哪些事情,有一个流程图一样的东西。

点击感叹号!

Details : 包含执行时间,执行时长,类型,还有一些组件的信息。

Attributes:这里是数据传输过程中,一些组件固有属性,重要的有mime.tyep:第一行是当前输出的数据类型,后面灰色的是指输入的数据类型。

Content:
InputClaim :输入。点击View

可以看到右边有contentType,是不是很熟悉。这是个ajax的请求。由于这是avro格式的数据,左边可以切换为格式化显示,它可以输出一个json格式的字符串。

OutputClaim :输出。点击View,由于ConetntType是json,就直接展示了。

到此我们可以看到,data provence在调试过程中的重要性,要学会查看输入输出数据,通过对数据的对比校验,检查自己的组件是否存在bug。并且分析传输类型可以堆组件之间的关系更加了解。

NIFI使用(二)HDFS到Mysql的数据传输

前言

NIFI是一个强大的数据处理工具,APACHE的顶级项目,什么叫顶级?我也不知道,有兴趣的自己了解下。开始主要是如何使用NIFI,会用了再谈原理。
工具的作用在于减少人的劳作,增加劳动力,工具同时也是使大多数人变的不愿意思考的元凶。我们应该怀着超越该工具的思想去学习,站在巨人的肩膀上。
上一节已经说明了一些基础组件,下面直接进入正题。

所用处理器GetHDFS->InferAvroSchema->ConvertCSVToAvro->ConvertAvroToJSON->ReplaceText->ConvertJSONToSQL->PutSQL

GetHDFS:获取一个HDFS目标文件。

InferAvroSchema:创建一个Avro的Schema空间。
注意:Schma Output Destination :要选择flowfile-attribute,否在在下面一步会娶不到命名空间的值。

ConvertCSVToAvro:配置CSV所在的schma空间。要加上hadoop配置(这里是怎么设计的,想不明白)

ConvertAvroToJSON:见上篇

ReplaceText:见上篇

ConvertJSONToSQL:见上篇

PutSQL:见上篇

NIFI使用(一)Mysql到Mysql的数据传输

前言

NIFI是一个强大的数据处理工具,APACHE的顶级项目,什么叫顶级?我也不知道,有兴趣的自己了解下。开始主要是如何使用NIFI,会用了再谈原理。
工具的作用在于减少人的劳作,增加劳动力,工具同时也是使大多数人变的不愿意思考的元凶。我们应该怀着超越该工具的思想去学习,站在巨人的肩膀上。

整体页面

首先看看整体页面
中间的白色板子是后面是传输流程。
我们先说下导航栏:从左到右的图标依次是。

Processor:nifi基本处理单元,目前所知,所有数据连接,数据处理都是在这个单元中做的。

Input Port:输入组件,主要应用于process group 接收外部数据流的时候使用。

Output Port:同input port,主要用于向外部输出数据流的时候使用。

Process group:相当于新建一个画布,可以在新画布写数据流程。

Remote Process group:远程执行用,两个NIFI实例之间互相通信使用。

Funnel:漏斗,将几种格式数据转换为一种输出,具体应用待测试,没用过。

Template:模板,顾名思义,将写好的流程可以组装成一个模板。

Label:便签,记录用。

组件通用页面


Penalty Duration 惩罚时间,当数据流传输过程中产生问题,允许组件对该数据流暂停处理一段时间
Yield Duration 延迟,越小代表越小的延迟,越小会造成浏览器的压力越大
其他都是处理器的基本属性,名称等等。值得注意的是右边的failure和success。如果该处理器没有下级组件,需要自己打勾。


Scheduling定时器:Concurrent Tasks 执行线程数量,Run Schedule 执行频率 10S。

Mysql到Mysql的数据传输


流程组件 ExecuteSQL->ConvertAvroToJSON->ReplaceText->ConvertJSONToSQL->PutSQL

ExecuteSQL:SQL执行,返回Avro格式(Avro NIFI中的数据格式,关系型数据库查出来的基本都是Avro格式)。

Database Connection Pooling Service:创建一个数据库连接池。具体配置点击箭头,参考JDBC连接。

ConvertAvroToJSON:将Avro格式数据转换成JSON。

ReplaceText:替换字符串。

ConvertJSONToSQL:将JSON格式转换为INSERT,UPDATE等SQL。

PutSQL:将之前的生成的SQL放到数据库执行。

LogAttribute:记录日志

MySql Cluster 测试结果

安装步骤->安装步骤
查看错误->错误集锦
节点作用->节点作用
测试结果->测试结果

性能测试

测试环境搭建:

Mysql Cluster 管理节点1个,Sql节点2个,数据节点2个。搭建过程见安装步骤。这里不再赘述。
测试表准备:

CREATE DATABASE IF NOT EXISTS testdb;
DROP TABLE IF EXISTS student;
CREATE TABLE IF NOT EXISTS student (
  UUID         VARCHAR(50) NOT NULL,
  name         VARCHAR(25) NOT NULL,
  age          INT(3)      NOT NULL,
  gentle       INT(1)      NOT NULL,
  province     VARCHAR(5)  NOT NULL,
  post_code    VARCHAR(10) NOT NULL,
  school_code  VARCHAR(2)  NOT NULL,
  school_level VARCHAR(8)  NOT NULL,
  class        VARCHAR(10) NOT NULL,
  create_ts    TIMESTAMP   NOT NULL DEFAULT now(),
  PRIMARY KEY (UUID),
  INDEX (create_ts)
)
  ENGINE = NDBCLUSTER;

DROP TABLE IF EXISTS `order`;
CREATE TABLE IF NOT EXISTS `order` (
  UUID      VARCHAR(50) NOT NULL,
  stu_uuid  VARCHAR(50) NOT NULL,
  is_pay    BOOLEAN     NOT NULL,
  money     BIGINT      NOT NULL,
  create_ts TIMESTAMP   NOT NULL DEFAULT now(),
  PRIMARY KEY (UUID),
  INDEX (create_ts)
)
  ENGINE = NDBCLUSTER;

测试过程及详情:

我们安装jemeter测试工具,用于发送请求。并且用二维折线图来展示测试关系。先测试单节点情况。
SQL插入测试:

INSERT INTO testdb。student (UUID,name,age,gentle,province,post_code, school_code,school_level, class,create_ts) VALUES (UUID(),'zs',77,1,'JX', '400000','21','middle','A99','2018-05-22 11:35:33');

通过测试得到下图:

上图的x轴是jemeter测试工具的并发量,X坐标代表并发量。Y代表时间,或者数量。淡蓝的线代表吞吐量,单位是K,深蓝是代表平均响应时间,单位ms。
根据公式得知,并发数=吞吐量/平均响应时间。在并发数量90的时候也就是,吞吐量在11K的时候,系统的响应时间上涨,但是吞吐量开始下降,这个点可以理解为服务器的瓶颈,也就是说,过了这个点,服务器性能开始下降。那导致服务器性能下降的原因是什么?数据量过大?还是服务器本身的因素。然后,我们做了如下的测试:

上图的蓝线还是原来的线条。但是,黄线的执行顺序是反向的。打个比方:蓝线执行顺序是,10-20-30-40-50......黄线的执行顺序是110-100-90-80.....由图可以看出来,数据库存储的数据量并不是造成SQL性能下降的原因。因为,插入行为反向执行,但是并没有影响平局响应时间的变化。我们再看下面一张:

前面说过,我们的服务器是2核4G的虚拟机,可以明显看到,发送请求的机器,内存和CPU并没有什么太大的变化。然而,SQL节点CPU高达166%(总共200%),说明CPU这时候已经很繁忙了。
到这里我们可以得到一个结论:插入效率也可以叫事务提交效率,在机器硬件是如下的情况(2核4G,CPU: Intel Core Processor (Broadwell)),最高并发量是100左右。当吞吐量超过11K之后,并发量不仅仅会下降,响应时间也会加长,就是这个机器的性能瓶颈。当我们业务需要更多的机器的时候,我们可以通过增长集群的SQL节点来优化这个问题。理论上,2个SQL节点的效率至少是1个的2倍。
多SQL节点插不测了,由于只有一台物理机器,无法测试出真正的效果,不过理论上应该是2倍效率。

SQL连表查询:

SELECT * from student r1 RIGHT JOIN `order` r2 on r1.UUID = r2.stu_uuid ;

数据量:student, 200W条, order , 600W条。
下面看图:

如上图所示,并发量增大,平均响应时间(ms)和吞吐量(单位x100)也一起增大。但是在测试的时候,由于并发超过250左右时候,数据库会出现一个错误“'Too many active scans' from NDBCLUSTER”。官网也没有给出解决方法。大概意思就是查询请求过多。修改了最大扫描的参数依旧无效,这个错误还有待解决。我们在选择每个SQL节点分配多少资源的时候,可以根据这种图做出选择,需要快速反应的节点,应该尽量减少并发量,让响应时间保持在100ms以下。由于没有测试到吞吐量和响应时间的交叉点,所以不知道这个服务器瓶颈点在什么位置。不过,由于数据库的特殊性,建议单个服务器不要超过250并发。
总结:经过测试可以得知,插入正常情况下5ms能过响应,连表查询100ms左右,考虑到测试环境机器是虚拟机,这样的速度是正常的。以及网络带宽的原因,mysql cluster的效率受到网络的影响比较大。官网给出的测试是在万兆带宽情况下进行。在不同的机器环境,软件环境下,我们的测试就可能会有很大的差距。不过,测试的目地在于帮助我们在不同的环境下选择搭建数量合适的集群机器。根据这样的效率,我认为mysql cluster可以应用在生产环境,但是需要经过大量测试,保证集群机器之间的带宽。
一些建议:
1.SQL节点CPU越好性能越高。
2.数据节点内存越大越好,如果数据分片的越多,对查询效率会有一定影响。
3.Mysql cluster 集群前,应通过测试决定合适的机器数量。

MySql Cluster 集群新增节点测试以及各个节点作用

安装步骤->安装步骤
查看错误->错误集锦
节点作用->节点作用
测试结果->测试结果

图解:启动过程


SQL,在DB没有启动的时候是无法启动的.
DB启动,你需要在短时间内启动全部DB节点,否在,DB节点可能会出现全部挂掉的情况

图解:SQL请求过程,数据存储过程


SQL节点分区好后开始发送请求,我测试下应该是一起发送,所有请求.当数据到达数据节点,会先存入数据的内存内.然后数据节点会将内存数据同步到本地磁盘上,在会到同组的节点备份一个数据,数据节点存储数据位置在数据存放位置的LCP目录下(/usr/local/mysql/data/LCP/)

Mysql Cluster 管理节点

管理节点作用: 管理配置文件,监控节点,暂停以及唤醒数据节点.当管理节点挂点,整个集群是可以照常运行的.这个节点没有必要新增,如果配置双管理节点,那也是为了学习,很少见配置双管理节点.

动态新增管理节点:没有必要.一个足够了.

Mysql Cluster 数据节点

数据节点作用:当数据节点启动,它会将数据加载到内存中,由于设计了数据节点内存大小,小心会超过.
在运行过程中,如果内存中数据发生了变化,它会将内存的数据同步到磁盘上,以及各个副本服务器中.

动态新增数据节点:如果要新增数据节点,节点的备份数量是不能修改的,如果修改了配置文件中的备份数量,需要数据节点初始化,这样会导致数据节点的数据丢失.
新增备份数的机器,如果NoOfReplicas=2,你新增节点需要多加两个.必须同时加入,否在分配节点组的时候会报错.刚加入节点如下图:

新建nodegroup, create nodegroup 7,8,(7,8是节点id)

重新分配数据,登录 sql 执行:ALTER TABLE student ALGORITHM=INPLACE, REORGANIZE PARTITION;
刚开始:

最终结果:

添加成功,这时候只要重启其他数据节点,占有的百分比就会下降.
分片时,旧数据节点内存中的数据不会发生变化,只有重启数据节点后才能看到效果
数据节点的CPU占用异常高,数据库几乎处于不可用的状态.所以生产环境要注意.

Mysql Cluster SQL节点

SQL节点作用:除了存储数据,其他东西都由它管理,包括分片,SQL语句解读等等.
动态新增SQL节点:照常配置新的SQL节点.配置文件配置新节点,重新加载配置文件,启动SQL节点SQL服务即可.

上图是新增节点,访问不存在的数据库时的操作.(SQL节点保存了数据库的信息,但是,数据表,数据都是存储在数据节点上的)
注意:新增的SQL节点没有数据库的信息,也就是没有database,如果你需要访问对应的database,请自己创建.由于数据节点不会存储database的数据.

MySql Cluster 集成安装,Centos,坑点集锦

坑点集锦

安装步骤->安装步骤
查看错误->错误集锦
节点作用->节点作用
测试结果->测试结果

[MgmtSrvr] ERROR -- Failed to delete file '/usr/local/mysql/mysql-cluster/ndb_1_config.bin.1',
权限不足,使用root启动


[MgmtSrvr] INFO -- The default config directory '/usr/local/mysql/mysql-cluster' does not exist. Trying to create it...
Failed to create directory '/usr/local/mysql/mysql-cluster', error: 2
[MgmtSrvr] ERROR -- Could not create directory '/usr/local/mysql/mysql-cluster'. Either create >it manually or specify a different directory with --configdir= 缺少目录/usr/local/mysql/mysql-cluster,自己去创建一个


查看管理节点日志ndb_1_cluster.log


ERROR Message: The cluster configuration is not yet confirmed by all defined management servers. This management server is still waiting for node 1 to connect.
解决办法:等待第二个另外一个管理节点启动


Failed to allocate nodeid for API at 192.168.31.48. Returned error: 'No free node id found for mysqld(API).'
解决办法:第一个可能,管理节点配置问题,节点id分配问题.
解决办法:第二个,其他节点配置问题,比如连接地址错误.


如果发现sql节点和数据节点无法连接,或者正常启动,但是管理节点还是显示未连接,请检查 防火墙.
如果发现sql节点时有时无,会闪现的情况,可能是有一个sql节点的配置错误导致


[ndbd] WARNING -- Cannot change directory to '/usr/local/mysql/data', error: 2
[ndbd] ERROR -- Couldn't start as daemon, error: 'Failed to open logfile '/usr/local/mysql/data/ndb_8_out.log' for write, errno: 2'
解决办法:创建./usr/local/mysql/data.


Forced node shutdown completed. Occured during startphase 1. Caused by error 2308: 'Another node failed during system restart, please investigate error(s) on other node(s)(Restart error). Temporary error, restart node'.
原因:在一定时间内,DB节点没有全部启动,轮流重启不能间隔太久时间.
解决办法:短时间内启动所有DB节点.


添加数据节点的时候,不能修改NoOfReplicas=2参数,一旦修改,需要全部数据节点重新初始化才能启动.否在,数据节点是启动不起来的.


Unable to setup transporter service port: 192.168.31.45:2202!
Please check if the port is already used,
(perhaps the node is already running)
globalTransporterRegistry.start_service() failed
解决:端口被占用....停掉所有集群服务,有些服务还在启动情况下,会和2202进行数据交互.


这里错误可能补全,由于有些错误都是粗心导致,忘记记录.如果你有发现其他错误,欢迎交流.