什么是MySQL集群
MySQL集群是一个无共享的(shared-nothing)、分布式节点架构的存储方案,其目的是提供容错性和高可用性能。
说的直白一点就是要做一件事,一个人做着非常吃力,没有那么多精力,所以需要多个人分工合作,最终一起完成。MySQL集群就是这个道理,比如读写分离等等。这个说的比较简单了,今天这篇文章就是一个简单的一主一从双节点的Replication集群,为了测试使用。介绍两种数据同步方案来实现主从和读写分离。
关于MySQL集群方案介绍(Replication,PXC)
MySQL的常用集群有很多种:mysql cluster,nbd,MHA,Mariadb Galera cluster,Replication,Percona XtraDB Cluster。
本来我是想一起写这个Replication(本文以下简称Rep)
和Percona XtraDB Cluster(PXC)
两种方案的实现的,不过篇幅太长。这一篇先来写Rep的实现。
先来大概说下这两种方案的优劣势:
- Replication 采用异步复制,无法保证数据的准确性。我们写入数据操作的只是master节点,只要操作master成功了就算是成功了。至于master节点是否将数据传输给slave几点,客户端是不知道的。写入速度快,但是无法保证数据的强一致性。
- PXC 同步复制,事务在所有的集群节点要不就同时提交,要不就不提交。它是对一个节点的操作有了准确的成功返回标识后,才会对其他节点同步操作,是以牺牲性能为代价保证强一致性的。
从上面两条信息来看,很多人会觉得明显是PXC集群方案更好啊,不过真的是这样吗?显然,一个事物存在就有其存在的道理。来看下下面的介绍:
不同于pxc集群方案的是,Rep集群方案无法保证数据的强一致性,自然性能稍微好一点,保证一致性的代价就是牺牲性能,保存一些非高价值
的数据,例如订单之外的数据等。
比如大数据领域的协同过滤算法分析行为的算法,数据源就是日志,比如商品浏览日志,单条价值不大,积累起来价值达,但是你说这些数据敏感吗?显然不是非常重要比起订单数据。所以在考虑性能后这里就可以采用Rep方案实现,至于订单等一些敏感数据必须采用可保证强一致性的集群方案,比如PXC。
简单点说,最终结果就是你可以搭建多个集群,重要的数据存储在PXC集群中,不是那么重要的数据存储在Rep集群中。保证性能的同时,保证数据的完整一致性。
注意: PXC集群并不是说节点越多读写速度就越快,恰恰相反,节点越多,同步的消耗就越大,所以,小规模的重要数据节点集群使用PXC很不错。集群性能的好坏取决于整个集群中性能最差的主机的配置性能,还是木桶装水问题。
来看几个案例:
16年微信红包支付峰值15.8W次/秒刷新世界纪录。
17年天猫双11数据库读写峰值4200W次/秒,可支付峰值为25.6W次/秒,再次刷新世界纪录,为什么差距这么大,这就是因为支付数据是很重要敏感的数据,必须保证强一致性,所以整个的读写成本高,峰值自然较低。
由上面的例子就可以看出,整个的大型高可用数据库集群并不是单纯的节点都建立在pxc集群中,重要等级不高的数据可以在Replication集群中操作,降低整体数据库架构的压力。
所以没有技术存在了就没有好与坏,取决于你需不需要。
好了,不说太多文字性描述了,直接开始试验。
环境
该文的所有测试都是基于docker
部署的,如果没有使用过或者不是很了解的自己查阅一下先关资料,保证基础的使用就可以完成以下配置搭建。如果你实在不想去使用docker,那你用虚拟机也可以,配置大同小异,几乎没有差距。
1.使用日志文件实现主从
1.1准备工作
首先我们拉取一个MySQL5.7的镜像,一会就使用这个镜像来创建运行几个MySQL容器来做实验。
docker pull mysql:5.7
完成后如下:
然后你需要创建几个文件夹,用来挂载容器中的文件。你可以按照我这样操作,或者选择别的地方来创建,首先我的位置(如果你选择别的位置,命令中的文件夹位置请勿写错):
/home/guwenjie/docker
创建两个文件夹:mysql-master,mysql-slave-1。表示一个是主节点容器文件挂载位置,一个是从节点。
然后分别
在两个文件夹中创建三个文件夹
:conf
,data
,logs
。那个timezone不用管,哪个是时区文件,一会执行相应命令即可。如下:
1.2创建mysql-master主节点MySQL容器并运行
现在需要创建运行MySql容器了。首先,设置时区:
echo "Asia/shanghai"