me小怪兽

导航

MyCAT实现数据库读写分离

官方网站:http://www.mycat.io/

======================================================
Mycat数据库中间件对于前端应用程序连接时会提供一套用户名和密码以及一个虚拟数据库名,这个虚拟数据库名可以是后端真实数据库中存在的,也可以是不存在的。最终前端应用程序要操作后端的真实数据库,连接的是mycat的虚拟数据库,由mycat连接真实数据库。mycat软件是用java编写的,所以需要java的运行环境,运行环境为jdk。


环境描述 :
192.168.122.105 node01 master
192.168.122.121 node01 master
192.168.122.137 node02 slave
192.168.122.103 mycat

准备工作:
关闭防火墙、selinux、同步时间,设置主机名,解析主机名

一、部署node01和node02的主从复制(略)

二、部署MyCAT

部署jdk环境
1、卸载系统自带jdk
[root@mycat ~]# rpm -qa | grep -E 'gcj|jdk'
[root@mycat ~]# rpm -e --nodeps java-1.8.0-openjdk-headless java-1.8.0-openjdk java-1.7.0-openjdk java-1.7.0-openjdk-headless

2、安装mycat运行环境——jdk
[root@mycat ~]# tar xf jdk-8u91-linux-x64.tar.gz -C /usr/local //1.8..0_91版本
[root@mycat ~]# ln -s /usr/local/jdk1.8.0_91 /usr/local/java

[root@mycat ~]# vim /etc/profile
export JAVA__HOME=/usr/local/java
export PATH=$PATH:$JAVA__HOME/bin
[root@mycat ~]# source /etc/profile

[root@mycat ~]# java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)

部署mycat
1、安装并启动MyCAT
[root@mycat ~]# useradd mycat
[root@mycat ~]# tar xf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
[root@mycat ~]# chown -R mycat.mycat /usr/local/mycat/

[root@mycat ~]# vim /etc/profile
export MYCAT_HOME=/usr/local/mycat
[root@mycat ~]# source /etc/profile

[root@mycat mycat]# ll
总用量 16
drwxr-xr-x 2 root root 4096 8月 1 17:11 bin
drwxrwxrwx 2 root root 6 3月 1 2016 catlet
drwxrwxrwx 4 root root 4096 8月 1 17:11 conf
drwxr-xr-x 2 root root 4096 8月 1 17:11 lib
drwxrwxrwx 2 root root 6 10月 28 2016 logs
-rwxrwxrwx 1 root root 217 10月 28 2016 version.txt
注释:
conf:java写的配置文件大多以xml为结尾
conf/schema.xml:虚拟数据库对应后端真实数据的ip和真正数据库的名字
conf/server.xml:mycat呈现给应用程序的虚拟库名、连接的用户名和密码
logs/wrapper.log:mycat的日志文件

[root@mycat ~]# /usr/local/mycat/bin/mycat start
Starting Mycat-server...
[root@mycat ~]# netstat -antp | grep -E "8066|9066"
tcp6 0 0 :::9066 :::* LISTEN 3181/java
tcp6 0 0 :::8066 :::* LISTEN 3181/java

8066端口:应用程序以及开发人员写代码连接的都是mycat8066端口

2、配置MyCAT实现读写分离
[root@mycat mycat]# cp conf/server.xml{,.bak}
[root@mycat mycat]# cp conf/schema.xml{,.bak}

[root@mycat ~]# vim /usr/local/mycat/conf/server.xml
提供应用程序连接mycat使用的虚拟用户名和密码以及虚拟库名,多余的用户名行需要删掉,80行左右
<user name="admin">
<property name="password">redhat</property>
<property name="schemas">game</property>
</user>

[root@mycat ~]# vim /usr/local/mycat/conf/schema.xml
定义虚拟数据库,虚拟数据库关联数据节点,数据节点中定义真实数据库的名字;同时dataNode还需要关联数据主机,数据主机中分别定义了真正后端数据库的端口号和ip以及连接数据库的用户名和密码
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="">http://io.mycat/">
scheme name:虚拟数据库名,和方才写的名字一样
<schema name="game" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
多个数据库,复制上两行修改库名即可,
虚拟数据库要关联dataNode,定义真实数据库的名字和ip信息
<dataNode name="dn1" dataHost="localhost1" database="game" />
balance="1",表示开启读写分离
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat> //mycat检测后端服务器是否存活的方法
<!-- can have multi write hosts -->
下面定义写主机和读主机,mycat连接master做写操作,连接slave做读操作
<writeHost host="hostM1" url="192.168.122.105:3306" user="mycatuser" password="Www.1.com">
自定义主机名,修改url为ip:3306,修改连接主机的用户名和密码,需要在主机上创建
<!-- can have multi read hosts -->
<readHost host="hostS2" url="192.168.1.137:3306" user="mycatuser" password="Www.1.com" />
</writeHost>
<writeHost host="hostM2" url="192.168.122.121:3306" user="mycatuser"
password="Www.1.com">
<!-- can have multi read hosts -->
<readHost host="hostS3" url="192.168.1.137:3306" user="mycatuser" password="Www.1.com" />
</writeHost>
</dataHost>
</mycat:schema>


sever.xml文件中定义schema_name
schema.xml文件中定义dataNode,一个dataNata对应一个dataHost,一个dtaHost对应一个database


[root@mycat ~]# cat /usr/local/mycat/conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="">http://io.mycat/">

<schema name="game" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="localhost1" database="game" />
<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="192.168.122.105:3306" user="mycatuser"
password="Www.1.com">
<readHost host="hostS2" url="192.168.1.137:3306" user="mycatuser" password="Www.1.com" />
</writeHost>

<writeHost host="hostM2" url="192.168.122.121:3306" user="mycatuser"
password="Www.1.com">
<readHost host="hostS3" url="192.168.1.137:3306" user="mycatuser" password="Www.1.com" />
</writeHost>
</dataHost>
</mycat:schema>
[root@mycat ~]#

balance 属性
1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的writeHost 上。
2. balance="1", 全部的 readHost 与 stand by writeHost备用写主机参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2
互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。
4. balance="2", 所有读操作都随机的在 writeHost、readhost 上分发。
5. balance="3", 所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。

writeType 属性
1. writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后以切换后的为准.
2. writeType="1",所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。


在后端任意数据库创建允许mycat连接的用户(主从会自动同步)
mysql> GRANT all ON *.* TO "mycatuser"@"%" IDENTIFIED BY "Www.1.com";
mysql> FLUSH PRIVILEGES;


[root@mycat ~]# /usr/local/mycat/bin/mycat restart
[root@mycat ~]# netstat -antp | grep -E "8066|9066"
tcp6 0 0 :::9066 :::* LISTEN 3873/java
tcp6 0 0 :::8066 :::* LISTEN 3873/java


测试读写分离
[root@node02 ~]# mysql -u admin -p -h 192.168.122.103 -P 8066
Enter password: redhat
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.29-mycat-1.6-RELEASE-20161028204710 MyCat Server (OpenCloundDB)
mysql> show databases; //查看到虚拟数据库game库

mysql> use game;
mysql> show tables; //看到的表是实际数据库中真实的表

mysql> insert into account values(1,"haha"); //在表中插入数据,在从服务器上查看数据









posted on 2022-11-21 19:26  me小怪兽  阅读(291)  评论(0编辑  收藏  举报