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" />

  

  

  

 

 

 

 

  



  

 

 

  

  

  

  

 

posted @ 2020-09-15 17:58  suminem  阅读(453)  评论(0编辑  收藏  举报