mysql+mycat主主备份,读写分离。

	我的拓扑:
			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

mysql+mycat主主备份,读写分离。_第1张图片
二、从库配置
编辑/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;

mysql+mycat主主备份,读写分离。_第2张图片
红色框内一定要是两个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;

mysql+mycat主主备份,读写分离。_第3张图片
三、mycat配置
安装mycat
下载压缩包

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的配置
mysql+mycat主主备份,读写分离。_第4张图片
两张图片的关联项为
在这里插入图片描述
和下边图片的
在这里插入图片描述
这两个地方一定要填写一样的内容,不然关联不到,会导致mycat重启失败。
mysql+mycat主主备份,读写分离。_第5张图片
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的读写分离!!

你可能感兴趣的:(MySQL+mycat)