在MySQL中间件出现之前,对于MySQL主从集群,如果要实现其读写分离,一般是在程序端实现,这样就带来一个问题,即数据库和程序的耦合度太高,如果我数据库的地址发生改变了,那么我程序端也要进行相应的修改,如果数据库不小心挂掉了,则同时也意味着程序的不可用,而这对很多应用来说,并不能接受。
在这里,我们用三个实例组成MySQL主从集群,来验证MyCAT的读写分离功能。
1.环境:CentOS7;MyCAT1.6;MySQL:5.6
1.1 安装JDK,MyCAT依赖于JDK
yum search java-1.7.0 yum install xxxxx
配置环境变量
vim /etc/profile并添加:
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.141-2.6.10.1.el7_3.x86_64
export CLASSPATH=.:JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=JAVA_HOME/bin
使配置文件生效:source /etc/profile
测试:echo $JAVA_HOME
输入命令:java -version
1.2 MySQL安装
yum install wget
wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm(下载mysql的repo源)
sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm
sudo yum install mysql-server
mysql -u root ,可以看到系统报错,
解决授权:sudo chown -R root:root /var/lib/mysql
重启服务:systemctl restart mysqld.service
修改mysql的密码:set password for 'root'@'localhost'=password('root');
GRANT ALL PRIVILEGES ON . TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION; 授权允许远程登录
FLUSH PRIVILEGES;
退出mysql,重启mysql;
1.3 MyCAT安装
wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
cp -r mycat /usr/local/mycat
cd /usr/local/mycat/
chmod +x *
配置环境变量:
vi /etc/profile
在文件添加一行:export MYCAT_HOME=/usr/local/mycat
使修改生效:source /etc/profile
测试是否生效:echo $MYCAT_HOME
1.4 三台虚拟服务器,MyCAT部署到启宗一台服务器上,实现一主二从。
MyCAT :172.16.92.159 , Port:8066/9066
MySQL Master :172.16.92.159, Port:3306
MySQL Slave :172.16.92.151, Port:3306
MySQL Slave :172.16.92.152, Port:3306
MyCAT 8066:使用端口;9066:管理端口
2.实现主从复制
2.1 在主服务器上修改配置文件:
vi /etc/my.cnf
[mysqld]
# my add
server-id=1(数据库id号,注意唯一)
log-bin=mysql-bin(把更新的记录写到二进制文件中)
log-slave-updates(把更新的记录写到二进制文件中)
退出后重启服务:systemctl restart mysqld.service
2.2 在从1服务器上修改配置文件:
vi /etc/my.cnf
[mysqld]
# my add
server-id=2
relay-log=relay-bin(从主服务器读并记录到本地)
退出后重启服务:systemctl restart mysqld.service
2.3 在从2服务器上修改配置文件:
vi /etc/my.cnf
[mysqld]
# my add
server-id=3
relay-log=relay-bin(从主服务器读并记录到本地)
退出后重启服务:systemctl restart mysqld.service
2.4 在主服务器上创建有复制权限到账号
打开mysql执行命令:
grant replication slave on *.* to 'slave'@'172.16.92.%' identified by '1234';
刷新权限:flush privileges;
在主服务器上查看状态信息:
show master status;
2.5 分别在两台服务器上连接主服务器
打开mysql执行命令:
change master to master_host='172.16.92.159',master_user='slave',master_password='1234',master_log_file='mysql-bin.000043'(主服务器上的file),master_log_pos=716(主服务器上的position);
start slave;
show slave status\G;
解释:
host:master的ip地址;
user:master上创建的账户;
password:账户的密码;
其他要与master服务器查看的状态匹配
注意:Slave_IO_Running和 Slave_SQL_Running的状态必须都为yes,如果不是,一般是两个问题:防火墙没有关闭,第三步输入的不准确,需要回到第二步开始。
2.6另外一个从服务器同上
2.7 测试
- 在主服务器上创建表并插入数据
create table me(id int);
insert into me values(1);
- 在两台服务器上查看。
show databases;
use xxx;
select * from me;
3.MyCAT实现读写分离
配置文件非常多.如果只是简单配置在不同的服务器上进行读写分离只需要配置两个文件 server.xml 和 schema.xml
3.1 进入conf目录,修改schema.xml文件
配置解析:
schema:mycat的逻辑数据库
- table:定义了 MyCat 中的逻辑表,所有需要拆分的表都需要在这个标签中定义。
name:定义逻辑表的表名,这个名字就如同我在数据库中执行 create table 命令指定的名字一样。
dataNode:该属性的值需要和 dataNode 标签中 name 属性的值相互对应。
- dataNode:该属性用于绑定逻辑库到某个具体的 database 上
dataHost:该属性用于定义该分片属于哪个数据库实例的
database 属性:该属性用于定义该分片属性哪个具体数据库实例上的具体库
- dataHost :定义了具 体的数据库实例、读写分离配置和心跳语句。
name:唯一标识 dataHost 标签,供上层的标签使用。
balance:属性负载均衡类型,目前的取值有 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", 所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,如果从服务器都挂了,过一段延迟之后,自动读主服务器。注意 balance=3 只在 1.4 及其以后版本有, 1.3 没有。
- writeType:负载均衡类型,目前的取值有 3 种
writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
writeType="1",所有写操作都随机的发送到配置的 writeHost。
writeType=“2",没实现。
- switchType
-1 表示不自动切换
1 默认值,自动切换。
2 基于MySQL 主从同步的状态决定是否切换 心跳语句为 show slave status
3 基于MySQLgalarycluster的切换机制(适合集群)(1.4.1)心跳语句为 show status like ‘wsrep%’
- heartbeat :指明用于和后端数据库进行心跳检查的语句。
主从切换的语句必须是:show slave status
- writeHost 标签、readHost 标签
host:用于标识不同实例
url :后端实例连接地址
weight:权重 配置在 readhost 中作为读节点的权重(1.4后)
常见坑位1:此配置在主机宕机后,msyql数据库就瘫痪了。
解决:可以把其中一台从机分配成writeHost,再第一个writeHost(主机)宕机后自动切换至第二个writeHost。
常见坑位2:此时出现了新的问题,读数据可以,写数据也可以。在把第一个wirteHost启动后,新添加的数据并没有保存到主机中而是报存到了第二个writeHost(从机中)。
解决:官网表示讨论了很久,建议重新手工配置主从复制关系。原从配成现主,原主作为现从加入到集群中。
3.2 测试
可以把conf/log4j2.xml设置为debug模式。然后在插入新数据、查询数据的时候来观察log日志文件的具体信息。