mysql------做主从复制,读写分离

news2025/1/15 17:09:58

1.为什么要做主从复制(主从复制的作用)

做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。
架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的评率,提高单个机器的I/O性能。
读写分离,使数据库能支持更大的并发。在报表中尤其重要。由于部分报表sql语句非常的慢,导致锁表,影响前台服务。如果前台使用master,报表使用slave,那么报表sql将不会造成前台锁,保证了前台速度。

 1--在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力;(主库写,从库读,降压)
 2--在从主服务器进行备份,避免备份期间影响主服务器服务;(确保数据安全)
 3--当主服务器出现问题时,可以切换到从服务器。(提升性能)

 2.什么是主从复制?

主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库。在赋值过程中,一个服务器充当主服务器,而另外一台服务器充当从服务器。
当一台从服务器连接到主服务器时,从服务器会通知主服务器从服务器的日志文件中读取最后一次成功更新的位置。然后从服务器会接收从哪个时刻起发生的任何更新,然后锁住并等到主服务器通知新的更新。

3.主从复制的原理

步骤一:主库db的更新事件(update、insert、delete)被写到binlog(二进制日志)
步骤二:从库发起连接,连接到主库
步骤三:此时主库创建一个binlog dump thread线程,把binlog的内容发送到从库
步骤四:从库启动之后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log(中继日志).
步骤五:还会创建一个SQL线程,从relay log里面读取内容,从Exec_Master_Log_Pos位置开始执行读取到的更新事件,将更新内容写入到slave的db. 

4 mysql主从搭建

 搭建步骤 :准备两台机器 (mysql的docker镜像模拟两台机器)

    -主库:8.130.125.9 33307    121.196.246.157 33307
  -从库:8.130.125.9 33306      121.196.246.157 33306

 第一步:拉取mysql5.7的镜像

docker pull mysql:5.7

 第二步:创建文件夹,文件(目录映射)


mkdir /home/mysql
mkdir /home/mysql/conf.d
mkdir /home/mysql/data/       #主库存放数据的
touch /home/mysql/my.cnf      #主库配置文件
        
mkdir /home/mysql1
mkdir /home/mysql1/conf.d
mkdir /home/mysql1/data/     #主库存放数据的
touch /home/mysql1/my.cnf    #主库配置文件

 第三步(重要):编写mysql配置文件(主,从)

 #### 主的配置####

[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000

server-id=100           #server-id自己写,不能重复    id号唯一的
log-bin=mysql-bin       #开启binlog日志   将sql语句写进去,然后给从库

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

 从库配置

[mysqld]
user=mysql    #mysqld用mysql用户跑
character-set-server=utf8    #编码是   utf8
default_authentication_plugin=mysql_native_password        #密码加密方式
secure_file_priv=/var/lib/mysql    #文件存放位置
expire_logs_days=7    #日志存放时间      sql严格模式
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000     #最多的连接数


server-id=101            #server-id自己写,不能重复    id号唯一的
log-bin=mysql-slave-bin      #开启binlog日志   和主库优点不一样
relay_log=edu-mysql-relay-bin    #开启中继日志

[client]
default-character-set=utf8      #client指定utf8

[mysql]
default-character-set=utf8       #mysql指定utf8

 第四步 :启动mysql容器,并做端口和目录映射

 启动主库 

docker run  -di -v /home/mysql/data/:/var/lib/mysql
 -v /home/mysql/conf.d:/etc/mysql/conf.d
 -v /home/mysql/my.cnf:/etc/mysql/my.cnf -p 33307:3306 
--name mysql-master -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

 启动从库

docker run  -di -v /home/mysql1/data/:/var/lib/mysql
 -v /home/mysql1/conf.d:/etc/mysql/conf.d 
-v /home/mysql1/my.cnf:/etc/mysql/my.cnf -p 33306:3306
 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

 第五步 用cmd连接主库

mysql -uroot -P33307 -h 121.196.246.157 -p      #ip地址
#在主库创建用户并授权
##创建test用户
create user 'test'@'%' identified by '123';
##授权用户
grant all privileges on *.* to 'test'@'%' ;    #将所有的权限赋予给test用户
###刷新权限
flush privileges;
#查看主服务器状态(显示如下图)
show master status; 

第五步:连接从库

mysql -uroot -P33306 -h 121.196.246.157 -p
    #配置详解
    '''
    change master to 
    master_host='MySQL主服务器IP地址', 
    master_user='之前在MySQL主服务器上面创建的用户名', 
    master_password='之前创建的密码', 
    master_log_file='MySQL主服务器状态中的二进制文件名', 
    master_log_pos='MySQL主服务器状态中的position值';
    '''
    change master to master_host='121.196.246.157',
master_port=33307,master_user='test',
master_password='123',master_log_file='mysql-bin.000003',master_log_pos=0;
    #启用从库
    start slave;
    #查看从库状态(如下图)
    show slave status\G;

  Slave_IO_Running: Yes
  Slave_SQL_Running: Yes

 这两个参数是yes,就意味这主从搭建成功

第六步:在主库创建库,创建表,插入数据,看从库

 5.django实现读写分离

# 第一步:配置文件配置多数据库
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    },
    'db1': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db1.sqlite3',
    }
}

# 第二步:手动读写分离
Book.objects.using('db1').create(name='西游记')

# 第三步,自动读写分离
写一个py文件,db_router.py,写一个类:
class DBRouter(object):
    def db_for_read(self, model, **hints):
        # 多个从库 ['db1','db2','db3']
        return 'db1'

    def db_for_write(self, model, **hints):


        return 'default'
    
    
# 第三步:配置文件配置
DATABASE_ROUTERS = ['mysql_master_demo.db_router.DBRouter', ]

# 以后自动读写分离
# 多从库负载
# 分库分表

 

DATABASES = {
     # 主库
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'zhu',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '121.196.246.157',
        'PORT': 33307,
    },
    # 从库
    'db1': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'zhu',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '121.196.246.157',
        'PORT': 33306,
    },
}

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

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

相关文章

matlab面向对象

一、面向对象编程 1.1 面向过程与面向对象 区别: 面向过程的核心是一系列函数,执行过程是依次使用每个函数面向对象的核心是对象(类)及其属性、方法,每个对象根据需求执行自己的方法以解决问题 对象:单个…

JAVA 读取jar包中excel模板

1、在resources路径下,新建report文件夹,放入excel模板 2、配置文件中的目录,分隔符使用 / template: /report/报告模板V1.0.xlsx3、使用getResourceAsStream()读取 XSSFWorkbook wb;try {//需要以/开始InputStream resourceAsStream this.g…

中国芯,寻找新赛道迫在眉睫

北京华兴万邦管理咨询有限公司 商瑞 陈皓 近期国内半导体行业的热点可以用两个“有点多”来描述,一个是中国芯群体中上市公司股价闪崩的有点多,另一个是行业和企业的活动有点多。前者说明了许多国内芯片设计企业(fabless商业模式)…

怎么去选消息队列? Kafka vs. RabbitMQ

在上周,我们讨论了使用消息队列的好处。然后我们回顾了消息队列产品的发展历史。如今,在项目中需要使用消息队列时,Apache Kafka似乎是首选产品。然而,考虑到特定需求时,它并不总是最佳选择。 基于数据库的队列 让我们…

【由于无法验证发布者,所以 windozs 已经阳止此软件。】

由于无法验证发布者,所以 windozs 已经阳止此软件。 由于无法验证发布者,所以 windozs 已经阳止此软件。IE点击【Internet选项】在打开Internet选项的对话框中,点击“安全”选项卡在打开的新窗口中点击“受信任的站点”图标,然后点…

Linux查看文本内容的一些技巧

Linux查看文本内容的一些技巧 headtailcat输出filename.txt中第二列的内容awkcutvimdiff abc.txt def.txt 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语…

sql入门-约束

约束 作用于表中字段上的规则,用于限制存储在表中的数据 外键增加--删除 # 创建dept -- 主表 create table dept ( id int primary key auto_increment comment id, name varchar(50) unicode comment 部门名称 )comment 部门表; insert into dept(name) v…

SQL注入之万能用户名

文章目录 分析代码原理实现 分析代码 在安装的cms数据库目录C:\phpStudy\WWW\cms\admin下找到login.action.php文件,查看第20行,发现如下php代码: $user_row $db->getOneRow("select userid from cms_users where username "…

FreeCAD傻瓜式教程之约束设定、构建实体、开孔、调整颜色、透明度、参考距离、任意修改尺寸、保持开孔居中、外部图形、基准平面等

本内容基于官方教程中的绘制简单的零件中的体会,在初次绘制的时候,总是无法完成,几经尝试才发现其关键点所在,以此文记录,用以被查资料,同时也希望能够帮到纯白新手快速熟悉该软件的绘图方法。 一、. 打开软…

联想小新Pro 16笔记本键盘失灵处理方法

问题描述: 联想小新Pro 16新笔记本开机准备激活,到连接网络的时候就开始触控板、键盘失灵,但是有意思的是键盘的背光灯是可以调节关闭的;外接鼠标是正常可以移动的,但是只要拔掉外接鼠标再插回去的时候就不能用了&…

8.22 作业

1. 中断实验 按下key1 led3取反 按下key2 led2取反 按下key3 led1取反 main.c #include "key.h" extern void printf(const char *fmt, ...); void delay_ms(int ms) {int i,j;for(i 0; i < ms;i)for (j 0; j < 1800; j); }int main() {rcc_init();led_…

pbootcms系统安全防护设置大全

PbootCMS系统简介 PbootCMS是全新内核且永久开源免费的PHP企业网站开发建设管理系统&#xff0c;是一套高效、简洁、 强悍的可免费商用的PHP CMS源码&#xff0c;能够满足各类企业网站开发建设的需要。系统采用简单到想哭的模板标签&#xff0c;只要懂HTML就可快速开发企业网站…

java八股文面试[java基础]——final 关键字作用

为什么局部内部类和匿名内部类只能访问final变量&#xff1a; 知识来源 【基础】final_哔哩哔哩_bilibili

Java反编译工具之javap介绍

文章目录 一、反编译定义二、反编译的使用场景1. 代码审查和调试&#xff1a;2. 学习和研究&#xff1a;3. 逆向工程&#xff1a;4. 代码重用&#xff1a; 三、反编译工具之javap1. javap介绍&#xff1a;2. 案例演示&#xff1a; 一、反编译定义 Java反编译是指将已经编译成字…

使用Java开发Jmeter自定义取样器(Sampler)插件

文章目录 1、Jmeter自定义取样器扩展类2、SpringBoot服务器端http测试例子3、自定义取样器实现3.1、默认界面的AbstractJavaSamplerClient扩展实现3.2、自定义界面的AbstractSamplerGui扩展实现 3、自定义取样器运行效果3.1、AbstractJavaSamplerClient运行效果3.2、AbstractSa…

net start Mysql 启动服务时 ,显示“Mysql服务正在启动 Mysql服务无法启动 服务没有报告任何错误

一、问题 有时候&#xff0c;输入net start Mysql 启动服务时 mysql>net start Mysql 显示 Mysql服务正在启动 Mysql服务无法启动 服务没有报告任何错误 二、原因 由于mysql的默认端口是3306&#xff0c;因此在启动服务的时候&#xff0c;如果此端口被占用&#xff0c;就会出…

Stable Diffusion 系列教程 | 打破模型壁垒

目录 1.模型基本分类 1.1 CheckPoint 大模型/底模型/主模型 1.2 VAE美化模型/变分自编码器 1.3 HyperNetwork 超网络 1.4 embeddings&#xff08;/Textual Inversion&#xff09; 嵌入式向量 1.5 loRa 低秩适应模型 2. 下载途径和渠道 2.1 C站 2.1.1 如何筛选到自己需…

攻防世界-Web_php_include

原题 解题思路 php://被替换了&#xff0c;但是只做了一次比对&#xff0c;改大小写就可以绕过。 用burp抓包&#xff0c;看看有哪些文件 flag明显在第一个PHP文件里&#xff0c;直接看

psycopg2 使用ThreadedConnectionPool 工具封装

psycopg2 介绍 psycopg2库介绍: Psycopg2是一个用于Python编程语言的第三方库&#xff0c;用于访问PostgreSQL数据库系统。它提供了一组工具和方法&#xff0c;可以轻松地在Python程序中进行数据库操作&#xff0c;包括查询、插入、更新、删除等操作。 以下是Psycopg2库的一些…

主程技术分享: 游戏项目帧同步,状态同步如何选

网络游戏开发项目中帧同步,状态同步如何选&#xff1f; 网络游戏的核心技术之一就是玩家的网络同步,主流的网络同步有”帧同步”与”状态同步”。今天我们来分析一下这两种同步模式。同时教大家如何在自己的项目中采用最合适的同步方式。接下来从以下3个方面来阐述: 对啦&…