一主一从读写分离

news2024/11/26 0:49:31

目录

介绍

一主一从

原理

准备

配置主从复制

验证主从复制

一主一从读写分离

安装MyCat

schema.xml配置

server.xml配置

测试


介绍

        读写分离,简单地说是把对数据库的读和写操作分开,以对应不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样能有效地减轻单台数据库的压力。

通过MyCat即可轻易实现上述功能,不仅可以支持MySQL,也可以支持Oracle和SQL Server。

一主一从

原理

MySQL的主从复制,是基于二进制日志(binlog)实现的。

准备

安装服务主机MySQL版本角色用户名密码
MyCat,MySQL192.168.226.100MySQL : 8.0.39masterroot1234
MySQL192.168.226.101MySQL : 8.0.39slaveroot1234

两台主机关闭防火墙和selinux,进行时间同步并安装mysql,设置root密码为1234

#!/bin/bash
echo "=====系统环境初始化脚本====="
sleep 3
echo "——>>> 关闭防火墙与SELinux <<<——"
sleep 3
systemctl stop firewalld
systemctl disable firewalld &> /dev/null
setenforce 0
sed -i '/SELINUX/{s/enforcing/disabled/}' /etc/selinux/config
 
echo "——>>> 创建阿里仓库 <<<——"
sleep 3
rm -rf /etc/yum.repos.d/*
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo 
yum -y install wget
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo  
 
 
echo "——>>> 设置时区并同步时间 <<<——"
sleep 3
timedatectl set-timezone Asia/Shanghai
yum -y install chrony
systemctl start chronyd
systemctl enable chronyd
reboot
sudo yum remove mysql-server -y && sudo yum autoremove -y
sudo yum remove *mysql* -y
sudo rm -rf /var/lib/mysql/ 
sudo rm -rf /etc/mysql/ 
 
yum install -y yum-utils > /dev/null
yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm > /dev/null
yum-config-manager --enable mysql80-community > /dev/null
yum-config-manager --disable mysql57-community > /dev/null
yum install -y mysql-server
systemctl start mysqld && systemctl enable mysqld
mysqladmin -p"`awk '/temporary password/{p=$NF}END{print p}' /var/log/mysqld.log`" password 'TianPFh@123'
mysql -p'TianPFh@123' -e "UNINSTALL COMPONENT 'file://component_validate_password'"
mysqladmin -p'TianPFh@123' password '1234'

配置主从复制

配置master,对192.168.226.100主机操作,配置/etc/my.cnf  在该配置文件末尾追加下述配置项

server-id = 1            # 服务器唯一标识,每个服务器在复制环境中应有唯一的ID,用于标识不同的复制实例
 
log-bin = mysql-bin      # 启用二进制日志,指定二进制日志文件的基名,MySQL会在此基名后添加数字和扩展名来创建日志文件
 
binlog-format = ROW      # 设置二进制日志格式为ROW,记录每一行数据的变化,有助于减少数据不一致的风险,也便于从库的并行复制

重新启动MySQL服务

systemctl restart mysqld

登录mysql创建用于主从复制的远程用户并授权

[root@master ~]# mysql -uroot -p1234  # 使用root用户登录MySQL,密码是1234
mysql: [Warning] Using a password on the command line interface can be insecure.  # 警告:在命令行界面使用密码可能不安全
Welcome to the MySQL monitor.  Commands end with ; or \g.  # 欢迎信息,命令以;或\g结束
Your MySQL connection id is 8  # MySQL连接ID为8
Server version: 8.0.39 MySQL Community Server - GPL  # 服务器版本信息
 
Copyright (c) 2000, 2024, Oracle and/or its affiliates.  # 版权信息
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.  # Oracle是Oracle公司及其附属公司的注册商标
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.  # 输入'help;'或'\h'获取帮助,输入'\c'清除当前输入的命令
 
mysql> create user 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'admin';  # 创建用户'itit',允许从任何主机访问,并设置密码为'123456'
Query OK, 0 rows affected (0.01 sec)  # 命令执行成功,没有行受到影响
 
mysql> grant all on *.* to 'root'@'%';  # 授予用户'itit'从任何主机进行复制的权限
Query OK, 0 rows affected (0.00 sec)  # 命令执行成功,没有行受到影响

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)
 
mysql> show master status;  # 显示主服务器状态,包括二进制日志文件名和位置
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      824 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)  # 输出结果,显示当前使用的二进制日志文件和位置
 
mysql> exit  # 退出MySQL命令行
Bye  # MySQL命令行退出信息

配置slave,对192.168.226.101主机操作,修改配置文件 /etc/my.cnf 在该配置文件末尾追加下述配置项

# 从库的唯一标识,与主库和其他从库不同

server-id = 2
 
# 设置二进制日志格式为ROW,有助于减少数据不一致的风险

binlog-format = ROW
 
# 设置从库为只读模式,防止在从库上直接写入数据导致的数据不一致

read-only = 1

 重新启动MySQL服务

systemctl restart mysqld

登录从库MySQL,配置从库以连接到主库 

CHANGE REPLICATION SOURCE TO
    SOURCE_HOST='192.168.226.100',
    SOURCE_USER='root',
    SOURCE_PASSWORD='admin',
    SOURCE_LOG_FILE='mysql-bin.000001',
    SOURCE_LOG_POS=824;

并创建一个远程用户并授权

create user 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'admin';
grant all on *.* to 'root'@'%';
FLUSH PRIVILEGES;

启动复制进程

START REPLICA;

查看复制状态

SHOW REPLICA STATUS\G;

验证主从复制

登录master的mysql,执行下述sql语句,然后回到slave上查看是否同步上了。

-- 在master执行sql
CREATE DATABASE IF NOT EXISTS itceshi;

-- 登录slave查看

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| itceshi            |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

一主一从读写分离

安装MyCat

详细步骤参考该博文,这里不在赘述安装步骤。

MySQ分库分表与MyCat安装配置-CSDN博客

schema.xml配置

MyCat控制后台数据库的读写分离和负载均衡由schema.xml文件datahost标签的balance属性控 制。将下述配置替换原文件里的内容即可。

<?xml version="1.0"?>  
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">  
<mycat:schema xmlns:mycat="http://io.mycat/">  
  
    <schema name="ITCESHI_RW" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1"></schema>  
  
    <dataNode name="dn1" dataHost="dhost1" database="itceshi" />  
  
    <dataHost name="dhost1" maxCon="1000" minCon="10" balance="1"  
              writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">  
        <heartbeat>select user()</heartbeat>  
        <writeHost host="master" url="jdbc:mysql://192.168.226.100:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="admin">  
			<readHost host="slave" url="jdbc:mysql://192.168.226.101:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="admin" />
			</writeHost>
    </dataHost>  
  
</mycat:schema>

writeHost代表的是写操作对应的数据库,readHost代表的是读操作对应的数据库。 所以我们要想 实现读写分离,就得配置writeHost关联的是主库,readHost关联的是从库。

而仅仅配置好了writeHost以及readHost还不能完成读写分离,还需要配置一个非常重要的负责均衡 的参数 balance,取值有4种,具体含义如下:

参数含义
读写分离机制0不开启读写分离机制,所有读操作都发送到当前可用的writeHost上
读写分离机制1全部的readHost与备用的writeHost都参与select语句的负载均衡(主要针对于双主双从模式)
读写分离机制2所有的读写操作都随机在writeHost, readHost上分发
读写分离机制3所有的读请求随机分发到writeHost对应的readHost上执行, writeHost不负担读压力

所以,在一主一从模式的读写分离中,balance配置1或3都是可以完成读写分离的。 

server.xml配置

配置mycat的root用户可以访问 ITCHESHI_RW逻辑库。(只需要修改下述模块位置的代码即可)

	<user name="root" defaultAccount="true">
		<property name="password">123456</property>
		<property name="schemas">ITCESHI_RW</property>
		
		<!-- 表级 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">123456</property>
		<property name="schemas">ITCESHI_RW</property>
		<property name="readOnly">true</property>
	</user>

启动MyCat

# 先停止再启动
/usr/local/mycat/bin/mycat stop
/usr/local/mycat/bin/mycat start

登录mycat查看库 

[root@master ~]# mysql -h 192.168.226.100 -P 8066 -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.6.29-mycat-1.6.7.3-release-20210913163959 MyCat Server (OpenCloudDB)

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+------------+
| DATABASE   |
+------------+
| ITCESHI_RW |
+------------+
1 row in set (0.01 sec)

测试

在master主机中,登陆mycat执行语句

CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    price DECIMAL(10, 2) NOT NULL,
    description TEXT
);
INSERT INTO products (name, price, description) VALUES
    ('Laptop', 999.99, 'High-performance laptop with SSD and 16GB RAM'),
    ('Smartphone', 599.50, 'Latest model with dual cameras and AI features'),
    ('Tablet', 349.00, 'Lightweight tablet for entertainment and productivity');

 在slave主机的mysql中查看是否同步了刚在mycat中写入的语句。

[root@slave ~]# mysql -p1234
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 91
Server version: 8.0.39 MySQL Community Server - GPL

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| itceshi            |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> show tables;
+-------------------+
| Tables_in_itceshi |
+-------------------+
| products          |
+-------------------+
1 row in set (0.00 sec)

mysql> select * from products;
+----+------------+--------+-------------------------------------------------------+
| id | name       | price  | description                                           |
+----+------------+--------+-------------------------------------------------------+
|  1 | Laptop     | 999.99 | High-performance laptop with SSD and 16GB RAM         |
|  2 | Smartphone | 599.50 | Latest model with dual cameras and AI features        |
|  3 | Tablet     | 349.00 | Lightweight tablet for entertainment and productivity |
+----+------------+--------+-------------------------------------------------------+
3 rows in set (0.00 sec)

 可以看到同步写入成功了,现在接着在slave主机的mysql中,修改或者插入一条数据,查看master会不会同步,正常情况slave写入,master不会同步。

UPDATE products
SET name = 'Lightweight Tablet'
WHERE name = 'Tablet' AND price = 349.00 AND description = 'Lightweight tablet for entertainment and productivity';

INSERT INTO products (name, price, description) VALUES
    ('Headphones', 79.99, 'Wireless headphones with noise-cancelling feature');
mysql> select * from products;
+----+--------------------+--------+-------------------------------------------------------+
| id | name               | price  | description                                           |
+----+--------------------+--------+-------------------------------------------------------+
|  1 | Laptop             | 999.99 | High-performance laptop with SSD and 16GB RAM         |
|  2 | Smartphone         | 599.50 | Latest model with dual cameras and AI features        |
|  3 | Lightweight Tablet | 349.00 | Lightweight tablet for entertainment and productivity |
|  4 | Headphones         |  79.99 | Wireless headphones with noise-cancelling feature     |
+----+--------------------+--------+-------------------------------------------------------+
4 rows in set (0.00 sec)

现在到master主机中的mysql中查看

mysql> select * from products;
+----+------------+--------+-------------------------------------------------------+
| id | name       | price  | description                                           |
+----+------------+--------+-------------------------------------------------------+
|  1 | Laptop     | 999.99 | High-performance laptop with SSD and 16GB RAM         |
|  2 | Smartphone | 599.50 | Latest model with dual cameras and AI features        |
|  3 | Tablet     | 349.00 | Lightweight tablet for entertainment and productivity |
+----+------------+--------+-------------------------------------------------------+
3 rows in set (0.00 sec)

这里可以看到,slave中写入不会同步到master,从而验证了一主一从的读写分离配置完成了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2061229.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Springboot中多线程数据库操作下的事务一致性问题的解决方案

文章目录 1 代码实现1.1 正常情况1.2 异常情况总结 1 代码实现 1.1 正常情况 我们采用手动开启事务的方式 public void add(CountDownLatch countDownLatch) {executor.submit(() -> {TransactionStatus transaction dataSourceTransactionManager.getTransaction(transa…

【HTML】HTML学习之引入CSS样式表

1、CSS样式规则 选择器{属性1:属性值1; 属性2:属性值2; 属性3:属性值3;}2、HTML引入CSS样式表 2.1、行内式 行内式也称为内联样式&#xff0c;是通过标签的style属性来设置元素的样式&#xff0c;其基本语法格式如下: <标签名 style"属性1:属性值1; 属性2:属性值2;…

Proxy/Skeleton

设计模式之&#xff08;十二&#xff09;代理模式_skeleton proxy 模式-CSDN博客 在RMI中&#xff0c;客户端可以通过一个桩&#xff08;Stub&#xff09;对象与远程主机上的业务对象进行通信&#xff0c;由于桩对象和远程业务对象接口的一致&#xff0c;因此对于客户端而言&am…

Maven的一些相关知识【重修】《包括私服搭建!》

mvnrepository.com Maven 下载jar包的位置&#xff01; 【该部分有教程】 这是什么nb代码投稿视频-这是什么nb代码视频分享-哔哩哔哩视频

python之matplotlib (6 等高线和热力图)

等高线 import numpy as np import matplotlib.pyplot as pltdef f(x,y):return (1-x/2x**5y**3)*np.exp(-x**2-y**2) n256 xnp.linspace(-3,3,n) yx X,Ynp.meshgrid(x,y) plt.contourf(X,Y,f(X,Y),8,alpha0.75,cmapviridis) plt.colorbar() Cplt.contour(X,Y,f(X,Y),8,colors…

第64期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

免费图形化nginx管理工具nginxWebUI

nginxWebUI是一款图形化管理nginx配置得工具, 可以使用网页来快速配置nginx的各项功能, 包括http协议转发, tcp协议转发, 反向代理, 负载均衡, 静态html服务器, ssl证书自动申请、续签、配置等, 配置好后可一建生成nginx.conf文件, 同时可控制nginx使用此文件进行启动与重载, 完…

Linux基础软件-软件安装

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux进阶部分又分了很多小的部分,我们刚讲完了Linux日常运维。讲的那些东西都算是系统自带的&#xff0c;但是Linux作为一个…

mklink 命令详解

mklink 命令详解 在命令提示符中输入 mklink 可以查看相关的运行命令。 创建符号链接。MKLINK [[/D] | [/H] | [/J]] Link Target/D 创建目录符号链接。默认为文件符号链接。/H 创建硬链接而非符号链接。/J 创建目录联接。Link 指定新的符号链接名称。Targ…

前端3d动画-----平移 transform: translate3d()

必须加这个属性&#xff1a;transform-style: preserve-3d; perspective: 900px; 设置了景深才能感到近大远小的感觉 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible&q…

CTF中的换表类Crypto题目

目录 [安洵杯 2019]JustBase[SWPUCTF 2021 新生赛]traditional字符替换解密 [BJDCTF 2020]base??字符替换 --》 base64解密 [安洵杯 2019]JustBase VGhlIGdlbxvZ#kgbYgdGhlIEVhcnRoJ#Mgc#VyZmFjZSBpcyBkb!pbmF)ZWQgYnkgdGhlIHBhcnRpY#VsYXIgcHJvcGVydGllcyBvZiB#YXRlci$gUHJ…

图神经网络教程3——循环图神经网络-2

目录 计算下游输出 序列图数据的扩展 图长短期记忆网络 循环转换在RGNN应用于图分类时的作用 数据集 算法 结果和讨论 门控循环单元 优缺点 前文索引 本篇是GRNN的第二篇文章&#xff0c;点击此处可到达第一篇文章的位置。 计算下游输出 一旦我们以图中的每个顶点为…

webm格式怎么转换成mp4?7个有效方法将webm转mp4

在数字媒体的浩瀚宇宙中&#xff0c;视频格式的多样性犹如繁星点点&#xff0c;既点亮了创意的火花&#xff0c;也铺设了内容分享的广阔道路。每一种视频格式都承载着其独特的技术优势与设计初衷&#xff0c;WebM便是其中一颗璀璨的新星&#xff0c;专为优化网络传输而生。它凭…

Unity | Shader基础知识(第二十二集:两次渲染)

目录 一、前言 二、“渲染两次” 三、本次成品介绍 四、第一次渲染代码 五、第二次渲染代码 六、截止目前的所有代码 七、调整代码 八、总结 一、前言 之前一直讲的shader文件中&#xff0c;都只写了一次CG代码。 为了大家对这部分的整体理解&#xff0c;我们这次渲…

微服务的保护

一、雪崩问题及解决方案 1.雪崩问题 微服务之间&#xff0c;一个微服务依赖多个其他的微服务。当一个微服务A依赖的一个微服务B出错时&#xff0c;微服务A会被阻塞&#xff0c;但其他不依赖于B的微服务不会受影响。 当有多个微服务依赖于B时&#xff0c;服务器支持的线程和并…

使用策略模式代替多个ifelse

传统的多个 public class OrderServiceImpl implements IOrderService {Overridepublic String handle(OrderDTO dto) {String type dto.getType();if ("1".equals(type)) {return "处理普通订单";} else if ("2".equals(type)) {return "…

PMP–知识卡片--产品管理知识体系

产品管理是公司为管理一个产品或者产品线的产品计划、产品市场和产品生命周期所采用的组织架构。产品管理是一个典型的强矩阵的管理方式。产品管理是企业或组织在产品生命周期中对产品规划、开发、生产、营销、销售和支持等环节进行管理的业务活动。 项目经理和产品有着直接、间…

xmind 2024下载,安装目录更改为其他盘

下载 最新版官网地址 更改目录

网络编程Day9_IO多路复用 20240821

运行1个服务器和2个客户端实现效果&#xff1a; 服务器和2个客户端互相聊天&#xff0c;服务器和客户端都需要使用select模型去实现 服务器要监视2个客户端是否连接&#xff0c;2个客户端是否发来消息以及服务器自己的标准输入流 客户端要监视服务器是否发来消息以及客户端自…

Go小技巧易错点100例(十七)

Go定时任务 在Go语言中&#xff0c;定时任务&#xff08;也称为定时器或cron作业&#xff09;具有多种作用&#xff0c;这些作用在应用程序的开发和运维中非常有用。以下是一些常见使用场景&#xff1a; 任务调度&#xff1a;定时任务可以在特定的时间点执行特定的任务&#…