如何使用HAProxy实现Kerberos环境下的Impala负载均衡

2018-04-01 20:51:59 浏览数 (1)

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。 Fayson的github:https://github.com/fayson/cdhproject 提示:代码块部分可以左右滑动查看噢

1.文档编写目的


前面Fayson介绍过《如何使用HAProxy实现Impala的负载均衡》,在Kerberos环境HAProxy的配置与非Kerberos环境下是一样的,只是在Impala的配置上需要做一些修改,接下来本篇文件主要讲述如何在Kerberos环境下使用HAProxy实现Impala的负载均衡。

  • 内容概述

1.修改Impala配置

2.Impala shell及JDBC测试

  • 测试环境

1.CM和CDH版本为5.11.2

2.采用sudo权限的ec2-user用户操作

3.集群已启用Kerberos

4.HAProxy1.5.18

2.HAProxy安装及配置


本文不再重复如何安装及配置HAProxy了,具体的安装及配置大家可以参考Fayson前面的文章《如何使用HAProxy实现Impala的负载均衡》。

我们在ip-172-31-22-86.ap-southeast-1.compute.internal节点上安装HAProxy服务,通过浏览器访问服务正常

3.Impala配置


1.使用管理员账号登录Cloudera Manager,进入Impala服务

2.搜索“Load Balancer”,在下图所示配置HAProxy的<IP>:<PORT>

3.保存配置,回到CM主页根据提示重启相应服务

4.重启成功

4.Impala Shell测试


使用多个终端同时访问,并执行SQL语句,查看是否会通过HAProxy服务自动负载到其它Impala Daemon节点,由于集群启用了Kerberos,所以在执行Impala shell命令前,需要先获取令牌

1.获取fayson的Kerberos令牌

代码语言:txt复制
[ec2-user@ip-172-31-21-45 ~]$ kinit -kt fayson.keytab fayson
[ec2-user@ip-172-31-21-45 ~]$ klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: fayson@CLOUDERA.COM

Valid starting       Expires              Service principal
12/22/2017 09:58:57  12/23/2017 09:58:57  krbtgt/CLOUDERA.COM@CLOUDERA.COM
        renew until 12/29/2017 09:58:57
[ec2-user@ip-172-31-21-45 ~]$ 

2.使用Impala shell访问HAProxy服务的25003端口,命令如下

代码语言:txt复制
impala-shell -i ip-172-31-22-86.ap-southeast-1.compute.internal:25003

3.打开第一个终端访问并执行SQL

4.同时打开第二个终端访问并执行SQL

通过以上测试可以看到,两个终端执行的SQL不在同一个Impala Daemon,这样就实现了Impala Daemon服务的负载均衡。

5.Impala JDBC测试


如何创建Java工程,Fayson不在赘述。具体请参考《如何使用java代码通过JDBC连接Impala(附Github源码)》

1.配置JDBC的地址为HAProxy服务所在的IP端口为25004,提示:代码块部分可以左右滑动查看噢

代码语言:txt复制
package com.cloudera.impalajdbc;

import com.cloudera.utils.JDBCUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.security.UserGroupInformation;
import java.io.IOException;
import java.security.PrivilegedAction;
import java.sql.*;

/**
 * package: com.cloudera.impala
 * describe: 该示例主要讲述通过JDBC连接Kerberos环境下的Impala
 * creat_user: Fayson
 * email: htechinfo@163.com
 * 公众号:Hadoop实操
 * creat_date: 2017/11/21
 * creat_time: 下午7:32
 */
public class KBSimple {

    private static String JDBC_DRIVER = "com.cloudera.impala.jdbc41.Driver";
    private static String CONNECTION_URL = "jdbc:impala://ip-172-31-22-86.ap-southeast-1.compute.internal:25004/default;AuthMech=1;KrbRealm=CLOUDERA.COM;KrbHostFQDN=ip-172-31-22-86.ap-southeast-1.compute.internal;KrbServiceName=impala";

    static {
        try {
            Class.forName(JDBC_DRIVER);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        System.out.println("通过JDBC连接Kerberos环境下的Impala");
        //登录Kerberos账号
        try {
            System.setProperty("java.security.krb5.conf", "/Volumes/Transcend/keytab/krb5.conf");
            Configuration configuration = new Configuration();
            configuration.set("hadoop.security.authentication" , "Kerberos");
            UserGroupInformation. setConfiguration(configuration);
            UserGroupInformation.loginUserFromKeytab("fayson@CLOUDERA.COM", "/Volumes/Transcend/keytab/fayson.keytab");
            System.out.println(UserGroupInformation.getCurrentUser()   "------"   UserGroupInformation.getLoginUser());

            UserGroupInformation loginUser = UserGroupInformation.getLoginUser();

            loginUser.doAs(new PrivilegedAction<Object>(){

                public Object run() {
                    Connection connection = null;
                    ResultSet rs = null;
                    PreparedStatement ps = null;
                    try {
                        Class.forName(JDBC_DRIVER);
                        connection = DriverManager.getConnection(CONNECTION_URL);
                        ps = connection.prepareStatement("select * from test_table");
                        rs = ps.executeQuery();
                        rs = ps.executeQuery();
                        while (rs.next()) {
                            System.out.println(rs.getInt(1));
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    } finally {
                        JDBCUtils.disconnect(connection, rs, ps);
                    }
                    return null;
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2.运行代码,查看运行结果

6.总结

  • 在Kerberos环境下使用HAProxy实现Impala负载均衡,需要配置Impala的Load Balance。
  • 在Kerberos环境下一旦配置了Impala的LoadBalance,将不能再连单个Impala Daemon,只能连HAProxy。
  • 在使用JDBC连接HAProxy时,需要注意JDBC连接串中的KrbHostFQDN要与HAProxy服务的hostname一致,否则会报认证失败的错误。

Github地址:

https://github.com/fayson/cdhproject/tree/master/jdbcdemo/src/main/java/com/cloudera/impalajdbc/KBHAProxySimple.java

为天地立心,为生民立命,为往圣继绝学,为万世开太平。

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。

0 人点赞