1.mycat 主从复制,读写分离
2.mycat-web mycat可视化界面
3.HAProxy mycat集群
4.HAProxy + Keepalived mycat高可用集群架构
注:Keepalived的作用是抢占vip(虚拟ip)以提供对外服务
注:MyCat的高可用及负载均衡由HAProxy来实现,而HAProxy的高可用由 Keepalived来实现
MyCat下载:http://dl.mycat.org.cn/
schema.xml:MyCat的逻辑库、逻辑表以及对应的分片规则、DataNode以及DataSource
server.xml:mycat系统配置信息。例如配置用户名、密码及权限
rule.xml :拆分表的规则
mycat管理端口9066(mycat-web查看mycat会使用) ; 服务端口8066(数据库连接)
select user()
...
utf8
123456
ITCAST
id
rang-long
autopartition-long.txt
## cmd使用管理员打开并安装
mycat.bat install
## 启动mycat服务
mycat.bat start
## 查看mycat的运行状态:
mycat.bat status
## 停止mycat服务
mycat.bat stop
MyCat-Web 引入了ZooKeeper作为配置中心,可以管理多个节点
1.安装zk
2.启动mycat-web
3.http://localhost:8082/mycat
4.配置mycat参数
keepalived实现HAProxy的高可用
双主双从:
架构 :m1 -> s1 ; m2 -> s2 ; m1 <-> m2 互为主备
读写分离 :m1写 ; m2,s1,s2读
挂机 :m1挂掉后m2进行写
mycat主从切换问题:
方式1:自动切换:
当M宕机后, 读写S ; 恢复M后, 写S, 读M ;
当S宕机后, 读写M ; 恢复S后, 写M, 读S ;
方式2:基于MySQL主从同步状态的切换
MyCat检测到主从数据同步延迟,会自动切换到拥有最新数据的MySQL服务器
双主双从架构
3大系统功能介绍
1.商品管理:①添加商品 ②查询商品
2.订单管理:①下订单 ②查询订单
3.日志管理:①日志记录 ②日志查询
微服务模块介绍
spring-boot-starter-parent
|- v_parent --------------------> 父工程, 统一管理依赖版本
|- v_common ----------------> 通用工程, 存放通用的工具类及组件
|- v_model -----------------> 实体类
|- v_eureka ----------------> 注册中心
|- v_feign_api -------------> feign远程调用的客户端接口
|- v_gateway ---------------> 网关工程
|- v_manage_web ------------> 模拟前端工程
|- v_service_goods ---------> 商品微服务
|- v_service_log -----------> 日志微服务
|- v_service_order ---------> 订单微服务
垂直拆分:同一块业务的数据库表拆分到同一个数据库服务中
1.全局表
1.1 省份表 tb_provinces
1.2市表 tb_cities
1.3 区县表 tb_areas
1.4 字典表 tb_dictionary
2.商品模块表(数据库v_goods) --> ip1
2.1 品牌表 tb_brand
2.2 商品SPU表 tb_spu
2.3 商品SKU表 tb_sku
2.4 商品分类表 tb_category
3.订单模块表(数据库v_order) --> ip2
3.1 订单表 tb_order
3.2 订单明细表 tb_order_item
3.3 订单日志表 tb_order_log
4.日志表(水平分库 数据库v_log) --> ip3 ip4
操作日志表 tb_operatelog
分库分表图
1.eureka注册中心:http://localhost:8161/
2.前端界面http://localhost:8080/
server:
port: 9003
spring:
application:
name: log
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:8066/V_SHOP?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: 123456
main:
allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册
eureka:
client:
fetch-registry: true
register-with-eureka: true
service-url:
defaultZone: http://127.0.0.1:8161/eureka
instance:
prefer-ip-address: true
schema.xml
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="V_SHOP" checkSQLschema="false" sqlMaxLimit="100">
<table name="tb_areas" dataNode="dn1,dn2,dn3,dn4" primaryKey="areaid" type="global"/>
<table name="tb_provinces" dataNode="dn1,dn2,dn3,dn4" primaryKey="provinceid" type="global"/>
<table name="tb_cities" dataNode="dn1,dn2,dn3,dn4" primaryKey="cityid" type="global"/>
<table name="tb_dictionary" dataNode="dn1,dn2,dn3,dn4" primaryKey="id" type="global"/>
<table name="tb_brand" dataNode="dn1" primaryKey="id" />
<table name="tb_category" dataNode="dn1" primaryKey="id" />
<table name="tb_sku" dataNode="dn1" primaryKey="id" />
<table name="tb_spu" dataNode="dn1" primaryKey="id" />
<table name="tb_order" dataNode="dn2" primaryKey="id" />
<table name="tb_order_item" dataNode="dn2" primaryKey="id" />
<table name="tb_order_log" dataNode="dn2" primaryKey="id" />
<table name="tb_operatelog" dataNode="dn3,dn4" primaryKey="id" rule="log-sharding-by-murmur"/>
schema>
<dataNode name="dn1" dataHost="host1" database="v_goods" />
<dataNode name="dn2" dataHost="host2" database="v_order" />
<dataNode name="dn3" dataHost="host3" database="v_log" />
<dataNode name="dn4" dataHost="host4" database="v_log" />
<dataHost name="host1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()heartbeat>
<writeHost host="hostM1" url="192.168.192.158:3306" user="root" password="itcast"> writeHost>
dataHost>
<dataHost name="host2" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()heartbeat>
<writeHost host="hostM2" url="192.168.192.159:3306" user="root" password="itcast">writeHost>
dataHost>
<dataHost name="host3" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()heartbeat>
<writeHost host="hostM3" url="192.168.192.160:3306" user="root" password="itcast">writeHost>
dataHost>
<dataHost name="host4" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()heartbeat>
<writeHost host="hostM4" url="192.168.192.161:3306" user="root" password="itcast">writeHost>
dataHost>
mycat:schema>
server.xml配置文件
<user name="root" defaultAccount="true">
<property name="schemas">V_SHOPproperty>
<property name="password">123456property>
user>
rule.xml配置文件
<tableRule name="log-sharding-by-murmur">
<rule>
<columns>idcolumns>
<algorithm>log-murmuralgorithm>
rule>
tableRule>
<function name="log-murmur" class="io.mycat.route.function.PartitionByMurmurHash">
<property name="seed">0property>
<property name="count">2property>
<property name="virtualBucketTimes">160property>
function>