当前位置: 首页 > news >正文

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

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=1000server-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.lryc.cn/news/137142.html

相关文章:

  • Anaconda虚拟环境跨系统迁移
  • 第四章 IRIS 编程简介 - Macros
  • 大厂考核重点:mysql索引面试题
  • MySQL使用binlog日志做数据恢复
  • USB Type-C端口集成式ESD静电保护方案 安全低成本
  • Shiro学习总结
  • AS中回退git历史版本并删除历史提交记录
  • 线性代数的学习和整理5: 矩阵的加减乘除及其几何意义
  • sqlsugar 使用TNS连接oracle
  • 用python解压zip文件
  • 代码随想录22| 216.组合总和III, 17.电话号码的字母组合
  • ITIL4—战略与指导
  • 【Spring】Spring循环依赖(超重要!!)
  • 数据分析之路应该是就此开启了
  • win10如何配置jdk环境变量
  • pm4py使用指南(非机翻)
  • ChatGPT帮助提升工作效率和质量:完成时间下降40%,质量评分上升 18%
  • 第二章 搜索
  • transform_train.json文件解析
  • Wlan——锐捷零漫游网络解决方案以及相关配置
  • 分布式锁系列之zookeeper分布式锁和mysql分布式锁
  • Ubuntu部署PHP7.4
  • WPF中的数据转换-StringFormat
  • java.lang.UnsupportedOperationException解决方法
  • docker for window更改到非系统盘的使用记录
  • day 38 | ● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ
  • 写得了代码,焊得了板!嵌入式开发工程师必修之代码管理方案(中)
  • Interlij IDEA 运行 ruoyi 后端项目。错误: 找不到或无法加载主类 com.ruoyi.auth.RuoYiAuthApplication
  • 相机设置报错记录
  • Vue3中搜索表单的二次封装