Mycat 官方: http://www.mycat.org.cn/ IP规划,本环境全是centos7.6的环境 Mycat(内存最少给2G系统环境纯净) 10.0.0.60 mariadb-master 10.0.0.55 mariadb-slave 10.0.0.56 客户端 10.0.0.50 读写分离 我这里用的是mariadb,你也可以用mysql都是一样的 读写分离的基础上需要先让你现有的数据库,有主从的模式 主从搭建地址 https://9527edu.org/post/115.html Mycat安装,实际生产环境大部分都是用的oracle的jdk安装 jdk下载地址,需要注册账号下载相关的JDK https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 我这里下载的是jdk-8u301-linux-x64.tar ls jdk-8u301-linux-x64.tar 解压jdk tar -xf jdk-8u301-linux-x64.tar.gz -C /usr/local/ 创建软软链接 ln -s /usr/local/jdk1.8.0_301/ /usr/local/jdk 添加系统环境变量。让系统识别jdk vim /etc/profile.d/jdk.sh 添加以下下内容 export JAVA_HOME=/usr/local/jdk/ export JRE_HOME=$JAVA_HOME/jre export CLASSPATH=$JAVA_HOME/lib/:$JRE_HOME/lib/ export PATH=$PATH:$JAVA_HOME/bin 让识别jdk的系统环境变量 source /etc/profile.d/jdk.sh 输入命令查看jdk有没有生效,这里你安装的版本不一定和我的一样 java -version 返回结果: java version "1.8.0_301" Java(TM) SE Runtime Environment (build 1.8.0_301-b09) Java HotSpot(TM) 64-Bit Server VM (build 25.301-b09, mixed mode) 安装Mycat 下载mycat wget http://dl.mycat.org.cn/1.6.7.6/20210730131311/Mycat-server-1.6.7.6-release-20210730131311-linux.tar.gz 解压mycat tar -xf Mycat-server-1.6.7.6-release-20210730131311-linux.tar.gz -C /usr/local/ 添加mycat的系统环境变量 vim /etc/profile.d/mycat.sh 写入以下内容: PATH=/usr/local/mycat/bin:$PATH 让系统识别mycat系统环境变量 source /etc/profile.d/mycat.sh 启动mycat 直接输入mycat会有命令帮助信息 mycat 返回结果 Usage: /usr/local/mycat/bin/mycat { console | start | stop | restart | status | dump } 启动mycat mycat start 停止mycat mycat stop 重启mycat mycat restart 启动mycat mycat start 返回结果: Starting Mycat-server... 设置为开机自启动 echo "/usr/local/mycat/bin/mycat start" >> /etc/rc.local 赋予此文件执行权限 chmod +x /etc/rc.local 查看端口 netstat -lntup 返回结果 Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 6559/sshd tcp 0 0 127.0.0.1:32000 0.0.0.0:* LISTEN 23787/java tcp6 0 0 :::9066 :::* LISTEN 23787/java tcp6 0 0 :::34898 :::* LISTEN 23787/java tcp6 0 0 :::22 :::* LISTEN 6559/sshd tcp6 0 0 :::45056 :::* LISTEN 23787/java tcp6 0 0 :::1984 :::* LISTEN 23787/java tcp6 0 0 :::8066 :::* LISTEN 23787/java udp 0 0 127.0.0.1:323 0.0.0.0:* 5704/chronyd udp6 0 0 ::1:323 :::* 5704/chronyd 解释: 9066端口 8066端口 查看解压好的mycat的文件 ls /usr/local/mycat/ 返回结果 bin catlet conf lib logs version.txt 解释: bin mycat命令,启动重启停止等,可执行命令目录 catlet catket为mycat的一个扩展功能 conf mycat的配置信息,配置文件存放位置 lib mycat引用的jar包,mycat是java开发的 logs 日志文件存放路径,包括mycat的启动的日志和运行的日志 version.txt 版本说明 日志文件说明 /usr/local/mycat/logs/ warpper.log mycat启动日志 mycat.log mycat详细工作日志 查看/usr/local/mycat/conf/下的文件 ls /usr/local/mycat/conf/ 返回结果: autopartition-long.txt dnindex.properties partition-hash-int.txt sequence_db_conf.properties sharding-by-enum.txt auto-sharding-long.txt ehcache.xml partition-range-mod.txt sequence_distributed_conf.properties wrapper.conf auto-sharding-rang-mod.txt index_to_charset.properties rule.xml sequence_http_conf.properties zkconf cacheservice.properties log4j2.xml schema.xml sequence_time_conf.properties zkdownload dbseq.sql migrateTables.properties schema.xml.bak server.xml dbseq - utf8mb4.sql myid.properties sequence_conf.properties server.xml.bak 解释: server.xml mycat软件本身相关的配置文件,设置账号参数等 schema.xml mycat对应的物理数据库和数据库表的配置,读写分离,高可用,分布式策略定制,节点控制 rule.xml mycat分片(分库分表)规则配置文件,记录分片规则列表,使用方法等 配置文件说明 server.xml 存放mycat软件本身相关的配置文件,比如:链接mycat的用户,密码,数据库名称等 server.xml参数说明 user 用户配置节点 name 客户端登陆mycat的用户名,也就是客户端用来链接mycat的用户名 password 客户端登陆mycat的密码 schemas 数据库名。这里会和schema.xml中的配置关联,多个用逗号分开,例如db1,db2 privileges 配置用户针对表的增删改查的权限 readOnly mycat/逻辑库所具有的权限。true为只读,false为读写都有,默认为false 注意: server.xml文件里登录mycat的用户名和密码可以任意定义,这个账号和密码是为客户机登录mycat时使用的账号信息 逻辑库名(如上面的TESTDB,也就是登录mycat后显示的库名,切换这个库之后,显示的就是代理的真实mysql数据库的表)要在schema.xml里面也定义,否则会导致mycat服务启动失败! 这里只定义了一个标签,所以把多余的都注释了。如果定义多个标签,即设置多个连接mycat的用户名和密码,那么就需要在schema.xml文件中定义多个对应的库! 解释:server.xml .....省略 <user name="root" defaultAccount="true"> #链接mycat的用户名 <property name="password">123456</property> #链接mycat的密码 <property name="schemas">TESTDB</property> #数据库名要和schema.xml相对应 <property name="defaultSchema">TESTDB</property> # <!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 --> </user> ......省略 </mycat:server> 这里使用的的root,密码为123456,逻辑数据库为TESTDB,这些信息都可以自己随意定义,读写权限都有,没有针对表做任何特殊的权限 重点关注这段配置,其他默认即可 修改/usr/local/mycat/conf/schema.xml vim /usr/local/mycat/conf/schema.xml 把原有的内容全部删除掉,可以按dG删除掉全部的行 添加内容如下 <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema> <dataNode name="dn1" dataHost="localhost1" database="hellodb" /> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="host1" url="10.0.0.55:3306" user="mycat" password="123456"> <readHost host="host2" url="10.0.0.56:3306" user="mycat" password="123456" /> </writeHost> </dataHost> </mycat:schema>a 解释: <schema name="TESTDB" 逻辑数据库,这里可以写成你真实数据库的名称 <dataNode name="dn1" dataHost="localhost1" database="hellodb" /> database="hellodb 后端真实数据库 <writeHost host="host1" url="10.0.0.55:3306" user="mycat" password="123456"> 后端真实数据库主服务器,也就是可写的服务器,授权的用户是mycat密码123456 <readHost host="host2" url="10.0.0.56:3306" user="mycat" password="123456" /> 后端真实从服务器,也就是读服务器授权的用户是mycat密码123456 schema 标签用于定义 MyCat 实例中的逻辑库,name:后面就是逻辑库名MyCat 可以有多个逻辑库,每个逻辑库都有自己的相关配置。可以使用 schema 标签来划分这些不同的逻辑库。 checkSQLschema 这个属性默认就是false,官方文档的意思就是是否去掉表前面的数据库的称,”select * from db1.testtable” ,设置为true就会去掉db1。但是如果db1的名称不是schema的名称,那么也不会被去掉,因此官方建议不要使用这种语法。同时默认设置为false。 sqlMaxLimit 当该值设置为某个数值时。每条执行的 SQL 语句,如果没有加上 limit 语句,MyCat 也会自动的加上所对应的值。例如设置值为 100,执行”select * from test_table”,则效果为“selelct * from test_table limit 100”. dataNode 标签定义了 MyCat 中的数据节点,也就是我们通常说所的数据分片。一个 dataNode 标签就是一个独立的数据分片. Name 定义数据节点的名字,这个名字需要是唯一的 dataHost 该属性用于定义该分片属于哪个数据库实例 Database 该属性用于定义该分片属性哪个具体数据库实例上的具体库 dataHost 该标签定义了具体的数据库实例、读写分离配置和心跳语句 balance 负载均衡类型,目前的取值有4 种: “0”, 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。 “1”,全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。 ”2”,所有读操作都随机的在 writeHost、readhost 上分发。”3”,所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压writeType 1. writeType=”0”, 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties . writeType=”1”,所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。默认0就好了! dbType 指定后端连接的数据库类型,目前支持二进制的 mysql 协议,还有其他使用 JDBC 连接的数据库。例如:mongodb、oracle、spark 等. dbDriver 指定连接后端数据库使用的 Driver,目前可选的值有 native 和 JDBC。使用 native 的话,因为这个值执行的是二进制的 mysql 协议,所以可以使用 mysql 和 maridb。其他类型的数据库则需要使用 JDBC 驱动来支持。 switchType “-1” 表示不自动切换; “1” 默认值,自动切换; “2” 基于 MySQL 主从同步的状态决定是否切换心跳语句为 show slave status; “3” 基于 MySQL galary cluster 的切换机制(适合集群)(1.4.1)心跳语句为 show status like ‘wsrep%’. heartbeat 标签指明用于和后端数据库进行心跳检查的语句。 writeHost /readHost这 两个标签都指定后端数据库的相关配置,用于实例化后端连接池。唯一不同的是,writeHost 指定写实例、readHost 指定读实例。 在一个 dataHost 内可以定义多个 writeHost 和 readHost。但是,如果 writeHost 指定的后端数据库宕机,那么这个 writeHost 绑定的所有 readHost 都将不可用。另一方面,由于这个 writeHost 宕机,系统会自动的检测到,并切换到备用的 writeHost 上去。这两个标签的属性相同. host 用于标识不同实例,一般 writeHost 我们使用*M1,readHost 我们用*S1。 url 后端实例连接地址。Native:地址:端口 JDBC:jdbc的url password 后端存储实例需要的密码 user 后端存储实例需要的用户名字 weight 权重 配置在 readhost 中作为读节点的权重 有两个参数需要注意,balance和 switchType。其中,balance指的负载均衡类型,目前的取值有4种: 1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上; 2. balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2、S1、S2都参与select语句的负载均衡; 3. balance="2",所有读操作都随机的在writeHost、readhost上分发; 4. balance="3",所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力。 switchType指的是切换的模式,目前的取值也有4种: 1. switchType='-1' 表示不自动切换; 2. switchType='1' 默认值,表示自动切换; 3. switchType='2' 基于MySQL主从同步的状态决定是否切换,心跳语句为 show slave status; 4. switchType='3'基于MySQL galary cluster的切换机制(适合集群)(1.4.1),心跳语句为 show status like 'wsrep%'。 重启mycat mycat restart Mysq主里面授权mycat用户允许读写的权限 进入主数据库10.0.0.55 mysql -uroot -p123456 授权 grant all on *.* to mycat@'10.0.0.%' identified by '123456'; 在客户端测试10.0.050 先安装客户端链接工具 yum install mariadb -y 连接mycat mysql -uroot -p123456 -h 10.0.0.60 -P8066 执行查看命令 MySQL [(none)]> show databases; 返回结果 +----------+ | DATABASE | +----------+ | TESTDB | +----------+ 1 row in set (0.00 sec) 进入TESTDB use TESTDB 返回结果 MySQL [(none)]> use TESTDB Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed 查看 MySQL [TESTDB]> show tables; 返回结果 +-------------------+ | Tables_in_hellodb | +-------------------+ | classes | | coc | | courses | | scores | | students | | teachers | | toc | +-------------------+ 7 rows in set (0.00 sec)