搭建mysql集群需要什么用_搭建mysql集群

mysql 集群搭建 一般会采用以下两种方案

概念

Replication

特点:1.速度快  2.弱一致性  3.低价值

速度快 : 储存数据速度快

弱一致性: 存储一致性弱 在mysql集群节点A存储的数据 replication集群方案无法保证一定分发到节点B 这就可能导致我在A节点昔日如数据 在B节点无法查询到

低价值:因为弱一致性的特点 就导致我们不能再replication集群方案中保存价值高的重要数据

应用: replication 集群方案可以应用于 日志 新闻 帖子 等场景

383f5c21a8ec0f8a9edbe929f802c7a8.png

如图在在负责写入的Master节点中写入的数据 数据会同步到 另一个负责读的Slave节点中 但是Slave节点中写入的数据不会同步到Master节点 Master节点是读不到的

PXC

特点:1.速度慢  2.强一致性  3.高价值

速度慢  : 储存数据速度较于Replication方案较慢

强一致性: 存储一致性强 在mysql集群节点A存储的数据 可以保证一定分发到数据库集群的所有节点

低价值:强一致性的特点使得PXC方案可以保存价值高的重要数据

应用: PXC 集群方案可以应用于 订单 账户 财务 等

d7c4716e6bf8588637984312a9941ed7.png

如图 在PXC集群方案中所有节点的读写都是同步的 事务在所有节点要么同时提交 要么都不提交 而replication 采用的是异步复制 无法保证数据一致性

c854c1a2cc65e623014362a5a9ab9006.png

本次我们采用的是PXC方案

PXC集群中任一节点对数据都是可读可写的 在任一节点写入数据

8f629a69490d12ebd3a2b88fb5388785.png

搭建

在docker中安装 PXC镜像

0728c211dd925c225b64d471c68efd31.png

出于安全考虑 需要给pxc集群实例创建docker内部网络

##创建网段net1

docker network create net1

##查看网段net1

docker network inspect net1

##删除网段net1

docker networkrm net1

ps:在docker容器中最好不要保存业务数据 可以通过目录映射保存到映射目录里 这样容器故障后只需重新启动一个新的docker容器将目录映射上  PXC无法直接映射 那我们可以采用 docker 卷

创建docker卷

##创建docker卷

docker volume create--name v1

##查看docker卷

docker volume inspect--name v1

##删除docker卷

docker volumerm --name v1

创建PXC容器

docker run -d -p 3306:3306 ##-d 后台运行 -p 端口映射-v v1:/var/lib/mysql ##-v 路径映射 将v1数据卷映射容器内MySQL目录-e MYSQL_ROOT_PASSWORD=yourpass ##用户密码-e CLUSTER_NAME=PXC ##PXC集群名字-e XTRABACKUP_PASSWORD=yourpass ##节点同步密码--privileged ##权限--name=node1 ##容器名称--net=net1 ##网段--ip 172.18.0.2##网段ip

pxc

实际命令

docker run -d -p 3306:3306

-v zxx.cms_server_v_node1:/var/lib/mysql-e MYSQL_ROOT_PASSWORD=HelloWorld@123

-e CLUSTER_NAME=zxx.cms_server_pxc-e XTRABACKUP_PASSWORD=HelloWorld@123

--privileged--name=zxx.cms_server_node1--net=zxx.cms_server_pxc_net--ip 172.20.0.2pxc

但是需要注意创建第二个PXC容器的时候 需要更改指令

docker run -d -p 3307:3306 ##-d 后台运行 -p 端口映射不能以3306 因为3306已经被被一个容器起占用了-v v2:/var/lib/mysql ##-v 路径映射 注意此处应该改为第二个docker卷 将v2数据卷映射容器内MySQL目录

-e CLUSTER_JOIN=node1                   ## 此处多个一个CLUSTER_JOIN参数 因为他要加入集群和第一个数据库节点同步-e MYSQL_ROOT_PASSWORD=yourpass ##用户密码-e CLUSTER_NAME=PXC ##PXC集群名字-e XTRABACKUP_PASSWORD=yourpass ##节点同步密码--privileged ##权限--name=node2 ##容器名称也需修改--net=net1 ##网段--ip 172.18.0.3##网段ip也需修改

pxc

实际创建命令

docker run -d -p 3307:3306

-v zxx.cms_server_v_node2:/var/lib/mysql

-e CLUSTER_JOIN=zxx.cms_server_node1

-e MYSQL_ROOT_PASSWORD=HelloWorld@123

-e CLUSTER_NAME=zxx.cms_server_pxc

-e XTRABACKUP_PASSWORD=HelloWorld@123

--privileged --name=zxx.cms_server_node2

--net=zxx.cms_server_pxc_net

--ip 172.20.0.3

pxc

这里要注意 当创建完第一个节点 需要稍等一下 容器创建很快 但是容器内数据库初始化需要一定的时间 如果第一个节点数据库没有构建完成 就创建第二个 可能会引发故障

0013c8869506f7d4036065822da3ed54.png

通过navicat 已经可以连接到搭建的6个实例 并且所有节点数据都是同步的

负载均衡

虽然已经搭建完基于PXC方案的mysql 集群 但是 如果我们不采用负载均衡 单节点处理所有的请求 那么我们搭建的集群好像并没有什么实际意义 单节点负载高 性能差

这里可以使用Haproxy 他不是数据库 只是一个请求转发器

bd776fc2dba4aa0a2422bf7b7347f77b.png

ea0bc669e87b2f06c7164102337e4867.png

这样就可以把请求转发给所有的Pxc节点 当时其他的负载均衡中间件还有很多

以下是几种常见的负载均衡中间件对比

87749776ba36ae088e519a80cee36c26.png

1.安装haproxy

docker pull haproxy

2.创建Haproxy配置文件

touch /home/haproxy/haproxy.cfg

配置文件具体内容 可以参考 https://zhangge.net/5125.html 写的很详#configure haproxy.cfg

global

#工作目录

chroot /usr/local/etc/haproxy

#日志文件,使用rsyslog服务中local5日志设备(/var/log/local5),等级info

log 127.0.0.1 local5 info

#守护进程运行

daemon

defaults

logglobal

modehttp

#日志格式

optionhttplog

#日志中不记录负载均衡的心跳检测记录

optiondontlognull

#连接超时(毫秒)

timeout connect 5000

#客户端超时(毫秒)

timeout client 50000

#服务器超时(毫秒)

timeout server 50000

#监控界面

listen admin_stats

#监控界面的访问的IP和端口

bind 0.0.0.0:8888

#访问协议

mode http

#URI相对地址

stats uri /dbs

#统计报告格式

stats realm Global\ statistics

#登陆帐户信息

stats auth admin:abc123456

#数据库负载均衡

listen proxy-mysql

#访问的IP和端口

bind 0.0.0.0:3306

#网络协议

mode tcp

#负载均衡算法(轮询算法)

#轮询算法:roundrobin

#权重算法:static-rr

#最少连接算法:leastconn

#请求源IP算法:source

balance roundrobin

#日志格式

option tcplog

#在MySQL中创建一个没有权限的haproxy用户,密码为空。Haproxy使用这个账户对MySQL数据库心跳检测

option mysql-check user haproxy

server MySQL_1 172.18.0.2:3306 check weight 1 maxconn 2000

server MySQL_2 172.18.0.3:3306 check weight 1 maxconn 2000

server MySQL_3 172.18.0.4:3306 check weight 1 maxconn 2000

server MySQL_4 172.18.0.5:3306 check weight 1 maxconn 2000

server MySQL_5 172.18.0.6:3306 check weight 1 maxconn 2000

#使用keepalive检测死链

option tcpka

3.创建Haproxy容器

docker run -it -d-p 4001:8888 -p 4002:3306

-v /home/soft/haporxy:/usr/local/etc/haproxy--name haproxy_node1--privileged--net=zxx.cms_server_pxc_net

haproxy

docker exec -it haproxy_node1 bash

haproxy-f /usr/local/etc/haproxy

ps:此处遇到问题1 在启动haproxy容器后 集群节点A挂掉(原因未知) 重启容器后立刻退出  查阅资料后有几个解决方案

1.删除数据卷重建 测试可行 但是数据丢失 不推荐

2.删除容器 重新创建

3.进入数据卷目录 /var/lib/docker/volumes/v1/_data  找到 grastate.dat 修改safe_to_bootstrap: 1,便能成功启动了。其余节点都是关联的node1节点,只要node1节点启动了,在创建其余节点严格按照步骤来的话,应该是能成功启动的。(原因为节点未能正常退出 safe_to_bootstrap为0 修改为1就可以了)

这里可能会担心 节点一挂掉了 其他是不是都不可用了 不是的 我停掉了 节点一的容器 修改节点2的数据 其他节点仍可以同步

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值