MyCat2搭建Mysql一主二从读写分离最佳实践
1.环境准备
- 三台配备mysql数据库环境的Centos7.6虚拟机(master01(主机),slave01(从机01),slave02(从机02))。
- 关闭所有虚拟机的防火墙,防止搭建过程出现不必要的问题。
2.安装Mycat2
-
通过工具将mycat文件目录上传至主机服务器(master01)/opt目录
-
进入/opt/mycat/bin目录,将红框文件权限修改为777最高权限
-
在主机(master01)数据库新建一个库用于mycat登录物理映射的原型库(我这里新建库为dev)
-
修改mycat的prototype的配置
#进入mycat配置数据源目录 cd /opt/mycat/conf/datasources #修改配置文件 vim prototypeDs.datasource.json
将图中红框内容修改为自己的信息即可。
启动mycat之前需要确认prototype数据源所对应的mysql数据库配置,修改对应的user(用户),password(密码),url中的ip
-
启动mycat
#进入mycat bin目录 cd /opt/mycat/bin #启动 ./mycat start #查看状态 ./mycat status #停止 ./mycat stop #前台运行,可查看运行日志 ./mycat console #重启服务 ./mycat restart #暂停 ./mycat pause
-
使用远程工具连接验证是否启动成功
-
账户密码在users配置文件中配置
如果需要指定主机登录,可以修改ip为指定主机的ip。
-
如果登录失败,可以通过**./mycat console** 命令查看错误日志
-
如果出现连接超时导致登录失败,可以重新设置超时时间
在wrapper.conf中添加 wrapper.startup.timeout=300 //超时时间300秒
-
3.搭建主从复制
-
修改主机(master01)配置文件
#编辑数据库配置文件 vim /etc/my.cnf #在文件末尾添加 #【必须】主服务器唯一ID server-id=1 #【必须】启用二进制日志,指明路径 log-bin=minedb-bin #设置需要复制的库(可设置多个) binlog-do-db=test #设置不要复制的库(可设置多个) #binlog-ignore-db=mysql #设置logbin格式 binlog_format=STATEMENT
logbin三种格式:
- Statement(Statement-Based Replication,SBR):每一条会修改数据的 SQL 都会记录在 binlog 中。
- Row(Row-Based Replication,RBR):不记录 SQL 语句上下文信息,仅保存哪条记录被修改。
- Mixed(Mixed-Based Replication,MBR):Statement 和 Row 的混合体。
-
修改从机(slave01、slave02)配置文件
#编辑数据库配置文件 vim /etc/my.cnf #在文件末尾添加 #[必须]从服务器唯一ID server-id=2 #[可选]启用中继日志 relay-log=mydb-relay
server-id一定要唯一!!!!
-
登录主机(master01)mysql
-
创建用于主从复制的账户
#创建主从复制账户 CREATE USER 'slave1'@'%' IDENTIFIED BY '3CIH$AOu5W3'; GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'%'; #此语句必须执行。否则见下面。 ALTER USER 'slave1'@'%' IDENTIFIED WITH mysql_native_password BY '3CIH$AOu5W3'; flush privileges;
-
查看主机当前状态,记录File和Position
#查看主机当前状态 show master status;
注意:执行完后,不要再对主机master01做操作,否则会影响Postition偏移值
-
-
登录从机(slave01、slave02)mysql
-
执行sql创建主从复制关系
#创建主从复制关系 #主机ip CHANGE MASTER TO MASTER_HOST='ip', #创建用于主从复制的账户 MASTER_USER='用户名', MASTER_PASSWORD='密码', #主机log文件和偏移值 MASTER_LOG_FILE='',MASTER_LOG_POS=偏移值; #开启主从复制服务 start slave; #查看从服务器状态 show slave status;
查看从服务器状态,标红字段均为Yes表示配置成功
如果这里出现了No,不要慌,后面还有字段,往后查看标红字段报错信息
-
测试主从复制,切换到主机(master01)
#建库语句 CREATE DATABASE test; #建表语句 CREATE TABLE test1(id INT,NAME VARCHAR(50)); #插入数据 INSERT INTO test1 VALUES(1,"test01");
执行完以上sql,两个从机上也会出现相应的库和表结构,主从复制搭建完成。
-
-
如果需要重新设置主从关系在从机上执行
stop slave; reset master;
4.搭建读写分离
-
登录Mycat,添加数据源(使用注解方式设置)
#添加数据源 /*+mycat:createDataSource{"name":"rwSepw","url":"jdbc:mysql://192.168.230.145:3306/test?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true","user":"admin","password":"admin" } */; /*+mycat:createDataSource{"name":"rwSepr01","url":"jdbc:mysql://192.168.230.142:3306/test?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true","user":"admin","password":"admin" } */; /*+mycat:createDataSource{"name":"rwSepr02","url":"jdbc:mysql://192.168.230.144:3306/test?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true","user":"admin","password":"admin" } */; /*+ mycat:showDataSources{} */;
-
创建集群
#创建集群 #test集群 /*!mycat:createCluster{"name":"prototypeTest","masters":["rwSepw"],"replicas":["rwSepr01","rwSepr02"]} */; /*+ mycat:showClusters{} */;
-
创建逻辑库,配置数据源
-
创建逻辑库
#创建逻辑表 create database test;
-
移动到**/opt/mycat/conf/schemas/** 目录,修改test.schema.json文件
vim /opt/mycat/conf/schemas/test.schema.json #添加targetName字段,指定数据源,将创建的数据源集群设置给targetName字段 { "customTables":{}, "globalTables":{}, "normalProcedures":{}, "normalTables":{}, "schemaName":"test", "targetName":"prototypeTest", "shardingTables":{}, "views":{} }
-
-
重启Mycat
-
验证读写分离(登录Mycat)
-
在写主机数据库表test01中插入带系统变量数据,造成主从数据不一致
INSERT INTO test01 VALUES(2,@@hostname);
-
在Mycat里查询test01表,可以看到查询语句在主从三个主机间切换
-
至此,使用MyCat2搭建一主二从数据库集群完成。