服务器学习心得


分库分表

<ul> <li><a href="https://www.topgoer.cn/docs/data-structures-questions/data-structures-questions-1d94t10l32571">https://www.topgoer.cn/docs/data-structures-questions/data-structures-questions-1d94t10l32571</a></li> </ul> <h2>分库分表说明</h2> <ul> <li>数据的切分就是通过某种特定的条件,将存放在同一个数据库中的数据分散存放到多个数据库(主机)中,以达到分散单台设备负载的效果</li> </ul> <h2>数据切分模式</h2> <ul> <li>垂直(纵向)切分 <ul> <li>把单一的表拆分成多个表,并分散到不同的数据库(主机)上。</li> </ul></li> <li>水平(横向)切分 <ul> <li>根据表中数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上。</li> </ul></li> </ul> <h2>垂直切分</h2> <ul> <li> <p>通常是按照列的关系密集程度进行切分</p> <ul> <li>如将原来的电商数据库垂直切分成商品数据库 payDB、用户数据库 userBD 等。</li> </ul> </li> <li>利用垂直切分将经常被使用的列和不经常被使用的列切分到不同的表中。</li> </ul> <h2>垂直切分优缺点</h2> <h4>优点</h4> <ul> <li>拆分后业务清晰,拆分规则明确</li> <li>系统之间进行整合或扩展很容易</li> <li>按照成本、应用的等级、应用的类型等将表放到不同的机器上,便于管理</li> <li>便于实现动静分离、冷热分离的数据库表的设计模式</li> <li>数据维护简单</li> </ul> <h4>缺点</h4> <ul> <li>部分业务表无法关联(Join),只能通过接口方式解决,提高了系统的复杂度</li> <li>受每种业务的不同限制,存在单库性能瓶颈,不易进行数据扩展和提升性能</li> <li>事务处理复杂</li> </ul> <h2>水平切分</h2> <ul> <li>水平切分又称为 Sharding(分片),将同一个表中的记录拆分到多个结构相同的表中。</li> <li>当一个表的数据不断增多时,将数据分布到集群的不同节点上,从而缓存单个数据库的压力。</li> </ul> <h2>水平切分优缺点</h2> <h4>优点</h4> <ul> <li>单库单表的数据保持在一定的量级,有助于性能的提高</li> <li>切分的表的结构相同,应用层改造较少,只需要增加路由规则即可</li> <li>提高了系统的稳定性和负载能力</li> </ul> <h4>缺点</h4> <ul> <li>切分后,数据是分散的,很难利用数据库的Join操作,跨库Join性能较差</li> <li>拆分规则难以抽象</li> <li>分片事务的一致性难以解决</li> <li>数据扩容的难度和维护量极大</li> </ul> <h2>垂直切分和水平切分共同点</h2> <ul> <li>存在分布式事务的问题</li> <li>存在跨节点Join的问题</li> <li>存在跨节点合并排序、分页的问题</li> <li>存在多数据源管理的问题</li> </ul> <h2>分片策略</h2> <ul> <li>哈希取模 <ul> <li>hash(key) % NUM_DB,按照 userId mod 64.将数据分布在64个服务器上。</li> </ul></li> <li>范围 <ul> <li>可以是 ID 范围也可以是时间范围,根据每台服务器计划存放一个亿的数据,</li> <li>先将数据写入服务器A,一旦服务器A写满,则将数据写入服务器B,以此类推。</li> <li>这种方式的好处是扩展方便,数据在各个服务器上分布均匀。</li> </ul></li> <li>映射表 <ul> <li>使用单独的一个数据库来存储映射关系。</li> </ul></li> </ul> <h2>分片问题</h2> <ul> <li> <p>事务</p> <ul> <li>使用分布式事务来解决,比如 XA 接口。</li> </ul> </li> <li> <p>连接查询</p> <ul> <li>将原来的 JOIN 查询分解成多个单表查询,然后在用户程序中进行 JOIN</li> </ul> </li> <li>ID 唯一性 <ul> <li>使用全局唯一 ID:GUID。</li> <li>为每个分片指定一个 ID 范围。</li> <li>分布式 ID 生成器 (如 Twitter 的 Snowflake 算法)。</li> </ul></li> </ul>

页面列表

ITEM_HTML