Lua Kafka使用

Lua Kafka使用

lua-resty-kafka,Lua kafka client driver for the Openresty based on the cosocket API。需要注意的是,不同于redis和mysql 客户端,kafka客户端并不是自带的,需要自行下载发布到openresty 的lualib目录下:

1
2
3
wget https://github.com/doujiang24/lua-resty-kafka/archive/master.zip
unzip master.zip
cp -r lua-resty-kafka-master/lib/resty/kafka /usr/local/openresty/lualib/resty/

当max_buffering参数设置过大时,出现table overflow


Lua Redis 使用

Lua Redis 使用

lua-resty-redis是为基于cosocket API的ngx_lua提供的Lua redis客户端,通过它可以完成Redis的操作。默认安装OpenResty时已经自带了该模块,使用文档可参考https://github.com/openresty/lua-resty-redis。


Lua Mysql 使用

Lua Mysql使用

lua-resty-mysql是为基于cosocket API的ngx_lua提供的Lua Mysql客户端,通过它可以完成Mysql的操作。默认安装OpenResty时已经自带了该模块,使用文档可参考https://github.com/openresty/lua-resty-mysql。


Lua Json使用

Lua Json使用

在进行数据传输时JSON格式目前应用广泛,因此从Lua对象与JSON字符串之间相互转换是一个非常常见的功能;目前Lua也有几个JSON库,如:cjson、dkjson。其中cjson的语法严格(比如unicode \u0020\u7eaf),要求符合规范否则会解析失败(如\u002),而dkjson相对宽松,当然也可以通过修改cjson的源码来完成一些特殊要求。而在使用dkjson时也没有遇到性能问题,目前使用的就是dkjson。使用时要特别注意的是大部分JSON库都仅支持UTF-8编码;因此如果你的字符编码是如GBK则需要先转换为UTF-8然后进行处理。


Nginx Lua 模块指令

Nginx Lua 模块指令

Nginx共11个处理阶段,而相应的处理阶段是可以做插入式处理,即可插拔式架构;另外指令可以在http、server、server if、location、location if几个范围进行配置:


Lua 模块开发

Lua 模块开发

在实际开发中,不可能把所有代码写到一个大而全的lua文件中,需要进行分模块开发;而且模块化是高性能Lua应用的关键。

使用require第一次导入模块后,所有Nginx 进程全局共享模块的数据和代码,每个Worker进程需要时会得到此模块的一个副本(Copy-On-Write),即模块可以认为是每Worker进程共享而不是每Nginx Server共享;

另外注意之前我们使用init_by_lua中初始化的全局变量是每请求复制一个;如果想在多个Worker进程间共享数据可以使用ngx.shared.DICT或如Redis之类的存储。

在/usr/openResty/lualib中已经提供了大量第三方开发库如cjson、redis客户端、mysql客户端:


Nginx Lua 环境搭建

Nginx Lua 环境搭建

安装

官方安装文档:http://openresty.org/cn/linux-packages.html#centos
以centos举例:

1
2
3
4
5
6
7
8
9
10
11
# add the yum repo:
wget https://openresty.org/package/centos/openresty.repo
sudo mv openresty.repo /etc/yum.repos.d/

# update the yum index:
sudo yum check-update

#然后就可以像下面这样安装软件包,比如 openresty:
sudo yum install -y openresty
#安装命令行工具 resty,那么可以像下面这样安装 openresty-resty 包:
sudo yum install -y openresty-resty

源码编译安装:

先去官网下载源码包:http://openresty.org/cn/download.html,安装指导:http://openresty.org/cn/installation.html


Lua 安装

Lua 安装

MacOS安装

1
brew install lua53

或者 源码编译

1
2
3
4
5
curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz
tar zxf lua-5.3.0.tar.gz
cd lua-5.3.0
make macosx test
make install

Linux

1
2
3
4
5
curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz
tar zxf lua-5.3.0.tar.gz
cd lua-5.3.0
make linux test
make install

测试是否安装成功

1
2
 ~ lua -v
Lua 5.3.5 Copyright (C) 1994-2018 Lua.org, PUC-Rio

kudu cli 命令

kudu 管理运维常用命令

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
31
32
33
34
service kudu-master restart
service kudu-tserver restart

# master server 管理界面
http://presto-1:8050/tablets

# tablet server 管理界面
http://presto-2:8051/tablet-servers

# 列出集群中的 tablet server
kudu tserver list presto-1,presto-2,presto-3

# 列出集群中的 master server
kudu master list presto-1,presto-2,presto-3

# 查看指定tserver_address的状态
kudu tserver status <tserver_address>

# 检测集群状态
sudo -u kudu kudu cluster ksck presto-1,presto-2,presto-3
sudo -u kudu kudu cluster ksck presto-1,presto-2,presto-3 > ./ksck.out 2>&1
<!-- more -->
# 检查tserver_address的状态
sudo -u kudu kudu remote_replica check <tserver_address>

# 列出所有表
kudu table list presto-1:7051,presto-2:7051,presto-3:7051

# 删除表
sudo -u kudu kudu table delete presto-1:7051,presto-2:7051,presto-3:7051 table_name
events
metrics_kudu
#
kudu remote_replica copy <tablet_id> <src_address> <dst_address> [-force_copy]

修复replicas

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
31
32
sudo -u kudu kudu cluster ksck master1,master2,master3 > ./ksck.out 2>&1
发现有56个表处于非健康状态:
==================
Errors:
==================
table consistency check error: 56 out of 183 table(s) are not healthy

举例:
在ksck.out中可以看到具体是哪个表的哪个tablet出问题了:
The consensus matrix is:
Config source | Replicas | Current term | Config index | Committed?
---------------+--------------+--------------+--------------+------------
master | A B C* | | | Yes
A | A B C* | 1427 | 2450 | Yes
B | A B C* | 1427 | 2450 | Yes
C | A B C* | 1427 | 2450 | Yes
Tablet 3689e076ed354f94a0967d1eed4b7d16 of table 'impala::dl_zz_kudu.tm_scada_hdzysj_change' is unavailable: 2 replica(s) not RUNNING
868688d5077b4e02b14a8a0a57958668: TS unavailable
0b4f24052ed74405b5d58fecd83f33e7: TS unavailable
a59cf0d8d1ed45d8b1af094f4a28d686 (xxxxx:7050): RUNNING [LEADER]

0 replicas' active configs differ from the master's.
All the peers reported by the master and tablet servers are:
A = 0b4f24052ed74405b5d58fecd83f33e7
B = 868688d5077b4e02b14a8a0a57958668
C = a59cf0d8d1ed45d8b1af094f4a28d686

可以看到只有a59cf0d8d1ed45d8b1af094f4a28d686这一个replication是好的,另外俩都不可用了。
修复命令:
sudo -u kudu kudu remote_replica unsafe_change_config xxxx:7050 3689e076ed354f94a0967d1eed4b7d16 a59cf0d8d1ed45d8b1af094f4a28d686

sudo -u kudu kudu remote_replica unsafe_change_config xxxx:7050 {tablet_id} {replica_id}

Presto 动态数据源改造方案

Presto 动态数据源改造方案

Presto 数据源加载机制原生是基于文件系统的,从配置目录中加载 数据源配置文件,从而实现不同源的数据库连接,而且整个过程是在presto集群启动时执行。而我们需要动态的增加/删除 数据源,并且不重启整个presto集群,所以对presto 加载数据源部分做了改造:

  1. 对外新增两个EndPoint:增加数据源API 和 删除数据源API
  2. 数据源的配置从文件系统迁移到数据库
  3. 在不重启集群的前提下,动态更新presto 数据源连接信息

动态增加/删除数据源,新增catalog endpoint

新增两个接口,用于向presto/trino 动态的增加和删除数据源:

  • POST http://{presto-api-base-url}/v1/catalog/add

  • DELETE http://{presto-api-base-url}/v1/catalog/delete

处理的流程图:


Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×