mycat实现数据库的读写分离

1. 一主一从

1.1 搭建

  1. 在node01上修改/etc/my.cnf的文件
#mysql服务唯一id,不同的mysql服务必须拥有全局唯一的id
server-id=1
#启动二进制日期
log-bin=mysql-bin
#设置不要复制的数据库
binlog-ignore-db=mysql
binlog-ignore-db=information-schema
#设置需要复制的数据库
binlog-do-db=chencc
#设置binlog的格式
binlog_format=statement

在这里插入图片描述

  1. 在node02上修改/etc/my.cnf文件
#服务器唯一id
server-id=2
#启动中继日志
relay-log=mysql-relay

在这里插入图片描述

  1. 重启mysql服务
    在这里插入图片描述

  2. 在node01上创建账户并授权slave

grant replication slave on *.* to 'root'@'%' identified by '123456';
--在进行授权的时候,如果提示密码的问题,把密码验证取消
set global validate_password_policy=0;
set global validate_password_length=1;

在这里插入图片描述

  1. 查看master的状态
    show master status
    在这里插入图片描述

  2. 在node02上配置需要复制的主机

CHANGE MASTER TO MASTER_HOST='192.168.109.132',MASTER_USER='root',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=154;
  1. 启动从服务器复制功能
start slave;
  1. 查看从服务器状态
show slave status\G

在这里插入图片描述

当执行完成之后,会看到两个关键的属性Slave_IO_Running,Slave_SQL_Running,当这两个属性都是yes的时候,表示主从复制已经准备好了,可以进行具体的操作了

1.2 验证

  1. 通过实际的操作来验证主从复制是否完成
--在node01上创建数据库
create database chencc;
--在node01上创建具体的表
create table mytbl(id int,name varchar(20));
--在node01上插入数据
insert into mytbl values(1,'zhangsan');
--在node02上验证发现数据已经同步成功,表示主从复制完成
  1. 通过mycat实现读写分离
-- 在mycat上执行
insert into mytbl values(2,@@hostname);

node01中
在这里插入图片描述
node02中
在这里插入图片描述

  • 修改配置文件,将balance=2(具体配置参数信息可看:https://blog.youkuaiyun.com/mengduan913/article/details/125503126?spm=1001.2014.3001.5501)
    在这里插入图片描述
-- 然后通过mycat进行数据的访问
select * from mytbl;

在这里插入图片描述

2. 双主双从

       在上述的一主一从的架构设计中,很容易出现单点的问题,所以我们要想让生产环境中的配置足够稳定,可以配置双主双从,解决单点的问题。

架构图如下所示
在这里插入图片描述

       在此架构中,可以让一台主机用来处理所有写请求,此时,它的从机和备机,以及备机的从机复制所有读请求,当主机宕机之后,另一台主机负责写请求,两台主机互为备机。

​ 主机分布如下:

编号角色ip主机名
1master1192.168.109.132node01
2slave1192.168.109.128node02
3master2192.168.109.129node03
4slave2192.168.109.130node04

2.1 搭建

  1. 修改node01上的/etc/my.cnf文件
#主服务器唯一ID
server-id=1
#启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库
binlog-do-db=chencc
#设置logbin格式
binlog_format=STATEMENT
# 在作为从数据库的时候, 有写入操作也要更新二进制日志文件
log-slave-updates
#表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1, 取值范围是1 .. 65535
auto-increment-increment=2
# 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535
auto-increment-offset=1
  1. 修改node02上的/etc/my.cnf文件
#从服务器唯一ID
server-id=2
#启用中继日志
relay-log=mysql-relay
  1. 修改node03上的/etc/my.cnf文件
#主服务器唯一ID
server-id=3
#启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库
binlog-do-db=chencc
#设置logbin格式
binlog_format=STATEMENT
# 在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
#表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1 .. 65535
auto-increment-increment=2
# 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535
auto-increment-offset=2
  1. 修改node04上的/etc/my.cnf文件
#从服务器唯一ID
server-id=4
#启用中继日志
relay-log=mysql-relay
  1. 所有主机重新启动mysql服务
  2. 在两台主机node01,node03上授权同步命令
GRANT REPLICATION SLAVE ON *.* TO 'root'@'%' IDENTIFIED BY '123456';
  1. 查看两台主机的状态
show master status;
  1. 在node02上执行要复制的主机
CHANGE MASTER TO MASTER_HOST='192.168.109.132',MASTER_USER='root',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=442;
  1. 在node04上执行要复制的主机
CHANGE MASTER TO MASTER_HOST='192.168.109.129',MASTER_USER='root',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=442;
  1. 启动两个从机的slave并且查看状态,当看到两个参数都是yes的时候表示成功
start slave;
show slave status\G;
  1. 完成node01跟node03的相互复制
--在node01上执行
CHANGE MASTER TO MASTER_HOST='192.168.109.129',MASTER_USER='root',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=442;
--开启slave
start slave;
--查看状态
show slave status\G
--在node03上执行
CHANGE MASTER TO MASTER_HOST='192.168.109.132',MASTER_USER='root',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=442;
--开启slave
start slave;
--查看状态
show slave status\G

2.2 验证

  • 在node01上执行如下sql语句:
create database chencc;
create table mytbl(id int,name varchar(20));
insert into mytbl values(1,'zhangsan');
--完成上述命令之后可以去其他机器验证是否同步成功
  • 进行读写分离的验证

在当前mysql架构中,我们使用的是双主双从的架构,因此可以将balance设置为1
     0:不开启读写分离机制,所有读操作都发送到当前可用的writeHost上
     1:全部的readHost和stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡
     2:所有读操作都随机的再writeHost、readHost上分发
     3:所有读请求随机的分发到writeHost对应readHost执行,writeHost不负担读压力,在之后的版本中失效。
参数writeType,表示写操作发送到哪台机器,此参数有两个值可以进行设置:
     writeType=0:所有写操作都发送到配置的第一个writeHost,第一个挂了切换到还生存的第二个
     writeType=1:所有写操作都随机的发送到配置的writehost中,1.5之后废弃,
需要注意的是:writehost重新启动之后以切换后的为准,切换记录在配置文件dnindex.properties中
参数switchType:表示如何进行切换:
     switchType=1:默认值,自动切换
     switchType=-1:表示不自动切换
     switchType=2:基于mysql主从同步的状态决定是否切换

在这里插入图片描述

--插入以下语句,使数据不一致
insert into mytbl values(2,@@hostname);
--通过查询mycat表中的数据,发现查询到的结果在node02,node03,node04之间切换,符合正常情况
select * from mytbl;
--停止node01的mysql服务
service mysqld stop
--重新插入语句
insert into mytbl values(3,@@hostname);
--开启node01的mysql服务
service mysqld start
--执行相同的查询语句,此时发现在noede01,node02,node04之间切换,符合情况
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值