在生产环境中持续运营Redis Cluster 3年的感受
这篇文章是DWANGO的第二个圣诞日历中的12/3文章。
上一次是我们的前辈yonex先生!虽然还没有看到他的文章,但我们期待着他的作品。
DWANGO 2017年第二个圣诞日历 – Qiita
首先
在dwango中,我们使用了至少10个Redis Cluster,同时我也涉及大约10个Redis Cluster。
只需一种选项
※实际上正在构建、运营,或者将其分配给公司内部服务,或者提供关于从Redis迁移的咨询。
在这篇文章中,我打算根据我的经验随便写一些感想。
之前撰写过的有关Redis的文章
在生产中使用Redis Cluster进行了2年的操作经验 – Qiita
Redis 4.0的重要功能解释 – Qiita
非常强大的Redis Cluster管理工具Reddie – Qiita
Redis 4.0 可以在生产环境中使用吗?
如果无法给予足够的时间进行自我验证,最好就放弃吧。
理由从最近的发布中很明显。
两天内有3个关键问题有点多。
顺便提一下,更新内容如下所示:
4.0.3:修复了PSYNC2的一个错误。
4.0.4:修复了PSYNC2的几个错误,之前忘记放入4.0.3中了。
4.0.5:修复了4.0.4的一个错误,它是有问题的。
因此,最好还是不要使用4.0版本。
Redis的日志监视了什么内容?
Redis的日志非常详细,不适用于系统监视。总之,以下通过正则表达式进行了粗略匹配。
AOF输出相关
AOF异步写入时同步操作(可能是磁盘忙碌)耗时太长。为了避免等待fsync完成而导致Redis变慢,将AOF缓冲区写入时不等待fsync操作完成。可以通过提升磁盘I/O性能、放弃AOF输出或减少查询量来解决这个问题。
关于RDB的输出相关
无法在后台保存:fork:无法分配内存
当在RDB输出时无法进行内存分配时出现的错误。您需要减少Redis使用的内存,增加服务器的内存,或者允许服务器进行内存过量分配。
在运营Redis时,你是否使用了一些方便的工具?
有时候我会用sripathikrishnan/redis-rdb-tools来查看Redis的全部内容。
我会检查特定的SET类型是否增长过大,是否有垃圾积累,以及是否存在应用程序实现错误等问题。
不需要向已加入服务的Redis发送查询,而是使用Redis的持久化文件RDB进行静态分析,这样既精神上也更轻松。能够方便地通过pip随意安装也是非常方便的。
如何将Redis迁移到Redis Cluster(带有密码)?(假设停止维护)
以下是一个大致的资料:《Redis集群教程》- Redis的《迁移到Redis集群》也有,但只支持无密码。
方法1:在无密码的情况下进行迁移后,添加密码。
如果Redis Cluster没有密码,可以使用redis-trib.rb的import方法进行迁移(官方方法)。
因此,创建一个没有密码的Redis Cluster,在使用redis-trib.rb迁移后,
关闭Redis Cluster的所有节点,然后加上密码再重新启动。
选项2: 通过“Mass Insert”一次性转换为带密码的格式。
利用上面介绍的实用工具,从RDB文件中进行Mass Insert,详情请参考https://github.com/sripathikrishnan/redis-rdb-tools#emitting-redis-protocol。
然而,在将数据批量插入到Redis集群时,需要对所有主节点进行操作。尽管会出现大量的MOVED错误,请忽略它们。
将Redis Cluster中的每个节点视为独立的Redis实例,并迁移数据。
通过利用Redis Cluster的功能,当涉及非负责的键时将返回MOVED错误,以实现特定规范。
选项1: 方案三:支持这个公关活动
Redis-Cluster:通过redis-trib.rb添加对认证的支持 by otherpirate · Pull Request #4288 · antirez/redis
Redis Cluster每个节点的内存大小有什么推荐的选项吗?
如果要创建一个可用的100GB的Redis集群,应该选择哪个好呢?
- 在每个节点上准备5个20GB的Redis,还是在每个节点上准备20个5GB的Redis?
在中国,我建议在后者旁边进行排列,特别是在不影响网络的连接和带宽的情况下。原因很简单,这是因为操作可能会稍微复杂一些,取决于数据的大小。这是当创建具有大量数据的Redis复制时所做的事情。
有人問我運營20個Redis是否負擔很大?
雖然這個問題讓人困擾,但只要自動化和監控都無需考慮,增加實例就好,
就能輕鬆處理。
你对Redis有什么不满点吗?
有很多选择,但因为更方便所以我使用它。
例如,从3.2版本开始,添加了一个叫做protected mode的功能。
为了防止太多的Redis被从互联网上访问,他们似乎要求默认情况下要么设置密码,要么将Redis的IP地址限制功能打开,以便只能从本地以外的地方访问。
然而,由于Redis的密码是以明文传输的,所以即使设置了密码,我认为它仍然可以从互联网访问,这让人担心。
而且,一旦密码泄露,更改密码就需要停止Redis,这太繁重了。
如果能够在线上添加/删除多个密码,就可以无需停止Redis而进行更改。所以,我认为在config requirepass这个功能的Pull Request上+1是个好主意。
最后
我没有什么条理,也没有什么结构,只是以感受的形式写了一些关于Redis的事情。
我写了一些不满和不方便之处,但我还是非常喜欢Redis这个中间件,所以我会继续使用它。
如果有任何異論、反論或者指摘,請在評論區提出。