RXC方案与Replication方案的对比:
RXC采用同步复制,事务在所有集群节点要么同时提交,要么不提交
Replication采用异步复制,无法保证数据的一致性
RXC镜像下载
docker pull percona/percona-xtradb-cluster
docker创建内部网段
docker network create --subnet=172.18.0.0/24 net1
docker卷:容器中的PXC节点映射数据目录的解决办法
name:v1,v2,v3,v4,v5
docker volume create --name v1
docker卷查看
docker inspect v1
创建PXC容器
name: node1,node2,node3,node4,node5
ip:172.18.0.2,172.18.0.3,172.18.0.4,172.18.0.5,172.18.0.6
port:3306,3307,3308,3309,3310
docker run -d -p 3306:3306\-v v1:/var/lib/mysql \-e MYSQL_ROOT_PASSWORD=root \-e CLUSTER_NAME=PXC \-e XTRABACKUP_PASSWORD=root \--privileged \--name=node1 \--net=net1 \--ip 172.18.0.2\
pxc
docker run -d -p 3307:3306\-v v2:/var/lib/mysql \-e MYSQL_ROOT_PASSWORD=root \-e CLUSTER_NAME=PXC \-e XTRABACKUP_PASSWORD=root \-e CLUSTER_JOIN=node1 \--privileged \--name=node2 \--net=net1 \--ip 172.18.0.3\
pxc
数据库负载均衡
使用Haproxy做负载均衡,请求被均匀分发给每个节点,单节点负载低,性能好
安装Haproxy镜像
docker pull haproxy
创建Haproxy配置文件(启动容器时指定映射)
touch /home/soft/haproxy/haproxy.cfg
...
创建Haproxy容器
docker run -it -d -p 4001:8888 -p 4002:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h1 --privileged --net=net1 --ip 172.18.0.7haproxy
docker exec-it h1 bash
haproxy-f /usr/local/etc/haproxy/haproxy.cfg
为集群添加haproxy的专用账号
CREATE USER 'haproxy'@'%' IDENTIFIED BY '';
error:Percona-XtraDB-Cluster prohibits use of ALTER command on a table(base_test.station_cmcu) that residesin non-transactional storage engine (except switching totransactional engine)with pxc_strict_mode = ENFORCING or MASTER
Keepalived实现双机热备
一个虚拟ip
多个keepalived(用于强虚拟ip)
安装Keepalived
Keepalived必须安装在Haproxy所在的容器内(虚机为ubantu)
docker exec -it h1 bash
apt-get update
apt-get install keepalived
keepalived配置文件(/etc/keepalived/keepalived.conf)
apt-get install vim
vim/etc/keepalived/keepalived.conf
MASTER:主服务;BACKUP:备服务
eth0:网卡设备,用于与宿主ip映射
priority:权重
advert_int:心跳检测时间间隔(秒)
virtual_ipaddress:公用虚拟ip
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id51priority100advert_int1authentication {
auth_type PASS
auth_pass123456}
virtual_ipaddress {172.18.0.201}
}
service keepalived start
在宿主中:ping 172.18.0.201
数据库备份(热备份)
MySQL常见的热备份:LVM和XtraBackup(推荐)
创建一个docker卷
docker volume create backup
停止并删除一个节点(随意:node1)
docker stop node1
dockerrm node1
创建PXC节点(node1)
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node2 -v v1:/var/lib/mysql -v backup:/data --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc
PXC全量备份步骤(手动触发)(PXC容器中安装XtraBackup)
以后自动增量备份
进入容器,以管理员的身份
docker exec -it --user root node1 bash
apt-get update
apt-get install percona-xtrabackup-24innobackupex--user=root --password=root /data/backup/full
PXC全量恢复(进入容器内部执行)
rm -rf /var/lib/mysql/*innobackupex --user=root --password=root --apply-back /data/backup/full/-04-15_05-09-07/
innobackupex --user=root --password=root --copy-back /data/backup/full/-04-15_05-09-07/
注意:RXC不能直接使用容器中的目录。
3----3.docker run -d -p 3308:3306 -v v3:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node1 --privileged --name=node3 --net=net1 --ip 172.18.0.4pxc4----4.docker run -d -p 3309:3306 -v v4:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node1 --privileged --name=node4 --net=net1 --ip 172.18.0.5pxc5----5.docker run -d -p 3310:3306 -v v5:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node1 --privileged --name=node5 --net=net1 --ip 172.18.0.6 pxc
global
#工作目录chroot /usr/local/etc/haproxy
#日志文件吗,使用rsyslog服务中local5日志设备(/var/log/local5),等级info
log127.0.0.1 local5 info#守护进程运行
daemon
defaults
log global
mode http
#日志格式
option httplog
#日志中不记录负载均衡的心跳检测记录
option dontlognull
#连接超时(毫秒)
timeout connect5000#客户端超时(毫秒)
timeout client50000#服务器超时(毫秒)
timeout server50000#监控界面
listen admin_stats
#监控界面的ip:port
bind0.0.0.0:8888#访问协议
mode http
#URI相对地址
stats uri/dbs
#统计报告格式
stats realm Global\ statistics
#登陆账户信息
stats auth pascall:zj1424603784
#数据库负载均衡
listen proxy-mysql
#访问的ip:port
bind0.0.0.0:3306#网络协议
mode tcp
#负载均衡算法(轮询算法)
#轮询算法:roundrobin
#权重算法:static-rr
#最少连接算法:leastconn
#请求源IP算法:source
balance roundrobin
#日志格式
option tcplog
#在Mysql中创建一个没有权限的haproxy用户,密码空
option mysql-check user haproxy
server MySQL_1172.18.0.2:3306 check weight 1 maxconn 2000server MySQL_2172.18.0.3:3306 check weight 1 maxconn 2000server MySQL_3172.18.0.4:3306 check weight 1 maxconn 2000server MySQL_4172.18.0.5:3306 check weight 1 maxconn 2000server MySQL_5172.18.0.6:3306 check weight 1 maxconn 2000#使用keepalive检测死链
option tcpka
注:安装好Percona XtraDBCluste(PXC)群集后,它在启动时和运行时执行许多验证。
可以使用以下模式:
DISABLED:不要执行严格的模式验证并正常运行。
PERMISSIVE:如果vaidation失败,请记录警告并继续正常运行。
ENFORCING:如果启动期间验证失败,请暂停服务器并抛出错误。如果验证在运行时失败,则拒绝操作并抛出错误。
MASTER:ENFORCING除了不执行显式表锁定的验证之外 。此模式可与群集一起使用,其中写入操作与单个节点隔离。
默认情况下,PXC严格模式设置为ENFORCING
Percona XtraDB Cluster目前仅支持对使用事务存储引擎(XtraDB或InnoDB)的表进行复制。
对于使用非事务性存储引擎(MyISAM,MEMORY,CSV等)的表,不应允许以下语句:
进行写入到表数据操作语句(例如,INSERT,UPDATE,DELETE,等等)
管理报表: CHECK,OPTIMIZE,REPAIR,和ANALYZE
TRUNCATE TABLE 和 ALTER TABLE
根据所选模式,会发生以下情况:
DISABLED 启动时,不执行验证。在运行时,允许所有操作。
PERMISSIVE 启动时,不会执行任何验证。在运行时,允许所有操作,但在不支持的表上执行不需要的操作时会记录警告。
ENFORCING 要么 MASTER 。启动时,不执行验证。在运行时,拒绝对不受支持的表执行的任何不良操作,并记录错误。
SQL补充:
SELECT @@global.sql_mode
set @@global.sql_mode='STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';