Dragonfly memory store(后简称Dragonfly)做为Redis的替代方案,70+天内,在GitHub上达到了200+ fork和11k+ star。而Redis因为只能利用一个CPU core,而久为业内所诟病。
天下苦Redis久矣。
做为开篇,本文对Dragonfly基于Kubernetes环境的部署进行演示和简单测试。在生产环境中,需结合具体要求,增加和调整相应的配置。本篇文档只涵盖最基本的部署需要。
架构图
实验环境所使用的主要组件:
AWS EKS:v1.23
Worker node
AMI: Amazon EKS optimized Linux AMI, CPU architecture: x86_64
Instance size: t3a.medium
创建Dragonfly的K8s deployment
kubectl create deploy dragonfly --image=docker.dragonflydb.io/dragonflydb/dragonfly
创建K8s service
vim dragonfly_service.yaml
apiVersion: v1
kind: Service
metadata:
name: dragonfly
namespace: blog
spec:
selector:
app: dragonfly
ports:
port: 6379
targetPort: 6379
kubectl apply -f dragonfly_service.yaml
查看deployment的部署结果
% kubectl get pod
NAME READY STATUS RESTARTS AGE
dragonfly-74899bcc4-wrfqj 1/2 CrashLoopBackOff 4 (43s ago) 2m25s
此时Dragonfly Pod没有成功创建。
排查问题,查看Pod日志
% kubectl logs dragonfly-74899bcc4-wrfqj
I20220909 13:41:18.250780 1 init.cc:56] dragonfly running in opt mode.
1 apiVersion: v1
I20220909 13:41:18.250833 1 dfly_main.cc:219] Starting dragonfly df-v0.7.0-a43badf50c77a67f7bfef37a08e047d42f62f96a
E20220909 13:41:18.250849 1 dfly_main.cc:233] Kernel 5.10 or later is supported. Exiting...
失败的原因与Linux中使用了一个名为io-uring的新的API有关。(https://github.com/dragonflydb/dragonfly#running-the-server)
Dragonfly runs on linux. It uses relatively new linux specific io-uring API for I/O, hence it requires Linux version 5.10 or later. Debian/Bullseye, Ubuntu 20.04.4 or later fit these requirements.
究其原因,Amazon EKS optimized Linux AMI的kernel默认为5.4。
解决办法:
将Amazon Linux 2(Amazon Linux Extras)内核从5.4.x升级到5.10.x。
步骤:
查看处于活动状态的内核:
uname -r
5.4.204-113.362.amzn2.x86_64
使用amazon-linux-extras工具验证可用的内核版本:
amazon-linux-extras | grep kernel
49 kernel-5.4=latest enabled
_ kernel-5.10 available
_ kernel-5.15 available
当前kernel-5.4处于enabled的状态。
使用amazon-linux-extras工具停用内核5.4:
amazon-linux-extras disable kernel-5.4
Beware that disabling topics is not supported after they are installed.
0 ansible2 available \
[ ]
2 httpd_modules available [ =1.0 =stable ]
3 memcached1.5 available \
[ ]
5 postgresql9.6 available \
[ ]
6 postgresql10 available [ =10 =stable ]
9 R3.4 available [ =3.4.3 =stable ]
10 rust1 available \
[
=stable ]
11 vim available [ =8.0 =stable ]
18 libreoffice available \
[ ]
19 gimp available [ =2.8.22 ]
20 docker=latest enabled \
[ ]
21 mate-desktop1.x available \
[ ]
22 GraphicsMagick1.3 available \
[ ]
23 tomcat8.5 available \
[
=stable ]
24 epel available [ =7.11 =stable ]
25 testing available [ =1.0 =stable ]
26 ecs available [ =stable ]
27 corretto8 available \
[
=1.8.0_242 =stable ]
28 firecracker available [ =0.11 =stable ]
29 golang1.11 available \
[ ]
30 squid4 available [ =4 =stable ]
32 lustre2.10 available \
[ ]
33 java-openjdk11 available [ =11 =stable ]
34 lynis available [ =stable ]
36 BCC available [ =0.x =stable ]
37 mono available [ =5.x =stable ]
38 nginx1 available [ =stable ]
39 ruby2.6 available [ =2.6 =stable ]
40 mock available [ =stable ]
41 postgresql11 available [ =11 =stable ]
42 php7.4 available [ =stable ]
43 livepatch available [ =stable ]
44 python3.8 available [ =stable ]
45 haproxy2 available [ =stable ]
46 collectd available [ =stable ]
47 aws-nitro-enclaves-cli available [ =stable ]
48 R4 available [ =stable ]
49 kernel-5.4 available [ =stable ]
50 selinux-ng available [ =stable ]
51 php8.0 available [ =stable ]
52 tomcat9 available [ =stable ]
53 unbound1.13 available [ =stable ]
54 mariadb10.5 available [ =stable ]
55 kernel-5.10 available [ =stable ]
56 redis6 available [ =stable ]
57 ruby3.0 available [ =stable ]
58 postgresql12 available [ =stable ]
59 postgresql13 available [ =stable ]
60 mock2 available [ =stable ]
61 dnsmasq2.85 available [ =stable ]
62 kernel-5.15 available [ =stable ]
63 postgresql14 available [ =stable ]
64 firefox available [ =stable ]
65 lustre available [ =stable ]
注意:如果没有停用内核5.4,则会在尝试安装内核5.10时收到以下错误信息:
Refusing because kernel-5.10 could cause an invalid combination.
使用amazon-linux-extras工具安装内核5.10:
amazon-linux-extras install kernel-5.10 -y
Installing kernel
Loaded plugins: priorities, update-motd, versionlock
Cleaning repos: amzn2-core amzn2extra-docker amzn2extra-kernel-5.10
12 metadata files removed
4 sqlite files removed
0 metadata files removed
Loaded plugins: priorities, update-motd, versionlock
amzn2-core | 3.7 kB 00:00:00
amzn2extra-docker | 3.0 kB 00:00:00
amzn2extra-kernel-5.10 | 3.0 kB 00:00:00
(1/7): amzn2-core/2/x86_64/group_gz | 2.5 kB 00:00:00
(2/7): amzn2-core/2/x86_64/updateinfo | 495 kB 00:00:00
(3/7): amzn2extra-docker/2/x86_64/primary_db | 93 kB 00:00:00
(4/7): amzn2extra-kernel-5.10/2/x86_64/updateinfo | 18 kB 00:00:00
(5/7): amzn2extra-docker/2/x86_64/updateinfo | 6.4 kB 00:00:00
(6/7): amzn2extra-kernel-5.10/2/x86_64/primary_db | 11 MB 00:00:00
(7/7): amzn2-core/2/x86_64/primary_db | 65 MB 00:00:00
Resolving Dependencies
--> Running transaction check
---> Package kernel.x86_64 0:5.10.135-122.509.amzn2 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
=====================================================================================================================================================================================================================================
Package Arch Version Repository Size
=====================================================================================================================================================================================================================================
Installing:
kernel x86_64 5.10.135-122.509.amzn2 amzn2extra-kernel-5.10 32 M
Transaction Summary
=====================================================================================================================================================================================================================================
Install 1 Package
Total download size: 32 M
Installed size: 134 M
Downloading packages:
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
kernel-5.10.135-122.509.amzn2.x86_64.rpm | 32 MB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : kernel-5.10.135-122.509.amzn2.x86_64 1/1
Verifying : kernel-5.10.135-122.509.amzn2.x86_64 1/1
Installed:
kernel.x86_64 0:5.10.135-122.509.amzn2
Complete!
0 ansible2 available \
[ =2.4.2 =2.4.6 =2.8 =stable ]
2 httpd_modules available [ =1.0 =stable ]
3 memcached1.5 available \
[ =1.5.1 =1.5.16 =1.5.17 ]
5 postgresql9.6 available \
[ =9.6.6 =9.6.8 =stable ]
6 postgresql10 available [ =10 =stable ]
9 R3.4 available [ =3.4.3 =stable ]
10 rust1 available \
[ =1.22.1 =1.26.0 =1.26.1 =1.27.2 =1.31.0 =1.38.0
=stable ]
11 vim available [ =8.0 =stable ]
18 libreoffice available \
[ =5.0.6.2_15 =5.3.6.1 =stable ]
19 gimp available [ =2.8.22 ]
20 docker=latest enabled \
[ =17.12.1 =18.03.1 =18.06.1 =18.09.9 =stable ]
21 mate-desktop1.x available \
[ =1.19.0 =1.20.0 =stable ]
22 GraphicsMagick1.3 available \
[ =1.3.29 =1.3.32 =1.3.34 =stable ]
23 tomcat8.5 available \
[ =8.5.31 =8.5.32 =8.5.38 =8.5.40 =8.5.42 =8.5.50
=stable ]
24 epel available [ =7.11 =stable ]
25 testing available [ =1.0 =stable ]
26 ecs available [ =stable ]
27 corretto8 available \
[ =1.8.0_192 =1.8.0_202 =1.8.0_212 =1.8.0_222 =1.8.0_232
=1.8.0_242 =stable ]
28 firecracker available [ =0.11 =stable ]
29 golang1.11 available \
[ =1.11.3 =1.11.11 =1.11.13 =stable ]
30 squid4 available [ =4 =stable ]
32 lustre2.10 available \
[ =2.10.5 =2.10.8 =stable ]
33 java-openjdk11 available [ =11 =stable ]
34 lynis available [ =stable ]
36 BCC available [ =0.x =stable ]
37 mono available [ =5.x =stable ]
38 nginx1 available [ =stable ]
39 ruby2.6 available [ =2.6 =stable ]
40 mock available [ =stable ]
41 postgresql11 available [ =11 =stable ]
42 php7.4 available [ =stable ]
43 livepatch available [ =stable ]
44 python3.8 available [ =stable ]
45 haproxy2 available [ =stable ]
46 collectd available [ =stable ]
47 aws-nitro-enclaves-cli available [ =stable ]
48 R4 available [ =stable ]
_ kernel-5.4 available [ =stable ]
50 selinux-ng available [ =stable ]
51 php8.0 available [ =stable ]
52 tomcat9 available [ =stable ]
53 unbound1.13 available [ =stable ]
54 mariadb10.5 available [ =stable ]
55 kernel-5.10=latest enabled [ =stable ]
56 redis6 available [ =stable ]
57 ruby3.0 available [ =stable ]
58 postgresql12 available [ =stable ]
59 postgresql13 available [ =stable ]
60 mock2 available [ =stable ]
61 dnsmasq2.85 available [ =stable ]
62 kernel-5.15 available [ =stable ]
63 postgresql14 available [ =stable ]
64 firefox available [ =stable ]
65 lustre available [ =stable ]
从RPM数据库验证已安装的内核:
rpm -qa | grep kernel
kernel-5.4.204-113.362.amzn2.x86_64
kernel-5.10.135-122.509.amzn2.x86_64
重启实例以激活最新的内核
reboot
登录并确认内核已激活
uname -r
5.10.135-122.509.amzn2.x86_64
查看K8s service信息
% kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dragonfly ClusterIP 172.20.xx.yyy <none> 6379/TCP 2m15s
记录service的IP地址,后面测试Dragonfly功能时,会使用此IP访问Dragonfly。
测试:(本测试不涉及应用集成测试部分)
登陆到worker node。
安装Redis CLI
amazon-linux-extras install redis6
使用上面步骤获取到的service的IP和6379端口,连接Dragonfly并验证功能
redis-cli -h 172.20.x.y -p 6379
172.20.x.y:6379> set hello world
OK
172.20.x.y:6379> keys *
1) "hello"
172.20.x.y:6379> get hello
"world"
References
https://github.com/dragonflydb/dragonfly
文章评论