Mycat+Mysql的读写分离

在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/jre/lib/rt.jar:JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

  • export PATH=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安装

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.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日志文件的具体信息。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容