集群的讲解分为三篇

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

MyCat中间件

mysql数据库用什么中间件 mysql集群中间件_mysql

  • 介绍
  • 一个彻底开源的,面向企业应用开发的大数据库集群
    支持事务、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.129

3306

percona-master01

master

192.168.56.129

3307

percona-slave01

slave

  • 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

mysql数据库用什么中间件 mysql集群中间件_数据库_02

#正式启动
./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.129

3306

percona-master01

master

192.168.56.129

3307

percona-slave01

slave

MySQL集群1:

主机

端口

容器名称

表角色

192.168.56.129

3316

percona-master02

master

192.168.56.129

3317

percona-slave02

slave

  • 创建第二个集群的方式跟第一个相同 省略…
  • 要注意的地方:创建容器时的映射的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

mysql数据库用什么中间件 mysql集群中间件_docker _03

  • 可以看到我们的mycat集群(mycat_1、mycat_2)是绿色的 说明我们的两个集群都是正常状状态 至此 集群搭建完毕!