从零搭建MySQL数据库集群(三):搭建混合集群综合应用
集群的讲解分为三篇
- (一):主从复制集群、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数据库集群(三):搭建混合集群综合应用相关推荐
- MySQL数据库程序设计(三)
MySQL数据库程序设计(三) 前言 数据查询 SELECT语句 单表查询 选择字段 选择指定记录 分组聚合查询 查询结果排序 限制结果数量 链接查询 交叉连接 内连接 外连接 子查询 IN关键字的子 ...
- 阿里云ECS服务器搭建Mysql数据库
阿里云ECS服务器搭建Mysql数据库 一.服务器系统: Alibaba Cloud Linux 3.2104 LTS 64位 二.服务器文件夹创建 [说明]:由于服务器为新申请,故服务器为空白服务器 ...
- MySQL数据库入门(三)--- 查询、权限、join语法、外键、备份
MySQL数据库入门(三) 文章目录 MySQL数据库入门(三) @[toc] MySQL回顾 查询: 查看字段 权限管理 查询权限 授权查询 多表查询 join语法 外键 备份: 指定时间段备份: ...
- python操作数据库的几种方法_python对mysql数据库操作的三种不同方式
原标题:python对mysql数据库操作的三种不同方式 |转载自:博客园 |原文链接:http://www.cnblogs.com/mryrs/p/6951008.html 先要说一下,在这个暑期如 ...
- 如何搭建MySQL数据库,常用的数据库命令
1.什么是数据库?MySQL是什么?如何搭建MySQL数据库?如何通过cmd连接MySQL?常用的支持MySQL数据库可视化软件有哪些(包含下载地址)? https://xunmi.blog.csdn ...
- 62 openEuler 22.03-LTS 搭建MySQL数据库服务器-管理数据库
文章目录 62 openEuler 22.03-LTS 搭建MySQL数据库服务器-管理数据库 62.1 创建数据库 示例 62.2 查看数据库 示例 62.3 选择数据库 示例 62.4 删除数据库 ...
- mysql数据库集群技术_使用MySQL-Cluster搭建MySQL数据库集群
1.MySQL集群的作用: - 解决访问节点的单点故障 - 数据存储节点的单点故障 - 解决数据存储节点数据备份问题 2.集群: 使用一组服务器提供相同的服务 3.关于MySQL-Cluster: M ...
- mysql数据库rp集群,使用MySQL-Cluster搭建MySQL数据库集群
1.MySQL集群的作用: - 解决访问节点的单点故障 - 数据存储节点的单点故障 - 解决数据存储节点数据备份问题 2.集群: 使用一组服务器提供相同的服务 3.关于MySQL-Cluster: M ...
- mysql数据库集群配置_使用MySQL-Cluster搭建MySQL数据库集群(示例代码)
1.MySQL集群的作用: - 解决访问节点的单点故障 - 数据存储节点的单点故障 - 解决数据存储节点数据备份问题 2.集群: 使用一组服务器提供相同的服务 3.关于MySQL-Cluster: M ...
- docker 搭建mysql 连接不上_docker搭建MySQL主从集群
关于MySQL主从模式,如果我们直接在本机上搭建的话,是没法搭建的,只能借助于虚拟机,但有的时候我们又需要搭建一个主从集群,以便于进行一些功能性的测试.这个时候我们就可以尝试使用docker,借助于d ...
最新文章
- Android 改变窗口标题栏的布局
- R语言do.call函数和call函数实战
- JavaWeb显示器
- 改进的简单Tooltips显示
- current of 使用
- vue实现树形结构增删改查
- Linux命令 ls -l s输出内容含义详解
- 如何使Session永不过期
- 万年历c语言程序微博,简易的万年历程序C语言
- 最全36种python设计模式
- 天肌处理器天梯排行榜2022 天肌处理器发布时间排行
- 中国沛县高层次人才创新创业大赛(深圳赛区)报名启动
- 以集成和管理为主要手段的企业报表中心架构设计
- 广发卡分期可商户分期啦
- Laravel 5.5 中文文档
- feign远程调用传参问题
- 【Turtle圣诞系列】今年的圣诞树都来了圣诞还会远吗?(内含多份源码)
- 物联卡要求上传身份证实名认证安全吗,不认证无法使用
- 如何将m4v视频格式快速转换成mp4视频呢
- Oracle Livelabs实验: Setting Up Active Data Guard For On-Premises