Mysql基于Mycat实现读写分离
Mycat
Mycat基于阿里开源的Cobar产品而研发 , 一个彻底开源的,面向企业应用开发的大数据库集群 , 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群 ,MYCAT并不依托于任何一个商业公司, 永不收费,永不闭源 !
下载mycat http://dl.mycat.io/1.6.7.1/ 环境 mysql 5.5 Mycat-server-1.6.7.1
server1 | 192.168.179.100 | master |
server2 | 192.168.179.99 | slave |
server3 | 192.168.179.101 | mycat |
下载Mycat,安装JDK
Mycat是用Java编写的,首先要安装JDK,没有JDK Java是跑不起来的。使用yum安装JDK,不推荐使用源码。
[root@localhost src]# yum list java-*
--查看你的yum源里面支持的JDK java-1.8.0-openjdk.x86_64
[root@localhost src]# yum install java-1.8.0-openjdk -y --安装1.8版本的JDK
[root@localhost src]# java -version
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (build 1.8.0_242-b08)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)
[root@localhost src]# tar -xvf Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz -C /usr/local/ --解压mycat到/usr/local下面
[root@localhost local]# cd mycat/ --可以看到mycat可以直接使用,不需要编译安装
[root@localhost mycat]# ls
bin catlet conf lib logs version.txt
[root@localhost ~]# echo "export PATH=/usr/local/mycat/bin:$PATH" > /etc/profile.d/mycat.sh
[root@localhost ~]# . /etc/profile.d/mycat.sh --配置环境变量,那么root用户就可以直接使用mycat命令了
修改server.xml文件
[root@localhost conf]# cd /usr/local/mycat/conf/ --来到mycat目录下修改其配置文件
server.xml 只针对mycat的配置,不针对数据库,配置数据库需要配置schema.xml
[root@localhost conf]# vim server.xml
server.xml配置用户登入信息,机登入到mycat数据节点的用户
修改默认配置,默认管理用户为mycat,可读可写,lutixiadb是逻辑库( 这里的TESTDB的名字可以随意写,只需与schema.xml中的一致即可)mycat和user用户是给到前端应用使用jdbc来做读写分离的
<user name="mycat" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">lutixiadb</property>
</user>
只读用户
<user name="user">
<property name="password">user</property>
<property name="schemas">lutixiadb</property>
<property name="readOnly">true</property>
</user>
修改schema.xml文件
[root@localhost conf]# vim schema.xml
配置schema.xml,将中间分库分表的去掉,然后逻辑库修改为lutixiadb(设置逻辑库以及数据库节点)这里配置分库分表,因只做读写分离所以这里暂不配置
<schema name="lutixiadb" checkSQLschema="false" sqlMaxLimit="100" dataNode='dn1'>
</schema>
配置数据库节点对应的后端真实的数据库(dataNode标签的主要作用是指明对哪一个数据库进行操作和管理)其中的dataHost属性对应的下面dataHost标签的name属性的值
<dataNode name="dn1" dataHost="localhost1" database="students" />
balance=1表示读写分离,writeType=0表示写操作集中到第一个写数据库,switchType=1代表自动切换
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
检测心跳的方法,可以用下面的语句,也可以用其他的,如果数据库宕机会切换到第二个writeHost
<heartbeat>select user()</heartbeat>
下面是读和写的mysql的ip和端口,以及登录的账号和密码
<writeHost host="hostM1" url="192.168.179.99:3306" user="mycat-proxy"password="123456">
<readHost host="hostS2" url="192.168.179.100:3306" user="mycat-proxy" password="123456" />
</writeHost>
<writeHost host="hostM2" url="192.168.179.100:3306" user="mycat-proxy" password="123456" />
</dataHost>
红色部分是如果192.168.179.99写库宕机了,那么192.168.179.100读库变成写库,让业务可以进行读写操作,而不是之前的只读操作
注意 dataHost节点的下面三个属性
balance, switchType, writeType
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”,所有读请求随机的分发到writeHost下的readhost执行,writeHost不负担读压力
writeType表示写模式
writeType=“0”,所有的操作发送到配置的第一个writehost
writeType=“1”,随机发送到配置的所有writehost
writeType=“2”,不执行写操作
switchType指的是切换的模式,目前的取值也有4种:
switchType=‘-1‘ 表示不自动切换
switchType=‘1‘ 默认值,表示自动切换
switchType=‘2‘ 基于MySQL主从同步的状态决定是否切换,心跳语句为show slave status
switchType=‘3‘ 基于MySQL galary cluster的切换机制(适合集群
主库对mysql-proxy用户进行授权
mysql> grant all on *.* to "mycat-proxy"@"192.168.179.101" identified by "123456"; --主库授权
Query OK, 0 rows affected (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.02 sec)
[root@localhost ~]# mysql -h192.168.179.99 -umycat-proxy -p --授权完成可以在192.168.179.101上登入做测试,看是否可以远程登入访问master数据库
Mycat启动已经报错解决
[root@localhost conf]# mycat start
Starting Mycat-server...
[root@localhost ~]# tail -f /usr/local/mycat/logs/wrapper.log --如果你碰到这个报错,就是你的schema.xml配置出现了问题
INFO | jvm 1 | 2020/03/25 10:35:09 | Caused by: io.mycat.config.util.ConfigException: schema lutixiadb didn't config tables,so you must set dataNode property!
STATUS | wrapper | 2020/03/25 10:35:11 | <-- Wrapper Stopped
上面错误的提示是因为我的dataNode='dn1'标签忘记加上去了
<schema name="lutixiadb" checkSQLschema="false" sqlMaxLimit="100" dataNode='dn1'>
[root@localhost conf]# netstat -tpln | grep 80 --这个端口是我们需要登入的端口,数据通信端口
tcp6 0 0 :::8066 :::* LISTEN 3219/java
[root@localhost conf]# netstat -tpln | grep 9066 --这个是管理端口
tcp6 0 0 :::9066 :::* LISTEN 3219/java
MYCAT连接测试读写分离
[root@localhost conf]# mysql -umycat -p123456 -P8066 -h192.168.179.101 --登入到mycat的server端,有点看起来像mysql端
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.29-mycat-1.6.7.1-release-20190627191042 MyCat Server (OpenCloudDB)
MySQL [(none)]> show databases; --可以看到逻辑数据库
+-----------+
| DATABASE |
+-----------+
| lutixiadb |
+-----------+
1 row in set (0.00 sec)
MySQL [(none)]> use lutixiadb; --选择该逻辑库
MySQL [lutixiadb]> show tables;
+--------------------+
| Tables_in_students |
+--------------------+
| t1 |
+--------------------+
1 row in set (0.01 sec)
MySQL [lutixiadb]> select * from t1; --查看数据
+------+----------+
| id | name |
+------+----------+
| 1 | xiaoming |
| 2 | xiaohua |
| 3 | lihua |
+------+----------+
3 rows in set (0.01 sec)
mysql> select * from t1; --跑到主库去查看数据
+------+----------+
| id | name |
+------+----------+
| 1 | xiaoming |
| 3 | lihua |
+------+----------+
2 rows in set (0.00 sec)
在主库查不到数据,通过代理可以查到,即可验证读写分离成功。
报错解决
MySQL [lutixiadb]> show tables;
ERROR 1184 (HY000): Invalid DataSource:0
可能是后端节点出现了问题,也有可能是代理端无法连上后端节点导致,可以先在代理端直接用授权用户名和密码登录后端数据库测试连接问题
[root@node3 conf]# mysql -umycat-proxy -h192.168.75.134 -p123456
ERROR 1129 (HY000): Host 'node3' is blocked because of many connection errors;
unblock with 'mysqladmin flush-hosts'
可以看到因为多次错误,代理端服务器被锁定了,所以也会出现上面的报错,在后端主库执行如下命令
mysqladmin flush-hosts
再次测试,一般问题就能解决。
目录 返回
首页