单节点数据库的弊病

  • 大型互联网程序用户群体庞大,所以架构必须要特殊设计
  • 单节点的数据库无法满足性能上的要求
  • 单节点的数据库没有冗余设计,无法满足高可用

单节点MySQL的性能瓶领颈

2016年春节微信红包巨大业务量,数据库承受巨大负载

常见MySQL集群方案

  mysql 集群方案介绍,建议使用pxc,因为弱一致性会有问题,比如说a节点数据库显示我购买成功,b 节点数据库显示没有成功,这就麻烦了,pxc 方案是在全部节点都写入成功之后才会告诉你成功,是可读可写双向同步的,但是replication是单向的,不同节点的数据库之间都会开放端口进行通讯,如果从防火墙的这个端口关闭,pxc就不会同步成功,也不会返给你成功了。

Replication

  • 速度快,但仅能保证弱一致性,适用于保存价值不高的数据,比如日志、帖子、新闻等。
  • 采用master-slave结构,在master写入会同步到slave,能从slave读出;但在slave写入无法同步到master。
  • 采用异步复制,master写入成功就向客户端返回成功,但是同步slave可能失败,会造成无法从slave读出的结果。

PXC (Percona XtraDB Cluster)

  • 速度慢,但能保证强一致性,适用于保存价值较高的数据,比如订单、客户、支付等。
  • 数据同步是双向的,在任一节点写入数据,都会同步到其他所有节点,在任何节点上都能同时读写。
  • 采用同步复制,向任一节点写入数据,只有所有节点都同步成功后,才会向客户端返回成功。事务在所有节点要么同时提交,要么不提交。

建议PXC使用PerconaServer (MySQL改进版,性能提升很大)

PXC的数据强一致性

  • 同步复制,事务在所有集群节点要么同时提交,要么不提交
  • Replication采用异步复制,无法保证数据的一致性

PXC集群安装介绍

在Docker中安装PXC集群,使用Docker仓库中的PXC官方镜像:https://hub.docker.com/r/percona/percona-xtradb-cluster

  1. 从docker官方仓库中拉下PXC镜像:

    1. docker pull percona/percona-xtradb-cluster

    或者本地安装

    1. docker load < /home/soft/pxc.tar.gz

    安装完成:

    1. [root@localhost ~]# docker pull percona/percona-xtradb-cluster
    2. Using default tag: latest
    3. Trying to pull repository docker.io/percona/percona-xtradb-cluster ...
    4. latest: Pulling from docker.io/percona/percona-xtradb-cluster
    5. ff144d3c0ab1: Pull complete
    6. eafdff1524b5: Pull complete
    7. c281665399a2: Pull complete
    8. c27d896755b2: Pull complete
    9. c43c51f1cccf: Pull complete
    10. 6eb96f41c54d: Pull complete
    11. 4966940ec632: Pull complete
    12. 2bafadcea292: Pull complete
    13. 3c2c0e21b695: Pull complete
    14. 52a8c2e9228e: Pull complete
    15. f3f28eb1ce04: Pull complete
    16. d301ece75f56: Pull complete
    17. 3d24904bec3c: Pull complete
    18. 1053c2982c37: Pull complete
    19. Digest: sha256:17c64dacbb9b62bd0904b4ff80dd5973b2d2d931ede2474170cbd642601383bd
    20. Status: Downloaded newer image for docker.io/percona/percona-xtradb-cluster:latest
    21. [root@localhost ~]# docker images
    22. REPOSITORY TAG IMAGE ID CREATED SIZE
    23. docker.io/percona/percona-xtradb-cluster latest 70b3670450ef months ago MB
  2. 重命名镜像:(名称太长,重命名一下)
    1. docker tag percona/percona-xtradb-cluster:latest pxc

    然后原来的镜像就可以删除掉了

    1. [root@localhost ~]# docker images
    2. REPOSITORY TAG IMAGE ID CREATED SIZE
    3. docker.io/percona/percona-xtradb-cluster latest 70b3670450ef months ago MB
    4. pxc latest 70b3670450ef months ago MB
    5. docker.io/java latest d23bdf5b1b1b years ago MB
    6. [root@localhost ~]# docker rmi docker.io/percona/percona-xtradb-cluster
    7. Untagged: docker.io/percona/percona-xtradb-cluster:latest
    8. Untagged: docker.io/percona/percona-xtradb-cluster@sha256:17c64dacbb9b62bd0904b4ff80dd5973b2d2d931ede2474170cbd642601383bd
    9. [root@localhost ~]# docker images
    10. REPOSITORY TAG IMAGE ID CREATED SIZE
    11. pxc latest 70b3670450ef months ago MB
    12. docker.io/java latest d23bdf5b1b1b years ago MB
  3. 出于安全考虑,给PXC集群创建Docker内部网络
    1. # 创建网段
    2. docker network create --subnet=172.18.0.0/ net1
    3. # 查看网段
    4. docker network inspect net1
    5. # 删除网段
    6. # docker network rm net1
  4. 创建Docker卷:
    使用Docker时,业务数据应保存在宿主机中,采用目录映射,这样可以使数据与容器独立。但是容器中的PXC无法直接使用映射目录,解决办法是采用Docker卷来映射
    1. # 创建名称为v1的数据卷,--name可以省略
    2. docker volume create --name v1

    查看数据卷

    1. docker inspect v1

    结果:

    1. [root@localhost ~]# docker inspect v1
    2. [
    3. {
    4. "Driver": "local",
    5. "Labels": {},
    6. "Mountpoint": "/var/lib/docker/volumes/v1/_data",#这里是在宿主机的保存位置
    7. "Name": "v1",
    8. "Options": {},
    9. "Scope": "local"
    10. }
    11. ]

    删除数据卷

    1. docker volume rm v1

    创建5个数据卷

    1. # 创建5个数据卷
    2. docker volume create --name v1
    3. docker volume create --name v2
    4. docker volume create --name v3
    5. docker volume create --name v4
    6. docker volume create --name v5
  5. 创建5个PXC容器:
    1. # 创建5个PXC容器构成集群
    2. # 第一个节点
    3. docker run -d -p : -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -v v1:/var/lib/mysql --name=node1 --network=net1 --ip 172.18.0.2 pxc
    4. # 在第一个节点启动后要等待一段时间,等候mysql启动完成。
    5.  
    6. # 第二个节点
    7. docker run -d -p : -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v2:/var/lib/mysql --name=node2 --net=net1 --ip 172.18.0.3 pxc
    8. # 第三个节点
    9. docker run -d -p : -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v3:/var/lib/mysql --name=node3 --net=net1 --ip 172.18.0.4 pxc
    10. # 第四个节点
    11. docker run -d -p : -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v4:/var/lib/mysql --name=node4 --net=net1 --ip 172.18.0.5 pxc
    12. # 第五个节点
    13. docker run -d -p : -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v5:/var/lib/mysql --name=node5 --net=net1 --ip 172.18.0.6 pxc

    查看:

    1. [root@localhost ~]# docker ps
    2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    3. f4708ce32209 pxc "/entrypoint.sh " About a minute ago Up About a minute -/tcp, 0.0.0.0:->/tcp node4
    4. bf612f9586bc pxc "/entrypoint.sh " minutes ago Up minutes -/tcp, 0.0.0.0:->/tcp node5
    5. 9fdde5e6becd pxc "/entrypoint.sh " minutes ago Up minutes -/tcp, 0.0.0.0:->/tcp node3
    6. edd5794175b6 pxc "/entrypoint.sh " minutes ago Up minutes -/tcp, 0.0.0.0:->/tcp node2
    7. 33d842de7f42 pxc "/entrypoint.sh " minutes ago Up minutes 0.0.0.0:->/tcp, -/tcp node1

数据库负载均衡的必要性

虽然搭建了集群,但是不使用数据库负载均衡,单节点处理所有请求,负载高,性能差

将请求均匀地发送给集群中的每一个节点。

  • 所有请求发送给单一节点,其负载过高,性能很低,而其他节点却很空闲。
  • 使用Haproxy做负载均衡,可以将请求均匀地发送给每个节点,单节点负载低,性能好

负载均衡中间件对比

  负载均衡首先是数据库的集群,加入5个集群,每次请求都是第一个的话,有可能第一个数据库就挂掉了,所以更优的方案是对不同的节点都进行请求,这就需要有中间件进行转发,比较好的中间件有nginx,haproxy等,因nginx 支持插件,但是刚刚支持了tcp/ip 协议,haproxy 是一个老牌的中间转发件。如果要用haproxy的话,可以从官方下载镜像,然后呢对镜像进行配置(自己写好配置文件,因为这个镜像是没有配置文件的,配置好之后再运行镜像的时候进行文件夹的映射,配置文件开放3306(数据库请求,然后根据check心跳检测访问不同的数据库,8888 对数据库集群进行监控))。配置文件里面设置用户(用户在数据库进行心跳检测,判断哪个数据库节点是空闲的,然后对空闲的进行访问),还有各种算法(比如轮训),最大连接数,时间等,还有对集群的监控。配置文件写好以后运行这个镜像,镜像运行成功后进入容器启动配置文件 。其实haprocy返回的也是一个数据库实例(但是并不存储任何的数据,只是转发请求),这个实例用来check其他节点。

安装Haproxy

  1. 从Docker仓库拉取haproxy镜像:https://hub.docker.com/_/haproxy

    1. docker pull haproxy
    1. [root@localhost ~]# docker images
    2. REPOSITORY TAG IMAGE ID CREATED SIZE
    3. docker.io/haproxy latest 11fa4d7ff427 days ago 72.2 MB
  2. 创建Haproxy配置文件。供Haproxy容器使用(docker中未生成配置文件,我们需要在宿主机中自己创建配置文件)
    配置文件详情参考:https://www.cnblogs.com/wyt007/p/10829184.html

    1. # 启动容器时使用目录映射技术使容器读取该配置文件
    2. touch /home/soft/haproxy/haproxy.cfg

    haproxy.cfg

    1. # haproxy.cfg
    2. global
    3. #工作目录
    4. chroot /usr/local/etc/haproxy
    5. #日志文件,使用rsyslog服务中local5日志设备(/var/log/local5),等级info
    6. log 127.0.0.1 local5 info
    7. #守护进程运行
    8. daemon
    9.  
    10. defaults
    11. log global
    12. mode http
    13. #日志格式
    14. option httplog
    15. #日志中不记录负载均衡的心跳检测记录
    16. option dontlognull
    17. #连接超时(毫秒)
    18. timeout connect
    19. #客户端超时(毫秒)
    20. timeout client
    21. #服务器超时(毫秒)
    22. timeout server
    23.  
    24. #监控界面
    25. listen admin_stats
    26. #监控界面的访问的IP和端口
    27. bind 0.0.0.0:
    28. #访问协议
    29. mode http
    30. #URI相对地址
    31. stats uri /dbs
    32. #统计报告格式
    33. stats realm Global\ statistics
    34. #登陆帐户信息
    35. stats auth admin:abc123456
    36. #数据库负载均衡
    37. listen proxy-mysql
    38. #访问的IP和端口
    39. bind 0.0.0.0:
    40. #网络协议
    41. mode tcp
    42. #负载均衡算法(轮询算法)
    43. #轮询算法:roundrobin
    44. #权重算法:static-rr
    45. #最少连接算法:leastconn
    46. #请求源IP算法:source
    47. balance roundrobin
    48. #日志格式
    49. option tcplog
    50. #在MySQL中创建一个没有权限的haproxy用户,密码为空。Haproxy使用这个账户对MySQL数据库心跳检测
    51. option mysql-check user haproxy
    52. server MySQL_1 172.18.0.2: check weight maxconn
    53. server MySQL_2 172.18.0.3: check weight maxconn
    54. server MySQL_3 172.18.0.4: check weight maxconn
    55. server MySQL_4 172.18.0.5: check weight maxconn
    56. server MySQL_5 172.18.0.6: check weight maxconn
    57. #使用keepalive检测死链
    58. option tcpka
  3. 在数据库集群中创建空密码、无权限用户haproxy,来供Haproxy对MySQL数据库进行心跳检测
    1. create user 'haproxy'@'%' identified by '';
  4. 创建Haproxy容器(name=h1的原因是为了高可用)
    1. # 这里要加 --privileged
    2. docker run -it -d -p : -p : -v /home/soft/haproxy:/usr/local/etc/haproxy --name h1 --net=net1 --ip 172.18.0.7 --privileged haproxy
  5. 进入容器
    1. docker exec -it h1 bash
  6. 在容器bash中启动Haproxy
    1. haproxy -f /usr/local/etc/haproxy/haproxy.cfg
  7. 接下来便可以在浏览器中打开Haproxy监控界面,端口4001,在配置文件中定义有用户名admin,密码abc123456。
    我这边访问的是http://192.168.63.144:4001/dbs,并且要使用用户名密码进行登录(小插曲,使用的是Basic登录,我的Chrome不知为何被屏蔽了,我最后用的火狐)

    这时候我们手动挂掉一个Docker节点,看一下变化(我们会发现已经显示挂掉了)

  8. Haproxy不存储数据,只转发数据。可以在数据库中建立Haproxy的连接,端口4002,用户名和密码为数据库集群的用户名和密码

为什么要采用双机热备

  单节点Haproxy不具备高可用,必须要有冗余设计

  双机就是两个请求处理程序,比如两个haproxy,当一个挂掉的时候,另外 一个可以顶上。热备我理解就是keepalive。在haproxy 容器中安装keepalive。

虚拟IP地址

  linux系统可以在一个网卡中定义多个IP地址,把这些地址分配给多个应用程序,这些地址就是虚拟IP,Haproxy的双机热备方案最关键的技术就是虚拟IP。

  关键就是虚拟ip,定义一个虚拟ip,然后比如两个haproxy分别安装keepalive镜像,因为haproxy是ubuntu系统的,所以安装用apt-get,keepalive是作用是抢占虚拟ip,抢到的就是主服务器,没有抢到的就是备用服务器,然后两个keepalive进行心跳检测(就是创建一个用户到对方那里试探,看是否还活着,mysql的集群之间也是心跳检测),如果 挂掉抢占ip。所以在启动keepalive 之前首先要编辑好他的配置文件,怎么抢占,权重是什么,虚拟ip是什么,创建的用户交什么。配置完启动完以后可以ping一下看是否正确,然后将虚拟ip映射到局域网的ip

利用Keepalived实现双机热备

  • 定义虚拟IP
  • 在Docker中启动两个Haproxy容器,每个容器中还需要安装Keepalived程序(以下简称KA)
  • 两个KA会争抢虚拟IP,一个抢到后,另一个没抢到就会等待,抢到的作为主服务器,没抢到的作为备用服务器
  • 两个KA之间会进行心跳检测,如果备用服务器没有受到主服务器的心跳响应,说明主服务器发生故障,那么备用服务器就可以争抢虚拟IP,继续工作
  • 我们向虚拟IP发送数据库请求,一个Haproxy挂掉,可以有另一个接替工作

Нaproxy双机热备方案

  • Docker中创建两个Haproxy,并通过Keepalived抢占Docker内地虚拟IP
  • Docker内的虚拟IP不能被外网,所以需要借助宿主机Keepalived映射成外网可以访问地虚拟IP

安装Keepalived

  1. 进入Haproxy容器,安装Keepalived:

    1. $ docker exec -it h1 bash
    2. apt-get update
    3. apt-get install keepalived
  2. Keepalived配置文件(Keepalived.conf):
    Keepalived的配置文件是/etc/keepalived/keepalived.conf
    1. # vim /etc/keepalived/keepalived.conf
    2. vrrp_instance VI_1 {
    3. state MASTER # Keepalived的身份(MASTER主服务要抢占IP,BACKUP备服务器不会抢占IP)。
    4. interface eth0 # docker网卡设备,虚拟IP所在
    5. virtual_router_id # 虚拟路由标识,MASTER和BACKUP的虚拟路由标识必须一致。从0~
    6. priority # MASTER权重要高于BACKUP数字越大优先级越高
    7. advert_int # MASTER和BACKUP节点同步检查的时间间隔,单位为秒,主备之间必须一致
    8. authentication { # 主从服务器验证方式。主备必须使用相同的密码才能正常通信
    9. auth_type PASS
    10. auth_pass
    11. }
    12. virtual_ipaddress { # 虚拟IP。可以设置多个虚拟IP地址,每行一个
    13. 172.18.0.201
    14. }
    15. }
  3. 启动Keepalived
    1. service keepalived start

    启动成功后,通过 ip a 可以查看网卡中虚拟IP是否成功,另外可以在宿主机中ping成功虚拟IP  172.18.0.201

  4. 可以按照以上步骤,再另外创建一个Haproxy容器,注意映射的宿主机端口不能重复,Haproxy配置一样。然后在容器中安装Keepalived,配置也基本一样(可以修改优先权重)。这样便基本实现了Haproxy双机热备方案
    命令如下:

    创建Haproxy容器(name=h2的原因是为了高可用)

    1. # 这里要加 --privileged
    2. docker run -it -d -p : -p : -v /home/soft/haproxy:/usr/local/etc/haproxy --name h2 --net=net1 --ip 172.18.0.8 --privileged haproxy

    进入容器

    1. docker exec -it h2 bash

    在容器bash中启动Haproxy

    1. haproxy -f /usr/local/etc/haproxy/haproxy.cfg

    接下来便可以在浏览器中打开Haproxy监控界面,端口4003,在配置文件中定义有用户名admin,密码abc123456。
    我这边访问的是http://192.168.63.144:4003/dbs,并且要使用用户名密码进行登录(小插曲,使用的是Basic登录,我的Chrome不知为何被屏蔽了,我最后用的火狐)

    安装Keepalived:

    1. apt-get update
    2. apt-get install keepalived

    Keepalived配置文件(Keepalived.conf):
    Keepalived的配置文件是/etc/keepalived/keepalived.conf

    1. # vim /etc/keepalived/keepalived.conf
    2. vrrp_instance VI_1 {
    3. state MASTER # Keepalived的身份(MASTER主服务要抢占IP,BACKUP备服务器不会抢占IP)。
    4. interface eth0 # docker网卡设备,虚拟IP所在
    5. virtual_router_id # 虚拟路由标识,MASTER和BACKUP的虚拟路由标识必须一致。从0~
    6. priority # MASTER权重要高于BACKUP数字越大优先级越高
    7. advert_int # MASTER和BACKUP节点同步检查的时间间隔,单位为秒,主备之间必须一致
    8. authentication { # 主从服务器验证方式。主备必须使用相同的密码才能正常通信
    9. auth_type PASS
    10. auth_pass
    11. }
    12. virtual_ipaddress { # 虚拟IP。可以设置多个虚拟IP地址,每行一个
    13. 172.18.0.201
    14. }
    15. }

    启动Keepalived

    1. service keepalived start

    启动成功后,通过 ip a 可以查看网卡中虚拟IP是否成功,另外可以在宿主机中ping成功虚拟IP 172.18.0.201

实现外网访问虚拟IP

查看当前局域网IP分配情况:

  1. yum install nmap -y
  2. nmap -sP 192.168.1.0/
  1. 在宿主机中安装Keepalived

    1. yum install keepalived
  2. 宿主机Keepalived配置如下(/etc/keepalived/keepalived.conf):
    1. vrrp_instance VI_1 {
    2. state MASTER
    3. #这里是宿主机的网卡,可以通过ip a查看当前自己电脑上用的网卡名是哪个
    4. interface ens33
    5. virtual_router_id
    6. priority
    7. advert_int
    8. authentication {
    9. auth_type PASS
    10. auth_pass
    11. }
    12. virtual_ipaddress {
    13. #这里是指定的一个宿主机上的虚拟ip,一定要和宿主机网卡在同一个网段,
    14. #我的宿主机网卡ip是192.168.63.,所以指定虚拟ip是160
    15. 192.168.63.160
    16. }
    17. }
    18.  
    19. #接受监听数据来源的端口,网页入口使用
    20. virtual_server 192.168.63.160 {
    21. delay_loop
    22. lb_algo rr
    23. lb_kind NAT
    24. persistence_timeout
    25. protocol TCP
    26. #把接受到的数据转发给docker服务的网段及端口,由于是发给docker服务,所以和docker服务数据要一致
    27. real_server 172.18.0.201 {
    28. weight
    29. }
    30. }
    31.  
    32. #接受数据库数据端口,宿主机数据库端口是3306,所以这里也要和宿主机数据接受端口一致
    33. virtual_server 192.168.63.160 {
    34. delay_loop
    35. lb_algo rr
    36. lb_kind NAT
    37. persistence_timeout
    38. protocol TCP
    39. #同理转发数据库给服务的端口和ip要求和docker服务中的数据一致
    40. real_server 172.18.0.201 {
    41. weight
    42. }
    43. }
  3. 启动Keepalived服务
    1. service keepalived start
    2. #service keepalived status
    3. #service keepalived stop

    之后其他电脑便可以通过虚拟IP 192.168.63.160 的8888和3306端口来访问宿主机Docker中的 172.18.0.201 的相应端口。

暂停PXC集群的办法

  1. vi /etc/sysctl.conf
  2. #文件中添加net.ipv4.ip_forward=1这个配置
  3. systemctl restart network

然后把虚拟机挂起

热备份数据

冷备份

  • 冷备份是关闭数据库时候的备份方式,通常做法是拷贝数据文件
  • 是简单安全的一种备份方式,不能在数据库运行时备份。
  • 大型网站无法做到关闭业务备份数据,所以冷备份不是最佳选择

热备份

热备份是在系统运行状态下备份数据
MySQL常见的热备份有LVM和XtraBackup两种方案

  • LVM:linux的分区备份命令,可以备份任何数据库;但是会对数据库加锁,只能读取;而且命令复杂
  • XtraBackup:不需要锁表,而且免费

XtraBackup

XtraBackup是一款基于InnoDB的在线热备工具,具有开源免费,支持在线热备,占用磁盘空间小,能够非常快速地备份与恢复mysql数据库

  • 备份过程中不锁表,快速可靠
  • 备份过程中不会打断正在执行地事务
  • 备份数据经过压缩,占用磁盘空间小

全量备份和增量备份

  • 全量备份:备份全部数据。备份过程时间长,占用空间大。第一次备份要使用全量备份
  • 增量备份: 只备份变化的那部分数据。备份的时间短,占用空间小。第二次以后使用增量备份

PXC全量备份

  1. 备份要在某个PXC节点的容器内进行,但应该把备份数据保存到宿主机内。所以采用目录映射技术。先新建Docker卷:

    1. docker volume create backup
  2. 挑选一个PXC节点node1,将其容器停止并删除,然后重新创建一个增加了backup目录映射的node1容器

    1. docker stop node1
    2. docker rm node1 # 数据库数据保存在Docker卷v1中,不会丢失
    3. # 参数改变:
    4. # . -e CLUSTER_JOIN=node2;原来其他节点是通过node1加入集群的,现在node1重新创建,需要选择一个其他节点加入集群
    5. # . -v backup:/data;将Docker卷backup映射到容器的/data目录
    6. docker run -d -u root -p : -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node2 -v v1:/var/lib/mysql -v backup:/data --network=net1 --ip 172.18.0.2 --name=node1 pxc
  3. 在node1容器中安装 percona-xtrabackup-24

    1. docker exec -it node1 bash
    2. apt-get update
    3. apt-get install percona-xtrabackup-

    之后便可以执行如下命令进行全量备份,备份后的数据会保存在 /data/backup/full 目录下:

    1. mkdir /data/backup
    2. mkdir /data/backup/full
    3. #不建议,已过时 innobackupex --backup -u root -p abc123456 --target-dir=/data/backup/full
    4. xtrabackup --backup -uroot -pabc123456 --target-dir=/data/backup/full

    官方文档已经不推荐使用 innobackupex,而推荐使用 xtrabackup 命令

PXC全量还原

数据库可以热备份,但是不能热还原,否则会造成业务数据和还原数据的冲突。

对于PXC集群为了避免还原过程中各节点数据同步冲突的问题,我们要先解散原来的集群,删除节点。然后新建节点空白数据库,执行还原,最后再建立起其他集群节点。

还原前还要将热备份保存的未提交的事务回滚,还原之后重启MySQL

  1. 停止并删除PXC集群所有节点

    1. docker stop node1 node2 node3 node4 node5
    2. docker rm node1 node2 node3 node4 node5
    3. docker volume rm v1 v2 v3 v4 v5
  2. 按照之前的步骤重新创建node1容器,并进入容器,执行冷还原

    1. # 创建卷
    2. docker volume create v1
    3. # 创建容器
    4. docker run -d -p : -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -v v1:/var/lib/mysql -v backup:/data --name=node1 --network=net1 --ip 172.18.0.2 pxc
    5. # 以root身份进入容器
    6. docker exec -it -uroot node1 bash
    7. # 删除数据
    8. rm -rf /var/lib/mysql/*
    9. # 准备阶段
    10. xtrabackup --prepare --target-dir=/data/backup/full/
    11. # 执行冷还原
    12. xtrabackup --copy-back --target-dir=/data/backup/full/
    13. # 更改还原后的数据库文件属主
    14. chown -R mysql:mysql /var/lib/mysql
    15. # 退出容器后,重启容器
    16. docker stop node1
    17. docker start node1

Docker环境下的前后端分离项目部署与运维(六)搭建MySQL集群的更多相关文章

  1. Docker环境下的前后端分离项目部署与运维

    本教程将从零开始部署一个前后端分离的开源项目,利用docker虚拟机的容器技术,采用分布式集群部署,将项目转换成为高性能.高负载.高可用的部署方案.包括了MySQL集群.Redis集群.负载均衡.双机 ...

  2. Docker环境下的前后端分离项目部署与运维(八)使用Docker部署RabbitMQ集群

    下载RabbitMQ镜像 镜像地址RabbitMQ Docker官方认证镜像地址:https://hub.docker.com/_/rabbitmq 安装命令安装之前,切记把Docker Hub设置为 ...

  3. Docker环境下的前后端分离项目部署与运维(九)后端项目部署与负载均衡

    数据库准备 建立数据库 renren_fast ,然后运行renrenfast项目中的db文件夹内的脚本 -- 菜单 CREATE TABLE `sys_menu` ( `menu_id` bigin ...

  4. Docker环境下的前后端分离项目部署与运维(七)Redis高速缓存

    Redis高速缓存 利用内存保存数据,读写速度远超硬盘:可以减少I/O操作,降低I/O压力. 发红包.抢红包的数据可以存在高速缓存中,加快处理速度,不需要经过数据库 淘宝首页一些优惠活动商品等热数据可 ...

  5. Docker环境下的前后端分离项目部署与运维(十一)Docker Swarm技术

    Docker Swarm技术 docker swarm技术(之前的docker集群都是在 一个虚拟主机上的,但是如果这个主机挂掉了over了,docker技术就是多个虚拟主机形成一个集群) Swarm ...

  6. Docker环境下的前后端分离项目部署与运维(十二)使用Portainer管理Docker

    安装 docker hub地址:https://hub.docker.com/r/portainer/portainer/ # 每台服务器都要安装 docker pull portainer/port ...

  7. 【Docker】1、 前后端分离项目 下载启动运行

    人人开源前后端分离项目下载与配置 文章目录 人人开源前后端分离项目下载与配置 前后端分离框架介绍 后端项目下载与配置 1.renren-fast后台项目介绍 2.开发环境搭建 3.下载后端renren ...

  8. nginx+vue+uwsgi+django的前后端分离项目部署

    Vue+Django前后端分离项目部署,nginx默认端口80,数据提交监听端口9000,反向代理(uwsgi配置)端口9999 1.下载项目文件(统一在/opt/luffyproject目录) (1 ...

  9. 前后端分离项目部署到Linux虚拟机

    最近做了一个springboot+vue的前后端分离项目,把它部署到Linux虚拟机上.下面是我的步骤和遇到的问题,需要的朋友可以看下(看的时候注意要全部看完到底部,因为我习惯是把我遇到的问题放到最后 ...

随机推荐

  1. MobaXterm的安装和使用

    MobaXterm的安装和使用 安装 1 下载网址:https://mobaxterm.mobatek.net/,选择“Download”,选择免费版的下载. 2 解压压缩包,双击exe文件安装软件, ...

  2. 「vue基础」一篇浅显易懂的 Vue 路由使用指南( Vue Router 上)

    大家好,今天的内容,我将和大家一起聊聊 Vue 路由相关的知识,如果你以前做过服务端相关的开发,那你一定会对程序的URL结构有所了解,我没记错的话也是路由映射的概念,需要进行配置. 其实前端这些框架的 ...

  3. Prometheus监控学习笔记之Prometheus 2.x版本的常用变化

    最近用了prometheus 2.0 版本,感觉改变还是有点大,现将改变相关记录如下: 1.prometheus.yml文件配置修改后,要想重新加载,必须在启动的时候添加参数: --web.enabl ...

  4. SpringBoot 打包成war

    1.修改pom.xml文件 <packaging>war</packaging> <properties> <project.build.sourceEnco ...

  5. Java程序员需要掌握的技能

    转自:https://www.cnblogs.com/harry335/p/5924505.html

  6. Ivanti的垃圾软件landesk

    landesk是Ivanti公司推出的终端管理工具,这个工具垃圾就垃圾在无法卸载,进程杀不死.文件删不掉,奉劝大家千万不要安装这个软件.前些天公司的IT部门一直在催促员工安装这个软件,我一时糊涂安装了 ...

  7. css1.0~3.0背景图使用多张折叠的概念与方法

    需求:使用多张图片作为页面的背景图: 首先需要了解background的属性以及细节知识:https://www.cnblogs.com/chenglj/p/7372996.html backgrou ...

  8. EF自动创建数据库步骤之三(自定义数据库初始器)

    EF自动创建数据库需要我们告诉数据库如何进行初始化:如创建表后是否需要插入一些基础数据,是否 需要创建存储过程.触发器等.还有就是EF有三种初始化方式(参见下面三个类): DropCreateData ...

  9. 实验吧——忘记密码了(vim备份文件,临时文件(交换文件))

    题目地址:http://ctf5.shiyanbar.com/10/upload/step1.php 前些天突然发现个游戏,于是浪费了好多时间,终于还是忍住了,现在专心学习,从今天开始正式写些学习笔记 ...

  10. C# Form 实现桌面弹幕

    使用C# Form 简单的实现了弹幕效果 0. 源代码 : https://github.com/ping9719/-desktop-barrage- 1.创建一个Form 设置  2.添加一个计时器 ...