前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用数据库中间件Mycat实现读写分离(双主双从)

使用数据库中间件Mycat实现读写分离(双主双从)

原创
作者头像
不凡
修改2021-10-29 14:08:37
1.2K0
修改2021-10-29 14:08:37
举报
文章被收录于专栏:运维小郭运维小郭

我们接着上一个文档继续做!由于还要用到上面装的mysql数据库,在这个进行一些配置

首先删除数据库testdb,然后关闭slave并重置 (在两台mysql上都要执行)

代码语言:txt
复制
drop database testdb
stop slave
reset master

接下来我们开始新的章节,在这一章节里我们会实现mysql的双主双从的读写分离(高可用)。

前面我们已经在192.168.10.1和192.168.10.2上搭建的mysql,接下来我们在192.168.10.3和192.168.10.4上搭建mysql

服务规划:

角色

IP地址

主机名

master1

192.168.10.1

Master1

slave1

192.168.10.2

Slave1

master2

192.168.10.3

Master1

slave2

192.168.10.4

Slave2

一. 准备前置环境(搭建msyql)

在192.168.10.3和192.168.10.4上搭建mysql服务

代码语言:txt
复制
yum install -y mariadb-server mariadb
systemctl start mariadb && systemctl enable mariadb
#进入/etc/my.cnf
添加:
[mysqld]
skip-grant-tables
重启mysql
systemctl restart mariadb
mysql -uroot -p
回车
设置root密码为
UPDATE mysql.user SET password = PASSWORD('123456') WHERE user = 'root';
exit

#进入/etc/my.cnf
在[mysqld]的段注释掉:skip-grant-tables 保存并且退出vi。
重启mysql
systemctl restart mariadb
##授权
mysql -uroot -p123456
grant all privileges on *.* to root@'%' identified by '123456';
grant all privileges on *.* to root@'localhost' identified by '123456';
flush privileges;
exit

##验证数据库访问情况(在192.168.10.1上)
mysql -uroot -p123456 -h 192.168.10.1 -P 3306 
mysql -uroot -p123456 -h 192.168.10.2 -P 3306
mysql -uroot -p123456 -h 192.168.10.3 -P 3306 
mysql -uroot -p123456 -h 192.168.10.4 -P 3306

二.修改配置文件

1.修改master1(192.168.10.1)的配置文件

代码语言:txt
复制
修改配置文件:vim /etc/my.cnf 

#主服务器唯一ID 
server-id=1 
#启用二进制日志 
log-bin=mysql-bin 
#设置不要复制的数据库(可设置多个) 
binlog-ignore-db=mysql 
binlog-ignore-db=information_schema 
#设置需要复制的数据库 
binlog-do-db=需要复制的主数据库名字 
#设置logbin格式 
binlog_format=STATEMENT 
# 在作为从数据库的时候,有写入操作也要更新二进制日志文件 
log-slave-updates 
#表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1 .. 65535 
auto-increment-increment=2  
# 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535 
auto-increment-offset=1 

2.修改master2(192.168.10.3)的配置文件

代码语言:txt
复制
修改配置文件:vim /etc/my.cnf 
#主服务器唯一ID 
server-id=3 
#启用二进制日志 
log-bin=mysql-bin 
# 设置不要复制的数据库(可设置多个) 
binlog-ignore-db=mysql 
binlog-ignore-db=information_schema 
#设置需要复制的数据库 
binlog-do-db=需要复制的主数据库名字 
#设置logbin格式 
binlog_format=STATEMENT 
# 在作为从数据库的时候,有写入操作也要更新二进制日志文件 
log-slave-updates  
#表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1 .. 65535 
auto-increment-increment=2  
# 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535 注意:自增长字段不能和master1的一样
auto-increment-offset=2     

3.修改slave1(192.168.10.2)的配置文件

代码语言:txt
复制
修改配置文件:vim /etc/my.cnf 
#从服务器唯一ID 
server-id=2 
#启用中继日志 
relay-log=mysql-relay 

4.修改slave2(192.168.10.4)的配置文件

代码语言:txt
复制
修改配置文件:vim /etc/my.cnf 
#从服务器唯一ID
server-id=4
#启用中继日志 
relay-log=mysql-relay

5.双主机、双从机重启 mysql 服务 关闭防火墙

代码语言:txt
复制
systemctl restart mariadb && systemctl stop  firewalld   && systemctl disable firewalld
  1. 在master(192.168.10.1,192.168.10.3)主机上建立帐户并授权 slave
代码语言:txt
复制
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';
flush privileges;

7.查看master(192.168.10.1,192.168.10.2)的状态

##查询Master1的状态

show master status;

#查询Master2的状态

show master status;

  1. 在slave1,slave2上各执行如下命令。

Slava1 复制 Master1,Slava2 复制 Master2

代码语言:txt
复制
##Slava1的复制命令
CHANGE MASTER TO MASTER_HOST='192.168.10.1',MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=473;

##Slava2的复制命令
CHANGE MASTER TO MASTER_HOST='192.168.10.3',MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=473;





##启动两台从服务器复制功能 
start slave;

#查看从服务器状态 
show slave status\G;



##下面两个参数都是Yes,则说明主从配置成功! 
## Slave_IO_Running: Yes
## Slave_SQL_Running: Yes

9.两个master互相复制(互为主备)

Master2 复制 Master1,Master1 复制 Master2

代码语言:txt
复制
## Master1的复制命令
CHANGE MASTER TO MASTER_HOST='192.168.10.3',MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=473;

## Master2的复制命令
CHANGE MASTER TO MASTER_HOST='192.168.10.1',MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=473;



#启动两台主服务器复制功能 
start slave; 

#查看从服务器状态 
show slave status\G;



![](https://ask8088-private-1251520898.cn-south.myqcloud.com/developer-images/article/8880527/olx7yuoe8i.png?q-sign-algorithm=sha1&q-ak=AKID2uZ1FGBdx1pNgjE3KK4YliPpzyjLZvug&q-sign-time=1635478227;1635485427&q-key-time=1635478227;1635485427&q-header-list=&q-url-param-list=&q-signature=9a66cbc0e07f49d580ba23f2837d15ccc742930c)



![](https://ask8088-private-1251520898.cn-south.myqcloud.com/developer-images/article/8880527/kde9k318zy.png?q-sign-algorithm=sha1&q-ak=AKID2uZ1FGBdx1pNgjE3KK4YliPpzyjLZvug&q-sign-time=1635478234;1635485434&q-key-time=1635478234;1635485434&q-header-list=&q-url-param-list=&q-signature=bbaa48a51c13a8667f01bbf64dc4859a491934f6)

##下面两个参数都是Yes,则说明主从配置成功!
  1. 验证双主双从的主从复制

##效果:在master1上新建库、新建表、insert 记录,Master2 和从机会复制

代码语言:txt
复制
##以下命令在master1上执行
create database testdb
use testdb
create table mytbl(id int,name varchar(20));
insert into mytbl values(1,'zhangsan');



##以下命令在slave1,master2,slave2上执行:
select * from testdb.mytbl;
  1. 修改 Mycat 的配置文件 schema.xml

修改<dataHost>的balance属性,通过此属性配置读写分离的类型

代码语言:txt
复制
负载均衡类型,目前的取值有4 种默认是0:
(1)balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
(2)balance="1",全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从
模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。
(3)balance="2",所有读操作都随机的在 writeHost、readhost 上分发。
(4)balance="3",所有读请求随机的分发到 readhost 执行,writerHost 不负担读压力
##双主双从模式选择:balance="1"    一主一从选择:balance="3"   

为了双主双从读写分离balance设置为1

代码语言:txt
复制
#balance="1": 全部的readHost与stand by writeHost参与select语句的负载均衡。 
#writeType="0": 所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个 
#writeType="1",所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐 
#writeHost,重新启动后以切换后的为准,切换记录在配置文件中:dnindex.properties 。 
#switchType="1": 1 默认值,自动切换。 
# -1 表示不自动切换 
# 2 基于 MySQL 主从同步的状态决定是否切换。

12.验证读写分离以及高可用

代码语言:txt
复制
##验证读写分离
##在写主机Master1数据库表mytbl中插入带系统变量数据,造成主从数据不一致
mysql -uroot -p123456
INSERT INTO mytbl VALUES(2,@@hostname);

mysql -umycat -p123456 -P 8066 -h 192.168.10.1
select * from mytbl;
##在Mycat里查询mytbl表,可以看到查询语句在Master2(192.168.10.3)、Slava1(192.168.10.2)、Slava2(192.168.10.4) 主从三个主机间切换
代码语言:txt
复制
##验证mysql高可用
在master1(192.168.10.1)输入如下命令:
systemctl stop mariadb
systemctl status  mariadb



##在Mycat里插入数据依然成功,Master2自动切换为写主机
mysql -umycat -p123456 -P 8066 -h 192.168.10.1
INSERT INTO mytbl VALUES(3,@@hostname);
select * from mytbl;
##在Mycat里查询mytbl表,可以看到查询语句在Slave2(192.168.10.4)上进行查询


##然后在启动master1(192.168.10.1)输入如下命令:
systemctl start mariadb
systemctl status  mariadb

##在Mycat里查询mytbl表,可以看到查询语句在Master2(192.168.10.3)、Slava1(192.168.10.2)、Slava2(192.168.10.4) 主从三个主机间切换



总结:Master1、Master2 互做备机,master1宕机之后会有master2继续master1写工作,但是此时查询的操作也只有slave2进行。
当master1恢复,此时就会有三台查询的机器,master2继续作为写的操作。当master2宕机后,由master1成为写的操作,此时读的操作也只有slave1。
也就是说,当master出现故障,slave也不会继续工作。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 服务规划:
  • 一. 准备前置环境(搭建msyql)
  • 二.修改配置文件
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档