集群的讲解分为三篇
- (一):主从复制集群、PXC集群
- (二):MyCat中间件、Haproxy负载均衡
- (三):前面四种技术的综合应用
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.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
#正式启动
./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
- 可以看到我们的mycat集群(mycat_1、mycat_2)是绿色的 说明我们的两个集群都是正常状状态 至此 集群搭建完毕!