从零搭建MySQL数据库集群(三):搭建混合集群综合应用
搭建如图集群部署PXC集群集群1节点端口容器名称数据卷node113306pxc_node1test-v1node213307pxc_node2test-v2集群1节点端口容器名称数据卷node313308pxc_node1test-v3node413309pxc_node2test-v4...
集群的讲解分为三篇
- (一):主从复制集群、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_node2 docker 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_node1 rm -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:
global log 127.0.0.1 local2 maxconn 4000 daemon defaults mode http log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 listen admin_stats #端口号 bind 0.0.0.0:4001 mode http #访问路径 stats uri /dbs stats realm Global\ statistics #用户名和密码 stats auth admin:admin123 listen proxy-mysql #mysql连接的端口 bind 0.0.0.0:4002 mode tcp balance roundrobin option tcplog #代理mycat服务 server mycat_1 192.168.56.132:18067 check port 18067 maxconn 2000 server 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这个节点就可以
更多推荐
所有评论(0)