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: v1kind: Servicemetadata:name: dragonflynamespace: blogspec:selector:app: dragonflyports:port: 6379targetPort: 6379
kubectl apply -f dragonfly_service.yaml
查看deployment的部署结果
% kubectl get podNAME READY STATUS RESTARTS AGEdragonfly-74899bcc4-wrfqj 1/2 CrashLoopBackOff 4 (43s ago) 2m25s
此时Dragonfly Pod没有成功创建。
排查问题,查看Pod日志
% kubectl logs dragonfly-74899bcc4-wrfqjI20220909 13:41:18.250780 1 init.cc:56] dragonfly running in opt mode.1 apiVersion: v1I20220909 13:41:18.250833 1 dfly_main.cc:219] Starting dragonfly df-v0.7.0-a43badf50c77a67f7bfef37a08e047d42f62f96aE20220909 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 kernelLoaded plugins: priorities, update-motd, versionlockCleaning repos: amzn2-core amzn2extra-docker amzn2extra-kernel-5.1012 metadata files removed4 sqlite files removed0 metadata files removedLoaded plugins: priorities, update-motd, versionlockamzn2-core | 3.7 kB 00:00:00amzn2extra-docker | 3.0 kB 00:00:00amzn2extra-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:00Resolving Dependencies--> Running transaction check---> Package kernel.x86_64 0:5.10.135-122.509.amzn2 will be installed--> Finished Dependency ResolutionDependencies Resolved=====================================================================================================================================================================================================================================Package Arch Version Repository Size=====================================================================================================================================================================================================================================Installing:kernel x86_64 5.10.135-122.509.amzn2 amzn2extra-kernel-5.10 32 MTransaction Summary=====================================================================================================================================================================================================================================Install 1 PackageTotal download size: 32 MInstalled size: 134 MDownloading packages:Delta RPMs disabled because /usr/bin/applydeltarpm not installed.kernel-5.10.135-122.509.amzn2.x86_64.rpm | 32 MB 00:00:00Running transaction checkRunning transaction testTransaction test succeededRunning transactionInstalling : kernel-5.10.135-122.509.amzn2.x86_64 1/1Verifying : kernel-5.10.135-122.509.amzn2.x86_64 1/1Installed:kernel.x86_64 0:5.10.135-122.509.amzn2Complete!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_64kernel-5.10.135-122.509.amzn2.x86_64
重启实例以激活最新的内核
reboot
登录并确认内核已激活
uname -r
5.10.135-122.509.amzn2.x86_64
查看K8s service信息
% kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEdragonfly 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 worldOK172.20.x.y:6379> keys *1) "hello"172.20.x.y:6379> get hello"world"
References
https://github.com/dragonflydb/dragonfly
文章评论