集群的讲解分为三篇
- (一):主从复制集群、PXC集群
- (二):MyCat中间件、Haproxy负载均衡
- (三):前面四种技术的综合应用
搭建如图集群
部署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这个节点就可以