集群的讲解分为三篇

  • (一):主从复制集群、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

节点端口容器名称数据卷
node113306pxc_node1test-v1
node213307pxc_node2test-v2

集群1

节点端口容器名称数据卷
node313308pxc_node1test-v3
node413309pxc_node2test-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/./*	
    

部署主从复制集群

节点端口容器名称表角色
node13306percona-master01master
node23307percona-slave01slave

搭建主库

  • 创建目录
    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

节点端口
node118067
node118068

安装

  • 下载

    链接: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这个节点就可以

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐