集群的讲解分为三篇

  • (一):主从复制集群、PXC集群
  • (二):MyCat中间件、Haproxy负载均衡
  • (三):前面四种技术的综合应用

搭建如图集群

mysql windows搭建集群 mysql集群搭建几种方式_docker

部署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

mysql windows搭建集群 mysql集群搭建几种方式_xml_02

  • 测试数据
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 说明搭建成功!

mysql windows搭建集群 mysql集群搭建几种方式_xml_03

  • 测试数据
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这个节点就可以