从零搭建MySQL数据库集群(二):MyCat中间件、Haproxy负载均衡

集群的讲解分为三篇

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

MyCat中间件

在这里插入图片描述

  • 介绍

    • 一个彻底开源的,面向企业应用开发的大数据库集群
      支持事务、ACID、可以替代MySQL的加强版数据库
    • 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
    • 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
      结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
    • 一个新颖的数据库分库分表中间件 产品
  • 安装

    • 下载

    链接:https://pan.baidu.com/s/1tJ2RjeTR4adwDhYNcbhQTQ
    提取码:4rdp
    复制这段内容后打开百度网盘手机App,操作更方便哦

    • 下载后上传到虚拟机 直接解压即可
    tar -zxvf Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz
    

读写分离
使用我们上一篇搭建好的主从

主机端口容器名称表角色
192.168.56.1293306percona-master01master
192.168.56.1293307percona-slave01slave
  • 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>
    	
    	<!--在这里是设置的mycat的用户和虚拟逻辑库-->
    	<!--修改这里:name是连接mycat的用户名-->
    	<user name="root" defaultAccount="true">
    		<!--修改这里:这个密码用于连接mycat-->
    		<property name="password">root</property>
    		<!--修改这里:逻辑数据库名称-->
    		<property name="schemas">TESTDB</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/">
    
    	<!--配置逻辑数据库里的表 name要在server.xml 里设置过-->
    	<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
    		<!--修改这里:name是实际存在的表名、dataNode里要有这个表-->
    		<!--rule是分片规则-->
    		<table name="test_tb" dataNode="dn1" rule="mod-long" />
    		<!--若当水平分库后 每个分片的表查询时都要使用原先某张字典表(全局表)
            <table name="commen_tb" dataNode="dn1,dn2" type="global" />-->
    	</schema>
    	
    	<!--配置分片关系-->
    	<!--修改这里:修改database 位实际存在的数据库-->
    	<dataNode name="dn1" dataHost="host1" database="user_db" />
    	
    	<!--配置连接信息-->
    	<dataHost name="host1" maxCon="1000" minCon="10" balance="3"
    			writeType="1" dbType="mysql" dbDriver="native" switchType="1"
    			slaveThreshold="100">
    			
    		<heartbeat>select user()</heartbeat>
    		
    		<!--修改这里:url是主数据库地址-->
    		<writeHost host="W1" url="192.168.56.129:3306" user="root"
    				password="root">
    			<!--修改这里:url是从数据库地址-->
    			<readHost host="W1R1" url="192.168.56.129:3307" user="root"
    					password="root" />
    		</writeHost>
    		
    	</dataHost>
    </mycat:schema>
    
    • 负载均衡类型,目前的取值有3 种:
      • balance=“0”(没有从节点时), 不开启读写分离机制,所有读操作都发送到当前可用的writeHost 上。
      • balance=“1”(不常用),全部的readHost 与stand by writeHost 参与select 语句的负载均衡,简单的说,当双 主双从模式(M1->S1,M2->S2,并且M1 与M2 互为主备),正常情况下,M2,S1,S2 都参与select 语句的负载均衡。
      • balance=“2”(pxc集群),所有读操作都随机的在writeHost、readhost 上分发。
      • balance=“3”(分片时),所有读请求随机的分发到wiriterHost 对应的readhost 执行,writerHost 不负担读压 力,注意balance=3 只在1.4 及其以后版本有,1.3 没有
  • rule.xml(mycat/conf/rule.xml)

    <!--查找到mod-long 修改节点数量 mycat负载均衡的时候 是通过这里的count来取模分片-->
    <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
    	<property name="count">1</property>
    </function>
    
  • 启动(mycat/bin)

    ./mycat console
    

    在这里插入图片描述

    #正式启动
    ./startup_nowrap.sh
    
  • 如何停止

    #在mycat/bin 下执行
    jps
    #显示进程id后 直接杀死
    kill -9 
    
  • navicat连接mycat

    • 端口:8066(默认)、用户名、密码:server.xml里user标签设置的
    • 操作的数据库:test_mycat_db、操作的表:test_table

数据分片

MySQL集群1:

主机端口容器名称表角色
192.168.56.1293306percona-master01master
192.168.56.1293307percona-slave01slave

MySQL集群1:

主机端口容器名称表角色
192.168.56.1293316percona-master02master
192.168.56.1293317percona-slave02slave
  • 创建第二个集群的方式跟第一个相同 省略…

    • 要注意的地方:创建容器时的映射的port、子节点在查询语句中设置master相关信息时的port
  • 编辑schema.xml:

    <?xml version="1.0"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://io.mycat/">
    	<!--配置数据表-->
    	<schema name="test_mycat_db" checkSQLschema="false" sqlMaxLimit="100">
    		<table name="test_table" dataNode="dn1,dn2" rule="mod-long" />
    	</schema>
    	
    	<!--配置分片关系-->
    	<!--集群肯定数据表和表都相同-->
    	<dataNode name="dn1" dataHost="cluster1" database="test_mycat_db" />
    	<dataNode name="dn2" dataHost="cluster2" database="test_mycat_db" />
    	
    	<!--配置连接信息-->
    	<dataHost name="cluster1" maxCon="1000" minCon="10" balance="3"
    			writeType="1" dbType="mysql" dbDriver="native" switchType="1"
    			slaveThreshold="100">
    		<heartbeat>select user()</heartbeat>
    		<writeHost host="W1" url="192.168.129.56:3306" user="root"
    				password="root">
    			<readHost host="W1R1" url="192.168.56.129:3307" user="root"
    					password="root" />
    		</writeHost>
    	</dataHost>
    	
    	<dataHost name="cluster2" maxCon="1000" minCon="10" balance="3"
    			writeType="1" dbType="mysql" dbDriver="native" switchType="1"
    			slaveThreshold="100">
    		<heartbeat>select user()</heartbeat>
    			<writeHost host="W2" url="192.168.56.129:3316" user="root"
    					password="root">
    				<readHost host="W2R1" url="192.168.56.129:3317" user="root"
    						password="root" />
    			</writeHost>
    	</dataHost>
    </mycat:schema>
    
  • 编辑rule.xml:

    <!--把分片数量改为两个-->
    <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
    	<property name="count">2</property>
    </function>
    
  • 重新启动mycat

    ./startup_nowrap.sh && tail -f ../logs/mycat.log
    

负载均衡Haproxy

  • HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
  • HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。
  • HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。
  • GitHub、Bitbucket、Stack Overflow、Reddit、Tumblr、Twitter和 Tuenti在内的知名网站,及亚马逊网络服务系统都使用了HAProxy。
    在这里插入图片描述

搭建mycat集群

  • 复制一份配置好的mycat
    • 因为集群除了端口不同 其他数据和配置都相同
    cp mycat mycat2 -R
    
  • vi wrapper.conf
    #设置jmx端口
    wrapper.java.additional.7=-Dcom.sun.management.jmxremote.port=1985
    
  • vi server.xml
    #设置服务端口以及管理端口
    <property name="serverPort">8067</property>
    <property name="managerPort">9067</property>
    
  • 重新启动服务
    ./startup_nowrap.sh
    

配置Haproxy负载均衡

  • 拉取镜像

    docker -p pull haproxy:1.9.3
    
  • 创建目录,用于存放配置文件

    mkdir /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
    	bind 0.0.0.0:4002
    	mode tcp
    	balance roundrobin
    	option tcplog
    	#代理mycat服务
    	server mycat_1 192.168.56.129:8066 check port 8066 maxconn 2000
    	server mycat_2 192.168.56.129:8067 check port 8067 maxconn 2000
    
  • 启动容器

    docker restart haproxy && docker logs -f haproxy
    
  • 测试

    • 通过web界面进行测试:http://192.168.56.132:4001/dbs
    • 用户名:admin、密码:admin123
      在这里插入图片描述
    • 可以看到我们的mycat集群(mycat_1、mycat_2)是绿色的 说明我们的两个集群都是正常状状态 至此 集群搭建完毕!
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值