kong+casssandra集群环境部署
kong简介
Kong是Mashape开源的一款API网关,起初是用来管理 Mashape 公司15000个微服务的,后来在2015年开源,现在已经在很多创业公司、大型企业和政府机构中广泛使用。基于nginx,Lua和Cassandra或PostgreSQL,支持分布式操作,有很强的可移植性和可扩展性。可以在任何一种基础设施上运行,作为应用和API之间的中间层,加上众多功能强大的插件,可以实现认证授权、访问控制等功能。并且提供易于使用的RESTful API来操作和配置系统。
有关kong的详细介绍请参考官网.
–
cassandra简介
Cassandra 是一个来自 Apache 的分布式数据库,具有高度可扩展性,可用于管理大量的结构化数据。它提供了高可用性,没有单点故障。kong支持PostgreSQL或者Cassandra两种数据库.这里我们选择了cassandra.
有关cassandra的详细介绍和使用方法.请参考官网
–
集群架构
- kong cluster
kong 集群并不意味着客户端请求将会负载均衡到kong集群中的每个节点上,kong集群并不是开箱即用,仍然需要在kong集群多节点上层搭建负载均衡,以便分发请求。 一个kong集群只是意味着集群内的节点,都共享同样的配置。
有关Kong cluster集群的详细介绍请参考官网:Kong cluser document
为了提高冗余性和健壮性.我们对kong的每个环节都进行了冗余设计.一个基本的kong集群架构大概如下图所示:
–
部署步骤
环境:
阿里云ECS Centos7.4操作系统
Kong: 0.14 最新版
Cassandra: 3.11 最新版
–
安装Cassandra
安装方式官网参考: Installing Cassandra
安装前提条件
1.安装JDK 8版本
2.安装2.7以上版本的Python.(cassandra管理工具:cqlsh 需要python2.7以上环境)
安装步骤
1.下载cassandra二进制文件.
1 | wget http://mirrors.tuna.tsinghua.edu.cn/apache/cassandra/3.11.3/apache-cassandra-3.11.3-bin.tar.gz |
2.将cassandra目录添加进环境变量.用work用户运行cassandra
1 | sudo mkdir /usr/local/cassandra |
添加进环境变量
1 | sudo vim /etc/profile |
–
配置Cassandra,以及cassandra集群
1.编辑cassandra的cassandra.yml配置文件.修改下列配置:
1 | [work@kong-node1 kong]$ vim /usr/local/cassandra/conf/cassandra.yaml |
2.创建刚才定义的路径目录
1 | sudo mkdir -pv /data/cassandra |
3.启动cassandra.直接在命令行执行cassandra
1 | [work@kong-node1 kong]$ cassandra |
- 使用cqlsh工具登陆cassandra数据库.创建cassandra用户密码,以及创建键空间
1 | #注意由于cassandra只侦听了内网的地址,因此要指定IP地址. |
5.删除自带的cassandra用户
1 | [work@kong-node1 cassandra]$ cqlsh 10.25.87.159 -ukong -pkong |
–
安装Kong
安装方法可以参考官网:Install Kong
1.下载,安装rpm安装包
1 | wget -O kong-community-edition-0.14.1.el7.noarch.rpm https://bintray.com/kong/kong-community-edition-rpm/download_file?file_path=centos/7/kong-community-edition-0.14.1.el7.noarch.rpm |
2.修改配置文件
1 | cd /etc/kong |
3.创建kong目录
1 | mkdir /data/kong |
4.准备启动工作
1 | kong migrations up -c /etc/kong/kong.conf |
5.启动kong
1 | kong start -c /etc/kong/kong.conf |
查看端口.可以看到cassandra和kong的侦听端口都已经成功启动
1 | work@kong-node1 kong]$ netstat -tulnp |
部署另外一台kong和cassandra
今天在阿里云镜像了kong-node1的服务器.新的服务器名字为kong-node2.
软件已经安装,只需要修改部分配置
修改node1和node2上的cassandra配置
1 | 在node1和node2上: |
在node2上修改kong的配置文件:
1 | work@kong-node2 ~]$ vim /etc/kong/kong.conf |
note:千万不要启动node2上的cassandra.因为node2是从node1镜像过去的.所以数据库的token是一模一样的.
在node2上删除cassandra的数据库.这一步非常重要.因为这是从node1镜像过来的.所以node2上的数据库是node1的数据
1 | rm -rf /data/cassandra/* |
启动node2上的数据库
直接在命令行执行:cassandra
查看cassandra的单台服务器状态
1 | [work@kong-node1 bin]$ nodetool info |
查看cassandra集群状态.可以看到集群中2台服务器
1 | [work@kong-node1 bin]$ nodetool status |
以下是我踩过的坑.在没有删除node2上的数据库文件情况下,直接启动cassnadra.
启动node2的cassandra后.发现集群无法正常启动.使用cassandra自带的nodetool工具可以查看集群状态.这里只有自己一台服务器
1 | [work@kong-node2 ~]$ nodetool status |
查看cassandra启动日志,发现日志提示和node1有一样的token:
1 | less /usr/local/cassandra/logs/system.log |
不仅如此,在node1上启动kong,提示cassandra数据库验证失败.以及提示kong需要migrations up(只需要在第一次启动kong时才需要migratios up):
1 | [work@kong-node1 bin]$ kong restart -c /etc/kong/kong.conf |
kong migrations失败
1 |
|
解决方法
启动node1和node2的cassandra
1.在node1和node2上drop kong的键空间
1 | [work@kong-node1 bin]$ cqlsh 10.25.87.159 -ukong -pkong |
2.删除kong的键空间目录
1 |
|
3.在node1上创建kong键空间.创建完毕后,应该会同步到node2
1 | [work@kong-node1 bin]$ cqlsh 10.25.87.159 -ukong -pkong |
4.在node1上执行 kong migrations up ,执行完后同样会同步到node2
1 | work@kong-node1 bin]$ kong migrations up -c /etc/kong/kong.conf |
5.在node1和node2上启动kong
1 | [work@kong-node1 bin]$ kong restart -c /etc/kong/kong.conf |
搭建kong-dashboard
kong-dashboard是管理kong各个组件(serveice,route,plugin,upstream,consumer)的可视化UI管理工具.在增删改查各个组件的配置时非常方便.
现在kong-dashboard也支持到了最新版的kong和kong的最新组件.
kong-dashboard的github参考:kong-dashboar
1.确保需要有node.js环境.如果没有npm工具,必须先安装nodejs
1 | [work@DWD-BETA kong]$ npm -v |
2.root用户执行下列安装命令
1 | [root@DWD-BETA ~]# npm install -g kong-dashboard |
3.启动kong-dashboard.启动方式有以下几种
1 | # Start Kong Dashboard |
但是kong-dashboard是前台启动,没有deamnize模式.所以将kong-dashboard加入到supervisor进程管理
1 | [root@DWD-BETA ~]# vim /etc/supervisor/conf.d/kong-dashboard.conf |
修改权限
1 | [root@DWD-BETA ~]# chown -R work.work /etc/supervisor/conf.d/ |
更新supervisor配置文件
1 | [root@DWD-BETA ~]# supervisorctl update kong-dashboard |
但是由于我这台服务器上8080端口已经被使用,所以启动kong-dashboard报错:
1 | work@DWD-BETA kong]$ /usr/local/src/nodejs/bin/kong-dashboard start --kong-url http://localhost:8001 |
8080端口被jenkins占用了
1 | [work@DWD-BETA kong]$ netstat -tulnp | grep 8080 |
更换kong-dashboard端口为8081
1 | [program:kong-dashboard] |
更新supervisor后,仍然无法启动
1 | [work@DWD-BETA kong]$ supervisorctl update kong-dashboard |
手动启动正常
1 | [work@DWD-BETA kong]$ /usr/local/src/nodejs/bin/kong-dashboard start --kong-url http://localhost:8001 --port 8081 |
查看supervisor启动日志文件:
1 | [work@DWD-BETA kong]$ less /data/logs/kong/kong-dashboard.log |
网上查找解决方案.说是要链接以下文件
1 | sudo ln -s /usr/bin/nodejs /usr/bin/node |
但是这台服务器上nodejs路径不同,所以执行以下命令
1 | [work@DWD-BETA kong]$ sudo ln -s /usr/local/src/nodejs /usr/bin/node |
仍然无法启动,提示
1 | /usr/bin/env: node: Permission denied |
修改kong-dashboard启动用户为root.仍然无法启动.
1 | [program:kong-dashboard] |
操作失误在创建软件的时候,删除了nodejs源目录.重新安装了npm和kong-dashboard
1 | 解压nodejs包到:/usr/local/node/ |
创建链接
1 | [root@DWD-BETA ~]# ln -s /usr/local/node/bin/node /usr/bin/node |
修改supervisor配置文件中的命令路径
1 | [program:kong-dashboard] |
启动kong-dashboard
1 | [root@DWD-BETA ~]# supervisorctl update kong-dashboard |
启动完成
1 | [root@DWD-BETA ~]# netstat -tulnp | grep 8081 |
将cassandra加入到supervisor进程管理
cassandra加入supervisor进程托管遇到不少问题.踩过以下2个坑:
1.启动报错,提示需要更高级版本的java.
1 | Cassandra 3.0 and later require Java 8u40 or later. |
我的解决方案:
- 在cassandra的supervisor配置文件中加入环境变量:
1 | environment=JAVA_HOME="/usr/local/java" #这样cassandra会识别用户自定义安装的Java. |
- 配置软链
1 | sudo ln -s /usr/local/java/bin/java /usr/bin/java |
2.仍然无法启动,因为命令行是以daemon方式启动.在cassandra的supervisor配置文件中的启动参数加入-f选项.
最终的cassandra配置文件如下:
1 | [program:cassandra] |
将kong加入到supervisor
1.由于默认kong启动是以daemon方式启动.所以修改/etc/kong/kong.conf配置文件
1 | #将下列行修改为off,且取消注释 |
2.编辑kong的supervisor配置文件
1 | [program:kong] |
注意由于kong启动的时候会连接后端的cassandra数据库,所以需要先启动cassandra,再启动kong.这就是为什么supervisor里要加入priority参数.优先级越小,启动顺序越优先.停止顺序越靠后.
但是经过我的验证,发现priority参数没什么鸟用.当我start all,stop all时.永远是cassandra进程首先启动和关闭,无论priority优先级是大还是小.而不是supervisor官网介绍的那样效果
启动没问题:
1 | [work@kong-node2 ~]$ supervisorctl status |
但是发现supervisor管理kong进程有很严重的问题.
因为kong启动后包括2个进程:kong和nginx
1 | work@kong-node1 conf.d]$ ps aux | grep kong |
.这个时候如果用supervisorctl restart kong进程会出现无法启动的情况.这是因为supervisor kill掉了kong进程.但是没有kill Ningx进程.所以重新启动kong的时候,由于nginx进程仍然存在,故无法启动.例如:
1 | [work@kong-node1 conf.d]$ ps aux | grep kong |
暂时就不用supervisor管理了,采用命令行直接启动方式
命令行启动kong.只有一个Nginx进程.没有Perl进程.不知道何故
1 | [work@kong-node2 conf.d]$kong start -c /etc/kong/kong.conf |
将kong,Cassandra加入到systemctl管理工具
- cassandra
systemctl文件如下:
1 | [work@kong-node1 ~]$cd /usr/lib/systemd/system |
注意.如果java是二进制包,则需要将Bin文件链接到系统环境变量目录下.因为systemctl不会读取profile环境,所以不能识别到java.
1 | [work@kong-node1 system]$which java |
第二种方法是在systemctl中指定环境变量.指定environment参数(这种方法理论可行,但是没有论证)
例如:
1 |
|
- kong
在同目录下编辑kong服务配置.
注意,需要在cassandra后端数据库启动后,才能启动kong服务
1 | [work@kong-node1 system]$vim kong.service |
- 在kong-node2上启动kong-dashbaord
dashbaord服务启动需要在cassandra,kong服务启动之后
1 | [work@kong-node2 system]$vim kong-dashboard.service |
- 加入到开启自启动
1 | systemctl enable cassandra |
经过反复论证,systemctl可以管理以上服务.