Administrator
Administrator
Published on 2024-11-13 / 60 Visits
0
0

MySQL主从、读写分离

1、 MySQL主从

主从复制(Master-Slave Replication)是一种数据库复制机制,通过它,一个MySQL服务器(主服务器)上的数据变更会被实时复制到一个或多个从服务器上,从而实现数据的同步和冗余。

当主服务器上的数据发生改变时,写入二进制日志(Binlog)中,从服务器会在一定时间间隔内对主服务器二进制日志进行探测其是否发生改变,如果发生改变,则开始请求主服务器二进制事件,主节点向其发送二进制事件,并保存至从节点本地的中继日志(Relay Log)中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后进入睡眠状态,等待下一次被唤醒。

Snipaste_2024-11-20_23-43-55.png

OS

IP

角色

Anolis OS release 8.9

192.168.101.104

Anolis OS release 8.9

192.168.101.105

--关闭防火墙和SElinux
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# sed -i 's/^SELINUX=.*$/SELINUX=disabled/' /etc/selinux/config
[root@localhost ~]# setenforce 0

1.1 主服务器配置

a. 修改配置文件/etc/my.cnf

[root@localhost ~]# vim /etc/my.cnf
--新增两个配置
log-bin=mysql-bin
server-id=1

参数

含义

log-bin

启用二进制日志(Binlog),会记录所有对数据库的更改操作(如插入、更新、删除等)。

server-id

为MySQL服务器设置一个唯一的标识符,不能重复,主要用于区分不同的MySQL服务器。

b. 启动MySQL。

[root@localhost ~]# systemctl start mysqld

c. 创建一个用户用于从服务器登录主服务器。

[root@localhost ~]# mysql -uroot -p

--创建MySlave用户只允许从从服务器IP登录
mysql> CREATE USER 'MySlave'@'192.168.101.105' IDENTIFIED BY 'Zgsmm285@';

--对MySlave用户权限进行管理,只有从从服务器IP请求,才有权限读写
mysql> GRANT REPLICATION SLAVE ON *.* TO 'MySlave'@'192.168.101.105';

--查询master状态
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |      716 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

输出字段

含义

File

当前正在写入的二进制日志文件名。

Position

当前二进制日志的位置。它表示在该二进制日志文件中的偏移量,即下一个事件的开始位置。

1.2 从服务器配置

c. 修改配置文件/etc/my.cnf

[root@localhost ~]# vim /etc/my.cnf
--新增两个配置
log-bin=mysql-bin
server-id=2

d. 启动MySQL。

[root@localhost ~]# systemctl start mysqld

e. 配置主服务器信息。并启动主从复制线程。

[root@localhost ~]# mysql -uroot -p
mysql> change master to
    -> master_host='192.168.101.104',
    -> master_user='MySlave',
    -> master_password='Zgsmm285@',
    -> master_log_file='mysql-bin.000002',
    -> master_log_pos=716;
--master_log_file和master_log_pos填写主服务器查询master状态的输出结果。意味着从服务器从主服务器的这个二进制日志的某个位置开始主从复制

--启动主从复制线程。
mysql> start slave;

--查询主从复制状态信息。
mysql> show slave status\G;
*************************** 1. row ***************************
Replica_IO_Running: Yes
Replica_SQL_Running: Yes
--留意这两个值,都为Yes代表正常。

参数

含义

Replica_IO_Running

连接主服务器情况,Yes为正常。

Replica_SQL_Running

从服务器的SQL线程运行状态,Yes为正常。

1.3 测试

a. 主服务器创建名为test_code的表,从服务器查询对应表已存在。

--104主服务器
mysql> CREATE TABLE test.test_code (
    ->     id INT AUTO_INCREMENT PRIMARY KEY,
    ->     dingdan VARCHAR(255) NOT NULL,
    ->     shangpin VARCHAR(255) NOT NULL
    -> );


--105从服务器
mysql> show tables like 'test_code';
+-----------------------------+
| Tables_in_mysql (test_code) |
+-----------------------------+
| test_code                   |
+-----------------------------+

b. 主服务器往test_code表插入数据,从服务器查询数据变更已同步落地。

--104主服务器
mysql> INSERT into test.test_code (dingdan,shangpin) VALUES ('订单1','哇哈哈汽水');

--105从服务器
mysql> select * from test.test_code \G;
*************************** 1. row ***************************
      id: 1
 dingdan: 订单1
shangpin: 哇哈哈汽水
1 row in set (0.00 sec)

2、 读写分离

MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信。

Snipaste_2024-11-14_01-41-02.png

应用连接MyCat,通过MyCat中间件进行读写分离配置,把写操作发往主节点,读操作发往从节点。主从复制是前提,把主服务器的写操作同步到从服务器。

主从复制架构不变,新增一台服务器192.168.101.106配置MyCat。

2.1 MyCat安装

a. 如图两个包上传到MyCat服务器。

Snipaste_2024-11-16_06-21-17.png

MyCat安装包可到GitHub下载https://github.com/MyCATApache/Mycat-Server

jdk安装包到oracle官网下载https://www.oracle.com/cn/java/technologies/downloads/archive/

b. 安装jdk。

[root@localhost ~]# rpm -ivh jdk-8u251-linux-x64.rpm
[root@localhost ~]# java -version
java version "1.8.0_251"
Java(TM) SE Runtime Environment (build 1.8.0_251-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.251-b08, mixed mode)

c. 安装MyCat。

[root@localhost ~]# tar -xvf Mycat-server-1.6.7.5-release-20200422133810-linux.tar.gz
[root@localhost ~]# echo 'MYCAT_HOME=/root/mycat' >> /etc/profile
[root@localhost ~]# echo 'PATH=$MYCAT_HOME/bin:$PATH' >> /etc/profile
[root@localhost ~]# source /etc/profile

2.2 MyCat配置

a. 查看MyCat系统配置文件,留意user标签,这里配置了两个用户(root+user)、密码和可连接的逻辑库。

[root@localhost ~]# vim /root/mycat/conf/server.xml
        <user name="root" defaultAccount="true">
                <property name="password">123456</property>
                <property name="schemas">TESTDB</property>
                <property name="defaultSchema">TESTDB</property>
                <!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 -->

                <!-- 表级 DML 权限设置 -->
                <!--            
                <privileges check="false">
                        <schema name="TESTDB" dml="0110" >
                                <table name="tb01" dml="0000"></table>
                                <table name="tb02" dml="1111"></table>
                        </schema>
                </privileges>           
                 -->
        </user>

        <user name="user">
                <property name="password">user</property>
                <property name="schemas">TESTDB</property>
                <property name="readOnly">true</property>
                <property name="defaultSchema">TESTDB</property>
        </user>

参数

含义

defaultAccount

当前账号是否为默认账号。

password

用户密码。

schemas

用户可连接的逻辑库,可指定多个,这里会和schema.xml中的配置关联。

defaultSchema

默认可连接的逻辑库。

readOnly

true代表为只读,false代表可读写。

b. 编辑MyCat逻辑库配置文件

[root@localhost ~]# vim /root/mycat/conf/schema.xml
  1. schema标签定义逻辑库

图片1.png

  • name:和2.2步骤MyCat server.xml配置文件中user标签schemas项所关联。

  • dataNode:定义数据存储的节点为dn1。dataNode用于绑定逻辑库到某个具体的数据库上,如果定义此属性,对这个逻辑库的所有操作会直接作用到绑定的dataNode上,所以这个逻辑库就不能工作在分库分表模式下了(schema标签内部不得配置任何逻辑表信息)

  1. Table标签定义逻辑表

图片2.png

因为在schema标签dataNode定义了数据节点,所以这里需要注释掉这个标签。

  1. dataNode标签定义数据节点

Snipaste_2024-11-16_06-25-18.png

  • name:对应schema标签中的dataNode

  • database:数据节点要连接的数据库,改为主和从服务器的数据库test

另外两个标签没用上可以注释掉。

  1. dataHose定义物理数据库

Snipaste_2024-11-16_06-34-18.png

  • name:对应dataNode标签的dataHost

  • balance:负载均衡类型。

0:不开启读写分离机制,所有读操作都发送到当前可用的writeHost 上。

1:启用读写分离机制,读操作从第一个writeHost下所有readHost和备用writeHost中随机选择一个进行读取。

2:读操作从所有的writeHost及其下面所有readHost随机选择一个进行读取。

3:读操作从所有的readHost随机选择一个进行读取,writerHost不负担读压力。

  • dbType:指定数据库类型。

  • dbDriver:使用native可以配置mysqlmaridb数据库类型。其他类型的数据库则需要使用JDBC驱动来支持。

  • writeHost:定义写数据库,readHostwriteHost的子标签,如果writeHost指定的后端数据库宕机,那么这个writeHost绑定的所有readHost都将不可用。另一方面,当一个writeHost宕机时系统会自动检测到,并切换到备用的writeHost 上去。

  • readHost:定义读数据库。

2.3 启动MyCat

[root@localhost ~]# /root/mycat/bin/mycat start
Starting Mycat-server...
[root@localhost ~]# /root/mycat/bin/mycat status
Mycat-server is running (13105).

2.4 测试

MyCat有两个端口,9066是管理端口,8066是连接端口,和平常的MySQL差不多,登录管理端。

2.4.1 MyCat状态

Snipaste_2024-11-16_07-30-52.png

a. 查看心跳,1为正常。

Snipaste_2024-11-16_06-42-01.png

b. 查看读写状态,W为写R为读。

Snipaste_2024-11-16_06-43-19.png

2.4.2 建表、插入测试

Snipaste_2024-11-16_07-31-04.png

登录客户端8066。

a. 创建表,主从服务器都能正常查询到。

Snipaste_2024-11-16_06-48-08.png

b. 插入数据,查询主从数据都正常落地。

Snipaste_2024-11-16_06-50-47.png

2.4.3 读测试

把从服务器的主从复制停了。MyCat再插一条记录,查询主服务器已存在新插入的数据。MyCat查询没有新插入的数据。停了从服务器的主从复制,没能同步主服务器的写操作过来,MyCat读的是从服务器,证明读配置没问题。

Snipaste_2024-11-16_06-58-29.png

Snipaste_2024-11-16_07-00-03.png

2.4.3 写测试

把从服务器的主从复制开启,停止主服务器的MySQL服务。MyCat插入数据报错,因为写操作为主服务器。

Snipaste_2024-11-16_07-03-45.png

Snipaste_2024-11-16_07-05-56.png


Comment