• Docker搭建mysql集群


    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
    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.7 haproxy 
    docker exec -it h1 bash
    haproxy -f /usr/local/etc/haproxy/haproxy.cfg
    • 为集群添加haproxy的专用账号
    CREATE USER 'haproxy'@'%' IDENTIFIED BY '';

    web监控:http://114.115.154.152:4001/dbs

    出现一下错误,参考http://www.mamicode.com/info-detail-2405918.html详解

    error:Percona-XtraDB-Cluster prohibits use of ALTER command on a table
    (base_test.station_cmcu) that resides in non-transactional storage engine (except switching to transactional 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_id 51
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 123456
        }
        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
    docker rm 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-24
    innobackupex --user=root --password=root /data/backup/full
    • PXC全量恢复(进入容器内部执行)
    rm -rf /var/lib/mysql/*
    innobackupex --user=root --password=root --apply-back /data/backup/full/2018-04-15_05-09-07/
    innobackupex --user=root --password=root --copy-back /data/backup/full/2018-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.4 pxc
    4----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.5 pxc
    5----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
        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:port
        bind 0.0.0.0:8888
        #访问协议
        mode http
        #URI相对地址
        stats uri /dbs
        #统计报告格式
        stats realm Global statistics
        #登陆账户信息
        stats auth pascall:zj1424603784
    
    #数据库负载均衡
    listen proxy-mysql
        #访问的ip:port
        bind 0.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_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

    注:安装好Percona XtraDB Cluste(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';
  • 相关阅读:
    JDBC批处理数据
    JSP+Servlet 无数据库模拟登录过程
    idea常用插件
    如何破解IntelliJ IDEA2018教程
    java在线工具
    mysql快捷修改密码
    jdk1.8新特性
    java基础感觉白学了
    论JDK源码的重要性:一道面试题引发的无限思考
    数组算法经典实例
  • 原文地址:https://www.cnblogs.com/pascall/p/9749770.html
Copyright © 2020-2023  润新知