在另外一篇文章,我保姆般的讲解了MySQL数据库搭建主从复制,现在我需要让我192.168.2.124上的MySQL主机来对外承担写入数据的任务,让我192.168.2.173上的MySQL从机来对外承担读取数据的任务,我用数据库中间件Mycat来实现这个功能。
一、安装Mycat
这里我把mycat安装到我的数据库主机所在的服务器上,也就是192.168.2.124这台机器,这是
linux下我就直接进入到local目录用wget下载了:
cd /usr/localwget http://dl.mycat.org.cn/1.6.7.4/Mycat-server-1.6.7.4-release/Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
你看,我的mycat文件夹里面已经下载下来了
然后解压到当前文件夹:
tar -zxvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
解压过后就会得到一个mycat文件夹,这样mycat就安装好了。进入这个文件夹吧,就是这样的:
二、配置Mycat
进入到conf目录下,里面就是一堆配置文件,图中框出来的三个文件是我们主要需要配置的
schema.xml 定义逻辑库,表、分片节点等内容
rule.xml 定义分片规则
server.xml 定义用户以及系统相关变量,如端口等
首先我们修改server.xml
vim server.xml
拉到这个文件的最下面,对这几行进行修改就行了:
改为:
# 连接mycat数据库的用户名为mycat
123456 # 连接mycat数据库的密码为123456
TESTDB # 创建一个逻辑数据库,名为TESTDB
完了过后顺便把上图中红框下面那个标签那6行配置给删了。
最后就是这样,记住你设置的用户名和密码:
然后我们修改schema.xml
改成这样就行了:
select user()
下面就是我机器上实际的样子:
至此mycat的重要配置就完成了,在正式启动mycat之前,我们还要验证一下我们的两台服务器上的数据库能不能够正常连接,只有保证了正常连接,我们的mycat才能正常工作,验证的方法是在我的192.168.2.124这台主机上分别远程连接我的两个物理数据库。如下:
mysql -uroot -p你物理数据库的密码 -h 192.168.2.124 -P 3306
mysql -uroot -p你物理数据库的密码 -h 192.168.2.173 -P 3306
注意,后面那个-P,P是大写的P
如果远程访问出错的话,有可能是没有开启远程访问权限,开启的方法是,通过无法访问的那台主机的命令行工具进入到mysql的命令行界面,然后执行以下命令:
grant all privileges on *.* to root@'无法访问的IP' identified by '物理数据库密码';
flush privileges;
然后应该就都能够远程连接了。
三、启动Mycat
进入到mycat的bin目录下,执行:
./mycat start
我的代码示例,可以看出,mycat已经启动成功了:
然后我们就要登陆到mycat去看看了:
mysql -umycat -p123456 -P8066 -h 192.168.2.124
# 我之前设置的mycat用户名就是mycat,密码是123456,所以上面的代码就能进入到我的mycat服务器
下面是我的真实代码示例,可以看出,成功进入mycat的命令行界面,跟mysql没有啥区别:
然后我进入之前创建的TESTDB逻辑库,由于这个逻辑库对应的物理库是testdb,而这个库里面有一张user表,那我就不客气了,直接插入一条数据试试:
insert into user values (3,@@hostname);
你看数据插入成功了,这条sql的神奇之处就是,它会在我的写主机和读主机上插入不同的数据,接下来我们用navicat来看看到底有没有数据:
很神奇,数据插入成功了,而且正如我所说,两台物理数据库的值是不一样的,你看看id为3的两条数据是不是不一样。
四、验证读写分离
还记得上面我的schema.xml配置文件吗?里面有一个参数叫balance,我设置的值是2(表示所有读操作都随机的在 writeHost、readhost 上分发。),这就是控制负载均衡的类型的:
负载均衡类型的值有4种:
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" # 所有读请求随机的分发到 readhost 执行,writeHost 不负担读压力。
接下来我就在mycat的命令行来读取一下数据试试,看看读操作到底是不是数据从writeHost、readhost 上分发的:
事实证明是对的,我两次读出来的数据不一样,来自两台物理数据库,读写分离搭建成功了。
当然我设置balance=2是为了验证读写分离,正常生产环境一主一从的话一般设置balance=3。