1.新加入的节点开销大,需要复制完整的数据。采用SST传输开销太大。
2.任何更新事务都需要全局验证通过,才会在每个节点库上执行。集群性能受限于性能最差的节点,也就是经常说的短板效应。
3.因为需要保证数据的一致性,所以在多节点并发写时,锁冲突问题比较严重。
4.存在写扩大问题,所有的节点上都会发生些操作。
5.只支持innodb存储引擎的表。
6.没有表级别的锁定,执行DDL语句操作会把整个集群锁住,而且也 kill 不了(建议 使用Osc操作,即在线DDL)
7.所有的表必须含有主键,不然操作数据时会报
docker pull percona/percona-xtradb-cluster:5.7.22
docker tag percona/percona-xtradb-cluster:5.7.22 pxc
我docker默认的网络是
我们创建一个172.18.0网段的以示区别
net1网络
docker network create --subnet=172.18.0.0/24 net1
查看net1网络信息
docker inspect net1
存储node1里mysql数据
docker volume create v1
存储node2里mysql数据
docker volume create v2
存储node3里mysql数据
docker volume create v3
后面热备用
docker volume create backup
查看创建的数据包卷
docker volume ls
创建node1
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
创建node2
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
创建node3
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
命令详解:
-d 后台启动
-p 3306:3306 端口映射
-e MYSQL_ROOT_PASSWORD=abc123456 指定数据库密码
-e CLUSTER_NAME=PXC 指定集群名称
-e XTRABACKUP_PASSWORD=abc123456 指定集群之间同步需要的密码
-v v1:/var/lib/mysql 把刚刚创建的数据卷挂载到mysql中
--name=node1 指定容器名称(当前我们把node1作为主节点、后面会创建node2)
--net=net1 指定网段
--ip=172.18.0.2 指定ip
(在node2 node3 上)
-e CLUSTER_JOIN=node1 指定与哪个节点进行数据同步
其他同上
docker ps 查看node1 node2 node3 是否启动
node1:
node2:
node3:
测试:
node1创建一个表 node2 node3是否会同步
?!
1.下载haproxy镜像
docker pull haproxy
2.宿主机创建haproxy.cfg配置文件
touch /usr/local/docker/haproxy/haproxy.cfg
global
#工作目录
chroot /usr/local/etc/haproxy
#日志文件,使用rsyslog服务中local5日志设备(/var/log/local5),等级info
log 127.0.0.1 local5 info
#守护进程运行
daemon
defaults
log global
mode http
#日志格式
option httplog
#日志中不记录负载均衡的心跳检测记录
option dontlognull
#连接超时(毫秒)
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 root:root
#数据库负载均衡
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 node1 172.18.0.2:3306 check weight 1 maxconn 2000
server node2 172.18.0.3:3306 check weight 1 maxconn 2000
server node3 172.18.0.4:3306 check weight 1 maxconn 2000
#使用keepalive检测死链
option tcpka
haproxy.cfg 配置文件我只贴出了负载均衡相关的配置。
其中配置了
交互用户 haproxy,
监控界面 用户名/密码 地址
负载均衡server 等内容,具体参考官网
3.启动h1容器
docker run -it -d -p 4001:8888 -p 4002:3306 -v /usr/local/docker/haproxy:/usr/local/etc/haproxy --name h1 --privileged --net=net1 --ip 172.18.0.7 haproxy
创建h2
docker run -it -d -p 4003:8888 -p 4004:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h2 --privileged --net=net1 --ip 172.18.0.8 haproxy
4.进入h1 h2容器
docker exec -it h1 bash
docker exec -it h2 bash
5.启动haproxy服务:
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
6、根据haproxy.cfg配置文件中、我们需要在node1数据库中创建一个haproxy用户
进入node1在node1 mysql里创建一个用户
docker exec -it node1 bash
7.创建用户
create user 'haproxy'@'%' identified by '';
8.在客户端链接haproxy(Navicat Premium):
数据表测试,和上面的操作一样h1 和 db1数据库中的数据一模一样,达到同步效果,当然你也可以自己在h1数据库中添加数据、看是否同步到db1,db2,db3中
9.集群监控界面:http://192.168.84.135:4001/dbs
(在pxc中加入了haproxy使其达到负载均衡,在做一个haproxy服务的备份)
1.进入h1容器中下载keepalived
docker exec -it h1 bash
2.更新apt-get
apt-get update
3.下载插件
apt-get install vim
apt-get install iputils-ping
apt-get install keepalived
4.编辑keepalived配置文件
vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
172.18.0.201
}
}
service keepalived start
yum install -y keepalived
编辑宿主机keepalived的配置文件
vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.84.200
}
}
virtual_server 192.168.84.200 8888 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 172.18.0.201 8888 {
weight 1
}
}
virtual_server 192.168.84.200 3306 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 172.18.0.201 3306 {
weight 1
}
}
注意:宿主机上的keepalived的配置文件里的虚拟IP要在此虚拟机的网段内
配置完然后重启keepalived服务
systemctl restart keepalved
#进入node1容器:docker exec -itu 0 node1 bash
docker exec ‐it node1 bash #更新软件包
apt‐get update #安装热备工具
apt‐get install percona‐xtrabackup‐24 #全量热备
innobackupex ‐‐user=root ‐‐password=abc123456 /data/backup/full
到/data/backup/full下面看备份文件
冷还原数据 停止其余4个节点,并删除节点
docker stop node2
docker stop node3
docker rm node2
docker rm node3
node1容器中删除MySQL的数据
#删除数据
rm ‐rf /var/lib/mysql/* #清空事务
innobackupex ‐‐user=root ‐‐password=abc123456 ‐‐apply‐back /data/backup/full/2018‐ 04‐15_05‐09‐07/
#还原数据
innobackupex ‐‐user=root ‐‐password=abc123456 ‐‐copy‐back /data/backup/full/2018‐ 04‐15_05‐09‐07/