(1) 那是因为单节点数据库服务器无法满足增长的读写请求;
(2) 单节点数据库服务器没有冗余设计,无法满足高可用特性;
就拿2018年的双十一说吧,天猫的订单量忒大:2018天猫双11的交易额快速攀升中, 2分05秒交易额突破100亿元,26分03秒2018天猫双11全球狂欢节成交额超500亿元。1小时16分37秒,2018天猫双11全球狂欢节成交额超912亿元。想想都可怕,这么多。
那么问题来了,就凭你一个单节点数据库就能处理好交易额这么多的背后的数据吗?
所以就需要用mysql集群方案来解决了。
Percona XtraDB Cluster 特性 |
---|
同步复制,事务要么在所有节点提交或不提交 |
节点自动配置 |
在从服务器上并行应用事件,真正意义上的并行复制 |
多主复制,可以在任意节点进行写操作 |
数据一致性,不再是异步复制 |
Percona XtraDB Cluster完全兼容MySQL和Percona Server |
PXC的优点:
①:实现mysql数据库集群架构的高可用性和数据的 强一致性。
②:完成了真正的多节点读写的集群方案。
③:改善了传统意义上的主从复制延迟问题,基本上达到了实时同步。
④:新加入的节点可以自动部署,无须提供手动备份,维护起来很方便。
⑤:由于是多节点写入,所以数据库故障切换很容易。
PXC的缺点:
①:新加入的节点开销大,需要复制完整的数据。采用SST传输开销太大。
②:任何更新事务都需要全局验证通过,才会在每个节点库上执行。集群性能受限于 性能最差的节点,也就是经常说的短板效应。
③:因为需要保证数据的一致性,所以在多节点并发写时,锁冲突问题比较严重。
④:存在写扩大问题,所有的节点上都会发生些操作。
⑤:只支持innodb存储引擎的表。
⑥:没有表级别的锁定,执行DDL语句操作会把整个集群锁住,而且也 kill 不了(建议 使用Osc操作,即在线DDL)
⑦:所有的表必须含有主键,不然操作数据时会报错
1️⃣首先我们先拉取镜像
docker pull percona/percona-xtradb-cluster
2️⃣我们给镜像改个名字他太长了
docker tag percona/percona-xtradb-cluster pxc
3️⃣现在我们创建一个内部网络,这个网段外部是无法直接访问的,可以通过Docker开放的端口供外部访问。
docker network create --subnet=172.18.0.0/16 net1
现在我们可以查看一下网络信息
docker inspect net1
4️⃣创建容器pxc节点(这里咱创建一个5节点的pxc集群)
(1)首先你得创建数据卷(将来给用户挂载mysql数据)
docker volume create v1
docker volume create v2
docker volume create v3
docker volume create v4
docker volume create v5
docker volume create --name backup 将来用于热备
(2)查看数据卷创建是否成功
docker inspect volume ls
(3)创建pxc容器
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -v v1:/var/lib/mysql -v backup:/data --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node1 -v v2:/var/lib/mysql -v backup:/data --privileged --name=node2 --net=net1 --ip 172.18.0.3 pxc
docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node1 -v v3:/var/lib/mysql --privileged --name=node3 --net=net1 --ip 172.18.0.4 pxc
docker run -d -p 3309:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node1 -v v4:/var/lib/mysql --privileged --name=node4 --net=net1 --ip 172.18.0.5 pxc
docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node1 -v v5:/var/lib/mysql -v backup:/data --privileged --name=node5 --net=net1 --ip 172.18.0.6 pxc
-d 后台启动 | -p 3306:3306 端口映射 |
---|---|
-e MYSQL_ROOT_PASSWORD=root 指定数据库密码 | -e XTRABACKUP_PASSWORD=root 指定集群之间同步需要的密码 |
-e CLUSTER_NAME=PXC 指定集群名称 | -v v1:/var/lib/mysql 把刚刚创建的数据卷挂载到mysql中 |
–name=node1 指定容器名称 | –net=net1 指定网段 |
5️⃣然后客户端连接测试连接上node1创建一个数据库test然后再看其余节点有没有同步
现在测试联通,好我们在node1 中创建test数据库
然后我们在查看其余节点有没有同步(小伙成败在此一举)
基于docker搭建mysql的pxc集群+haproxy+keepalived的高可用(2️⃣)