我的拓扑:
MySQL1 ,ip:192.168.1.19
MySQL2 ,ip:192.168.1.20
mycat , ip: 192.168.1.15
#我的MySQL和mycat都是用yum安装的,配置文件位置可能不同。
主备部署
安装数据库需要的yum源
yum install centos-release-openstack-pike
yum makecache
一、主库配置
两台MySQL和mycat保证在同一网段,可ping通,这是前提哦。
编辑/etc/my.cnf (MySQL的主配置文件)
log_bin=mysql-bin #开启二进制日志
server_id=1 #设置server id号
更改完配置文件记得重启MySQL服务;
systemctl restart mysqld
进入MySQL
mysql -uroot -p
创建同步账号,可以让MySQL2通过远程连接同步用的账户,不需要很多权限。
grant replication client,replication slave on *.* to rep@'从库ip' identified by 'root';
查看主库状态
show master status\G
二、从库配置
编辑/etc/my.cnf 在[mysqld]下边添加
log_bin=mysql-bin
server_id=2
relay_log=mysql-relay-bin #开启中继日志
log_slave_updates=1
read_only=1 #只读模式
#replicate-do-db = 123 指定那些库需要复制
#replicate-ignore-db = mysql 不复制的库
#replicate-ignore-db = performance_schema 不复制的库
#replicate-ignore-db = information_schema 不复制的库
#replicate-wild-do-table = 数据库名字.表名字 // 所要同步的数据库的单个表,可以加多行就是多个
从库关联主库
change master to master_host='主库ip',master_user='远程登录用户',master_password='配置一个密码';
检查从库状态
show slave status\G;
红色框内一定要是两个yes,否则无法同步,如果有一项或两项是NO,那么,重启主数据库,再次查看,可以试试多重启几次,如若还是不行,重新修改配置文件 /etc/my.cnf 再重启。
做主主备份不需要修改配置文件,只需要将主库的关联库改为从库。
stop slave;
先关闭slave才能进行下方配置。
创建远程账号
grant replication client,replication slave on *.* to rep@'从库ip' identified by 'root';
关联从库,也就是将从库当做主库
change master to master_host='主库ip',master_user='rep',master_password='root';
做完后重启数据库
systemctl restart mysqld
在进入数据库查看slave状态
slave status\G;
wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161
解压
tar -zvxf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
更改名字
mv mycat /data/
mycat解压后即可使用。
mycat安装完成后,目录如下:
bin mycat命令,启动、重启、停止等
catlet catlet为Mycat的一个扩展功能
conf Mycat 配置信息,重点关注
lib Mycat引用的jar包,Mycat是java开发的
logs 日志文件,包括Mycat启动的日志和运行的日志。
Mycat的配置文件都在conf目录里面,这里介绍几个常用的文件:
server.xml Mycat的配置文件,设置账号、参数等
schema.xml Mycat对应的物理数据库和数据库表的配置
rule.xml Mycat分片(分库分表)规则
[root@Mycat-node src]# cd /data/mycat/conf
[root@Mycat-node conf]# ll server.xml
-rwxrwxrwx. 1 root root 3740 Jul 25 12:19 server.xml
[root@Mycat-node conf]# ll schema.xml
-rwxrwxrwx. 1 root root 4667 Jul 31 02:54 schema.xml
编辑server.vml文件
.......
bo@123
mycat/property>
.......
重点关注上面这段配置,其他默认即可。
=======================================
参数 说明
user 用户配置节点
name 登录的用户名,也就是连接Mycat的用户名。
password 登录的密码,也就是连接Mycat的密码
schemas 数据库名,这里会和schema.xml中的配置关联,多个用逗号分开,例如需要这个用户需要管理两个数据库db1,db2,则配置db1,dbs
privileges 配置用户针对表的增删改查的权限
readOnly mycat逻辑库所具有的权限。true为只读,false为读写都有,默认为false。
server.xml文件里登录mycat的用户名和密码可以任意定义,这个账号和密码是为客户机登录mycat时使用的账号信息。
- 逻辑库名(如上面的mycat,也就是登录mycat后显示的库名,切换这个库之后,显示的就是代理的真实mysql数据库的表)要在schema.xml里面也定义,否则会导致mycat服务启动失败!
- 这里只定义了一个标签,所以把多余的都注释了。如果定义多个标签,即设置多个连接mycat的用户名和密码,那么就需要在schema.xml文件中定义多个对应的库!
仅仅进行读写分离的schema.xml配置(备份原来的schema.xml文件,清空,直接复制下面内容):不想要自动切换功能,即MySQL写节点宕机后不自动切换到备用节点:
[root@Mycat-node conf]# vim schema.xml
show slave status
实现主从自动切换的schema.xml配置:即MySQL写节点宕机后自动切换到备用节点(也就是把从机也配置成writeHosts):
[root@Mycat-node conf]# vim schema.xml
show slave status
上面配置中,balance改为1,表示读写分离。
以上配置达到的效果就是192.168.1.19为主库,192.168.1.20为从库
注意:要保证192.168.1.19和192.168.1.20机器能使用root/123456权限成功登录mysql数据库。同时,也一定要授权mycat机器能使用root/123456权限成功登录这两台机器的mysql数据库!!这很重要,否则会导致登录mycat后,对库和表操作失败!
(按照自己的IP改动)
server.xml的配置
两张图片的关联项为
和下边图片的
这两个地方一定要填写一样的内容,不然关联不到,会导致mycat重启失败。
mycat操作指令
[root@Mycat-node ~]# cd /data/mycat/bin/
[root@Mycat-node bin]#
[root@Mycat-node bin]# ./mycat start #开启
[root@Mycat-node bin]# ./mycat stop #关闭
[root@Mycat-node bin]# ./mycat restart #重启
[root@Mycat-node bin]# ./mycat status #查看启动状态
[root@Mycat-node bin]# ./mycat console #前台运行
[root@Mycat-node bin]# ./mycat pause #暂停
更改完配置文件后重启mycat
./mycat restart
上边启动的命令,如果报错也不会提示
需要进行前台运行
./mysql consoole
若报错,程序会自动退出,并显示错误信息,若正常,可能会卡顿较时间,需手动ctrl+c退出。
此时使用查看端口的命令查看mycat是否正常
Mycat服务端口默认是8066
[root@Mycat-node bin]# lsof -i:8066
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 5695 root 79u IPv6 37036522 0t0 TCP *:8066 (LISTEN)[root@Mycat-node conf]# lsof -i:9066
Mycat还有一个管理端口,默认是9066
[root@Mycat-node conf]# lsof -i:9066
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 5695 root 75u IPv6 37036520 0t0 TCP *:9066 (LISTEN)
在客户机远程登录Mycat登录mysql(将mycat启动起来后,远程连接,默认端口是8066,逻辑库名和账号密码就是在schema.xml里配置的信息。代码里用jdbc方式连接)
链接远程数据库:
mysql -h192.168.1.19 -P8066 uroot -p123456
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.29-mycat-1.6-RELEASE-20161028204710 MyCat Server (OpenCloundDB)
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+----------+
| DATABASE |
+----------+
| mycat |
+----------+
1 row in set (0.01 sec)
mysql> use mycat;
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> show tables;
+-----------------+
| Tables_in_kevin |
+-----------------+
| haha |
+-----------------+
1 row in set (0.00 sec)
mysql> select * from haha;
+----+-------------+
| id | name |
+----+-------------+
| 1 | wangshibo |
| 2 | linan |
| 3 | zhangminmin |
+----+-------------+
3 rows in set (0.00 sec)
mysql>
将mycat的日志输出级别改完debug(默认是info级别),在conf/log4j2.xml里配置,然后去查询去添加数据在/logs/mycat.log日志文件里查看sql被路由到了哪个服务器上
root@Mycat-node ~]# vim /data/mycat/conf/log4j2.xml
把
改成
重启mycat服务
[root@Mycat-node ~]# /data/mycat/bin/mycat restart
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...
[root@Mycat-node ~]# lsof -i:8066
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 18955 root 79u IPv6 3812293 0t0 TCP *:8066 (LISTEN)
登录mycat
[root@client-server ~]# mysql -h192.168.10.210 -P8066 -ubobo -pbo@123
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
....
mysql> show databases;
+----------+
| DATABASE |
+----------+
| mycat |
+----------+
1 row in set (0.00 sec)
mysql> use mycat;
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> show tables;
+-----------------+
| Tables_in_kevin |
+-----------------+
| haha |
+-----------------+
1 row in set (0.00 sec)
mysql> select * from haha;
+----+-------------+
| id | name |
+----+-------------+
| 1 | wangshibo |
| 2 | linan |
| 3 | zhangminmin |
+----+-------------+
3 rows in set (0.00 sec)
mysql>
通过mycat写入一条数据或读数据,查看sql被路由到了代理的哪个mysql服务器上了:
mysql> insert into kevin.haha values(4,"lihuan");
Query OK, 1 row affected (0.31 sec)
mysql> select * from haha;
+----+-------------+
| id | name |
+----+-------------+
| 1 | wangshibo |
| 2 | linan |
| 3 | zhangminmin |
| 4 | lihuan |
+----+-------------+
4 rows in set (0.01 sec)
mysql>
然后查看mycat.log的debug日志,观察mysql的sql被路由到了哪个服务器上了(下面日志中的192.168.10.203是远程客户机的ip地址)。
[root@Mycat-node ~]# tail -f /data/mycat/logs/mycat.log
.......
2018-07-31 08:50:12.616 DEBUG [$_NIOREACTOR-1-RW] (io.mycat.server.NonBlockingSession.execute(NonBlockingSession.java:110)) - ServerConnection
[id=2, schema=mycat, host=192.168.10.203, user=bobo,txIsolation=3, autocommit=true, schema=mycat]insert into kevin.haha values(4,"lihuan"),
route={
1 -> haha{insert into kevin.haha values(4,"lihuan")}
.......
.......
2018-07-31 08:50:12.617 DEBUG [$_NIOREACTOR-1-RW] (io.mycat.backend.mysql.nio.MySQLConnection.synAndDoExecute(MySQLConnection.java:448)) -
con need syn ,total syn cmd 1 commands SET names latin1;schema change:false con:MySQLConnection [id=6, lastTime=1532998212617, user=root,
schema=kevin, old shema=kevin, borrowed=true, fromSlaveDB=false, threadId=55, charset=latin1, txIsolation=3, autocommit=true, attachment=
haha{insert into kevin.haha values(4,"lihuan")}, respHandler=SingleNodeHandler [node=haha{insert into kevin.haha values(4,"lihuan")}, packetId=0],
host=192.168.10.205, port=3306, statusSync=null, writeQueue=0, modifiedSQLExecuted=true]
.......
.......
2018-07-31 08:50:14.358 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.server.NonBlockingSession.releaseConnection(NonBlockingSession.java:341)) -
release connection MySQLConnection [id=12, lastTime=1532998214353, user=root, schema=kevin, old shema=kevin, borrowed=true, fromSlaveDB=true,
threadId=29, charset=latin1, txIsolation=3, autocommit=true, attachment=haha{select * from haha}, respHandler=SingleNodeHandler [node=haha
{select * from haha}, packetId=8], host=192.168.10.206, port=3306, statusSync=null, writeQueue=0, modifiedSQLExecuted=false]
从日志中可以看出,"insert into …"插入语句路由到了192.168.10.205的主机上了,"select * …"的查询语句路由到了192.168.10.206的从机上了。
这就实现了mysql的读写分离!!