主机 | IP |
---|---|
Master | 192.168.100.23 |
Slave | 192.168.100.26 |
Mycat | 192.168.100.27 |
准备工作
所有主机关闭防火墙和selinux
systemctl stop firewalld setenforce 0
mycat需要java7以上版本,这里java的版本是1.8,大体说一下步骤,首先下载java1.8的包,然后解压移动到/usr/local,改名为java,然后修改/etc/profile,最后使其生效。
tar xf jdk-8u191-linux-x64.tar.gz mv jdk1.8.0_191/ /usr/local/java vim /etc/profile #末尾添加这两行 export JAVA_HOME=/usr/local/java export PATH=$PATH:$JAVA_HOME/bin source /etc/profile
[root@localhost ]# java -version java version "1.8.0_191" Java(TM) SE Runtime Environment (build 1.8.0_191-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
下载mycat,上传到服务器,解压移动到/usr/local/,创建一个mycat用户,并对mycat目录下进行授权
useradd -M -s /sbin/nologin mycat chown -R mycat:mycat /usr/local/mycat/ [root@localhost ~]# cd /usr/local/mycat/ [root@localhost mycat]# ll 总用量 16 drwxr-xr-x. 2 mycat mycat 190 1月 6 12:18 bin drwxrwxrwx. 2 mycat mycat 6 2月 13 2019 catlet drwxrwxrwx. 4 mycat mycat 4096 1月 7 11:44 conf drwxr-xr-x. 2 mycat mycat 4096 1月 6 12:18 lib drwxr-xr-x. 3 mycat mycat 75 1月 6 19:55 logs drwxr-xr-x. 2 mycat mycat 6 1月 6 14:10 tmlogs -rwxrwxrwx. 1 mycat mycat 185 2月 13 2019 version.txt -rw-r--r--. 1 mycat mycat 665 1月 6 14:09 wrapper.log
若没有logs目录的话,可以手动创建一个,不然mycat启动会报错
Mycat除了做读写分离外还能做分库分表的操作,这里只说一下读写分离的配置,主要就是修改conf下schema.xml和server.xml
cd /usr/local/mycat/conf vim schema.xml <?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="aaa" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn01"> </schema> <dataNode name="dn01" dataHost="dh1" database="aaa" /> <dataHost name="dh1" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native"> <heartbeat>select user()</heartbeat> <writeHost host="master" url="192.168.100.23:3306" user="root" password="123456"> <readHost host="slave" url="192.168.100.26:3306" user="root" password="123456"></readHost> </writeHost> </dataHost> </mycat:schema>
简单解释一下
schema标签中的name指的是一个逻辑库,个人建议和真实库名相同;dataNode是节点,用的是dn01节点,与下面相对应
dataNode标签中的name来定义节点名称,dataHost是指采用的dh1主机,database是采用的库名,这里是真实库名,要有这个库才可以
dataHost 标签中定义了虚拟主机的名称为dh1,balance=3是指的是开启读写分离,writeHost 是负责写的主机,子标签readHost 是指的负责读操作的主机,url格式为数据库的IP:端口,后面是数据库的连接账号和密码
server.xml文件配置比较简单,只需要注意schemas要对应schema.xml文件中schema标签中的name
[root@localhost conf]# vim server.xml <user name="root" defaultAccount="true"> <property name="password">123456</property> <property name="schemas">aaa</property>
然后启动mycat
[root@localhost mycat]# ./bin/mycat start Starting Mycat-server... netstat -lnpt tcp6 0 0 :::8066 :::* LISTEN 1573/java tcp6 0 0 :::9066 :::* LISTEN 1573/java
9066为管理端口,8066为正常连接端口
在这里我出了一个错 ,能看到aaa库,但进去很慢,就算进去了,也看不到表,网上乱七八糟的,反正我是这样做的,主从上都做了
mysql>use mysql; mysql>update user set host = '%' where user ='root'; select user,host from user, mysql>select 'host','user' from user where user='root'; mysql>quit
然后就行了。
不过我估计是因为主库没创建mycat所登陆的用户导致的
然后进行测试
master和slave的主从复制就不做了,本次只是看读写分离的效果
master
create databases aaa; create table user(ID int(10),NAME int(10)); insert into user values('1','abc'); select * from aaa.user; +------+------+ | ID | NAME | +------+------+ | 1 | 0 | +------+------+
slave
create databases aaa; create table user(ID int(10),NAME int(10)); insert into user values('2','2222'); select * from user; +------+------+ | ID | NAME | +------+------+ | 2 | 2222 | +------+------+
登录进行读写分离测试
mysql -uroot -p123456 -P8066 -h192.168.100.27 select * from aaa.user; +------+------+ | ID | NAME | +------+------+ | 2 | 2222 | +------+------+ insert into aaa.user values('3','3333'); Query OK, 1 row affected (0.19 sec) select * from aaa.user; +------+------+ | ID | NAME | +------+------+ | 2 | 2222 | +------+------+
但是查看Master
select * from aaa.user; +------+------+ | ID | NAME | +------+------+ | 1 | 0 | | 3 | 3333 | +------+------+