集群的讲解分为三篇

  • (一):主从复制集群、PXC集群 https://blog.csdn.net/weixin_43934607/article/details/102762570
  • (二):MyCat中间件、Haproxy负载均衡 https://blog.csdn.net/weixin_43934607/article/details/102769179
  • (三):前面四种技术的综合应用 https://blog.csdn.net/weixin_43934607/article/details/102784120

搭建如图集群

部署PXC集群

集群1

节点 端口 容器名称 数据卷
node1 13306 pxc_node1 test-v1
node2 13307 pxc_node2 test-v2

集群1

节点 端口 容器名称 数据卷
node3 13308 pxc_node1 test-v3
node4 13309 pxc_node2 test-v4
  • 拉取镜像

    • 必须是5.6,5.6之后不支持docker搭建集群
    docker pull percona/percona-xtradb-cluster:5.6
    #重命名
    docker tag percona/percona-xtradb-cluster:5.6 pxc
    
  • 创建数据卷(存储路径:/var/lib/docker/volumes)

    docker volume create test-v1
    docker volume create test-v2
    docker volume create test-v3
    docker volume create test-v4
    
  • 创建网络

    docker network create --subnet=172.30.0.0/24 pxc-network
    
  • 创建第一个集群容器

    • 创建主节点:node1
    docker create -p 13306:3306 \
    -v test-v1:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=root \
    -e CLUSTER_NAME=pxc \
    -e XTRABACKUP_PASSWORD=root \
    --privileged=true \
    --name=pxc_node1 \
    --net=pxc-network \
    --ip 172.30.0.2 \
    pxc
    
    • 创建从节点:node2

      • 从节点增加了CLUSTER_JOIN参数
    docker create -p 13307:3306 \
    -v test-v2:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=root \
    -e CLUSTER_NAME=pxc \
    -e CLUSTER_JOIN=pxc_node1 \
    -e XTRABACKUP_PASSWORD=root \
    --privileged=true \
    --name=pxc_node2 \
    --net=pxc-network \
    --ip 172.30.0.3 \
    pxc
    
  • 创建第二个集群容器

    • 创建主节点:node3
    docker create -p 13308:3306 \
    -v test-v3:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=root \
    -e CLUSTER_NAME=pxc \
    --privileged=true \
    --name=pxc_node3 \
    --net=pxc-network \
    --ip 172.30.0.4 \
    pxc
    
    • 创建从节点:node4

      • 从节点增加了CLUSTER_JOIN参数
    docker create -p 13309:3306 \
    -v test-v4:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=root \
    -e CLUSTER_NAME=pxc \
    -e CLUSTER_JOIN=pxc_node3 \
    --privileged=true \
    --name=pxc_node4 \
    --net=pxc-network \
    --ip 172.30.0.5 \
    pxc
    
  • 启动

    docker start pxc_node1 && docker logs -f pxc_node1
    docker start pxc_node2 && docker logs -f pxc_node2docker start pxc_node3 && docker logs -f pxc_node3
    docker start pxc_node4 && docker logs -f pxc_node4
    

    • 测试数据
    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;create database test_db;
    use test_db;DROP TABLE IF EXISTS `test_table`;
    CREATE TABLE `test_table`  (`id` int(11) NOT NULL,PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;INSERT INTO `test_table` VALUES (1);
    INSERT INTO `test_table` VALUES (2);
    INSERT INTO `test_table` VALUES (3);SET FOREIGN_KEY_CHECKS = 1;
    
  • 注意:退出关闭pxc集群后 再次启动都是处于宕机状态

    • 数据都存储在卷中 我们要重新创建容器
    docker rm pxc_node4  pxc_node3 pxc_node2  pxc_node1rm -f  /var/lib/docker/volumes/test-v1/_data/grastate.dat
    rm -f  /var/lib/docker/volumes/test-v2/_data/grastate.dat
    rm -f  /var/lib/docker/volumes/test-v3/_data/grastate.dat
    rm -f  /var/lib/docker/volumes/test-v4/_data/grastate.dat#重新创建容器
    
  • 如果要删除集群

    #删除容器
    docker stop  pxc_node4  pxc_node3 pxc_node2  pxc_node1
    docker rm pxc_node4  pxc_node3 pxc_node2  pxc_node1#删除卷中内容
    cd /var/lib/docker/volumes
    rm -f test-v1/_data/./* test-v2/_data/./* test-v3/_data/./* test-v4/_data/./*
    rm -rf test-v1/_data/./* test-v2/_data/./* test-v3/_data/./* test-v4/_data/./*
    

部署主从复制集群

节点 端口 容器名称 表角色
node1 3306 percona-master01 master
node2 3307 percona-slave01 slave

搭建主库

  • 创建目录

    mkdir -p /data/mysql/master01
    cd /data/mysql/master01
    mkdir conf data
    chmod 777 * -R
    
  • 创建配置文件
    cd /data/mysql/master01/conf
    vi my.cnf
    
  • 输入如下内容
    [mysqld]
    log-bin=mysql-bin  #开启二进制日志
    server-id=1            #服务id,一个集群中不可重复
    sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
    
  • 创建容器
    docker create \
    --name percona-master01 \
    -v /data/mysql/master01/data:/var/lib/mysql \
    -v /data/mysql/master01/conf:/etc/my.cnf.d \
    -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=root \
    percona:5.7.23
    
  • 启动
    docker start percona-master01 && docker logs -f percona-master01
    
  • 用navicat连接该数据库
    • 端口:3306、用户名root、密码:root
  • 执行查询语句:创建同步账户以及授权
    • 主数据库创建了一个用户,用户名:test、密码:test
    create user 'test'@'%' identified by 'test';
    grant replication slave on *.* to 'test'@'%';
    flush privileges;
    
  • 执行查询语句:查看
    • 查看master状态
    show master status;
    
    • 查看二进制日志相关的配置项
    show global variables like 'binlog%';
    
    • 查看server相关的配置项
    show global variables like 'server%';
    

搭建从库

  • 创建目录

    mkdir -p /data/mysql/slave01
    cd /data/mysql/slave01
    mkdir conf data
    chmod 777 * -R
    
  • 创建配置文件

    cd /data/mysql/slave01/conf
    vi my.cnf
    
  • 输入如下内容

    [mysqld]
    server-id=2
    sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
    
  • 创建容器

    docker create \
    --name percona-slave01 \
    -v /data/mysql/slave01/data:/var/lib/mysql \
    -v /data/mysql/slave01/conf:/etc/my.cnf.d \
    -p 3307:3306 \
    -e MYSQL_ROOT_PASSWORD=root \
    percona:5.7.23
    
  • 启动

    docker start percona-slave01 && docker logs -f percona-slave01
    
  • 用navicat连接该数据库

    • 端口:3307、用户名root、密码:root
  • 执行查询语句:设置master相关信息

    • 注意

      • 修改 master_host
      • 修改 master_log_file、master_log_pos(通过主数据库的“ show master status; ” 查看)
    CHANGE MASTER TO
    master_host='192.168.56.129',
    master_user='test',
    master_password='test',
    master_port=3306,
    master_log_file='mysql-bin.000003',
    master_log_pos=758;
    
  • 执行查询语句:启动同步

    start slave;
    
  • 执行查询语句:查看

    • 查看master状态
    show slave status;
    

    看到 Slave_IO_Running h和 Slave_SQL_Running 都是yes 说明搭建成功!

  • 测试数据

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;create database test_db;
use test_db;DROP TABLE IF EXISTS `test_table2`;
CREATE TABLE `test_table2`  (`id` int(11) NOT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;INSERT INTO `test_table2` VALUES (1);
INSERT INTO `test_table2` VALUES (2);
INSERT INTO `test_table2` VALUES (3);SET FOREIGN_KEY_CHECKS = 1;

部署Mycat

节点 端口
node1 18067
node1 18068

安装

  • 下载

    链接:https://pan.baidu.com/s/1tJ2RjeTR4adwDhYNcbhQTQ
    提取码:4rdp
    复制这段内容后打开百度网盘手机App,操作更方便哦

  • 下载后上传到虚拟机 直接解压即可

    tar -zxvf Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz
    

节点一

  • 复制mycat作节点一

    cp -r mycat mycat01
    
  • server.xml(mycat/conf/server.xml)

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mycat:server SYSTEM "server.dtd">
    <mycat:server xmlns:mycat="http://io.mycat/"><system><property name="nonePasswordLogin">0</property><property name="useHandshakeV10">1</property><property name="useSqlStat">0</property><property name="useGlobleTableCheck">0</property><property name="sequnceHandlerType">2</property><property name="subqueryRelationshipCheck">false</property><property name="processorBufferPoolType">0</property><property name="handleDistributedTransactions">0</property><property name="useOffHeapForMerge">1</property><property name="memoryPageSize">64k</property><property name="spillsFileBufferSize">1k</property><property name="useStreamOutput">0</property><property name="systemReserveMemorySize">384m</property><property name="useZKSwitch">false</property></system><!--这里是设置的itcast用户和虚拟逻辑库--><user name="root" defaultAccount="true"><property name="password">root</property><!---因为逻辑数据库名字要和实际的相同-><property name="schemas">test_db</property></user>
    </mycat:server>
    
  • schema.xml(mycat/conf/schema.xml)

    <?xml version="1.0"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://io.mycat/"><!--配置数据表--><schema name="test_db" checkSQLschema="false" sqlMaxLimit="100"><table name="test_table" dataNode="dn1,dn2" rule="mod-long" /><table name="test_table2" dataNode="dn3"/></schema><!--配置分片关系--><dataNode name="dn1" dataHost="cluster1" database="test_db" /><dataNode name="dn2" dataHost="cluster2" database="test_db" /><dataNode name="dn3" dataHost="cluster3" database="test_db" /><!--配置连接信息--><dataHost name="cluster1" maxCon="1000" minCon="10" balance="2"writeType="1" dbType="mysql" dbDriver="native" switchType="1"slaveThreshold="100"><heartbeat>select user()</heartbeat><writeHost host="W1" url="192.168.56.132:13306" user="root"password="root"><readHost host="W1R1" url="192.168.56.132:13307" user="root"password="root" /></writeHost></dataHost><dataHost name="cluster2" maxCon="1000" minCon="10" balance="2"writeType="1" dbType="mysql" dbDriver="native" switchType="1"slaveThreshold="100"><heartbeat>select user()</heartbeat><writeHost host="W2" url="192.168.56.132:13308" user="root"password="root"><readHost host="W2R1" url="192.168.56.132:13309" user="root"password="root" /></writeHost></dataHost><dataHost name="cluster3" maxCon="1000" minCon="10" balance="3"writeType="1" dbType="mysql" dbDriver="native" switchType="1"slaveThreshold="100"><heartbeat>select user()</heartbeat><writeHost host="W3" url="192.168.56.132:3306" user="root"password="root"><readHost host="W3R1" url="192.168.56.132:3307" user="root"password="root" /></writeHost></dataHost></mycat:schema>
    
  • rule.xml(mycat/conf/rule.xml)

    • 找到下面 把mod-long的分片数量改为2
    <function name="mod-long" class="io.mycat.route.function.PartitionByMod"><property name="count">2</property>
    </function>
    
  • wrapper.conf(mycat/conf/wrapper.xml)

    • 设置jmx端口
    wrapper.java.additional.7=-Dcom.sun.management.jmxremote.port=11985
    
  • server.xml(mycat/conf/server.xml)

    • 设置服务端口以及管理端口
    <property name="serverPort">18067</property>
    <property name="managerPort">19067</property>
    
  • 启动(mycat/bin)

    #赋予权限才可以输出日志
    sudo chmod -R mycat01
    ./startup_nowrap.sh && tail -f ../logs/mycat.log
    
  • 用navicat测试是否可以连接

    • 端口:18067、用户名:root、用户名:root
  • 测试数据

    INSERT INTO `test_table2` VALUES (5);
    INSERT INTO `test_table` VALUES (55);
    

节点二

  • 复制配置好的mycat1 修改一下端口就可以

    cp -r mycat01 mycat02
    
  • wrapper.conf
    wrapper.java.additional.7=-Dcom.sun.management.jmxremote.port=11986
    
  • server.xml
    <property name="serverPort">18068</property>
    <property name="managerPort">19068</property>
    
  • 启动
    ./startup_nowrap.sh && tail -f ../logs/mycat.log
    
  • 用navicat测试连接
    • 端口:18068、用户名:root、用户名:root

部署HAProxy

  • 拉取镜像

    docker pull haproxy:1.9.3
    
  • 创建目录,用于存放配置文件

    mkdir -p /haoke/haproxy
    
  • 创建容器

    docker create --name haproxy \
    --net host \
    -v /haoke/haproxy:/usr/local/etc/haproxy \
    haproxy:1.9.3
    
  • 创建目录,用于存放配置文件

    mkdir -p /haoke/haproxy
    vi /haoke/haproxy/haproxy.cfg
    
  • haproxy.cfg:

    globallog 127.0.0.1 local2maxconn 4000daemondefaultsmode httplog globaloption httplogoption dontlognulloption http-server-closeoption forwardfor except 127.0.0.0/8option redispatchretries 3timeout http-request 10stimeout queue 1mtimeout connect 10stimeout client 1mtimeout server 1mtimeout http-keep-alive 10stimeout check 10smaxconn 3000listen admin_stats#端口号bind 0.0.0.0:4001mode http#访问路径stats uri /dbsstats realm Global\ statistics#用户名和密码stats auth admin:admin123listen proxy-mysql#mysql连接的端口bind 0.0.0.0:4002mode tcpbalance roundrobinoption tcplog#代理mycat服务server mycat_1 192.168.56.132:18067 check port 18067 maxconn 2000server mycat_2 192.168.56.132:18068 check port 18068 maxconn 2000
    
  • 启动容器

    docker restart haproxy && docker logs -f haproxy
    
  • 测试

    • 通过web界面进行测试:http://192.168.56.132:4001/dbs
    • 用户名:admin、密码:admin123
    • 可以看到我们的mycat集群(mycat_1、mycat_2)是绿色的 说明我们的两个集群都是正常状状态 至此 集群搭建完毕!
  • 使用Navicat连接haproxy

    • 端口:4002
    • 用户名、密码 与mycat 的相同(所以mycat服务的密码设置时应该相同)

客户端连接mysql的集群时 直接连接haproxy这个节点就可以

从零搭建MySQL数据库集群(三):搭建混合集群综合应用相关推荐

  1. MySQL数据库程序设计(三)

    MySQL数据库程序设计(三) 前言 数据查询 SELECT语句 单表查询 选择字段 选择指定记录 分组聚合查询 查询结果排序 限制结果数量 链接查询 交叉连接 内连接 外连接 子查询 IN关键字的子 ...

  2. 阿里云ECS服务器搭建Mysql数据库

    阿里云ECS服务器搭建Mysql数据库 一.服务器系统: Alibaba Cloud Linux 3.2104 LTS 64位 二.服务器文件夹创建 [说明]:由于服务器为新申请,故服务器为空白服务器 ...

  3. MySQL数据库入门(三)--- 查询、权限、join语法、外键、备份

    MySQL数据库入门(三) 文章目录 MySQL数据库入门(三) @[toc] MySQL回顾 查询: 查看字段 权限管理 查询权限 授权查询 多表查询 join语法 外键 备份: 指定时间段备份: ...

  4. python操作数据库的几种方法_python对mysql数据库操作的三种不同方式

    原标题:python对mysql数据库操作的三种不同方式 |转载自:博客园 |原文链接:http://www.cnblogs.com/mryrs/p/6951008.html 先要说一下,在这个暑期如 ...

  5. 如何搭建MySQL数据库,常用的数据库命令

    1.什么是数据库?MySQL是什么?如何搭建MySQL数据库?如何通过cmd连接MySQL?常用的支持MySQL数据库可视化软件有哪些(包含下载地址)? https://xunmi.blog.csdn ...

  6. 62 openEuler 22.03-LTS 搭建MySQL数据库服务器-管理数据库

    文章目录 62 openEuler 22.03-LTS 搭建MySQL数据库服务器-管理数据库 62.1 创建数据库 示例 62.2 查看数据库 示例 62.3 选择数据库 示例 62.4 删除数据库 ...

  7. mysql数据库集群技术_使用MySQL-Cluster搭建MySQL数据库集群

    1.MySQL集群的作用: - 解决访问节点的单点故障 - 数据存储节点的单点故障 - 解决数据存储节点数据备份问题 2.集群: 使用一组服务器提供相同的服务 3.关于MySQL-Cluster: M ...

  8. mysql数据库rp集群,使用MySQL-Cluster搭建MySQL数据库集群

    1.MySQL集群的作用: - 解决访问节点的单点故障 - 数据存储节点的单点故障 - 解决数据存储节点数据备份问题 2.集群: 使用一组服务器提供相同的服务 3.关于MySQL-Cluster: M ...

  9. mysql数据库集群配置_使用MySQL-Cluster搭建MySQL数据库集群(示例代码)

    1.MySQL集群的作用: - 解决访问节点的单点故障 - 数据存储节点的单点故障 - 解决数据存储节点数据备份问题 2.集群: 使用一组服务器提供相同的服务 3.关于MySQL-Cluster: M ...

  10. docker 搭建mysql 连接不上_docker搭建MySQL主从集群

    关于MySQL主从模式,如果我们直接在本机上搭建的话,是没法搭建的,只能借助于虚拟机,但有的时候我们又需要搭建一个主从集群,以便于进行一些功能性的测试.这个时候我们就可以尝试使用docker,借助于d ...

最新文章

  1. Android 改变窗口标题栏的布局
  2. R语言do.call函数和call函数实战
  3. JavaWeb显示器
  4. 改进的简单Tooltips显示
  5. current of 使用
  6. vue实现树形结构增删改查
  7. Linux命令 ls -l s输出内容含义详解
  8. 如何使Session永不过期
  9. 万年历c语言程序微博,简易的万年历程序C语言
  10. 最全36种python设计模式
  11. 天肌处理器天梯排行榜2022 天肌处理器发布时间排行
  12. 中国沛县高层次人才创新创业大赛(深圳赛区)报名启动
  13. 以集成和管理为主要手段的企业报表中心架构设计
  14. 广发卡分期可商户分期啦
  15. Laravel 5.5 中文文档
  16. feign远程调用传参问题
  17. 【Turtle圣诞系列】今年的圣诞树都来了圣诞还会远吗?(内含多份源码)
  18. 物联卡要求上传身份证实名认证安全吗,不认证无法使用
  19. 如何将m4v视频格式快速转换成mp4视频呢
  20. Oracle Livelabs实验: Setting Up Active Data Guard For On-Premises

热门文章

  1. 数学女博士奥运会摘金!用数学知识自己训练
  2. 【从零开始学习 UVM】10.9、UVM TLM —— TLM Analysis Port
  3. msf工具之木马程序制作以及伪装
  4. 找出你的高价值潜在用户 - 通过归因分析实现用户画像和精准营销
  5. 读书笔记---金融学一新国富论
  6. [转]离散数据编码方式总结()
  7. 获得手机IMEI IMSI
  8. Windows 2012 R2安装KB2919355失败,需先安装KB2919442
  9. 【Java-----日期类(三)之Calendar类详解】
  10. 字符串转日期,日期转字符串,日期比较