集群的方案
单节点的弊病
大型互联网程序用户群体庞大,所以架构必须要特殊设计
单节点的数据库无法满足性能的要求
案例15年前,高考成绩可以在网上查(河南几十万考生),那时候基本家里都没电脑,都是去网吧白天去网吧也查不了,太慢了,后来半夜通宵有时候可以查到,也就是说白天基本查不了人太多了。晚上看运气。一个数据库的实例1万多人就无法反应了。
单节点的数据库没有冗余设计,无法满足高可用
常用的mysql集群设计方案
Replication
速度快
弱一致性
低价值
场景:日志,新闻,帖子
PXC
速度慢
强一致性
高价值
场景:订单,账户,财务
Percona Xtradb Cluster,简称PXC。是基于Galera插件的MySQL集群。相比那些比较传统的基于主从复制模式的集群架构MHA和MM+keepalived,galera cluster最突出特点就是解决了诟病已久的数据复制延迟问题,基本上可以达到实时同步。而且节点与节点之间,他们相互的关系是对等的。本身galera cluster也是一种多主架构。galera cluster最关注的是数据的一致性,对待事物的行为时,要么在所有节点上执行,要么都不执行,它的实现机制决定了它对待一致性的行为非常严格,这也能非常完美的保证MySQL集群的数据一致性。在PXC里面任何一个节点都是可读可写的。在其他的节点一定是可以读取到这个数据。
建议PXC使用PerconaServer(MYSQL的改进版,性能提升很大)
PXC方案和Replication方案的对比
PXC任意一个节点都可以存在读写的方案,也就是任意一个节点都可以当读或者当写。同步复制。保证强一致性。
Replication方案,主从的方式,他是采用异步的方式。
PXC的数据强一致性
同步复制,事务在所有节点要提交都提交。要么都不提交
Replication弱一致性,主要master成功就成功了。返回给调用者。如果slave失败,也没办法。因为已经告诉调用者成功了,调用者获取查询的时候查询不到信息。例如:在淘宝买个东西,付款也成功了,查询订单没信息是不是要骂娘。
环境搭建
应用 | IP地址 | 服务 | 配置 | 安装应用 | 安装方式 |
---|---|---|---|---|---|
docker-mysql | 192.168.66.100 | docker-mysql | 双核 8g内存 | docker-mysql | docker |
(1). 虚拟机vagrant讲述安装的步骤
vagrant up
(2).机器window/mac开通远程登录root用户下
su -# 密码vagrant#设置 PasswordAuthentication yesvi /etc/ssh/sshd_config sudo systemctl restart sshd
PXC集群安装介绍
PXC既可以在linux系统安装,也可以在docker上面安装。
安装镜像PXC镜像
docker pull percona/percona-xtradb-cluster#本地安装docker load </home/soft/pxc.tar.gz
创建内部网络的
处于安全,需要给PXC集群实例创建Docker内部网络,都出可虚拟机自带的网段是172.17.0., 这是内置的一个网段,当你创建了网络后,网段就更改为172.18.0.,
docker network create net1 docker network inspect net1 docker network rm net1#设置网段docker network create --subnet=172.18.0.0/24 net1
创建Docker 卷
一旦生成docker容器,不要在容器内保存业务的数据,要把数据放到宿主机上,可以把宿主机的一个目录映射到容器内,如果容器出现问题,只需要吧容器删除,重新建立一个新的容器把目录映射给新的容器。
之前一直有个疑问,如果直接映射目录的吧,存在失败的问题,现在终于知道解决方案了,直接映射docker卷就可以可以忽略这个问题了。
容器中的PXC节点映射数据目录的解决方法
docker volume create name --v1
mysql pxc搭建
脚本开发
#!/bin/bashecho "创建网络"docker network create --subnet=172.18.0.0/24 net1echo "创建5个docker卷"docker volume create v1 docker volume create v2 docker volume create v3 docker volume create v4 docker volume create v5echo "创建节点 node1"docker run -d -p 3306:3306 --net=net1 --name=node1 \ -e CLUSTER_NAME=PXC \ -e MYSQL_ROOT_PASSWORD=a123456 \ -e XTRABACKUP_PASSWORD=a123456 \ -v v1:/var/lib/mysql \ --privileged \ --ip 172.18.0.2 \ percona/percona-xtradb-cluster sleep 1m echo "创建节点 node2"docker run -d -p 3307:3306 --net=net1 --name=node2 \ -e CLUSTER_NAME=PXC \ -e MYSQL_ROOT_PASSWORD=a123456 \ -e XTRABACKUP_PASSWORD=a123456 \ -e CLUSTER_JOIN=node1 \ -v v2:/var/lib/mysql \ --privileged \ --ip 172.18.0.3 \ percona/percona-xtradb-cluster sleep 1m echo "创建节点 node3"docker run -d -p 3308:3306 --net=net1 --name=node3 \ -e CLUSTER_NAME=PXC \ -e MYSQL_ROOT_PASSWORD=a123456 \ -e XTRABACKUP_PASSWORD=a123456 \ -e CLUSTER_JOIN=node1 \ -v v3:/var/lib/mysql \ --privileged \ --ip 172.18.0.4 \ percona/percona-xtradb-cluster sleep 1m echo "创建节点 node4"docker run -d -p 3309:3306 --net=net1 --name=node4 \ -e CLUSTER_NAME=PXC \ -e MYSQL_ROOT_PASSWORD=a123456 \ -e XTRABACKUP_PASSWORD=a123456 \ -e CLUSTER_JOIN=node1 \ -v v4:/var/lib/mysql \ --privileged \ --ip 172.18.0.5 \ percona/percona-xtradb-cluster sleep 1m echo "创建节点 node5"docker run -d -p 3310:3306 --net=net1 --name=node5 \ -e CLUSTER_NAME=PXC \ -e MYSQL_ROOT_PASSWORD=a123456 \ -e XTRABACKUP_PASSWORD=a123456 \ -e CLUSTER_JOIN=node1 \ -v v5:/var/lib/mysql \ --privileged \ --ip 172.18.0.6 \ percona/percona-xtradb-cluster
新建立一个aaa数据库 结果都可以用
哇塞就这么简单,成功的搭建了mysql的集群
增加负载均衡方案
目前数据库都是独立的ip,在开发的时候总不能随机连接一个数据库吧。如果想请求,统一的口径,这就需要搭建负载均衡了。虽然上边已经搭建了集群,但是不使用数据库负载均衡,单节点处理所有请求,负载高,性能差。下图就是一个节点很忙,其他节点很闲。
作者:IT人故事会
链接:https://www.jianshu.com/p/c623713a532c
共同学习,写下你的评论
评论加载中...
作者其他优质文章