准备工作
各节点配置主机名、IP、关闭防⽕墙、关闭selinux、同步时间
安装JDK
Mycat 是使⽤Java开发的,因此需要先安装JDK。
### 安装JDK
[root@node1 ~]# yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
### 验证JDK版本
[root@node1 ~]# java -version
openjdk version "1.8.0_342"
OpenJDK Runtime Environment (build 1.8.0_342-b07)
OpenJDK 64-Bit Server VM (build 25.342-b07, mixed mode)
安装MyCAT
事先将 Mycat 的⼆进制软件包 Mycat-server-1.6.tar.gz 上传到 Mycat节点的 /root ⽬录下
[root@node1 ~]# cp /opt/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz /root
### 将MyCAT软件包解压到/usr/local⽬录
[root@node1 ~]# tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
### 赋予mycat⽬录权限
[root@node1 ~]# chown -R 777 /usr/local/mycat/
### 添加Mycat服务的系统环境变量
[root@node1 ~]# echo export MYCAT_HOME=/usr/local/mycat/ >> /etc/profile
### 使环境变量⽣效
[root@node1 ~]# source /etc/profile
配置MyCAT读写分离
配置MyCAT实现读写分离需要修改两个配置⽂件。
* schema.xml :⽤于配置读写分离规则。它管理着逻辑库、分⽚表、分⽚节点和分⽚主机等信息。
* server.xml :⽤于配置⽤户访问规则。
配置读写分离规则
- 在这⾥定义⼀个逻辑库( schema)USERDB。
- 逻辑库 USERDB 对应数据库为 test(在部署主从数据库时已创建)。
- 设置数据库写⼊节点为主节点 192.168.137.102。
- 设置数据库读取节点为从节点 192.168.137.103。
[root@node1 ~]# vi /usr/local/mycat/conf/schema.xml
[root@node1 ~]# 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="USERDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn
1"></schema>
<dataNode name="dn1" dataHost="localhost1" database="test" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3" dbType=
"mysql" dbDriver="native" writeType="0" switchType="1" slaveThreshold="10
0">
<heartbeat>select user()</heartbeat>
<writeHost host="192.168.137.102" url="192.168.137.102:3306" user="root" p
assword="123456">
<readHost host="192.168.137.103" url="192.168.137.103:3306" user="root" pa
ssword="123456" />
</writeHost>
</dataHost>
</mycat:schema>
[root@node1 ~]# chown root:root /usr/local/mycat/conf/schema.xml
重要配置项含义如下。
- sqlMaxLimit: 配置默认查询数量。
- database: 为真实数据库名。
- balance=”0”: 不开启读写分离机制, 所有读操作都发送到当前可⽤的 writeHost 上。
- balance=”1”: 全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡, 简单来说,当双主双从模式(M1->S1, M2->S2, 并且 M1 与 M2 互为主备) , 正常情况下, M2、S1、S2 都参与 select 语句的负载均衡。
- balance=”2”: 所有读操作都随机的在 writeHost、 readhost 上分发。
- balance=”3”: 所有读请求随机地分发到 wiriterHost 对应的 readhost 执⾏, writerHost不负担读压⼒, 注意 balance=3 只在 1.4 及其以后版本有, 1.3 版本没有。
- writeType=”0”: 所有写操作发送到配置的第⼀个 writeHost, 第⼀个挂了需要切换到还 ⽣ 存 的第 ⼆ 个 writeHost , 重 新 启 动 后 已 切 换 后 的 为 准 , 切 换 记 录 在 配 置 ⽂ 件dnindex.properties 中。
- writeType=”1”: 所有写操作都随机的发送到配置的 writeHost。
配置⽤户访问规则
修改server.xml ⽂件中root ⽤户的访问密码与数据库,密码设置为 123456, 访问 Mycat 的逻辑库为USERDB。
[root@node1 ~]# vi /usr/local/mycat/conf/server.xml
......
### 保留该部分以上内容,修改以下内容
<user name="root">
<property name="password">123456</property>
<property name="schemas">USERDB</property>
### 删除以下内容
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>
运⾏MyCAT
通过命令启动 Mycat 数据库中间件服务, 启动后使⽤ ss -nltp 命令查看虚拟机端⼝开放情况, 如果有开放 8066 和 9066 端⼝, 则表示 Mycat 服务启动成功。
Mycat服务默认的数据端⼝是8066,⽽9066端⼝则是Mycat管理端⼝,⽤于管理Mycat的整个集群状态。
[root@node1 ~]# /usr/local/mycat/bin/mycat start
Starting Mycat-server...
[root@node1 ~]# ss -nltp
State Recv-Q Send-Q Local Address:Port Peer Addre
ss:Port
LISTEN 0 128 *:80 *:* users:(("nginx",pid=9852,fd=6),("nginx",pid=9359,fd=6))
LISTEN 0 128 *:22 *:* users:(("sshd",pid=872,fd=3))
LISTEN 0 100 127.0.0.1:25 *:* users:(("master",pid=1033,fd=13))
LISTEN 0 1 127.0.0.1:32000 *:* users:(("java",pid=16043,fd=4))
LISTEN 0 100 [::]:9066 [::]:* users:(("java",pid=16043,fd=74))
LISTEN 0 50 [::]:34986 [::]:* users:(("java",pid=16043,fd=58))
LISTEN 0 128 [::]:80 [::]:* users:(("nginx",pid=9852,fd=7),("nginx",pid=9359,fd=7))
LISTEN 0 50 [::]:45811 [::]:* users:(("java",pid=16043,fd=56))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=872,fd=4))
LISTEN 0 100 [::1]:25 [::]:* users:(("master",pid=1033,fd=14))
LISTEN 0 50 [::]:1984 [::]:* users:(("java",pid=16043,fd=57))
LISTEN 0 100 [::]:8066 [::]:* users:(("java",pid=16043,fd=78))
如果不能正常启动服务可查看mycat⽇志
[root@node1 ~]# cat /usr/local/mycat/logs/wrapper.log
验证读写分离
mycat可以认为是⼀个MySQL服务器,对主从两个节点的操作,可以简单认为是对mycat节点的操作。
根据前⾯的配置,操作主从节点的test数据库,相当于对mycat节点的USERDB数据库进⾏操作。
可以通过MySQL命令⾏登录数据端⼝(8066)执⾏相应的数据操作SQL语句进⾏管理,也可以通过
MySQL命令⾏登录管理端⼝(9066)执⾏相应的管理SQL语句进⾏管理,也可以通过JDBC⽅式进⾏远
程连接管理。
### 安装mariadb客户端
[root@node1 ~]# yum install -y mariadb
### 连接mycat服务器,操作USERDB逻辑库
[root@node1 ~]# mysql -h127.0.0.1 -P8066 -uroot -p123456
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.29-mycat-1.6-RELEASE-20161028204710 MyCat Server (Open
CloundDB)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statem
ent.
MySQL [(none)]> show databases;
+----------+
| DATABASE |
+----------+
| USERDB | ###数据库提前创建好了
+----------+
1 row in set (0.00 sec)
MySQL [(none)]> use USERDB;
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 [USERDB]> show tables;
+----------------+
| Tables_in_test |
+----------------+
| company |
+----------------+
1 row in set (0.00 sec)
MySQL [USERDB]> select * from company;
+----+----------+------+
| id | name | addr |
+----+----------+------+
| 1 | facebook | usa |
+----+----------+------+
1 row in set (0.04 sec)
MySQL [USERDB]> insert into company values(2,"bastetball","usa");
Query OK, 1 row affected (0.01 sec)
通过 show @@datasource; 语句可查询数据库读写操作的分离信息。
* 所有的写操作 WRITE_LOAD 数都在 192.168.137.102 主数据库节点上。
* 所有的读取操作READ_LOAD 数都在 192.168.137.103 主数据库节点上。
由此可⻅, 数据库读写操作已经分离到192.168.137.102 和192.168.137.103节点上了。
# 查看mycat的数据源
[root@node1 ~]# mysql -h127.0.0.1 -P9066 -uroot -p123456 -e 'show @@datasource;'
+----------+-----------------+-------+-----------------+------+------+--------+
------+------+---------+-----------+------------+
| DATANODE | NAME | TYPE | HOST | PORT | W/R | ACTIVE | IDLE | SIZE | EXECUTE |
READ_LOAD | WRITE_LOAD |
+----------+-----------------+-------+-----------------+------+------+--------+-
-----+------+---------+-----------+------------+
| dn1 | 192.168.137.102 | mysql | 192.168.137.102 | 3306 | W | 0 | 10 | 1000 | 67 | 0 | 1 |
| dn1 | 192.168.137.103 | mysql | 192.168.137.103 | 3306 | R | 0 | 6 | 1000 | 72 | 11 | 0 |
+----------+-----------------+-------+-----------------+------+------+-----