集群的讲解分为三篇
- (一):主从复制集群、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.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 没有
- 负载均衡类型,目前的取值有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)是绿色的 说明我们的两个集群都是正常状状态 至此 集群搭建完毕!