写点什么

MySQL 运维 16- 双主双从读写分离

  • 2023-12-26
    福建
  • 本文字数:3681 字

    阅读完需:约 12 分钟

一、双主双从架构介绍


在 MySQL 多主多从的架构配置中和双主双从是一样的,学会了双主双从的架构部署,多主多从的配置也同样就回了。下面以双主双从作为示例演示。其中一个主机 maste1 用于处理所有写请求,它的从机 slave1 和另外一台主机 master2 还有它的从机 salve2 负责所有读数据请求,当 master1 主机宕机后,master2 主机会立刻切换到负责写请求,master1 和 master2 互为备机,架构如下:

  


二、双主双从主机配置


四台 MySQL 主机,分别如下


192.168.3.91:角色 master1, 启动服务 Mycat,MySQL, 关闭防火墙


192.168.3.92:角色 slave1, 启动服务 MySQL,关闭防火墙


192.168.3.93:角色 master2, 启动服务 MySQL,关闭防火墙


192.168.3.94:角色 slave2,  启动服务 MySQL,关闭防火墙

  


说明 1:其中 192,168.3.91 即当 MySQL 服务器,又充当 Mycat 的服务器 


三、master1 节点配置


3.1 修改 mysql 配置文件


192.168.3.91 这个台服务器当做双主中的一个,修改其配置文件如下:vim /etc/my.cnf

    


说明 1: server-id=1 是 mysql 集群服务中的唯一标识


说明 2:binlog-do-db 是指定要主从复制的数据库,不指定默认是全部数据库都做主从复制


说明 3:在主服务器上要配置 log-slave-updates 因为当存在多个主服务器的时候,有可能会存在备用主机,备用主机也是需要通过 binlog 文件向自己的从机同步数据的,所以要开始 log-slave-updates


3.2 重启 mysql

    


3.3 创建用于主从复制的账号


要进入 mysql 交互界面,注意不是进入 Mycat 


# 创建一个mysql用户为houlei,并设置密码为:Se7eN521,该用户可以在任意主机连接该MySQL服务mysql> create user 'houlei'@'%' identified with mysql_native_password by 'Se7eN521';Query OK, 0 rows affected (0.03 sec)# 为'houlei'@'%' 用户分配主从复制权限mysql> grant replication slave on *.* to 'houlei'@'%';Query OK, 0 rows affected (0.01 sec)
复制代码


3.4 查看二进制日志坐标    

    


四、master2 节点配置


4.1 修改 mysql 配置文件


192.168.3.93 这个台服务器当做双主中的另外一个,修改其配置文件如下:vim /etc/my.cnf

    


说明 1:这里的 server-id=3


4.2 重启 mysql  



4.3 创建用于主从复制的账号


要进入 mysql 交互界面,注意不是进入 Mycat 


# 创建一个mysql用户为houlei,并设置密码为:Se7eN521,该用户可以在任意主机连接该MySQL服务mysql> create user 'houlei'@'%' identified with mysql_native_password by 'Se7eN521';Query OK, 0 rows affected (0.03 sec)# 为'houlei'@'%' 用户分配主从复制权限mysql> grant replication slave on *.* to 'houlei'@'%';Query OK, 0 rows affected (0.01 sec)
复制代码

  

4.4 查看二进制日志坐标

  


五、slave1 节点配置


5.1 修改配置文件


slave1 节点是 192.168.3.92, 修改其配置文件如下 vim /etc/my.cnf

    


5.2 重启 mysql

    


5.3 slave1 关联 master1


change master to master_host='192.168.3.91',master_user='houlei',master_password='Se7eN521',master_log_file='binlog.000010',master_log_pos=156;
复制代码

    

说明 1:master_host 是该从库关联的主库,slave1 关联的事 192.168.3.91 这台 master1

    

说明 2:master_user 是关联账号,houlei 这个账号是在 master1 中刚创建的账号,就是用来做主从复制使用的

    

说明 3:master_password 是关联账号的密码

    

说明 4:master_log_file 是开始主从复制的 binlog 文件名

    

说明 5:master_log_poss 是 binlog 日志文件位置,这个参数是不用加引号或单引号的。


5.4 启动 slave1 的主从复制

    


说明 6:start slave 开始主从复制


六、slave2 节点配置

6.1 修改配置文件


slave2 节点是 192.168.3.94,修改其配置文件如下 vim /etc/my.cnf

    


6.2 重启 mysql

    


6.3 slave2 关联 master2


change master to master_host='192.168.3.93',master_user='houlei',master_password='Se7eN521',master_log_file='binlog.000018',master_log_pos=156;
复制代码

    

说明 1:master_host 是该从库关联的主库,slave2 关联的事 192.168.3.93 这台 master2

    

说明 2:master_user 是关联账号,houlei 这个账号是在 master1 中刚创建的账号,就是用来做主从复制使用的

    

说明 3:master_password 是关联账号的密码

    

说明 4:master_log_file 是开始主从复制的 binlog 文件名

    

说明 5:master_log_poss 是 binlog 日志文件位置,这个参数是不用加引号或单引号的。

    

说明 6:该语句是在 slave2 的 mysql 交互界面执行的

6.4 启动 slave2 的主从复制 

    


七、两台主库相互复制

  

以上 6 章节我们等于部署了 master1-slave1 和 master2-slave2 两套一主一从,但是目前位置这两个一主一从还没有任何关系,所以接下来我们就要配置两台主机上的关联了。即 master1 复制 master2 的同时 master2 也复制 master2.

  

在 master1 上执行:


change master to master_host='192.168.3.93',master_user='houlei',master_password='Se7eN521',master_log_file='binlog.000018',master_log_pos=156;
复制代码


 start slave;
复制代码


show slave status\G;
复制代码

  


说明 1:以上代码其实就是将 master1 配置为 master2 的从库  

  

然后在 master2 上执行:

change master to master_host='192.168.3.91',master_user='houlei',master_password='Se7eN521',master_log_file='binlog.000010',master_log_pos=156;
复制代码


start slave;
复制代码


show slave status\G;
复制代码

  


说明 2:以上代码其实就是将 master2 配置为 master1 的从库 

 

八、双主双从测试


分别在两台主库 master1,master2 上执行 DDL 和 DML 语句,查看涉及到的数据库服务器的数据同步情况

  

在 master1 上操作:


8.1、创建数据库 test_db1


mysql> create database test_db1;Query OK, 1 row affected (0.01 sec)
复制代码

    


说明 1:我们在 192.168.3.91 的 master1 主库上创建了数据库 test_db1,然后再 slave1,和 master2,slave2 上立刻就复制创建了 test_db1 出来


2、我们在 master2 上的 test_db1 的数据库中创建一个 tb_test 表

    


create table tb_test(id int auto_increment primary key, name varchar(20));
复制代码

    


说明 2:在 master2 上进行创建表同样会自动复制到 master1 和其他从表中

    

说明 3:至此双主双从算是配置好了


九、双主双从的读写分离


Mycat 控制后台数据库的读写分离和负载均衡有 schema.xml 文件中的 dataHost 标签的 balance 属性控制,通过 writeType 及 switchType 来完成失败自动切换的。


9.1 配置 schema.xml 

    


说明 1:在配置 schema 逻辑库的时候就要指定数据节点 dataNode 的值,因为如果逻辑库下的所有表都要实现读写分离,则不需要配置 table 标签

    

说明 2:dn1 数据节点下对应的 mysql 的 database 为 test_db1

    

说明 3:在 dataHost 标签的配置中要注意,balance 值为"1",writeType 值为"0",switchType 的值为"1",解释如下:


  • balance="1": 关于 balance 所有值的解释在上一遍文章中有解释,需要的请通过合集找到上一篇文章查看,这里直接是 balance="1"的情况:代表全部的 readHost 和备用主机的 writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(master1->slave1,master2->slave2,并且 master1 和 master2 互为主备),正常情况下 master2,slave1,slave2 都要参与 select 语句的负载均衡


  • writeType:0:代表写操作都转发到第一台 writerHost,writeHost1 挂了,会切换到 writeHost2 上。1:代表所有写操作都随机的发送到配置的 witerHost 上


  • switchType:-1:代表不自动切换,1:代表自动切换

    

说明 4:双主双从即配置两个 writeHost 和 readHost 组合,如果是多主多从即配置多个 writeHost 和 readHost 组合即可。

9.2 配置 server.xml

    


说明 5:给 root 用户增加 test_db1 数据库的操作权限


9.3 双主双从读写分离测试


首先重启 Mycat

    


登录 Mycat

    


查看逻辑库和逻辑表

    


插入测试数据


insert into tb_test(name) values ("张三");insert into tb_test(name) values ("李四");insert into tb_test(name) values ("王五");
复制代码

    



说明 6:在 Mycat 中插入数据 master1,slave1,master2,slave2 中都添加了数据.

    

查询数据测试:同样的直接查询我们是没办法确定查询的数据到底是来自哪里,所以我们还是修改从库中的数据,将 slave1 中的“张三”改了“张三 s1”,将 slave2 中的“张三”改为“张三 s2”

    

   


说明 7:查询结果是张三的说明数据来源 master2

    

说明 8:查询结果是张三 s1 的说明数据来源是 slave1

    

说明 9:查询结果是张三 s2 的说明数据来源是 slave2

    

说明 10:以上测试说明了双主双从实现了读写分离


十、双主双从的高可用测试

  

测试一台主机宕机下,双主双从是否可以继续运行。


10.1、现将 master1(192.168.3.91)的服务关闭

    


10.2 进入 Mycat 进行增删改查测试

    


说明 1:仍然可以查询,说明可以进行读数据

    


说明 2:master1 挂了的情况下,我们的双主双从架构的 MySQL 依然可读可写,所以高可用也没问题

    

总结:在双主双从的基础上,多主多从同样的实现思路。

 

文章转载自:Se7eN_HOU

原文链接:https://www.cnblogs.com/Se7eN-HOU/p/17926983.html

体验地址:http://www.jnpfsoft.com/?from=001

用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
MySQL运维16-双主双从读写分离_MySQL_不在线第一只蜗牛_InfoQ写作社区