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参数调优
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" />