用户在使用WEB服务时,读和写的需求往往存在差异。比如电商网站,读的操作往往比写的操作多出好几倍。另一方面,若能将WEB服务器上的数据库进行隐藏,数据的安全性将得到大幅提高。
读写分离正可以达到这种效果。如上如,当用户向WEB服务器发送写请求时,WEB服务器将通过读写分离机制将写操作转移给指定的写服务器去执行,反之,读操作请求将交给读服务器去执行。
本文将介绍Mycat实现Mysql数据库的读写分离。
一.配置JAVA环境
从网站http://www.oracle.com/technetwork/java/javase/overview/index.html
下载JDK,将其解压到/usr/local目录下面:
tar xf jdk-8u91-linux-x64.tar.gz -C /usr/local/
为了方便操作,为其创建软链接:
ln -s /usr/local/jdk1.8.0_91/ /usr/local/java
将JAVA环境变量写入/etc/profile文件中:
[root@mycat ~]# tail -3 /etc/profile
JAVA_HOME=/usr/local/java
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME PATH
(修改变量,让新增的JAVA环境优先使用)
[root@mycat ~]# source /etc/profile
查看是否配置成功:
[root@mycat ~]# env |grep JAVA
JAVA_HOME=/usr/local/java
# java -version 查看JAVA版本
二. 配置Mycat.
解压mycat到/usr/local
主要关注两个配置文件,其一:
server.xml
usr/local/mycat/conf/server.xml 用来配置客户端如何链接mycat:
80
81
82
schema.xml
usr/local/mycat/conf/schema.xml
select user()
该配置文件中留意以下字段:
balance 属性
负载均衡类型,目前的取值有 3 种:
1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
2. balance="1", 全部的 readHost 与 writeHost 都参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2
互为主备) 都参与 select 语句的负载均衡。
3. balance="2", 所有读操作都随机的在 writeHost、readhost 上分发。
4. balance="3", 所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。
writeType 属性
1. writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,以切换后的为准.
2. writeType="1",所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。
DBtype: 数据库类型
DBdriver:数据库驱动
switch type:数据类型转换
slave Threshold :从机数量限制
三. 准备Mycat连接的用户及权限
在读、写主机的mysql数据库内分别创建db1库。
(在读与写的主机上分别创建schema.xml内所设置的用户与密码)
mysql>grant all on db1.* to 'writeuser'@'192.168.2.114' identified by '123456';(写主机:192.168.2.112)
mysql> flush privileges;
mysql>grant all on *.* to 'readuser'@'192.168.2.114' identified by '123456';(读主机:192.168.2.113)
mysql> flush privileges;
在安装mycat的机器上实验这两个账号是否可用
# mysql -h'192.168.2.112' -uwriteuser -p'123456'
# mysql -h'192.168.2.113' -ureaduser -p'123456'
启动Mycat
#/usr/local/mycat/bin/mycat start
#ps aux |grep mycat 和 #netstat -tnlp |grep java(查看进程是否起来了)
#ss -tnlp |grep java (查看java对应端口)
不成功的原因:首先考虑内存是否够用(free -m查看一下),另外检查配置文件。
如果不知道哪里出错了,去查看usr/local/mycat/logs/mycat.log
登陆mycat账户进行测试:
格式:#mysql -hmycat -uroot -p123456 -P8066
这里mycat是指搭载Mycat服务的服务器IP地址。
-u和-p是在server.xml文件中创建的用户名和密码。
-P8066代表Mycat的端口。
#mysql -h192.168.2.114 -uwuyang -p123456 -P8066
四. 测试:
在安装有Mycat的主机上创建table A1自己是看不见的,只能在写主机上查看到。
另外,倘若在读主机上创建table B1,那么在安装有Mycat的主机上查看table时,便只能看到B1。
这足以说明,Mycat能实现WEB服务器上数据的隐藏,以及读写分离。
图一:Mycat主机上无法显示db1,只显示在Schema中定义的SG。并且自己创建表后自己无法查询到。
图二:读主机上创建表db1.B123。
图三:Mycat主机上能查询到读主机上创建的表B123。
此外,如果想在Mycat主机中创建表A后能在读主机上及时查询。需要使用AB复制技术。可参阅以下博文:
https://blog.csdn.net/Ezra1991/article/details/88046271