zoukankan      html  css  js  c++  java
  • mysql集群基于docker 在centos上

    新博客https://blog.koreyoshi.work/

    mysql集群(PXC)基于docker 在centos上

    常用设计方案

    Replication(复制)

    1. 速度快
    2. 弱一致性
    3. 低价值
    4. 场景:日志,新闻,帖子

     PXC

    1. 速度慢
    2. 强一致性
    3. 高价值
    4. 场景:订单,账户,财务

    Replication是主从,PXC是使用事务要求同步复制,各有取舍。当然PXC在标准的MySQL基础上有更多限制,例如只支持InnoDB系列的引擎,不支持XA分布式事务协议,不支持表级锁等等。并且在处理冲突方面,同时有两个事务修改同一行数据,后一个事务会被终止并抛出异常。都是为了高可用,强一致性,所以需要在不同的场景使用不同的解决方案。

    Percona Xtradb Cluster,简称PXC。
    是基于Galera插件的MySQL集群。
    相比那些比较传统的基于主从复制模式的集群架构MHA和MM+keepalived,galera cluster最突出特点就是解决了诟病已久的数据复制延迟问题,基本上可以达到实时同步。
    而且节点与节点之间,他们相互的关系是对等的。
    本身galera cluster也是一种多主架构。galera cluster最关注的是数据的一致性,
    对待事物的行为时,要么在所有节点上执行,要么都不执行,它的实现机制决定了它对待一致性的行为非常严格,这也能非常完美的保证MySQL集群的数据一致性。
    在PXC里面任何一个节点都是可读可写的。在其他的节点一定是可以读取到这个数据。

    作者:IT人故事会

    链接:https://www.jianshu.com/p/c623713a532c

    使用docker初步安装PXC集群

    • 安装docker

      如果不了解docker可以去看菜鸟教程中的docker教程

      docker教程

      yum -y update
      yum install -y docker
    • 安装PXC镜像

      docker pull percona/percona-xtradb-cluster
    • 直接脚本搭建

      #!/bin/bash
      echo "创建网络"
      docker network create  --subnet=172.18.0.0/24 net1
      ​
      echo "创建5个docker卷"
      docker volume create v1
      docker volume create v2
      docker volume create v3
      docker volume create v4
      docker volume create v5
      ​
      echo "创建节点 node1"
      docker run -d -p 3306:3306  --net=net1 --name=node1 
              -e CLUSTER_NAME=PXC 
              -e MYSQL_ROOT_PASSWORD=a123456 
              -e XTRABACKUP_PASSWORD=a123456 
              -v v1:/var/lib/mysql 
              --privileged 
              --ip 172.18.0.2 
              percona/percona-xtradb-cluster
      sleep 1m 
      echo "创建节点 node2"
      docker run -d -p 3307:3306  --net=net1 --name=node2 
              -e CLUSTER_NAME=PXC 
              -e MYSQL_ROOT_PASSWORD=a123456 
              -e XTRABACKUP_PASSWORD=a123456 
              -e CLUSTER_JOIN=node1 
              -v v2:/var/lib/mysql 
              --privileged 
              --ip 172.18.0.3 
              percona/percona-xtradb-cluster
      sleep 1m 
      echo "创建节点 node3"
      docker run -d -p 3308:3306  --net=net1 --name=node3 
              -e CLUSTER_NAME=PXC 
              -e MYSQL_ROOT_PASSWORD=a123456 
              -e XTRABACKUP_PASSWORD=a123456 
              -e CLUSTER_JOIN=node1 
              -v v3:/var/lib/mysql 
              --privileged 
              --ip 172.18.0.4 
              percona/percona-xtradb-cluster
      sleep 1m 
      echo "创建节点 node4"
      docker run -d -p 3309:3306  --net=net1 --name=node4 
              -e CLUSTER_NAME=PXC 
              -e MYSQL_ROOT_PASSWORD=a123456 
              -e XTRABACKUP_PASSWORD=a123456 
              -e CLUSTER_JOIN=node1 
              -v v4:/var/lib/mysql 
              --privileged 
              --ip 172.18.0.5 
              percona/percona-xtradb-cluster
      sleep 1m 
      echo "创建节点 node5"
      docker run -d -p 3310:3306  --net=net1 --name=node5 
              -e CLUSTER_NAME=PXC 
              -e MYSQL_ROOT_PASSWORD=a123456 
              -e XTRABACKUP_PASSWORD=a123456 
              -e CLUSTER_JOIN=node1 
              -v v5:/var/lib/mysql 
              --privileged 
              --ip 172.18.0.6 
              percona/percona-xtradb-cluster

      这样你就可以得到5个mysql组成的PXC集群,密码均为a123456,在docker下映射的宿主机端口为3306~3310。

    负载均衡方案

    docker-haproxy的介绍:https://hub.docker.com/_/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  admin:123456
    #数据库负载均衡
    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  

     在docker中安装haproxy容器(注意-v 后的路径,为了配置文件所在路径)

    docker run -it -d -p 4001:8888 
    -p 4002:3306 
    -v /home/haproxy/h1:/usr/local/etc/haproxy 
    --name h1 --privileged --net=net1 
    --ip 172.18.0.7 haproxy

    进入容器,加载配置文件

    docker exec -it h1 /bin/bash
    haproxy -f /usr/local/etc/haproxy/haproxy.cfg 

    在数据库中创建一个haproxy的用户,不需要设置密码

    CREATE user 'haproxy'@'%' IDENTIFIED BY '';

    进入监控页面查看:url:4001/dbs

     需要输入开始设置的密码,连接直接连3306就可以了。

    如果要真正的使用,则需要维护haproxy的高可用,这个下次再尝试吧!

     

     

     

  • 相关阅读:
    如何保证 Redis 缓存与数据库双写一致性?
    如何合理地估算线程池大小?
    不用装工具,一条 Linux 命令就能实现文件上传下载!
    看了 Google 大神 Jeff Dean 的传说,我拜服了~
    div设置水平垂直居中
    "起用"与"启用"
    徇私舞弊
    精选排比金句20例
    一笔画图推
    一笔画
  • 原文地址:https://www.cnblogs.com/z-jx/p/10824146.html
Copyright © 2011-2022 走看看