zoukankan      html  css  js  c++  java
  • MyCAT-安装配置读写分离

    一、下载安装

    1.1  下载安装jdk

    下载地址
    https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
    
    解压安装
    tar zxvf jdk-8u261-linux-x64.tar.gz -C /usr/local/
    
    配置环境变量
    export JAVA_HOME=/usr/local/jdk1.8.0_261
    export PATH=$JAVA_HOME/bin:$PATH
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

    1.2  下载安装Mycat

    http://www.mycat.org.cn/
    wget http://dl.mycat.org.cn/1.6.7.4/Mycat-server-1.6.7.4-release/Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
    tar zxvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz -C /usr/local/ cd /usr/local/mycat/bin/ ./mycat start 启动 ./mycat stop 停止 ./mycat console 前台运行 ./mycat restart 重启服务 ./mycat pause 暂停 ./mycat status 查看启动状态

      

    二、环境调优

    2.1 JVM调优配置:/usr/local/mycat/conf/wrapper.conf

          调优策略:

      内存占用分两部分:java堆内存+直接内存映射(DirectBuffer占用),建议堆内存适度大小,直接映射内存尽可能大,两种一起占据操作系统的1/2-2/3的内存。 

      以服务器16G内存为例,Mycat堆内存4G,直接内存映射6G,JVM参数如下: 

    -Xms4G    // JAVA堆内存初始化的大小
    -Xmx4G    // JAVA堆能够使用的内存最大值   
    -XX:MaxPermSize=64M    // JVM运行时分配的最大永久性内存大小,建议不超过物理内存1/64
    -XX:MaxDirectMemorySize=6G    // JVM直接内存映射
    

      配置文件实例(8G),注意wrapper.ping.timeout参数,当出现HUNG住情况时判断超时重启时间的设置,默认120s,太长,建议修改

    #********************************************************************
    # Wrapper Properties
    #********************************************************************
    # Java Application
    wrapper.java.command=java
    wrapper.working.dir=..
    
    # Java Main class.  This class must implement the WrapperListener interface
    #  or guarantee that the WrapperManager class is initialized.  Helper
    #  classes are provided to do this for you.  See the Integration section
    #  of the documentation for details.
    wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
    set.default.REPO_DIR=lib
    set.APP_BASE=.
    
    # Java Classpath (include wrapper.jar)  Add class path elements as
    #  needed starting from 1
    wrapper.java.classpath.1=lib/wrapper.jar
    wrapper.java.classpath.2=conf
    wrapper.java.classpath.3=%REPO_DIR%/*
    
    # Java Library Path (location of Wrapper.DLL or libwrapper.so)
    wrapper.java.library.path.1=lib
    
    # Java Additional Parameters
    # 配置Java启动参数,包括一系列Java环境变量设定以及JVM参数配置
    #wrapper.java.additional.1=
    wrapper.java.additional.1=-DMYCAT_HOME=.
    wrapper.java.additional.2=-server
    # JVM运行时分配的最大永久性内存大小,物理内存1/64
    wrapper.java.additional.3=-XX:MaxPermSize=64M
    wrapper.java.additional.4=-XX:+AggressiveOpts
    # 直接内存映射
    wrapper.java.additional.5=-XX:MaxDirectMemorySize=2G
    wrapper.java.additional.6=-Dcom.sun.management.jmxremote
    wrapper.java.additional.7=-Dcom.sun.management.jmxremote.port=1984
    wrapper.java.additional.8=-Dcom.sun.management.jmxremote.authenticate=false
    wrapper.java.additional.9=-Dcom.sun.management.jmxremote.ssl=false
    # JAVA堆内存能够使用的内存最大值
    wrapper.java.additional.10=-Xmx4G
    # JAVA堆内存初始化的大小
    wrapper.java.additional.11=-Xms1G
    
    # Initial Java Heap Size (in MB)
    #wrapper.java.initmemory=3
    
    # Maximum Java Heap Size (in MB)
    #wrapper.java.maxmemory=64
    
    # 指定wrapper需要包装的Java应用主程序入口
    # Application parameters.  Add parameters as needed starting from 1
    wrapper.app.parameter.1=org.opencloudb.MycatStartup
    wrapper.app.parameter.2=start
    
    #********************************************************************
    # Wrapper Logging Properties
    #********************************************************************
    # wrapper 控制台日志输出格式 
    # Format of output for the console.  (See docs for formats)
    wrapper.console.format=PM
    
    # wrapper 控制台输出日志级别
    # Log Level for console output.  (See docs for log levels)
    wrapper.console.loglevel=INFO
    
    # Log file to use for wrapper output logging.
    wrapper.logfile=logs/wrapper.log
    
    # Format of output for the log file.  (See docs for formats)
    wrapper.logfile.format=LPTM
    
    # wrapper 输出到log文件的日志级别 
    # Log Level for log file output.  (See docs for log levels)
    wrapper.logfile.loglevel=INFO
    
    # Maximum size that the log file will be allowed to grow to before
    #  the log is rolled. Size is specified in bytes.  The default value
    #  of 0, disables log rolling.  May abbreviate with the 'k' (kb) or
    #  'm' (mb) suffix.  For example: 10m = 10 megabytes.
    wrapper.logfile.maxsize=0
    
    # Maximum number of rolled log files which will be allowed before old
    #  files are deleted.  The default value of 0 implies no limit.
    wrapper.logfile.maxfiles=0
    
    # Log Level for sys/event log output.  (See docs for log levels)
    wrapper.syslog.loglevel=NONE
    
    #********************************************************************
    # Wrapper Windows Properties
    #********************************************************************
    # Title to use when running as a console
    wrapper.console.title=Mycat-server
    
    #********************************************************************
    # Wrapper Windows NT/2000/XP Service Properties
    #********************************************************************
    # WARNING - Do not modify any of these properties when an application
    #  using this configuration file has been installed as a service.
    #  Please uninstall the service before modifying this section.  The
    #  service can then be reinstalled.
    
    # Name of the service
    wrapper.ntservice.name=mycat
    
    # Display name of the service
    wrapper.ntservice.displayname=Mycat-server
    
    # Description of the service
    wrapper.ntservice.description=The project of Mycat-server
    
    # Service dependencies.  Add dependencies as needed starting from 1
    wrapper.ntservice.dependency.1=
    
    # Mode in which the service is installed.  AUTO_START or DEMAND_START
    wrapper.ntservice.starttype=AUTO_START
    
    # Allow the service to interact with the desktop.
    wrapper.ntservice.interactive=false
    
    # 重要参数,控制wrapper ping Mycat hung住的超时时间,单位是s,120s = 2min
    wrapper.ping.timeout=20
    configuration.directory.in.classpath.first=conf
    

    2.2 操作系统调优

      修改系统最大文件句柄数,Mycat和MySQL均优化

    echo "* soft nofile 65536"  >> /etc/security/limits.conf
    echo "* hard nofile 65536"  >> /etc/security/limits.conf
    

    2.3 Mycat参数调优

    http://www.yoyoask.com/?p=770

    https://blog.csdn.net/tornadojava/article/details/54948662

    https://www.cnblogs.com/icebutterfly/p/9505624.html

    --log4j.xml

    conf/log4j.xml
    日志级别根据情况调整,"debug"用于排错,性能测试和生产环境用"info"

    --server.xml:是Mycat服务器参数调整和用户授权的配置文件。

    有如下参数可以调整:
    <system> 
    
    <property name="processors">1</property> 
    #CPU核心数越多,可以越大,当发现系统CPU压力很小的情况下,可以适当调大此参数,如4核心的4CPU,可以设置为16,24核心的可以最大设置为128
    
    <property name="processorExecutor">32</property> 
    #下面这个参数为每个processor的线程池大小,建议可以是16-64,根据系统能力来测试和确定。
    
    processorBufferPool :processorBufferPool参数的调整,需要观察show @@processor的结果来确定,BU_PERCENT为已使用的百分比,BU_WARNS为Socket Buffer Pool不够时,临时创新的新的BUFFER的次数,若百分比经常超过90%并且BU_WARNS>0,则表明BUFFER不够,需要增大processorBufferPool。基本上,连接数越多,并发越高,需要的POOL越大,建议BU_PERCENT最大在40-80%之间。
    

    --schema.xml:负责管理库,表,分片规则

    Schema标签
    checkSQLschema属性默认为false,当sql中未加逻辑库名时报错,可以优化SQL解析,成熟后可以改为true,会将逻辑库名在sql中删除,如select * from TESTDB.company会自动变成select * from company。 
    
    dataHost标签
         <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
                    writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                    <heartbeat>select user()</heartbeat>
                    <writeHost host="hostM1" url="10.202.4.39:3306" user="root"
                            password="sf123456">      
                    </writeHost>        
            </dataHost>
    #最大连接池maxCon,和mysql的最大连接数对应,可以改为1000至2000,同一个Mysql实例上的所有datanode节点共享本dataHost 上的所有物理连接,性能测试的时候,建议minCon=maxCon= mysql #max_connections设为2000左右。
    
    
    

    缓存优化调整: 

    show @@cache命令展示了缓存的使用情况,经常观察其结果,需要时候进行调整: 

    一般来说:若CUR接近MAX,而PUT大于MAX很多,则表明MAX需要增大, HIT/ACCESS为缓存命中率,这个值越高越好。重新调整缓存的最大值以后,观测指标都会跟随变化,调整是否有效,主要观察缓存命中率是否在提升,PUT则下降。
    
    目前缓存服务的配置文件为:cacheservice.properties,主要使用的缓存为enhache,enhache.xml里面设定了enhance缓存的全局属性,下面定义了几个缓存:
    
    #used for mycat cache service conf  
    
    factory.encache=org.opencloudb.cache.impl.EnchachePooFactory
    
    #key is pool name ,value is type,max size, expire seconds
    
    pool.SQLRouteCache=encache,10000,1800
    
    pool.ER_SQL2PARENTID=encache,1000,1800  
    
    layedpool.TableID2DataNodeCache=encache,10000,18000
    
    layedpool.TableID2DataNodeCache.TESTDB_ORDERS=50000,18000  
    
    l SQLRouteCache为SQL 解析和路由选择的缓存,这个大小基本相对固定,就是所有 SELECT语句的数量。  
    
    l ER_SQL2PARENTID为ER分片时候,根据关联SQL查询父表的节点时候用到,没有用到 ER分片的,这个缓存用不到  
    
    l TableID2DataNodeCache,当某个表的分片字段不是主键时,缓存主键到分片ID的关系, 这个是二层的缓存,每个表定义一个子缓存,如”TEST_ORDERS”,这里命名为 schema_tableName(tablename要大写),当有很多的根据主键查询SQL时,这个缓存往往需要设置比较大,才能更好的提升性能。     
    

    2.4 Mycat配置文件

    server.xml

         <user name="liu" defaultAccount="true">
                    <property name="password">yyy</property>
                    <property name="schemas">liu</property>
                    <property name="defaultSchema">liu</property>
                    <!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 -->
    
            </user>
    
            <user name="root">
                    <property name="password">123456</property>
                    <property name="schemas">smc_e,smc_g</property>
                    <property name="readOnly">false</property>
            </user>

    说明:

    user:用户配置节点
    name:登录的用户名,也就是连接myCat的用户名
    password:登录的密码,也就是连接myCat的密码
    schemas:数据库名,这里会和schema.xml中的配置关联,多个用逗号分开,例如这个用户需要管理2个数据库db1,db2则配置 db1,db2
    readOnly:是否只读,注意必须配置该参数,否则默认只读,无法完成写操作 privileges:配置用户针对表的增删改查权限,具体见文档 # 第一个账号是liu 密码是:yyy ,针对数据库liu,读写权限都有,没有针对表做什么特殊权限设置
    # 第二个账号是root 密码是:123456,针对的数据库是smc_e和smc_g
    # 注意这里设置的是登录mycat的用户和密码,与实际mysql的用户名密码没关系

    schema.xml

    <?xml version="1.0"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://io.mycat/">
    <!-- 数据库配置,与server.xml中的数据库对应 -->
    	<schema name="liu" checkSQLschema="false" sqlMaxLimit="100" dataNode="node1" />
    	<schema name="smc_gateway" checkSQLschema="false" sqlMaxLimit="100" dataNode="node2" />
    	<schema name="smc_eticket" checkSQLschema="false" sqlMaxLimit="100" dataNode="node3" />
    	<!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
    		/> -->
    <!-- 分片配置 -->
    	<dataNode name="node1" dataHost="MGR1" database="liu" />
    	<dataNode name="node2" dataHost="MGR2" database="smc_gateway" />
    	<dataNode name="node3" dataHost="MGR3" database="smc_eticket" />
    
    
    <!-- 物理数据库配置 -->
    	<dataHost name="MGR1" maxCon="1000" minCon="10" balance="3"
    			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
    		<heartbeat>select user()</heartbeat>
    		<!-- can have multi write hosts -->
    		<writeHost host="MGRM1" url="10.11.0.213:3306" user="liu" password="liu">
    		<readHost host="MGRS1" url="10.11.0.214:3306" user="liu" password="liu" />
    		</writeHost>
    	</dataHost>
    
    	<dataHost name="MGR2" maxCon="1000" minCon="10" balance="3"
                              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                    <heartbeat>select user()</heartbeat>
                    <!-- can have multi write hosts -->
                    <writeHost host="MGRM1" url="10.11.0.213:3306" user="smc_gateway" password="smc_gateway">
                            <readHost host="MGRS1" url="10.11.0.214:3306" user="smc_gateway" password="smc_gateway" />
                    </writeHost>
            </dataHost>
    
    	<dataHost name="MGR3" maxCon="1000" minCon="10" balance="3"
                              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                    <heartbeat>select user()</heartbeat>
                    <!-- can have multi write hosts -->
                    <writeHost host="MGRM1" url="10.11.0.213:3306" user="smc_eticket" password="smc_eticket">
                            <readHost host="MGRS1" url="10.11.0.214:3306" user="smc_eticket" password="smc_eticket" />
                    </writeHost>
            </dataHost>
    
    </mycat:schema>  

    说明:

    配置说明
    schema---逻辑数据库设置
    name:逻辑数据库名,与server.xml中的schema对应
    checkSQLschema:数据库前缀相关设置,为true时,select * from table1会自动补全为select * from db1.table1;默认值false时,如不写db1前缀则会报错,方便处理解析问题。
    sqlMaxLimit:select 时默认的limit,避免查询全表
    dataNode:逻辑分库信息,节点为dataNode设置的name
    
    table--逻辑分表设置(读写分离不用配置)
    name:表名,物理数据库中表名
    dataNode:表存储到哪些分库节点,多个节点用逗号分隔。节点为dataNode设置的name
    primaryKey:主键字段名,自动生成主键时需要设置
    autoIncrement:是否自增
    rule:分片规则名,具体规则在rule.xml中配置
    
    dataNode---分片信息,也就是分库相关配置
    name:节点名,与table中dataNode对应
    datahost:物理数据库名,与datahost中name对应
    database:物理数据库中数据库名
    
    dataHost: 物理数据库,真正存储数据的数据库
    name:物理数据库名,与dataNode中dataHost对应
    balance:均衡负载的方式
    writeType:写入方式
    dbType:数据库类型
    heartbeat:心跳检测语句,注意语句结尾的分号要加
    

    rule.xml(读写分离不用配置)

    <tableRule name="mod-long">
            <rule>
                <columns>id</columns>
                <algorithm>mod-long</algorithm>
            </rule>
    </tableRule>
        
    <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
            <!-- how many data nodes -->
            <property name="count">2</property>
    </function>  

    说明:

    table中的rule属性对应的就是rule.xml文件中tableRule的name,分表和分库的实现有十几种,这里的mod-long是将数据平均拆分。因为后端是二台物理库,所以rule.xml中mod-long对应的function count为2  

    dataHost中分离策略详解:

    balance 属性负载均衡类型,目前的取值有 4 种:
    balance="0",不开启读写分离机制,所有读操作都发送到当前可用的writeHost 上。
    balance="1",所有读操作都随机发送到当前的writeHost对应的readHost和备用的writeHost和对应的readHost上写操作也是如此 (一主多从不建议使用,会间歇性出现readonly)
    balance="2",所有读操作都随机的在 writeHost、 readhost 上分发。
    balance="3", 所有的读操作都只发送到当前writeHost的readHost上, writerHost 不负担读压力,注意 balance=3 只有1.4 及其以后版本有, 1.3 没有。
    writeType 属性,负载均衡类型,目前的取值有 3 种:
    (双主可以使用这种,第一个master挂了写就自动切换到下一个)
    writeType="0",所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
    writeType="1",所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。
    writeType="2",官方文档没有介绍。
    switchType 属性:
    注意,读库可以分配一个单独的只读权限的用户  

    三、Mycat的启动

    ##启动
    mycat start 
    ##停止
    mycat stop 
    ##重启
    mycat restart

    设置开机启动

    建立软件连接
    在 /usr/local/mycat/bin/mycat  开头加一行source /etc/profile (有些机器不需要,这个步骤是让他正确加载环境变量,否则可能会报jvm找不到的问题)
     
    ln -s /usr/local/mycat/bin/mycat /etc/init.d/mycat
     
    service mycat start
     
    #加入开机启动
    chkconfig --add mycat
    

      

      

    问题1

    Caused by: io.mycat.config.util.ConfigException: schema liu didn't config tables,so you must set dataNode property!

    原因

    因为schema未配置tales,如果有randomDatenode需要改成dataNode,最后的 > 需要变为/> ,注意该段最后的</schema>也要注释掉
    <schema name="liu" checkSQLschema="false" sqlMaxLimit="100" dataNode="node" />
    

      

      

      

     

     

      



      

     

      

      

      

      

  • 相关阅读:
    使用RazorGenerator对视图View进行单元测试
    C#常用获取本周、本月、本季度、本年的时间起止段代码
    Redis使用记录
    Git和ConEmu
    mongodb单索引的升序和降序
    AES 加密解密 php c#
    redis 外网连接错误
    .net mvc 分页
    检查Windows上安装的.net版本
    sqlserver跨服务器查询
  • 原文地址:https://www.cnblogs.com/suminem/p/13674462.html
Copyright © 2011-2022 走看看