mycat 实现读写mysql分离

 

服务器

IP

说明

Mycat

192.168.139.125

mycat服务器,连接数据库时,连接此服务器

database1

192.168.139.130

物理数据库1,真正存储数据的数据库

database2

192.168.139.131

物理数据库2,真正存储数据的数据库

1.什么是MYCAT

  • 一个彻底开源的,面向企业应用开发的大数据库集群
  • 支持事务、ACID、可以替代MySQL的加强版数据库
  • 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
  • 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
  • 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
  • 一个新颖的数据库中间件产品

配置mycat之前请做好准备工作,统一各个数据库的字符集.并且最好使用mysql5.6的版本进行配置.以免以为版本问题带来很多未知的麻烦!

 

2.安装mycat

Mycat的架构其实很好理解,Mycat是代理,Mycat后面就是物理数据库。和Web服务器的Nginx类似。对于使用者来说,访问的都是Mycat,不会接触到后端的数据库。

2.11.1 安装流程

安装mysql---->安装Java环境(mycat基于java) —> 下载mycat —> 新建mycat用户 —> 解压mycat —> 配置环境变量 —> 启动mycat

2.2 安装mysql:

可以参考我的这篇文档:https://blog.csdn.net/a1779078902/article/details/82461606

2.3 安装jdk

Mycat是用java开发的,所以需要在实验环境下安装java,官方建议jdk1.7及以上版本

下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

然后我们可以用xftp传到我们linux机器上面来

[root@knightlai]# mv jdk-8u181-linux-x64.tar.gz  /usr/local/src/
 
[root@knightlai src]# tar xzvf jdk-8u181-linux-x64.tar.gz 
jdk1.8.0_181/lib/visualvm/profiler/modules/org-netbeans-lib-profiler-common.jar
jdk1.8.0_181/lib/missioncontrol/
jdk1.8.0_181/lib/missioncontrol/plugins/
jdk1.8.0_181/lib/missioncontrol/plugins/org.eclipse.equinox.p2.operations.nl_zh_4.4.0.v20140623020002.jar
jdk1.8.0_181/lib/missioncontrol/plugins/org.eclipse.equinox.p2.repository.nl_zh_4.4.0.v20140623020002.jar
jdk1.8.0_181/lib/missioncontrol/plugins/org.eclipse.equinox.p2.touchpoint.eclipse_2.1.200.v20140512-1650.jar
jdk1.8.0_181/lib/missioncontrol/plugins/org.eclipse.e4.core.di.extensions_0.12.0.v20140417-2033.jar
jdk1.8.0_181/lib/missioncontrol/plugins/org.eclipse.core.databinding.property.nl_ja_4.4.0.v20140623020002.jar
jdk1.8.0_181/lib/missioncontrol/plugins/org.eclipse.jetty.security_8.1.14.v20131031.jar
......................................................................




[root@knightlai src]# mv jdk1.8.0_181/ /usr/local/jdk1.8

重点是在这里配置java环境,我之前就是因为java环境没有配置一直报错:

错误代码:

INFO   | jvm 1    | 2018/11/04 15:26:45 | Caused by: io.mycat.config.util.ConfigException: java.lang.NullPointerException

INFO   | jvm 1    | 2018/11/04 15:26:45 | Caused by: java.lang.NullPointerException

具体原因可能各有不同,这里只是我自已遇到的问题解决办法而已。

java环境:


[root@knightlai src]# vim /etc/profile

JAVA_HOME=/usr/lib/jdk1.8
CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar 
PATH=$JAVA_HOME/bin:$HOME/bin:$HOME/.local/bin:$PATH

//使变量立即生效
[root@knightlai src]# source /etc/profile
基本上这里没有报错说明java配置没有语法问题

[root@localhost logs]# java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

 

2.4 mycat安装

经过了前面的铺垫,下面我们的主角登场了,我们可以到下面的地址下载相应的版本

 下载mycat我这里用的是1.6

wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

解压
[root@localhost logs]#tar -zxvf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz
# 剪切到/usr/local下
[root@localhost logs]mv mycat /usr/local/

切换到mycat文件夹路径下
[root@localhost logs]cd /usr/local
# 将文件权限赋给mycat账号
[root@localhost logs]chown mycat:mycat -R mycat

3. 配置mycat

3.1 先配置server.xml

(一)先配置server.xml
找到这一段
    <user name="root">
                <property name="password">12345</property>
                <property name="schemas">TESTDB</property>
        </user>
        <user name="user">
                <property name="password">user</property>
                <property name="schemas">TESTDB</property>
                <property name="readOnly">true</property>
        </user>

这里配置了两个可以来连接的用户
用户1  root   密码12345   给予了此用户TESTDB数据库的权限
用户2  user   密码user   给予了此用户TESTDB数据库的只读权限

注意

    A : 这里的testdb 不一定是你数据库上的真实库名.可以任意指定.只要和接下来的schema.xml的配置文件中的库名统一即可

    B:这里的配置的用户名和密码,是我们 连接mycat的用户名和密码,和  schema.xml中配置的 连接真实mysql的用户名和密码 不一定一样

3.2 配置schema.xml

因为我们现在只做库的读写分离,没用分库 没用分表这些东西.

<?xml version="1.0"?>
<!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="zrlog" />
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="2"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
           <writeHost host="hostM1" url="192.168.139.130:3306" user="root" password="123456">
        <readHost host="hostS1" url="192.168.139.131:3306" user="root" password="123456" />

    </writeHost>
     </dataHost>
</mycat:schema>


配置文件详解:
一,  <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">

这里TESTDB 就是我们对外声称的我们有数据库的名称  必须和server.xml中的用户指定的数据库名称一致

添加一个dataNode="dn1" 是指定了我们这个库只在dn1上.没有进行分库

 

二, <dataNode name="dn1" dataHost="localhost1" database="realdb_test_name" />

这里只需要改database的名字 realdb_test_name 就是你真实数据库服务上的数据库名 .

根据你自己的数据库名进行修改.

 

三,<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">

 

这里只需要配置四个地方    balance="1"与writeType="0" ,switchType=”1”

a. 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 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有, 1.3 没有。

b. writeType 属性
负载均衡类型,目前的取值有 3 种:
1. writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个
writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
2. writeType="1",所有写操作都随机的发送到配置的 writeHost。
3. writeType="2",没实现。

c. switchType 属性

-1:表示不启用主从切换;

1:为默认值,自动切换;心跳检测语句,一般为select user();

2:基于主从同步的状态,决定是否切换,与show slave status心跳对应;
3:基于多住galary集群切换,与show status like 'wsrep%'对应;


d. Seconds_Behind_Master主从复制时延,当Seconds_Behind_Master>slaveThreshold时,读写分离筛选器会过滤掉此Slave机器,防止读到很久之前的旧数据


建议组合值:

    balance="1" writeType="0"   switchType="2" 

4.启动并测试mycat

4.1 启动Mycat

[root@localhost logs]#  /usr/local/mycat/bin/mycat start

4.2 测试连接mycat

[root@localhost logs]# mysql -h127.0.0.1 -uroot -p12345  -P8066
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.6.29-mycat-1.6-RELEASE-20161028204710 MyCat Server (OpenCloundDB)
//这里会显示我们现在连接的是mycat
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB   |
+----------+
1 row in set (0.00 sec)

 

 

 

 

 

 

 

 

mysql> show @@datasource;
+----------+--------+-------+-----------------+------+------+--------+------+------+---------+-----------+------------+
| DATANODE | NAME   | TYPE  | HOST            | PORT | W/R  | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD |
+----------+--------+-------+-----------------+------+------+--------+------+------+---------+-----------+------------+
| dn1      | hostM1 | mysql | 192.168.139.130 | 3306 | W    |      0 |    0 | 1000 |       0 |         0 |          0 |
| dn1      | hostS1 | mysql | 192.168.139.131 | 3306 | R    |      0 |    0 | 1000 |       0 |         0 |          0 |
+----------+--------+-------+-----------------+------+------+--------+------+------+---------+-----------+------------+
2 rows in set (0.02 sec)

 

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/a1779078902/article/details/83714323