利用一致性哈希水平拆分MySql单表

springboot集成sharding-shardingsphere做分库分表(一) 一般中小公司没有能力去开发自己的框架,只能使用开源的,我们这里也使用开源框架sharding-jdbc来实现我们的分库分表。 1、建表 一般情况下,我们会去建10个库,每个库是10张表,我们这里为了方便测试,我只建2个库,每个库里建10张表。 -------------下面是fincenter00库----------------- CREATE TABLE `fincenter00`.`account_profile_00` ( `id` bigint NOT NULL AUTO_INC 阅读详情
Sharding(切片) 不是一门新技术,而是一个相对简朴的软件理念,就是当我们的数据库单机无法承受高强度的i/o时,我们就考虑利用 sharding 来把这种读写压力分散到各个主机上去。

所以Sharding 不是一个某个特定数据库软件附属的功能,而是在具体技术细节之上的抽象处理,是Horizontal Partitioning 水平扩展(或横向扩展)的解决方案,其主要目的是为突破单节点数据库服务器的 I/O 能力限制,注意这里是突破单点数据库服务器的“I/O”能力。

在MySql 5.1 中增加了对单表的 PARTITION(分区)支持,可以把一张很大的单表通过 partition 分区成很多物理文件,避免每次操作一个大文件,可以对读写新能有所提升,下面是一个 partition 分区的例子。

一张游戏的日志表,有几千万行的数据,记录了接近一年的游戏物品获取日志,如果不对它进行 partition 分区存储,每次统计和分析日志都会消耗大量的时间。然后我们新建一张分区表,把老的日志数据导入到新的数据,统计分析的时间就会节约很多。
<div><div><span class="pln" style="color:#000000;">CREATE TABLE </span><span class="str" style="color:#0880;">`xxxxxxxx`</span><span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">(</span><span class="pln" style="color:#000000;">     </span></div><div><span class="str" style="color:#0880;">`crttm`</span><span class="pln" style="color:#000000;"> </span><span class="kwd" style="color:#0088;">int</span><span class="pun" style="color:#66660;">(</span><span class="lit" style="color:#06666;">11</span><span class="pun" style="color:#66660;">)</span><span class="pln" style="color:#000000;"> NOT NULL</span><span class="pun" style="color:#66660;">,</span><span class="pln" style="color:#000000;">     </span></div><div><span class="str" style="color:#0880;">`srvid`</span><span class="pln" style="color:#000000;"> </span><span class="kwd" style="color:#0088;">int</span><span class="pun" style="color:#66660;">(</span><span class="lit" style="color:#06666;">11</span><span class="pun" style="color:#66660;">)</span><span class="pln" style="color:#000000;"> NOT NULL</span><span class="pun" style="color:#66660;">,</span><span class="pln" style="color:#000000;">     </span></div><div><span class="str" style="color:#0880;">`evtid`</span><span class="pln" style="color:#000000;"> </span><span class="kwd" style="color:#0088;">int</span><span class="pun" style="color:#66660;">(</span><span class="lit" style="color:#06666;">11</span><span class="pun" style="color:#66660;">)</span><span class="pln" style="color:#000000;"> NOT NULL</span><span class="pun" style="color:#66660;">,</span><span class="pln" style="color:#000000;">     </span></div><div><span class="str" style="color:#0880;">`aid`</span><span class="pln" style="color:#000000;"> </span><span class="kwd" style="color:#0088;">int</span><span class="pun" style="color:#66660;">(</span><span class="lit" style="color:#06666;">11</span><span class="pun" style="color:#66660;">)</span><span class="pln" style="color:#000000;"> NOT NULL</span><span class="pun" style="color:#66660;">,</span><span class="pln" style="color:#000000;">     </span></div><div><span class="str" style="color:#0880;">`rid`</span><span class="pln" style="color:#000000;"> </span><span class="kwd" style="color:#0088;">int</span><span class="pun" style="color:#66660;">(</span><span class="lit" style="color:#06666;">11</span><span class="pun" style="color:#66660;">)</span><span class="pln" style="color:#000000;"> NOT NULL</span><span class="pun" style="color:#66660;">,</span><span class="pln" style="color:#000000;">     </span></div><div><span class="str" style="color:#0880;">`itmid`</span><span class="pln" style="color:#000000;"> </span><span class="kwd" style="color:#0088;">int</span><span class="pun" style="color:#66660;">(</span><span class="lit" style="color:#06666;">11</span><span class="pun" style="color:#66660;">)</span><span class="pln" style="color:#000000;"> NOT NULL</span><span class="pun" style="color:#66660;">,</span><span class="pln" style="color:#000000;">     </span></div><div><span class="str" style="color:#0880;">`itmnum`</span><span class="pln" style="color:#000000;"> </span><span class="kwd" style="color:#0088;">int</span><span class="pun" style="color:#66660;">(</span><span class="lit" style="color:#06666;">11</span><span class="pun" style="color:#66660;">)</span><span class="pln" style="color:#000000;"> NOT NULL</span><span class="pun" style="color:#66660;">,</span><span class="pln" style="color:#000000;">     </span></div><div><span class="str" style="color:#0880;">`gdtype`</span><span class="pln" style="color:#000000;"> </span><span class="kwd" style="color:#0088;">int</span><span class="pun" style="color:#66660;">(</span><span class="lit" style="color:#06666;">11</span><span class="pun" style="color:#66660;">)</span><span class="pln" style="color:#000000;"> NOT NULL</span><span class="pun" style="color:#66660;">,</span><span class="pln" style="color:#000000;">     </span></div><div><span class="str" style="color:#0880;">`gdnum`</span><span class="pln" style="color:#000000;"> </span><span class="kwd" style="color:#0088;">int</span><span class="pun" style="color:#66660;">(</span><span class="lit" style="color:#06666;">11</span><span class="pun" style="color:#66660;">)</span><span class="pln" style="color:#000000;"> NOT NULL</span><span class="pun" style="color:#66660;">,</span><span class="pln" style="color:#000000;">     </span></div><div><span class="str" style="color:#0880;">`islmt`</span><span class="pln" style="color:#000000;"> </span><span class="kwd" style="color:#0088;">int</span><span class="pun" style="color:#66660;">(</span><span class="lit" style="color:#06666;">11</span><span class="pun" style="color:#66660;">)</span><span class="pln" style="color:#000000;"> NOT NULL</span><span class="pun" style="color:#66660;">,</span><span class="pln" style="color:#000000;">  </span></div><div><span class="pln" style="color:#000000;">KEY </span><span class="str" style="color:#0880;">`crttm`</span><span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">(</span><span class="str" style="color:#0880;">`crttm`</span><span class="pun" style="color:#66660;">),</span><span class="pln" style="color:#000000;">  </span></div><div><span class="pln" style="color:#000000;">  KEY </span><span class="str" style="color:#0880;">`itemid`</span><span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">(</span><span class="str" style="color:#0880;">`itmid`</span><span class="pun" style="color:#66660;">),</span><span class="pln" style="color:#000000;">  </span></div><div><span class="pln" style="color:#000000;">  KEY </span><span class="str" style="color:#0880;">`srvid`</span><span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">(</span><span class="str" style="color:#0880;">`srvid`</span><span class="pun" style="color:#66660;">),</span><span class="pln" style="color:#000000;">  </span></div><div><span class="pln" style="color:#000000;">  KEY </span><span class="str" style="color:#0880;">`gdtype`</span><span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">(</span><span class="str" style="color:#0880;">`gdtype`</span><span class="pun" style="color:#66660;">)</span><span class="pln" style="color:#000000;">  </span></div><div><span class="pun" style="color:#66660;">)</span><span class="pln" style="color:#000000;"> ENGINE</span><span class="pun" style="color:#66660;">=</span><span class="pln" style="color:#000000;">myisam DEFAULT CHARSET</span><span class="pun" style="color:#66660;">=</span><span class="pln" style="color:#000000;">utf8  </span></div><div><span class="pln" style="color:#000000;">PARTITION BY RANGE </span><span class="pun" style="color:#66660;">(</span><span class="pln" style="color:#000000;">crttm</span><span class="pun" style="color:#66660;">)</span><span class="pln" style="color:#000000;">   </span></div><div><span class="pun" style="color:#66660;">(</span><span class="pln" style="color:#000000;">  </span></div><div><span class="pln" style="color:#000000;">PARTITION p201303 VALUES LESS THAN </span><span class="pun" style="color:#66660;">(</span><span class="pln" style="color:#000000;">unix_timestamp</span><span class="pun" style="color:#66660;">(</span><span class="str" style="color:#0880;">'2014-04-01'</span><span class="pun" style="color:#66660;">)),</span><span class="pln" style="color:#000000;">  </span></div><div><span class="pln" style="color:#000000;">PARTITION p201304 VALUES LESS THAN </span><span class="pun" style="color:#66660;">(</span><span class="pln" style="color:#000000;">unix_timestamp</span><span class="pun" style="color:#66660;">(</span><span class="str" style="color:#0880;">'2014-05-01'</span><span class="pun" style="color:#66660;">)),</span><span class="pln" style="color:#000000;">  </span></div><div><span class="pln" style="color:#000000;">PARTITION p201305 VALUES LESS THAN </span><span class="pun" style="color:#66660;">(</span><span class="pln" style="color:#000000;">unix_timestamp</span><span class="pun" style="color:#66660;">(</span><span class="str" style="color:#0880;">'2014-06-01'</span><span class="pun" style="color:#66660;">)),</span><span class="pln" style="color:#000000;">  </span></div><div><span class="pln" style="color:#000000;">PARTITION p201306 VALUES LESS THAN </span><span class="pun" style="color:#66660;">(</span><span class="pln" style="color:#000000;">unix_timestamp</span><span class="pun" style="color:#66660;">(</span><span class="str" style="color:#0880;">'2014-07-01'</span><span class="pun" style="color:#66660;">)),</span><span class="pln" style="color:#000000;">  </span></div><div><span class="pln" style="color:#000000;">PARTITION p201307 VALUES LESS THAN </span><span class="pun" style="color:#66660;">(</span><span class="pln" style="color:#000000;">unix_timestamp</span><span class="pun" style="color:#66660;">(</span><span class="str" style="color:#0880;">'2014-08-01'</span><span class="pun" style="color:#66660;">)),</span><span class="pln" style="color:#000000;">  </span></div><div><span class="pln" style="color:#000000;">PARTITION p201308 VALUES LESS THAN </span><span class="pun" style="color:#66660;">(</span><span class="pln" style="color:#000000;">unix_timestamp</span><span class="pun" style="color:#66660;">(</span><span class="str" style="color:#0880;">'2014-09-01'</span><span class="pun" style="color:#66660;">)),</span><span class="pln" style="color:#000000;">  </span></div><div><span class="pln" style="color:#000000;">PARTITION p201309 VALUES LESS THAN </span><span class="pun" style="color:#66660;">(</span><span class="pln" style="color:#000000;">unix_timestamp</span><span class="pun" style="color:#66660;">(</span><span class="str" style="color:#0880;">'2014-10-01'</span><span class="pun" style="color:#66660;">)),</span><span class="pln" style="color:#000000;">  </span></div><div><span class="pln" style="color:#000000;">PARTITION p201310 VALUES LESS THAN </span><span class="pun" style="color:#66660;">(</span><span class="pln" style="color:#000000;">unix_timestamp</span><span class="pun" style="color:#66660;">(</span><span class="str" style="color:#0880;">'2014-11-01'</span><span class="pun" style="color:#66660;">)),</span><span class="pln" style="color:#000000;">  </span></div><div><span class="pln" style="color:#000000;">PARTITION p201311 VALUES LESS THAN </span><span class="pun" style="color:#66660;">(</span><span class="pln" style="color:#000000;">unix_timestamp</span><span class="pun" style="color:#66660;">(</span><span class="str" style="color:#0880;">'2014-12-01'</span><span class="pun" style="color:#66660;">)),</span><span class="pln" style="color:#000000;">  </span></div><div><span class="pln" style="color:#000000;">PARTITION p201312 VALUES LESS THAN </span><span class="pun" style="color:#66660;">(</span><span class="pln" style="color:#000000;">unix_timestamp</span><span class="pun" style="color:#66660;">(</span><span class="str" style="color:#0880;">'2015-01-01'</span><span class="pun" style="color:#66660;">)),</span><span class="pln" style="color:#000000;">  </span></div><div><span class="pln" style="color:#000000;">PARTITION p201401 VALUES LESS THAN </span><span class="pun" style="color:#66660;">(</span><span class="pln" style="color:#000000;">unix_timestamp</span><span class="pun" style="color:#66660;">(</span><span class="str" style="color:#0880;">'2015-02-01'</span><span class="pun" style="color:#66660;">))</span><span class="pln" style="color:#000000;">  </span></div><div><span class="pun" style="color:#66660;">);</span><span class="pln" style="color:#000000;"> </span></div></div>
对于这种业务场景,使用 mysql 的 partition 就已经足够了,但是对于 i/o 非常频繁的大表,单机垂直升级也已经支撑不了,存储已经不是影响其性能的主要原因,这时候就要用到sharding了。

我们一般会将一张大表的唯一键作为 hash 的 key,比如我们想要水平拆分的是一张拥有3千万行数据的用户表,我们可以利用唯一的字段用户id作为拆分的依据,这样就可以依据如下的方式,将用户表水平拆分成3张,下面是伪代码,将老的用户数据导入到新的3个被水平拆分的数据库中。
<div><span class="kwd" style="color:#0088;">if</span><span class="pln" style="color:#000000;"> userId </span><span class="pun" style="color:#66660;">%</span><span class="pln" style="color:#000000;"> </span><span class="lit" style="color:#06666;">3</span><span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">==</span><span class="pln" style="color:#000000;"> </span><span class="lit" style="color:#06666;">0</span><span class="pun" style="color:#66660;">:</span></div><div><span class="pln" style="color:#000000;">	</span><span class="com" style="color:#8800;">#insert data in user_table (</span><span style="font-family:'Hiragino Sans GB W3','Hiragino Sans GB',Arial,Helvetica,simsun,宋体;"><span class="com" style="color:#8800;">user_table_0 </span></span><span style="font-family:'Hiragino Sans GB W3','Hiragino Sans GB',Arial,Helvetica,simsun,宋体;"><span class="com" style="color:#8800;">databaseip: 127.0.0.1)</span></span></div><div><div><span class="com" style="color:#8800;">elif userId % 3 == 1:</span></div><div><span class="com" style="color:#8800;">	</span><span class="com" style="color:#8800;">#insert data in user_table (</span><span style="font-family:'Hiragino Sans GB W3','Hiragino Sans GB',Arial,Helvetica,simsun,宋体;"><span class="com" style="color:#8800;">user_table_1 </span></span><span style="font-family:'Hiragino Sans GB W3','Hiragino Sans GB',Arial,Helvetica,simsun,宋体;"><span class="com" style="color:#8800;">databaseip: 127.0.0.2)</span></span></div></div><div><span class="com" style="color:#8800;">else:</span></div><div><span class="com" style="color:#8800;">	</span><span class="com" style="color:#8800;">#insert data in user_table (</span><span style="font-family:'Hiragino Sans GB W3','Hiragino Sans GB',Arial,Helvetica,simsun,宋体;"><span class="com" style="color:#8800;">user_table_2 </span></span><span style="font-family:'Hiragino Sans GB W3','Hiragino Sans GB',Arial,Helvetica,simsun,宋体;"><span class="com" style="color:#8800;">databaseip: 127.0.0.3)</span></span></div>
我们还会对每一个被拆分的数据库,做一个双主 master 的副本集备份,至于backup,我们则可以使用 percona的cluster来解决。它是比 mysql m/s 或者 m/m 更靠谱的方案。

所以最后拆分的拓扑图大致如下:
利用一致性哈希水平拆分MySql单表 - snoopyxdy - snoopyxdy的博客
 
随着我们的业务增长,数据涨到5千万了,慢慢的发现3个sharding不能满足我们的需求了,因为服务器紧张,所以这时候BOSS打算再加2个sharding,以后会慢慢加到10个sharding。

所以我们得在之前的3台sharding服务器上分别执行导入数据代码,将数据根据新的hash规则导入到每台sharding服务器上。几乎5千万行数据每行都移动了一遍,如果服务器够牛逼,Mysql每秒的插入性能能高达 2000/s,即使这样整个操作,都要让服务暂停8个小时左右。这时候DBA的脸色已经不好看了,他应该是已经通宵在导数据了。

那有没有一种更好的办法,让添加或者删除 sharding 节点对整个分片系统的数据迁移量降低呢?

我们可以利用一致性哈希算法,把用户id散列到各个 sharding 节点,这样就可以保证添加和删除节点数据迁移影响较小。关于什么是一致性哈性算法,参考我的另一篇博客:

这里介绍一个Node.js模块,hashring,github主页地址如下,上面有demo和api文档:
这是一个使用的demo代码,我翻译了注释,供大家参考:
<div><div><span class="com" style="color:#8800;">// 加载模块,返回HashRing的构造函数</span></div><div><span class="com" style="color:#8800;">var HashRing = require('hashring');</span></div><div>
</div><div><span class="com" style="color:#8800;">//实例化HashRing,这个例子中,我们把各个服务器均匀的添加了,没有设置权重</span></div><div><span style="font-family:'Hiragino Sans GB W3','Hiragino Sans GB',Arial,Helvetica,simsun,宋体;"><span class="com" style="color:#8800;">// 设置了最大的缓冲区 10000</span></span></div><div><span class="com" style="color:#8800;">var ring = new HashRing([</span></div><div><span class="com" style="color:#8800;">    '127.0.0.1',</span></div><div><span class="com" style="color:#8800;">    '127.0.0.2',</span></div><div><span class="com" style="color:#8800;">    '127.0.0.3', </span></div><div><span class="com" style="color:#8800;">    '127.0.0.4'</span></div><div><span class="com" style="color:#8800;">  ], 'md5', {</span></div><div><span class="com" style="color:#8800;">    'max cache size': 10000</span></div><div><span class="com" style="color:#8800;">  });</span></div><div>
</div><div><span class="com" style="color:#8800;">//我们获取这个字符串的服务器ip</span></div><div><span class="com" style="color:#8800;">var server = ring.get('foo bar banana'); // returns 127.0.0.x</span></div><div><span class="com" style="color:#8800;">console.log(server)</span></div><div>
</div><div><span class="com" style="color:#8800;">// 如果你想把数据冗余的存储在多个服务器上</span></div><div><span class="com" style="color:#8800;">ring.range('foo bar banana', 2).forEach(function forEach(server) {</span></div><div><span class="com" style="color:#8800;">  console.log(server); // do stuff with your server</span></div><div><span class="com" style="color:#8800;">});</span></div><div>
</div><div><span style="font-family:'Hiragino Sans GB W3','Hiragino Sans GB',Arial,Helvetica,simsun,宋体;"><span class="com" style="color:#8800;">// 对环上移除或新增加一台服务器</span></span></div><div><span class="com" style="color:#8800;">ring.add('127.0.0.7').remove('127.0.0.1');</span></div><div>
</div><div><span class="kwd" style="color:#0088;">var</span><span class="pln" style="color:#000000;"> server </span><span class="pun" style="color:#66660;">=</span><span class="pln" style="color:#000000;"> ring</span><span class="pun" style="color:#66660;">.</span><span class="kwd" style="color:#0088;">get</span><span class="pun" style="color:#66660;">(</span><span class="str" style="color:#0880;">'foo bar banana'</span><span class="pun" style="color:#66660;">);</span><span class="pln" style="color:#000000;"> </span><span class="com" style="color:#8800;">// returns 127.0.0.x</span></div><div><span class="com" style="color:#8800;">console.log(server)</span></div></div>
接下来我们就要验证这种方式的可行性。
第一,假如我们有3万条数据,根据一致性哈希算法存储好了之后,这个算法是否能够较平均的将3万条数据分散到3台sharding服务器上。
第二,当数据量增加到5万,然后我们增加2台sharding服务器后,这个算法移动的数据量和最终每台服务器上的数据分布是如何的。

connHashStep1.js将3万用户数据通过一致性哈希算法存储在3台服务器上
<div><span class="kwd" style="color:#0088;">var</span><span class="pln" style="color:#000000;"> </span><span class="typ" style="color:#66066;">HashRing</span><span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">=</span><span class="pln" style="color:#000000;"> </span><span class="kwd" style="color:#0088;">require</span><span class="pun" style="color:#66660;">(</span><span class="str" style="color:#0880;">'hashring'</span><span class="pun" style="color:#66660;">);</span></div><div><span class="kwd" style="color:#0088;">var</span><span class="pln" style="color:#000000;"> ring </span><span class="pun" style="color:#66660;">=</span><span class="pln" style="color:#000000;"> </span><span class="kwd" style="color:#0088;">new</span><span class="pln" style="color:#000000;"> </span><span class="typ" style="color:#66066;">HashRing</span><span class="pun" style="color:#66660;">([</span></div><div><span class="pln" style="color:#000000;">    </span><span class="str" style="color:#0880;">'127.0.0.1'</span><span class="pun" style="color:#66660;">,</span></div><div><span class="pln" style="color:#000000;">    </span><span class="str" style="color:#0880;">'127.0.0.2'</span><span class="pun" style="color:#66660;">,</span></div><div><span class="pln" style="color:#000000;">    </span><span class="str" style="color:#0880;">'127.0.0.3'</span><span class="pun" style="color:#66660;">,</span><span class="pln" style="color:#000000;"> </span></div><div><span class="pln" style="color:#000000;">  </span><span class="pun" style="color:#66660;">],</span><span class="pln" style="color:#000000;"> </span><span class="str" style="color:#0880;">'md5'</span><span class="pun" style="color:#66660;">,</span><span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">{</span></div><div><span class="pln" style="color:#000000;">    </span><span class="str" style="color:#0880;">'max cache size'</span><span class="pun" style="color:#66660;">:</span><span class="pln" style="color:#000000;"> </span><span class="lit" style="color:#06666;">10000</span></div><div><span class="pln" style="color:#000000;">  </span><span class="pun" style="color:#66660;">});</span></div><div>
</div><div><span class="kwd" style="color:#0088;">var</span><span class="pln" style="color:#000000;"> record </span><span class="pun" style="color:#66660;">=</span><span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">{</span></div><div><span class="pln" style="color:#000000;">      </span><span class="str" style="color:#0880;">'127.0.0.1'</span><span class="pun" style="color:#66660;">:</span><span class="lit" style="color:#06666;">0</span><span class="pun" style="color:#66660;">,</span></div><div><span class="pln" style="color:#000000;">    </span><span class="str" style="color:#0880;">'127.0.0.2'</span><span class="pun" style="color:#66660;">:</span><span class="lit" style="color:#06666;">0</span><span class="pun" style="color:#66660;">,</span></div><div><span class="pln" style="color:#000000;">    </span><span class="str" style="color:#0880;">'127.0.0.3'</span><span class="pun" style="color:#66660;">:</span><span class="lit" style="color:#06666;">0</span></div><div><span class="pun" style="color:#66660;">};</span></div><div><span class="kwd" style="color:#0088;">var</span><span class="pln" style="color:#000000;"> userMap </span><span class="pun" style="color:#66660;">=</span><span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">{}</span></div><div>
</div><div><span class="kwd" style="color:#0088;">for</span><span class="pun" style="color:#66660;">(</span><span class="kwd" style="color:#0088;">var</span><span class="pln" style="color:#000000;"> i</span><span class="pun" style="color:#66660;">=</span><span class="lit" style="color:#06666;">1</span><span class="pun" style="color:#66660;">;</span><span class="pln" style="color:#000000;"> i</span><span class="pun" style="color:#66660;"><=</span><span class="lit" style="color:#06666;">30000</span><span class="pun" style="color:#66660;">;</span><span class="pln" style="color:#000000;"> i</span><span class="pun" style="color:#66660;">++){</span></div><div><span class="pln" style="color:#000000;">	</span><span class="kwd" style="color:#0088;">var</span><span class="pln" style="color:#000000;"> userIdStr </span><span class="pun" style="color:#66660;">=</span><span class="pln" style="color:#000000;"> i</span><span class="pun" style="color:#66660;">.</span><span class="pln" style="color:#000000;">toString</span><span class="pun" style="color:#66660;">();</span></div><div><span class="pln" style="color:#000000;">	</span><span class="kwd" style="color:#0088;">var</span><span class="pln" style="color:#000000;"> server </span><span class="pun" style="color:#66660;">=</span><span class="pln" style="color:#000000;"> ring</span><span class="pun" style="color:#66660;">.</span><span class="kwd" style="color:#0088;">get</span><span class="pun" style="color:#66660;">(</span><span class="pln" style="color:#000000;">userIdStr</span><span class="pun" style="color:#66660;">);</span></div><div><span class="pln" style="color:#000000;">	</span><span class="pln" style="color:#000000;">userMap</span><span class="pun" style="color:#66660;">[</span><span class="pln" style="color:#000000;">userIdStr</span><span class="pun" style="color:#66660;">]</span><span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">=</span><span class="pln" style="color:#000000;"> server</span><span class="pun" style="color:#66660;">;</span></div><div><span class="pln" style="color:#000000;">	</span><span class="pln" style="color:#000000;">record</span><span class="pun" style="color:#66660;">[</span><span class="pln" style="color:#000000;">server</span><span class="pun" style="color:#66660;">]++;</span></div><div><span class="pun" style="color:#66660;">}</span></div><div>
</div><div><span class="pln" style="color:#000000;">console</span><span class="pun" style="color:#66660;">.</span><span class="pln" style="color:#000000;">log</span><span class="pun" style="color:#66660;">(</span><span class="pln" style="color:#000000;">record</span><span class="pun" style="color:#66660;">);</span></div>
第一次利用一致性hash之后,每台服务器存储的用户数据。
<p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"><span class="pun" style="color:#66660;">{</span><span class="pln" style="color:#000000;"> </span><span class="str" style="color:#0880;">'127.0.0.1'</span><span class="pun" style="color:#66660;">:</span><span class="pln" style="color:#000000;"> </span><span class="lit" style="color:#06666;">9162</span><span class="pun" style="color:#66660;">,</span><span class="pln" style="color:#000000;"> </span><span class="str" style="color:#0880;">'127.0.0.2'</span><span class="pun" style="color:#66660;">:</span><span class="pln" style="color:#000000;"> </span><span class="lit" style="color:#06666;">9824</span><span class="pun" style="color:#66660;">,</span><span class="pln" style="color:#000000;"> </span><span class="str" style="color:#0880;">'127.0.0.3'</span><span class="pun" style="color:#66660;">:</span><span class="pln" style="color:#000000;"> </span><span class="lit" style="color:#06666;">11014</span><span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">}</span></p>
connHashStep2.js将5万用户数据通过一致性哈希算法存储在3台服务器上,然后用户数据5万不改变,新增加2台sharding,查看新的5台sharding的用户数据存储情况以及计算移动的数据条数。
<div><span class="kwd" style="color:#0088;">var</span><span class="pln" style="color:#000000;"> </span><span class="typ" style="color:#66066;">HashRing</span><span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">=</span><span class="pln" style="color:#000000;"> </span><span class="kwd" style="color:#0088;">require</span><span class="pun" style="color:#66660;">(</span><span class="str" style="color:#0880;">'hashring'</span><span class="pun" style="color:#66660;">);</span></div><div><span class="kwd" style="color:#0088;">var</span><span class="pln" style="color:#000000;"> ring </span><span class="pun" style="color:#66660;">=</span><span class="pln" style="color:#000000;"> </span><span class="kwd" style="color:#0088;">new</span><span class="pln" style="color:#000000;"> </span><span class="typ" style="color:#66066;">HashRing</span><span class="pun" style="color:#66660;">([</span></div><div><span class="pln" style="color:#000000;">    </span><span class="str" style="color:#0880;">'127.0.0.1'</span><span class="pun" style="color:#66660;">,</span></div><div><span class="pln" style="color:#000000;">    </span><span class="str" style="color:#0880;">'127.0.0.2'</span><span class="pun" style="color:#66660;">,</span></div><div><span class="pln" style="color:#000000;">    </span><span class="str" style="color:#0880;">'127.0.0.3'</span><span class="pun" style="color:#66660;">,</span><span class="pln" style="color:#000000;"> </span></div><div><span class="pln" style="color:#000000;">  </span><span class="pun" style="color:#66660;">],</span><span class="pln" style="color:#000000;"> </span><span class="str" style="color:#0880;">'md5'</span><span class="pun" style="color:#66660;">,</span><span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">{</span></div><div><span class="pln" style="color:#000000;">    </span><span class="str" style="color:#0880;">'max cache size'</span><span class="pun" style="color:#66660;">:</span><span class="pln" style="color:#000000;"> </span><span class="lit" style="color:#06666;">10000</span></div><div><span class="pln" style="color:#000000;">  </span><span class="pun" style="color:#66660;">});</span></div><div>
</div><div><span class="kwd" style="color:#0088;">var</span><span class="pln" style="color:#000000;"> record </span><span class="pun" style="color:#66660;">=</span><span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">{</span></div><div><span class="pln" style="color:#000000;">      </span><span class="str" style="color:#0880;">'127.0.0.1'</span><span class="pun" style="color:#66660;">:</span><span class="lit" style="color:#06666;">0</span><span class="pun" style="color:#66660;">,</span></div><div><span class="pln" style="color:#000000;">    </span><span class="str" style="color:#0880;">'127.0.0.2'</span><span class="pun" style="color:#66660;">:</span><span class="lit" style="color:#06666;">0</span><span class="pun" style="color:#66660;">,</span></div><div><span class="pln" style="color:#000000;">    </span><span class="str" style="color:#0880;">'127.0.0.3'</span><span class="pun" style="color:#66660;">:</span><span class="lit" style="color:#06666;">0</span></div><div><span class="pun" style="color:#66660;">};</span></div><div><span class="kwd" style="color:#0088;">var</span><span class="pln" style="color:#000000;"> userMap </span><span class="pun" style="color:#66660;">=</span><span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">{}</span></div><div><span class="pln" style="color:#000000;">  </span></div><div><span class="kwd" style="color:#0088;">for</span><span class="pun" style="color:#66660;">(</span><span class="kwd" style="color:#0088;">var</span><span class="pln" style="color:#000000;"> i</span><span class="pun" style="color:#66660;">=</span><span class="lit" style="color:#06666;">1</span><span class="pun" style="color:#66660;">;</span><span class="pln" style="color:#000000;"> i</span><span class="pun" style="color:#66660;"><=</span><span class="lit" style="color:#06666;">50000</span><span class="pun" style="color:#66660;">;</span><span class="pln" style="color:#000000;"> i</span><span class="pun" style="color:#66660;">++){</span></div><div><span class="pln" style="color:#000000;">	</span><span class="kwd" style="color:#0088;">var</span><span class="pln" style="color:#000000;"> userIdStr </span><span class="pun" style="color:#66660;">=</span><span class="pln" style="color:#000000;"> i</span><span class="pun" style="color:#66660;">.</span><span class="pln" style="color:#000000;">toString</span><span class="pun" style="color:#66660;">();</span></div><div><span class="pln" style="color:#000000;">	</span><span class="kwd" style="color:#0088;">var</span><span class="pln" style="color:#000000;"> server </span><span class="pun" style="color:#66660;">=</span><span class="pln" style="color:#000000;"> ring</span><span class="pun" style="color:#66660;">.</span><span class="kwd" style="color:#0088;">get</span><span class="pun" style="color:#66660;">(</span><span class="pln" style="color:#000000;">userIdStr</span><span class="pun" style="color:#66660;">);</span></div><div><span class="pln" style="color:#000000;">	</span><span class="pln" style="color:#000000;">userMap</span><span class="pun" style="color:#66660;">[</span><span class="pln" style="color:#000000;">userIdStr</span><span class="pun" style="color:#66660;">]</span><span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">=</span><span class="pln" style="color:#000000;"> server</span><span class="pun" style="color:#66660;">;</span></div><div><span class="pln" style="color:#000000;">	</span><span class="pln" style="color:#000000;">record</span><span class="pun" style="color:#66660;">[</span><span class="pln" style="color:#000000;">server</span><span class="pun" style="color:#66660;">]++;</span></div><div><span class="pun" style="color:#66660;">}</span></div><div>
</div><div><span class="pln" style="color:#000000;">console</span><span class="pun" style="color:#66660;">.</span><span class="pln" style="color:#000000;">log</span><span class="pun" style="color:#66660;">(</span><span class="pln" style="color:#000000;">record</span><span class="pun" style="color:#66660;">);</span></div><div>
</div><div><span class="com" style="color:#8800;">//新增加2个sharding节点</span></div><div><span class="com" style="color:#8800;">var record2 = {</span></div><div><span class="com" style="color:#8800;">	</span><span class="com" style="color:#8800;">'127.0.0.1':0,</span></div><div><span class="com" style="color:#8800;">      '127.0.0.2':0,</span></div><div><span class="com" style="color:#8800;">      '127.0.0.3':0,</span></div><div><span class="com" style="color:#8800;">	</span><span class="com" style="color:#8800;">'127.0.0.4':0,</span></div><div><span class="com" style="color:#8800;">	</span><span class="com" style="color:#8800;">'127.0.0.5':0,</span></div><div><span class="com" style="color:#8800;">};</span></div><div><span class="com" style="color:#8800;">ring.add('127.0.0.4').add('127.0.0.5')</span></div><div>
</div><div><span class="kwd" style="color:#0088;">var</span><span class="pln" style="color:#000000;"> moveStep </span><span class="pun" style="color:#66660;">=</span><span class="pln" style="color:#000000;"> </span><span class="lit" style="color:#06666;">0</span><span class="pun" style="color:#66660;">;</span></div><div><span class="kwd" style="color:#0088;">for</span><span class="pun" style="color:#66660;">(</span><span class="kwd" style="color:#0088;">var</span><span class="pln" style="color:#000000;"> i</span><span class="pun" style="color:#66660;">=</span><span class="lit" style="color:#06666;">1</span><span class="pun" style="color:#66660;">;</span><span class="pln" style="color:#000000;"> i</span><span class="pun" style="color:#66660;"><=</span><span class="lit" style="color:#06666;">50000</span><span class="pun" style="color:#66660;">;</span><span class="pln" style="color:#000000;"> i</span><span class="pun" style="color:#66660;">++){</span></div><div><span class="pln" style="color:#000000;">	</span><span class="kwd" style="color:#0088;">var</span><span class="pln" style="color:#000000;"> userIdStr </span><span class="pun" style="color:#66660;">=</span><span class="pln" style="color:#000000;"> i</span><span class="pun" style="color:#66660;">.</span><span class="pln" style="color:#000000;">toString</span><span class="pun" style="color:#66660;">();</span></div><div><span class="pln" style="color:#000000;">	</span><span class="kwd" style="color:#0088;">var</span><span class="pln" style="color:#000000;"> server </span><span class="pun" style="color:#66660;">=</span><span class="pln" style="color:#000000;"> ring</span><span class="pun" style="color:#66660;">.</span><span class="kwd" style="color:#0088;">get</span><span class="pun" style="color:#66660;">(</span><span class="pln" style="color:#000000;">userIdStr</span><span class="pun" style="color:#66660;">);</span></div><div><span class="pln" style="color:#000000;">	</span><span class="com" style="color:#8800;">//当用户的存储server改变,则计算移动</span></div><div><span class="com" style="color:#8800;">	</span><span class="com" style="color:#8800;">if(userMap[userIdStr] && userMap[userIdStr] != server){</span></div><div><span class="com" style="color:#8800;">		</span><span class="com" style="color:#8800;">userMap[userIdStr] = server;</span></div><div><span class="com" style="color:#8800;">		</span><span class="com" style="color:#8800;">moveStep++;</span></div><div><span class="com" style="color:#8800;">	</span><span class="com" style="color:#8800;">}</span></div><div><span class="com" style="color:#8800;">	</span><span class="com" style="color:#8800;">record2[server]++;</span></div><div><span class="com" style="color:#8800;">}</span></div><div><span class="com" style="color:#8800;">console.log(record2);</span></div><div><span class="com" style="color:#8800;">console.log('move step:'+moveStep);</span></div>
5万用户数据,存储在3台服务器上的数目:
<p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"><span class="pun" style="color:#66660;">{</span><span class="pln" style="color:#000000;"> </span><span class="str" style="color:#0880;">'127.0.0.1'</span><span class="pun" style="color:#66660;">:</span><span class="pln" style="color:#000000;"> </span><span class="lit" style="color:#06666;">15238</span><span class="pun" style="color:#66660;">,</span><span class="pln" style="color:#000000;"> </span><span class="str" style="color:#0880;">'127.0.0.2'</span><span class="pun" style="color:#66660;">:</span><span class="pln" style="color:#000000;"> </span><span class="lit" style="color:#06666;">16448</span><span class="pun" style="color:#66660;">,</span><span class="pln" style="color:#000000;"> </span><span class="str" style="color:#0880;">'127.0.0.3'</span><span class="pun" style="color:#66660;">:</span><span class="pln" style="color:#000000;"> </span><span class="lit" style="color:#06666;">18314</span><span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">}</span></p>
当我们sharding增加到5台,存储在5台服务器上的数目:
<div><span class="pun" style="color:#66660;">{</span><span class="pln" style="color:#000000;"> </span><span class="str" style="color:#0880;">'127.0.0.1'</span><span class="pun" style="color:#66660;">:</span><span class="pln" style="color:#000000;"> </span><span class="lit" style="color:#06666;">8869</span><span class="pun" style="color:#66660;">,</span></div><div><span class="pln" style="color:#000000;">  </span><span class="str" style="color:#0880;">'127.0.0.2'</span><span class="pun" style="color:#66660;">:</span><span class="pln" style="color:#000000;"> </span><span class="lit" style="color:#06666;">9972</span><span class="pun" style="color:#66660;">,</span></div><div><span class="pln" style="color:#000000;">  </span><span class="str" style="color:#0880;">'127.0.0.3'</span><span class="pun" style="color:#66660;">:</span><span class="pln" style="color:#000000;"> </span><span class="lit" style="color:#06666;">10326</span><span class="pun" style="color:#66660;">,</span></div><div><span class="pln" style="color:#000000;">  </span><span class="str" style="color:#0880;">'127.0.0.4'</span><span class="pun" style="color:#66660;">:</span><span class="pln" style="color:#000000;"> </span><span class="lit" style="color:#06666;">10064</span><span class="pun" style="color:#66660;">,</span></div><div><span class="pln" style="color:#000000;">  </span><span class="str" style="color:#0880;">'127.0.0.5'</span><span class="pun" style="color:#66660;">:</span><span class="pln" style="color:#000000;"> </span><span class="lit" style="color:#06666;">10769</span><span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">}</span></div>
最终我们移动的用户数量:
<p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"><span class="pln" style="color:#000000;">move step</span><span class="pun" style="color:#66660;">:</span><span class="lit" style="color:#06666;">20833</span></p>
其实你会发现
<p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"><span class="lit" style="color:#06666;">20833</span><span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">=</span><span class="pln" style="color:#000000;"> </span><span class="lit" style="color:#06666;">10064</span><span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">+</span><span class="pln" style="color:#000000;"> </span><span class="lit" style="color:#06666;">10769</span><span class="pln" style="color:#000000;"> </span></p>
也就是说,我们只是将1-3节点的部分数据移动到了4,5节点,并没有多余的移动一行数据。根据上面的示例,如果是5千万数据,利用一致性哈希的算法,添加2个节点,仅需2-3小时就可以完成。

那么什么时候我们需要利用一致性哈希水平拆分数据库单表呢?
1、当我们拥有一个数据量非常大的单表,比如上亿条数据。
2、不仅数据量巨大,这个单表的访问读写也非常频繁,单机已经无法抗住 I/O 操作。
3、此表无事务性操作,如果涉及分布式事务是相当复杂的事情,在拆分此类表需要异常小心。
4、查询条件单一,对此表的查询更新条件常用的仅有1-2个字段,比如用户表中的用户id或用户名。
最后,这样的拆分也是会带来负面性的,当水平拆分了一个大表,不得不去修改应用程序或者开发db代理层中间件,这样会加大开发周期、难度和系统复杂性。

P.S 打算在公司试行这种方案,求大牛指点一二,看看有无错误和遗漏。

ShardingJDBC 分库分表详解 1、ShardingSphere概述1.1、ShardingSphere概述主要来说就以下三点:1.2、ShardingSphere-JDBC概述定位为轻量级 Java 框架,和spring、mybatis一样,在 Java 的 JDBC 层提供的额外服务。 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。1.3、ShardingSphere-Proxy概述定位为透明化的数据库代理端,提供封装了数据库二进制协 阅读详情

相关推荐

Mysql千万数据级分表设计及实现方案(2)附一致性哈希原理解析

首先,接着上篇博文:Mysql千万数据级分表设计及实现方案已经分析了自增id作分表key和全局服务id(16位)作分表key进行分表的两种设计方案。自增id优势在于简单,直接哈希取模即可分表完成。根据全局服务生成的16位用户id(或订单id)则需关注分表键生成策略,根据生成策略确定取模算法,保证数据尽量均匀分布。另外采取uid还得关注热点用户导致的数据热点问题,若出现热点问题,可针对热点数据做缓存...

Think In JAVA—Max 5657

数据库之Sharding分库分表操作详解

Sharding和,最早是由当当网开源,捐给了Apache,成为了Apache顶级项目,后来又升级成了是一款分布式SQL事务和查询引擎,可通过数据分片、弹性伸缩、加密等能力对任意数据库进行增强。需要实现接口System . out . println("自定义的id" + id);return id;} // 返回 自定义 算法类型表示 @Override public String getType() {} }

上善若泪 3842

在 MySQL 单表存储 500 万数据的场景下,如何设计读取

在 MySQL 单表存储 500 万数据的场景下,如何设计读取

Aaron Fang的专栏 1180

sharding配置文件

依赖配置 <!-- Druid连接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.20</version> </dependency> <!-- Mysql驱动依赖 --> <dependency> &

qq_38608582的博客 1795

AJ-Report开源数据大屏存在远程命令执行漏洞

该平台可以通过post方式在validationRules参数对应值中进行命令执行,可以获得服务器权限,登陆管理后台接管大屏。如果被攻击者利用,危害后果十分严重。

swordheart的博客 388

realsense D455深度相机+YOLO V5结合实现目标检测(一)

realsense D455深度相机+YOLO V5结合实现目标检测代码来源环境配置代码分析:1.如何用realsense在python下面调用的问题:2.对main_debug.py文件的分析:结束语 可以实现将D435,D455深度相机和yolo v5结合到一起,在识别物体的同时,还能测到物体相对与相机的距离。 说明一下为什么需要做这个事情?1.首先为什么需要用到realsense D455深度相机? 因为他是普通的相机还加了一个红外测距的东西,所以其他二维图像一样,能够得到三维世界在二维像素平面的投影

文一生 3万+

一致性哈希算法 mysql_利用一致性哈希水平拆分MySql单表

Sharding(切片) 不是一门新技术,而是一个相对简朴的软件理念,就是当我们的数据库单机无法承受高强度的i/o时,我们就考虑利用 sharding 来把这种读写压力分散到各个主机上去。所以Sharding 不是一个某个特定数据库软件附属的功能,而是在具体技术细节之上的抽象处理,是Horizontal Partitioning水平扩展(或横向扩展)的解决方案,其主要目的是为突破单节点数据库服务...

weixin_36312603的博客 482

ERPS协议原理

目录 1、ERPS概述: 2、ERPS名词概念解释: 3、ERPS协议报文: 4、ERPS单环基本原理: 5、单环多实例原理: 6、多环原理: 1、ERPS概述: ERPS(Ethernet Ring Protection Switching),即以太网多环保护技术,是ITU-T定义的一种二层破环协议标准,标准号为ITU-T G.8032/Y1344,因此又称为G.8032。它定义了RAPS(Ring Auto Protection Switching)协议报文和保护倒换机制。 ERPS目前支持v1和v2两

weixin_44880796的博客 1万+

mysql数据库水平拆分例子_数据库水平拆分

数据库拆分垂直拆分数据库垂直拆分就是要把表按模块划分到不同数据库中。微服务架构中每个服务拥有自己独立的数据库,就是典型的垂直拆分。通俗说,就是根据业务类型,把一个数据库中的多张表拆分到多个数据库中,这样不同数据库的数据量和压力不同,可以有针对性的进行优化。水平拆分垂直拆分只是把一张表拆分到另一个数据库实例中,并不会把一张表拆分为多张表。当单表的数据量增加到千万量级以上时,就需要拆表了,成为数据库水...

weixin_35676943的博客 913

中国城市统计年鉴1991-2024面板数据真正无缺失值填补指标说明

大学普通高等中等职业教育成人中小学学前教育在校学生人数。大学普通高等中等职业教育成人中小学学前教育在校学生人数。大学普通高等中等职业教育成人中小学学前教育在校学生人数。大学普通高等中等职业教育成人中小学学前教育在校学生人数。大学普通高等中等职业教育成人中小学学前教育在校学生人数。大学普通高等中等职业教育成人中小学学前教育在校学生人数。大学普通高等中等职业教育成人中小学学前教育在校学生人数。大学普通高等中等职业教育成人中小学学前教育在校学生人数。大学普通高等中等职业教育成人中小学学前教育在校学生人数。

yushibing717的博客 928

从Google到LLVM:5种主流clang-format预设风格横向对比(含代码对比图)

本文横向对比了LLVM、Google、Chromium、Mozilla和WebKit五种主流的clang-format预设代码风格。通过同一段C++代码的格式化效果对比图,直观展示了它们在指针对齐、大括号换行、缩进等关键细节上的差异,并提供了基于团队背景与项目基因的选型决策指南。

weixin_28828243的博客 443

MySQL高可用之分库分表

当表 的数据量大到一定程度时, 分区也不太好解决问题,此时就要拆分表结构,把一张表拆分成多张表,查询的时候根据拆分表的方式去相应的表中查询数据。,因为在单表中我们可以用数据库主键做唯一 ID ,但是如果做了分库分表,多张单表中的自增主键就会发生冲突。但是不管什么算法,都要保证一个前提,那就是同一个分表字段,经过这个算法处理后,得到的结果一定是一致的,不可变的。一致性哈希可以将常用的 hash 算法来将对应的可以哈希到一个具有 2 的 32 次方个节点的空间中,那么这里的用户,时间,地区就是分表字段。

X2512261315的博客 1443

路径跟踪 | 图解分析人工势场算法APF(附ROS C++/Python/Matlab仿真)

人工势场法的基本思想是在机器人运动环境中创建一个势场,再搜索一条势函数下降的方向,寻找一条无碰撞的最优路径。本文介绍APF算法的基本原理,并提供势场可视化实现,基于ROS C++/Python/Matlab进行算法仿真实验加深理解

FRIGIDWINTER的博客 7394

MySQL单表数据量优化与分库分表实战指南

关系型数据库的性能优化是后端开发的核心课题,其中单表数据量的合理控制直接影响系统响应速度与稳定性。以MySQL为例,其存储引擎InnoDB采用B+树索引结构,数据量增大会导致索引层级加深,进而增加查询延迟。通过合理的表结构设计、索引优化和字段类型选择,可以有效提升单表存储效率。在电商、金融等高频业务场景中,当单表数据达到500万至2000万行时,就需要考虑分库分表策略。水平分片通过将数据分散到多个物理节点,能够显著提升查询性能。结合ShardingSphere等中间件,可以实现灵活的分片路由和分布式事务管理

weixin_33416697的博客 227

选型不再靠感觉:一文看懂 SAP Event Mesh 与 SAP Integration Suite, advanced event mesh 的能力边界

本文对比分析了SAP Event Mesh与SAP Integration Suite, advanced event mesh的差异。SAP Event Mesh适合轻量级场景,主要用于SAP系统间异步通信,支持AMQP、MQTT等协议,消息大小限制为1MB。而advanced event mesh面向企业级事件网络,提供跨云/本地部署、事件治理、监控等高级功能,支持30MB消息和更大存储容量。选择时需考虑业务规模、实时性要求、治理需求等因素:单一SAP生态内扩展可选Event Mesh;跨区域、多云环境

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 133

TC8:SOMEIPSRV_SD_MESSAGE_07-09

TTL为服务实例的生命周期。在此生命周期之后,不提供服务实例。

jasonj333 908

mysql水平拆分 mycat_Mycat水平拆分之十种分片规则

水平切分分片实现配置schema.xml 在同一个mysql数据库中,创建了三个数据库 testdb1,testdb2,testdb3。并在每个库中都创建了user表writeType="0" dbType="mysql" dbDriver="native">select 1druidparsermycattestdbsharding_idhash-intclass="io.mycat.r...

weixin_36343353的博客 183

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

mysql将一个字段的值根据逗号拆分_Mysql 学习笔记:分库分表 (sharding)

当数据库性能出现瓶颈时就需要通过扩展来提升性能,对于扩展性来说要么加强机器本身的性能,要么把任务分发到不同的机器上。对于数据库来说通过强悍的机器解决成本是很大的,如Oracle。通过多个廉价的机器实现水平扩展是现代的主流解决方案,如Mysql。数据库水平扩展的核心是把数据拆分成不同的单元并放在不同的独立的实例上,这样就做到了负载均衡。拆分分为逻辑和物理拆分,逻辑拆分是对物理上不可分割的实例进行逻辑...

weixin_39759989的博客 392

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Mysql水平分表需要考虑的问题和具体方案

MySQL的水平分表是一种有效的数据库性能优化手段,但也带来了一些挑战和问题。在实施水平分表时,需要充分考虑业务需求、数据特点和技术实现等因素,选择合适的分表策略和解决方案,以确保系统的性能和可维护性。

qq_30009397的博客 664

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

MySQL 分库分表基础:水平拆分与路由规则实现

本文系统讲解MySQL分库分表的基础知识,聚焦水平拆分与路由规则。首先阐明分库分表的适用场景与临界点,区分垂直拆分与水平拆分的本质差异。深入剖析三种主流路由规则——哈希取模、范围分片、一致性哈希的原理、优缺点及适用场景,并进行对比分析。进一步介绍“范围分组+组内哈希”的组合方案及其平滑扩容机制。最后总结路由工程实现要点与实施建议,为数据库水平扩展提供系统指导。

macowl的博客 393
上一篇: 汇总Javascript各种判断脚本(javascript经典例子)
下一篇: MemCache深度解读
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值