数据库简单高可用方案-基于PXC集群与Replication集群相结合的思想
数据高并发例子
每当我们是使用校园网进行抢课的时候、每当我们查成绩的时候,校园网常常都是十分不给力的。一个学校也就两到三万人,数据库的处理并发能力在这里就会显得特别重要了。相比小小的校园网,在社会中还有许多大型网站,他们可以能够承受的并发量有多强呢? 我们看看微信和天猫的案例:
- 2016年春节,微信红包支付峰值15.8万次每秒,创下了世界纪录
- 2017年天猫双十一交易额1682亿元,3分钟破百亿,9小时破千亿
- 2017年天猫双十一数据库峰值4200万次每秒,交易峰值32.5万次每秒,支付峰值 :25.6万次每秒。
这么高的并发量要是用校园网那样的数据库策略早就凉凉了。他们用的是怎样的数据库方案呢?还有,你有没有发现,数据库的访问量可以达到4200万次每秒,但是交易峰值却只有32.5万次每秒,这是为何?
数据库的四大特性
原子性(Atomicity)
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
个人理解:要求数据库做一件事的时候,要么全做,要么不做,不可以做到一半。这样可以保证数据库存储的内容都是有价值的。
一致性(Consistency)
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
个人理解:我从我的银行账户向小明转了100元,此时小明的账单就必须要记录下来保存了100元并且我的账户就必须少了100元。
隔离性(Isolation)
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
个人理解:必须要把每一件事情分得清清楚楚,做完一件再接着一件,不可以三心二意。
持久性(Durability)
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
简单的数据库方案
什么是高可用?高可用是说可用性特别高。怎样实现高可用?个人认为在提高数据库性能的同时还需要提高数据库的四大特性。
应对高并发的方法中,最简单有效的就是分布式了。把原本一个人要做的事情分配给多个人去完成,从而提高效率。当然,除了简单粗暴地使用分布式,我们还需要制定一些存储数据的方案。
主从复制 Replication简述
要求将所有的读写事务分开,通过master即进行数据的写入,另外通过slave机进行读取。这样做的好处在于可以提高数据的读取效率,可以支持非常多的用户进行数据的读取,因为写操作消耗的实践会比较长,由于数据库的隔离性会使得需要先完成写操作之后才进行读操作,如果将将读写分离开来既可以让读操作变得更加快速了。写入完成之后,再从master机将信息同步到slave机。这种方案存在一些问题,在只有两台机的情况下,如果主机宕机了,从机是不会替代主机进行写操作的。此时可以加入双机热备的思想。如果主机没有及时与从机同步数据就会使得两个数据库中的数据不一致。
PXC集群 Percona XtraDB Cluster简述
向PXC进行读写事务的时候,写操作要求每个节点都进行写入操作,只要有一个节点写入不成功就做回滚,恢复写入事务之前的状态。读操作,根据负载均衡随机安排一个节点进行事务。这样做的好处是保证了数据的一致性,就算出现某个节点宕机了,也可以通过其他节点继续让系统正常运行,并且可通过其他节点辅助恢复。缺点也是显而易见的,利用冗余来保证数据的强一致性,还有就是如果某个节点进行事务失败又得做一次回滚,然后再重新再每个节点都进行一次,消耗的时间也是较多的。
那么为什么我们还要用PXC?他能够保证高价值数据不丢失,尤其是涉及交易的信息。
PXC集群与主从复制集群相比较
PXC | Replication |
---|---|
同步复制 | 异步复制 |
数据的强一致性 | 不保证强一致性 |
速度较慢 | 性能较优 |
各有各的优势,我们需要做的就是把他们优点都集合到一个方案中去,让这个集群能够应对多种多样的情形。具体怎么做呢?
简单的高可用方案
这里主要是讲一个比较简单的,将Replication和PXC集合起来使用的一个方案。
当数据从应用程序中产生的时候,先通过Redis缓存数据,然后将数据分发给Mycat进行分库分表操作发放发放数据到具体的数据库以及数据表。如果是价值相对较高的数据则传输至PXC集群分片进行存储,价值相对较低的则分发给Replication分片。利用多个分片的原因是:如果单表的数据超过了两千万条时则数据表的性能会降低。因此分配给多个集群分片,使得PXC1与PXC2存储不同的数据,通过增加硬件的方法提高性能。每个分片中通过负载均衡(如:Haproxy)对数据进行分发。举一个简单的例子:当有一个事务进入待处理状态是,则让负载均衡器对当前无操作的数据库进行编号争抢,谁抢赢了就分配给谁来执行这个事务。
大致的方案就是这样,希望对你友邦组。
个人的第一篇博客,欢迎到评论区发表意见。嘻嘻
部分思想来自于:慕课神思者老师!!