NoSQL文档型数据库Couchbase的生产部署最佳实践
Posted twt企业IT社区
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NoSQL文档型数据库Couchbase的生产部署最佳实践相关的知识,希望对你有一定的参考价值。
Couchbase Server是一款开源、分布式的NoSQL文档型数据库。它提供的快速KV存储使用缓存管理可以应对亚毫秒级别的数据操作;专门设计的索引器可以支持快速查询;更包含可以执行类SQL查询的查询引擎。
Couchbas在国内比较小众,因此中文资料也少得可怜,为了能让国内开发者在自己环境用好Couchbase,译者 hackergodness 专门翻译了《Couchbase - Environment Configuration Best Practices》这份资料,原作者Alex Ma, Justin Machiel, Asif Kazi,为Couchbase原厂资深开发工程师。
下文概述了部署Couchbase的基础架构配置的最佳实践
为了让Couchbase集群获得最优性能,需要确保集群大小的正确分配,不能仅满足当前的工作负载,还要考虑维护、业务增长趋势和高峰负载。一般来说,推荐给集群预留一定的净上空间来适应容量上的异常毛刺和集群中的硬件故障。
系统、硬件
裸机(bare metal)安装总能获得最佳性能。虚拟化会增加开销,减少各方面的整体资源效率,如操作系统、磁盘I/O、网络性能、CPU。
永远使用本地磁盘存储(节点间无共享架构)。使用SAN不光会导致单点故障,还会导致资源竞争。
如果你必须使用虚拟化架构,你仍然可以用专用的本地存储替代逻辑虚拟化磁盘来提高性能。
系统级
生产上只使用64位操作系统。
Linux上部署,其内核版本应该大于2.6.32-504.12.2来避免已知的内核缺陷。
在这里查看支持平台所有列表。
内存
最少保留10%的系统内存用于内核进程和页面缓存。其余内存应分配给Bucket和Index quotas。
在Bios中禁止非一致性内存访问(NUMA)。
磁盘、卷设计
一切顺利的话,SSD要优于机械盘,更优于网络块设备(iSCSI或EBS)。注意的是NFS不支持。
从性能角度来看,等价容量前提下(RAID 0 或 RAID 10 而不是 RAID 5),多并行设备要优于单块硬盘,例如 4块256GB SSDs要比单个1TB的SSD磁盘快,就因为并行I/O通道变多了。
为了性能,要给每个索引和数据配置独立的磁盘卷来隔离I/O。更快的磁盘应该给索引。
CPU
最小4核
每10,000 ops/s吞吐量一个bucket对应 +1 核
每个视图文档或者GSI索引对应 +1 核
每个XDCR流对应 +1 核
调优索引节点上的IRQ affinity来减少IRQ竞争。Linux上有个脚本可以自动完成该操作。
网络
Couchbase只会使用一个网络接口。如果多个接口可用,需要进行接口绑定。
在相同VLAN内部署Couchbase节点。
消除集群节点间的路由跨界(router hops)
消除客户端和集群间的路由跨界(router hops)
Couchbase
生产环境中Data,Index和Query服务应该部署在不同的服务器上。最低限度,Data和Index应该隔离在不同的卷上来防止资源竞争。
配置数据的Bucket尽可能少,推荐上限是一个集群5个buckets。
分配所有可用的集群quota内存给buckets和索引。如果需要,可用减少Bucket quota分配来容纳额外的buckets。
在Couchbase指导下在Bucket上使用Value Eviction。
确保所有buckets上的Flush被禁用。
启用内置的告警功能,配置发送到监控中。
启用auto-failover,设置120秒超时时间。一旦网络稳定性确定了,这个值还可以再减少。
如果发现IO竞争。在非高峰时间窗口进行压缩。
确保部署视图后生产环境上的开发设计文档被移除。
生产环境中删除默认的bucket。
虚拟化环境的考虑
查看http://support.couchbase.com/entries/26790124-Virtualization-Considerations
以下内容重点描述部署Couchbase前需要对系统进行的参数调优
这些参数影响着Couchbase能否以最优性能运行。其实不难发现,在部署其它数据库产品前也需要对类似参数进行调整。本文提供的参数设置仅作为基本参考,具体大小应结合实际情况考虑。
网络和内存
修改或添加/etc/sysctl.conf文件中以下配置:
增加keepalive的探测频率,更快发现和超时僵死连接。
net.ipv4.tcp_keepalive_intvl = 30
表示开启重用。允许将TIME-WAIT sockets重用于新的TCP连接,默认为0,表示关闭。
该配置对所有Couchbase协议来说是安全的。
net.ipv4.tcp_tw_reuse = 1
指导内核先最大限度使用物理内存,然后才是swap空间。
如果内核版本大于3.0,将该值设置为1
vm.swappiness = 0
将脏数据的最大内存使用限制为200MB,超过该值系统启动pdflush线程。
默认为系统内存的20%,此时一旦启动pdflush会将系统压垮。
vm.dirty_bytes = 209715200
该内核参数保存pdflush开始进行回写的最小脏内存数目,100MB
vm.dirty_background_bytes = 104857600
增加脏数据刷新到磁盘的速率,只有变脏时间超过一定限制的页,
才会在pdflush下次醒来后刷回磁盘,
dirty_expire_centisecs用来控制过期时间
vm.dirty_expire_centisecs = 300
vm.dirty_writeback_centisecs = 100
增加系统中可以同时打开的文件数目
fs.file-max = 500000
禁用NUMA内存区域回收算法,以便减少读延时。
vm.zone_reclaim_mode = 0
保存好文件后,执行sysctl -p命令使设置生效。
文件系统
XFS是最适合Couchbase append-only这种文件结构的文件系统。我们推荐将所有Couchbase的卷都格式化成XFS。如果不行,就使用EXT4。
如果磁盘控制器上有电池备份单元(BBU),推荐禁用barriers以提高吞吐量。
Couchbase不依赖于文件访问时间,因此可以开启noatime选项来减少磁盘的IO。编辑/etc/fstab文件,使用以下选项对Couchbase数据挂载点(如果有)进行修改:
rw,noatime
User Limits
增加Couchbase可用的文件描述符,确保核心文件可以创建,将以下内容添加到/etc/security/limits.conf中:
couchbase soft nofile 131072
couchbase hard nofile 131072
couchbase hard core unlimited
Transparent Huge Pages (THP)
执行以下命令禁用THP:
sudo echo never > /sys/kernel/mm/transparent_hugepage/enabled
sudo echo never > /sys/kernel/mm/transparent_hugepage/defrag
将这些命令添加到/etc/rc.local里,使系统重启时持久化设置。
IO调度
默认的Red Hat Linux IO scheduler(CFQ)不太适合数据库随机读写访问模式。相比而言deadline调度更为合适,并且提供了更好的延迟保证。
执行以下命令将IO调度修改成deadline模式:
sudo echo deadline > /sys/block/<block device>/queue/scheduler
增加IO调度的对列深度后就可以通过提高顺序写入来减少IOPS。
将IO调度对列深度增加到1024:
sudo echo 1024 > /sys/block/<block device>/queue/nr_requests
将这些命令添加到/etc/rc.local里,使系统重启时持久化设置。
Couchbase成功上线后,就需要对其运行状态进行监控,准确定位性能瓶颈,及时优化。
下文列举了需要重点关注的Couchbase和OS层面的监控指标
Couchbase Web Console本身提供了对集群、节点状态以及容量等的监控告警。如下图。
图一 General Bucket Analytics界面
图二 General Bucket Analytics界面
大家也可以使用Couchbase提供的cbstats工具获取更细粒度的监控信息,进行二次加工丰富监控场景。
beam.smp进程负责监控管理底层服务进程如XDCR复制、集群操作、视图等。
memcached进程负责将项目(items)缓存到RAM中并持久化到磁盘上。
接下来再看看Couchbase内部哪些参数需要关注的。以及达到监控阈值后,我们应该如何响应。
关于更详细的指标,请参考以下链接:
https://developer.couchbase.com/documentation/server/4.6/cli/cbstats-intro.html
我们可以使用cbstats命令获取上述表格中描述的各种指标项,例如:
这里将<bucket_name>和<pass_word>换成你当前环境的bucket名和访问密码。
此外,我们还可以通过/pools/default/buckets/bucket_name/stats URI获取bucket的采样统计信息:
curl –X GET -u <username>:<passwd>http://<ip>:8091/pools/default/buckets/<bucket_name>/stats
另外可以指定-d zoom={interval}参数指定采样时间,可选参数有minute,hour,day等。
curl –X GET -u <username>:<passwd>-d zoom=minute http://<ip>:8091/pools/default/buckets/<bucket_name>/stats
将<username>,<passwd>,<ip>,<bucket_name>根据自己环境的实际配置进行修改。
详细使用参考:
https://developer.couchbase.com/documentation/server/current/rest-api/rest-bucket-stats.html
以上是关于NoSQL文档型数据库Couchbase的生产部署最佳实践的主要内容,如果未能解决你的问题,请参考以下文章
分布式 NoSql 数据库 Couchbase 的3个应用案例