我有一个包含4个节点的ES集群:
number_of_replicas: 1
search01 - master: false, data: false
search02 - master: true, data: true
search03 - master: false, data: true
search04 - master: false, data: true
Run Code Online (Sandbox Code Playgroud)
我不得不重新启动search03,当它返回时,它重新加入群集没有问题,但留下了7个未分配的分片.
{
"cluster_name" : "tweedle",
"status" : "yellow",
"timed_out" : false,
"number_of_nodes" : 4,
"number_of_data_nodes" : 3,
"active_primary_shards" : 15,
"active_shards" : 23,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 7
}
Run Code Online (Sandbox Code Playgroud)
现在我的群集处于黄色状态.解决此问题的最佳方法是什么?
有趣的是,当添加一个新索引时,该节点开始处理它并与群集的其余部分一起玩得很好,它只是留下未分配的分片.
关注问题:我是否做错了导致这种情况发生在一开始?对重新启动节点时以这种方式运行的集群,我没有多少信心.
注意:如果由于某种原因运行单个节点群集,则可能只需执行以下操作:
curl -XPUT 'localhost:9200/_settings' -d '
{
"index" : {
"number_of_replicas" …Run Code Online (Sandbox Code Playgroud) 我最近一直在阅读有关可扩展架构的文章.在这种情况下,继续显示wrt数据库的两个词是分片和分区.我搜索了关于搜索引擎,维基百科和stackoverflow的描述,但最终仍然感到困惑.
stackoverflow的专家能帮助我掌握基础知识吗?
Sharding MySQL表的最佳方法是什么?我能想到的方法是:
你知道这方面有什么有趣的项目或工具吗?
我们最近为我们的一个主要系列创下了超过200万的记录,现在我们开始因该系列的主要性能问题而受到影响.
他们在集合中的文档有大约8个字段,您可以使用UI进行过滤,结果应该按处理记录的时间戳字段进行排序.
我已经添加了几个复合索引与过滤字段和时间戳,例如:
db.events.ensureIndex({somefield: 1, timestamp:-1})
Run Code Online (Sandbox Code Playgroud)
我还添加了几个索引,可以同时使用多个过滤器,以期获得更好的性能.但是一些过滤器仍然需要很长时间才能完成.
我已经确定使用解释,查询确实使用了我创建的索引,但性能仍然不够好.
我想知道分片是否是现在的方式..但我们很快就会开始在该系列中每天创造约100万条新记录......所以我不确定它是否会很好地扩展...
编辑:查询的示例:
> db.audit.find({'userAgent.deviceType': 'MOBILE', 'user.userName': {$in: ['nickey@acme.com']}}).sort({timestamp: -1}).limit(25).explain()
{
"cursor" : "BtreeCursor user.userName_1_timestamp_-1",
"isMultiKey" : false,
"n" : 0,
"nscannedObjects" : 30060,
"nscanned" : 30060,
"nscannedObjectsAllPlans" : 120241,
"nscannedAllPlans" : 120241,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 1,
"nChunkSkips" : 0,
"millis" : 26495,
"indexBounds" : {
"user.userName" : [
[
"nickey@acme.com",
"nickey@acme.com"
]
],
"timestamp" : [
[
{
"$maxElement" : 1
},
{
"$minElement" : 1
} …Run Code Online (Sandbox Code Playgroud) 我们有一个大约70 GB的InnoDB数据库,我们预计它会在未来2到3年内增长到几百GB.大约60%的数据属于一个表.目前数据库运行良好,因为我们有一个64 GB RAM的服务器,所以几乎整个数据库都适合内存,但我们担心未来数据量会大得多.现在我们正在考虑某种方式来分割表格(尤其是占据数据最大部分的表格),我现在想知道,最好的方法是什么.
我目前知道的选项是
我们的应用程序基于J2EE和EJB 2.1构建(希望有一天我们可以切换到EJB 3).
你会建议什么?
编辑(2011-02-11):
只是一个更新:目前数据库的大小是380 GB,我们的"大"表的数据大小是220 GB,其索引的大小是36 GB.因此,虽然整个表不再适合内存,但索引确实如此.
系统仍然运行良好(仍然在相同的硬件上),我们仍然在考虑分区数据.
编辑(2014-06-04):还有一个更新:整个数据库的大小是1.5 TB,我们的"大"表的大小是1.1 TB.我们将服务器升级到具有128 GB RAM的4处理器机器(Intel Xeon E7450).该系统仍然表现良好.我们接下来要做的是将我们的大表放在一个单独的数据库服务器上(我们已经在我们的软件中进行了必要的更改),同时升级到具有256 GB RAM的新硬件.
这个设置应该持续两年.然后我们要么必须最终开始实施分片解决方案,要么只购买1 TB RAM的服务器,这应该让我们继续使用一段时间.
编辑(2016-01-18):
从那以后,我们将自己的大表放在单独的服务器上.目前,该数据库的大小约为1.9 TB,另一个数据库的大小(除了"大"之外的所有表)都是1.1 TB.
当前硬件设置:
此设置的性能很好.
我正在尝试用Elasticsearch替换Solr设置.这是一个新的设置,还没有看到生产,所以我有很多空间摆弄东西,让他们运作良好.
我有非常非常大量的数据.我正在索引一些实时数据并持续7天(通过使用_ttl字段).我不在索引中存储任何数据(并禁用_source字段).我希望我的指数稳定在200亿左右.我将把这些数据放入2-3个命名索引中.到目前为止,搜索性能高达几十亿行是完全可以接受的,但索引性能是一个问题.
我对ES如何在内部使用分片感到有些困惑.我创建了两个ES节点,每个节点都有一个单独的数据目录,每个节点有8个索引和1个副本.当我查看群集状态时,我只看到每个节点有一个分片和一个副本.每个节点是否保持内部运行多个索引?(检查磁盘存储位置显示肯定只有一个Lucene索引存在). - 已解决,因为我的索引设置未从配置中正确选取.使用API创建索引并指定分片和副本的数量现在已经产生了我期望看到的内容.
此外,我尝试运行相同ES节点的多个副本(来自相同的配置),并且它识别出已经存在副本并且创建其自己的工作区域.这些新的节点实例似乎也只有一个索引在磁盘上. - 既然每个节点实际上都在使用多个索引,那么具有多个索引的单个节点就足以限制整个系统,因此这不是问题.
何时启动其他Elasticsearch节点,以获得最大的索引性能?我应该有多个节点,每个节点运行1个索引1副本,或更少的节点有多吨索引?为了让单个节点做更多的工作,我的配置是否缺少一些东西?
另外:是否有任何指标可用于了解何时仅HTTP节点过载?现在我只有一个节点专门用于HTTP,但除了CPU使用情况之外,我无法判断它是否正常.什么时候启动其他HTTP节点并将索引软件拆分为指向各个节点?
我试图掌握数据库分区的不同概念,这就是我对它的理解:
水平分区/分片:将表拆分到不同的表中,该表将包含初始表中的行的子集(如果按大陆分割Users表,我已经看到了很多示例,如北美的子表,另一个为欧洲等...).每个分区位于不同的物理位置(了解"机器").据我所知,水平分区和分片是完全相同的(?).
垂直分区:根据我的理解(http://technet.microsoft.com/en-us/library/ms178148%28v=sql.105%29.aspx),有两种垂直分区:
规范化(包括通过拆分表并使用外键链接来从数据库中删除冗余).
Row Splitting,这是我不明白的,Normalization和Row Splitting有什么区别?那两种技术在哪些方面有所不同?
我还读过这篇文章(数据库水平和垂直缩放之间的差异),水平分区和垂直分区之间的区别在于,您通过添加更多机器来扩展第一个,而在第二个中您通过添加更多功率进行扩展( CPU,RAM)到你现有的机器,是一个正确的定义?我认为这两种技术之间的核心区别在于您分割表格的方式.
对于大量问题我很抱歉,但是我有点困惑,因为我遇到的很多不同的网站都说不同的东西.
任何帮助澄清将不胜感激.任何带有几个表格的简单演示的链接也会非常有用.
database database-design sharding database-performance database-partitioning
我正在开发一个介于电子邮件服务和社交网络之间的Web应用程序.我觉得它有可能在未来发展壮大,所以我担心可扩展性.
我决定为每个活跃用户创建一个单独的SQLite数据库,而不是使用一个集中式MySQL/InnoDB数据库然后对其进行分区:每个"分片"一个活跃用户.
这样,备份数据库就像每天一次将每个用户的小型数据库文件复制到远程位置一样简单.
扩展将像添加额外的硬盘来存储新文件一样简单.
当应用程序超出单个服务器时,我可以使用GlusterFS在文件系统级别将服务器链接在一起并运行应用程序,或者构建一个简单的SQLite代理系统,允许每个服务器操作相邻服务器中的sqlite文件.
并发问题将是最小的,因为每个HTTP请求一次只能触及一个或两个数据库文件,成千上万,而SQLite只会阻止读取.
我敢打赌,这种方法可以让我的应用程序优雅地扩展,并支持许多很酷和独特的功能.我打错了吗?我错过了什么吗?
更新我决定采用一种不太极端的解决方案,到目前为止工作正常.我正在使用固定数量的分片 - 准确地说是256个sqlite数据库.通过简单的散列函数将每个用户分配并绑定到随机分片.
我的应用程序的大多数功能每个请求只需要访问一个或两个分片,但有一个特别需要在256到10个不同的分片上执行简单查询,具体取决于用户.测试表明,如果所有数据都缓存在RAM中,则需要大约0.02秒或更短的时间.我想我可以忍受这个!
UPDATE 2.0我移植应用到MySQL/InnoDB和能够得到有关规则请求相同的性能,但对于需要碎片步行一个请求时,InnoDB快4-5倍.出于这个原因,以及其他原因,我正在放弃这种架构,但我希望某个地方找到它的用途......谢谢.
所以我一直在努力弄清楚NoSQL是否真的在自动分片和处理UNSTRUCTURED数据之外带来了那么多的价值.
假设我可以将STRUCTURED数据放在一台机器上,或者为SQL提供有效的"自动分片"功能,那么NoSQL选项有哪些优势呢?我已经确定了以下内容:
基于文档(MongoDB,Couchbase等) - 除了"自动分片"功能之外,我很难理解其中的好处.链接对象与SQL连接非常相似,而嵌入对象显着膨胀文档大小并导致复制的挑战(注释可能同时属于帖子和用户,因此数据将是多余的).此外,ACID和交易的损失是一个很大的缺点.
基于键值(Redis,Memcached等) - 提供不同的用例,非常适合缓存但不是复杂的查询
Columnar(Cassandra,HBase等) - 这里的最大优势似乎是数据如何存储在磁盘上,并且主要用于聚合而不是一般用途
图(Neo4j的,OrientDB等) -最引人注目的地方,同时使用边沿和节点使一个有趣的价值主张,但对于高度复杂的关系数据,而不是一般用途最有用.
我可以看到Key-value,Columnar和Graph DB对于特定用例(缓存,社交网络关系映射,聚合)的优势,但是看不出任何理由使用像MongoDB这样的结构数据之外的'自动 - 分割'能力.
如果SQL具有类似的"自动分片"能力,那么SQL对于结构化数据来说是不是很明智吗?在我看来会是这样,但我希望社区的意见......
注意:这与典型的CRUD应用程序有关,如社交网络,电子商务网站,CMS等.
这是我试图解决的问题:我最近完成了数据层重新设计,允许我跨多个分片对数据库进行负载平衡.为了保持碎片平衡,我需要能够将数据从一个碎片迁移到另一个碎片,这涉及从碎片A复制到碎片B,然后从碎片A中删除记录.但是我有几个非常大的表,并且有许多外键指向它们,因此从表中删除单个记录可能需要一秒以上.
在某些情况下,我需要从表中删除数百万条记录,实际上只需要很长时间.
禁用外键不是一种选择.删除大批量的行也不是一种选择,因为这是一个生产应用程序,而大型删除会锁定太多资源,从而导致失败.我正在使用Sql Server,而且我知道分区表,但是对分区的限制(以及企业版的许可费用)是如此不切实际,以至于它们是不可能的.
当我开始研究这个问题时,我认为困难的部分是编写算法,该算法计算出如何从叶级别删除行到数据模型的顶部,以便在此过程中不会违反外键约束.但解决这个问题对我没有好处,因为删除需要在一夜之间消失的记录需要数周时间.
我已经建立了一种将数据标记为虚拟删除的方法,因此就应用程序而言,数据已经消失,但由于其庞大的大小,我仍在处理大型数据文件,大型备份和较慢的查询.表格.
有任何想法吗?我已经在这里阅读了较旧的相关帖子,但没有发现任何有用的信息.
sharding ×10
database ×4
mysql ×3
scalability ×3
architecture ×1
bigdata ×1
indexing ×1
master ×1
mongodb ×1
nosql ×1
partitioning ×1
sql ×1
sql-server ×1
sqlite ×1