我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MyCat - 使用篇(3)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MyCat - 使用篇(3)

全局序列号

数据切分后,原有的关系数据库中的主键约束在分布式条件下将无法使用,因此需要引入外部机制保证数据唯一性标识,这种保证全局性的数据唯一标识的机制就是全局序列号(sequence)。 
全局序列号有很多实现的方式,比如本地配置文件,或者拿一个分片节点保存全局序列号,但是这么做都有单点故障的问题,从架构上看不推荐这么做。 
全局序列号还是推荐用独立的id生成器服务去实现最佳!

安装准备

环境

Red Hat Enterprise Linux Server release 6.6 (Santiago) 
java version “1.7.0_79”

软件

配置并部署zookeeper

只要部署好即可,默认配置,将conf/zoo_sample.cfg 重命名为conf/zoo.cfg。启动后验证下即可(因为目前只为了为监控服务) 
zookeeper配置

配置MyCat

下载MyCat的源代码,并使用maven打包安装:mvn install -Dmaven.test.skip=true. 使用生成的linux下的tar.gz文件,解压。

1. 业务分析

接下来是我们的重点,MyCat的配置,还是拿之前的例子,我们只需要一个逻辑库(schema),客户和运单需要分片。业务上,客户和快递员查询和自己相关的运单比客户和快递员还有仓管员通过运单号查询相关信息的业务量少的,所以以运单号为中心进行分片。 
运单表根据运单号哈希取模分片; 
运单子母件表作为运单表的子表; 
快递员运单关系表作为运单表的子表; 
客户运单关系表作为运单表的子表; 
快递员信息变动不频繁,而且量不大,但是业务上基本没有需要和快递员join的场景,作为非分片表; 
客户表根据客户id做哈希取模; 
为了举例,增加一个字典表,运单状态信息表,运单表多一个状态字段,运单状态信息表记录状态的解释信息。

运单根据量放在两个分片节点上,客户根据量也放在两个分片节点上。(这里假设两个节点都撑得住未来10年的量,主要要考虑存储量级和tps/qps两个维度,采用涉及到哈希取模的分片规则,最好一开始就估计足量,避免未来的扩容麻烦)

综上,如下分片: 
这里写图片描述

2. 配置conf/server.xml

server.xml几乎保存了所有mycat需要的系统配置信息。其在代码内直接的映射类为SystemConfig类。

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mycat:server SYSTEM "server.dtd"><mycat:server xmlns:mycat="http://org.opencloudb/">
    <system>
        <property name="defaultSqlParser">druidparser</property>
        <!--  <property name="useCompression">1</property>--> <!--1为开启mysql压缩协议-->
        <!-- <property name="processorBufferChunk">40960</property> -->
        <!--
        <property name="processors">1</property>
        <property name="processorExecutor">32</property>
         -->
        <!--默认是65535 64K 用于sql解析时最大文本长度 -->
        <!--<property name="maxStringLiteralLength">65535</property>-->
        <!--<property name="sequnceHandlerType">0</property>-->
        <!-- 表示使用数据库方式生成sequence. -->
        <property name="sequnceHandlerType">1</property>
        <!--<property name="backSocketNoDelay">1</property>-->
        <!--<property name="frontSocketNoDelay">1</property>-->
        <!--<property name="processorExecutor">16</property>-->
        <!--
            <property name="mutiNodeLimitType">1</property> 0:开启小数量级(默认) ;1:开启亿级数据排序
            <property name="mutiNodePatchSize">100</property> 亿级数量排序批量
            <property name="processors">32</property> <property name="processorExecutor">32</property>
            <property name="serverPort">8066</property> <property name="managerPort">9066</property>
            <property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property>
            <property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> -->
        <property name="serverPort">8066</property> <property name="managerPort">9066</property>
    </system>
    <user name="root">
        <!--从1.4.1开始,MyCat支持密文保存密码,这里明文密码为root -->
        <property name="usingDecrypt">1</property>
        <property name="password">CrjpLhvVJkHk0EPW35Y07dUeTimf52zMqClYQkIAN3/dqiG1DVUe9Zr4JLh8Kl+1KH1zd7YTKu5w04QgdyQeDw==</property>
        <property name="schemas">schema1</property>
    </user><user name="test">
        <!--这里明文密码为test-->
        <property name="usingDecrypt">1</property>
        <property name="password">nYx8wxkKtgdPtMXIpapwbNadIWFzpse48NcO+42D1yS//1cNxxQquw07eV/7gvVpxzbjNv47t6QpChvVszKy9g==</property>
        <property name="readOnly">true</property>
        <property name="schemas">schema1</property>
    </user></mycat:server>12345678910111213141516171819202122232425262728293031323334353637383940414243

2.1 生成密文密码

查看密文密码工具类org.opencloudb.util.DecryptUtil,可以发现main方法中接收的参数为如下格式: 
0:test:test 分别对应的是

这里我们是配置前端,用户名为test,密码为test。 
(前端和后端用的密码盐不一样,盐中还有用户名的成分) 
传入这个参数运行主类,在控制命令行得到密文密码。 
nYx8wxkKtgdPtMXIpapwbNadIWFzpse48NcO+42D1yS//1cNxxQquw07eV/7gvVpxzbjNv47t6QpChvVszKy9g==

2.2 配置用户和逻辑库与权限

<user name="root">
        <!--从1.4.1开始,MyCat支持密文保存密码,这里明文密码为root -->
        <property name="usingDecrypt">1</property>
        <property name="password">CrjpLhvVJkHk0EPW35Y07dUeTimf52zMqClYQkIAN3/dqiG1DVUe9Zr4JLh8Kl+1KH1zd7YTKu5w04QgdyQeDw==</property>
        <!--规定可以访问的逻辑库,可以配置多个,用,分割-->
        <property name="schemas">schema1</property>
    </user><user name="test">
        <!--这里明文密码为test-->
        <property name="usingDecrypt">1</property>
        <property name="password">nYx8wxkKtgdPtMXIpapwbNadIWFzpse48NcO+42D1yS//1cNxxQquw07eV/7gvVpxzbjNv47t6QpChvVszKy9g==</property>
        <!--对于数据库只读访问-->
        <property name="readOnly">true</property>
        <property name="schemas">schema1</property>
    </user>123456789101112131415

上面的注释已经很清楚,在1.5版本,用户权限更全面,并且还有ip白名单和sql黑名单的功能。

2.3 配置系统参数

<system>
        <!--默认sql解析器,之后我们会仔细分析,这里设置为淘宝开源的druidparser最为高效-->
        <property name="defaultSqlParser">druidparser</property>
        <!--是否开启mysql压缩协议,客户端、mycat、mysql三者都启用才行,参考下面1-->
        <!--  <property name="useCompression">1</property>--> <!--1为开启mysql压缩协议-->
        <!-- <property name="processorBufferChunk">40960</property> -->
        <!--
        <property name="processors">1</property>
        <property name="processorExecutor">32</property>
         -->
        <!--默认是65535 64K 用于sql解析时最大文本长度 -->
        <!--<property name="maxStringLiteralLength">65535</property>-->
        <!--<property name="sequnceHandlerType">0</property>-->
        <!-- 指定使用Mycat全局序列的类型。0为本地文件方式,1为数据库方式。默认是使用本地文件方式,文件方式主要只是用于测试使
用。根据之前的讨论,最好还是用id生成器-->
        <!--<property name="sequnceHandlerType">1</property>-->
        <!--<property name="backSocketNoDelay">1</property>-->
        <!--<property name="frontSocketNoDelay">1</property>-->
        <!--<property name="processorExecutor">16</property>-->
        <!--
            <property name="mutiNodeLimitType">1</property> 0:开启小数量级(默认) ;1:开启亿级数据排序
            <property name="mutiNodePatchSize">100</property> 亿级数量排序批量
            <property name="processors">32</property> <property name="processorExecutor">32</property>
            <property name="serverPort">8066</property> <property name="managerPort">9066</property>
            <property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property>
            <property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> -->
        <property name="serverPort">8066</property> <property name="managerPort">9066</property>
    </system>12345678910111213141516171819202122232425262728
  1. Mycat可以在server.xml中配置1启用。 
    客户端如果是mysql命令行,则加参数-C启用压缩协议。 
    客户端如果是jdbc则在jdbc的url上加上参数useCompression=true,例如:jdbc:mysql://127.0.0.1:8066 
    /base?useCompression=true 
    一般网路条件越差,性能提升越明显。

  2. processors:这个属性主要用于指定系统可用的线程数,默认值为Runtime.getRuntime().availableProcessors()方法返回的值。主要影响processorBufferPool、processorBufferLocalPercent、processorExecutor属性。NIOProcessor的个数也是由这个属性定义的,所以调优的时候可以适当的调高这个属性。

  3. 由于每次执行NIO读、写操作都需要使用到buffer,系统初始化的时候会建立一定长度的buffer池来加快读、写的效率,减少建立buffer的时间。Mycat中有两个主要的buffer池:BufferPool和ThreadLocalPool 
    BufferPool由ThreadLocalPool组合而成,每次从BufferPool中获取buffer都会优先获取ThreadLocalPool中的buffer,未命中之 
    后才会去获取BufferPool中的buffer。也就是说ThreadLocalPool是作为BufferPool的二级缓存,每个线程内部自己使用的。当 
    然,这其中还有一些限制条件需要线程的名字是由$_开头。然而,BufferPool上的buffer则是每个NIOProcessor都共享的。 
    默认这个属性的值为: 默认bufferChunkSize(4096) * processors属性 * 1000 
    BufferPool的总长度 = bufferPool / bufferChunk。 
    若bufferPool不是bufferChunk的整数倍,则总长度为前面计算得出的商 + 1 
    假设系统线程数为4,其他都为属性的默认值,则: 
    bufferPool = 4096 * 4 * 1000 
    BufferPool的总长度 : 4000 = 16384000 / 4096

  4. processorExecutor属性 
    这个属性主要用于指定NIOProcessor上共享的businessExecutor固定线程池大小。mycat在需要处理一些异步逻辑的时候会把任务提交到这个线程池中。新版本中这个连接池的使用频率不是很大了,可以设置一个较小的值。

  5. TCP相关参数,前端后端分别为: 
    frontSocketSoRcvbuf 默认值: 1024 * 1024 
    frontSocketSoSndbuf 默认值: 4 * 1024 * 1024 
    frontSocketNoDelay 默认值: 1 
    backSocketSoRcvbuf 默认值: 4 * 1024 * 1024 
    backSocketSoSndbuf 默认值: 1024 * 1024 
    backSocketNoDelay 默认值: 1

  6. MySql连接相关属性: 
    packetHeaderSize : 指定Mysql协议中的报文头长度。默认4。 
    maxPacketSize : 指定Mysql协议可以携带的数据最大长度。默认16M。 
    idleTimeout : 指定连接的空闲超时时间。某连接在发起空闲检查下,发现距离上次使用超过了空闲时间,那么这个连接会被回收,就是被直接的关闭掉。默认30分钟。 
    charset : 连接的初始化字符集。默认为utf8。 
    txIsolation : 前端连接的初始化事务隔离级别,只在初始化的时候使用,后续会根据客户端传递过来的属性对后端数据库连接进行同步。默认为REPEATED_READ。 
    **sqlExecuteTimeout:**SQL执行超时的时间,Mycat会检查连接上最后一次执行SQL的时间,若超过这个时间则会直接关闭这连接。默认时间为300秒

  7. 定时任务: 
    processorCheckPeriod : 清理NIOProcessor上前后端空闲、超时和关闭连接的间隔时间。默认是1秒。 
    dataNodeIdleCheckPeriod : 对后端连接进行空闲、超时检查的时间间隔,默认是60秒。 
    dataNodeHeartbeatPeriod : 对后端所有读、写库发起心跳的间隔时间,默认是10秒

  8. 服务相关属性: 
    bindIp : mycat服务监听的IP地址,默认值为0.0.0.0。 
    serverPort : 定义mycat的使用端口,默认值为8066。就是客户端接入端口 
    managerPort : 定义mycat的管理端口,默认值为9066。有很多监控命令

MyCat - 使用篇(3)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MyCat - 使用篇(3)

全局序列号数据切分后,原有的关系数据库中的主键约束在分布式条件下将无法使用,因此需要引入外部机制保证数据唯一性标识,这种保证全局性的数据唯一标识的机制就是全局序列号(sequence)。 全局序列号有很多实现的方式,比如本地配置文件,或者拿
2023-01-31

mycat简单使用

MyCat MyCAT是使用JAVA语言进行编写开发,使用前需要先安装JAVA运行环境(JRE),由于MyCAT中使用了JDK7中的一些特性,所以 要求必须在JDK7以上的版本上运行。 mysql mysql主从复制 首先安装mysql数据库实现主从复制,之前
mycat简单使用
2021-02-12

Mycat安装部署简单使用

Mycat安装部署简单使用1. 软件准备Mycat:下载地址:https://github.com/MyCATApache/Mycat-download。下载界面图 1‑1 Mycat首页下载界面。任意选中RELEASE版本,进入RELEASE版本目录
Mycat安装部署简单使用
2021-03-09

Mycat基本使用方法是什么

Mycat是一个开源的数据库中间件,可以用于数据库的读写分离、负载均衡等功能。以下是Mycat的基本使用方法:1. 安装和配置:首先需要下载并安装Mycat,然后进行相关配置,包括数据库连接信息、数据分片规则等。2. 数据库连接:使用Myc
2023-10-18

使用 iptables 3

<< Back to man.ChinaUnix.net 红帽企业 Linux 4: 安全指南后退第 7章 . 防火墙前进使用 iptables 的第一步是启动 iptables 服务。这可以使用以下命令进行:service iptable
2023-01-31

FusionChart使用3

12、Zero plan相关属性zeroPlaneColor设置零线(面)的颜色 zeroPlaneThickness设置零线(面)的粗细 zeroPlaneAlpha设置零线(面)的透明度 zeroPlaneShowBorder是否显示零
2023-01-31

Sublime Text 3 使用

Sublime Text 3Emmet快速编写HTML代码共3图>01初始化文档HTML文档需要包含一些固定的标签,比如、、等,现在你只需要1秒钟就可以输入这些标签。比如输入“!”或“html:5”,然后
2023-01-31

ansile(3)playbook 使用

一、playbook介绍二、palybook使用说明三、roles说明及配置一、playbook介绍1.playbook介绍顾名思义,playbook就是类似演戏的剧本一样,将所有的戏码全部放在一起,官方说明如下:Playbooks是Ans
2023-01-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录