linux中MySQL主从配置(Django实现主从读写分离)
一 linux中MySQL主从配置原理(主从分离,主从同步)
mysql主从配置的流程大体如图:
1)master会将变动记录到二进制日志里面;
2)master有一个I/O线程将二进制日志发送到slave;
3)slave有一个I/O线程把master发送的二进制写入到relay日志里面;
4)slave有一个SQL线程,按照relay日志处理slave的数据;
二 操作步骤
2.1我们准备两台装好mysql的服务器(我在此用docker模拟了两台机器)
| 环境 | mysql版本 | ip地址:端口号 |
|---|---|---|
| 主库(master) | 5.7 | 172.16.209.100:33307 |
| 从库(slave) | 5.7 | 172.16.209.100:33306 |
用docker拉起两个mysql容器,步骤如下(对docker不熟悉的同学可以查看docker快速入门章节):
# 拉取mysql5.7镜像
docker pull mysql:5.7
#在home目录下创建mysql文件夹,下面创建data和conf.d文件夹
mkdir /home/mysql
mkdir /home/mysql/conf.d
mkdir /home/mysql/data/
# 为了目录映射
#在home目录下创建mysql文件夹,下面创建data和conf.d文件夹
mkdir /home/mysql2
mkdir /home/mysql2/conf.d
mkdir /home/mysql2/data/
# 创建my.cnf配置文件(mysql1配置文件)
touch /home/mysql/my.cnf
# 创建my.cnf配置文件(mysql2配置文件)
touch /home/mysql2/my.cnf
# 切换到home
cd /home
# 1.切换到mysql路径内
vim /mysql/my.cnf
# mysql/my.cnf添加如下内容:(配置主库)
[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 # id号
# 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin
# 主库需要配以下两句
[client] # 客户端配置
default-character-set=utf8
[mysql] # mysql配置
default-character-set=utf8
# 2.切换到mysql2路径内
vim /mysql2/my.cnf
# mysql2/my.cnf添加如下内容:(配置从库)
[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=101 # 从库id号
# 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-slave-bin
# relay_log配置中继日志
relay_log=edu-mysql-relay-bin
#启动主库容器(挂载外部目录,端口映射成33307,密码设置为123456)
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
#启动从库容器(挂载外部目录,端口映射成33306,密码设置为123456)
docker run -di -v /home/mysql2/data/:/var/lib/mysql -v /home/mysql2/conf.d:/etc/mysql/conf.d -v /home/mysql2/my.cnf:/etc/mysql/my.cnf -p 33306:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# docker ps
# 没有mysql就安装

2.2 远程连接入主库和从库
远程连接主库
#连接主库
mysql -h 47.102.133.190 -P 33307 -u root -p123456
#在主库创建用户并授权
##创建test用户
create user 'test'@'%' identified by '123';
##授权用户(任何表库,任何ip地址登录方式)
grant all privileges on *.* to 'test'@'%' ;
###刷新权限
flush privileges;
#查看主服务器状态(显示如下图)
show master status;
mysql-bin : bin-log日志
# Position数据位置: 2128
1.从库下次写入就在该位置复制或者从头开始0位置复制进行主从同步,
远程连接从库
# 远程连接从库
mysql -h 47.102.133.190 -P 33306 -u root -p123456
#配置详解
/*
change master to
master_host='MySQL主服务器IP地址',
master_user='之前在MySQL主服务器上面创建的用户名',
master_password='之前创建的密码',
master_log_file='MySQL主服务器状态中的二进制文件名',
master_log_pos='MySQL主服务器状态中的position值,0表示从头开始复制';
*/
#命令如下
change master to master_host='47.102.133.190',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;
2.3 测试主从同步
#在主库上创建数据库test1
create database test1;
use test1;
#创建表
create table tom (id int not null,name varchar(100)not null ,age tinyint);
#插入数据
insert tom (id,name,age) values(1,'xxx',20),(2,'yyy',7),(3,'zzz',23);
#在从库上查看是否同步成功
#查看数据库
show database;
use test1;
#查看表
show tables;
#查看数据
select * from tom;

django实现主从读写分离(主从同步)
# s1.py
import os
# 脚本中调用django的环境
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djang333.settings')
import django
# 启动django
django.setup()
from app01.models import Book
if __name__ == '__main__':
# 手动方式实现读写分离:
# 插入,修改,删除使用主库(default)
# using('default') : 指定使用default主库写入(不写默认default)
# Book.objects.using('default').create(name='金梅瓶', price=11)
# 查询使用从库(db1)
# using() queryset对象方法
# using('db') : 指定使用db从库查询
# res=Book.objects.using('db').filter(pk=1)
# res=Book.objects.using('default').filter(pk=1)
# print(res)
# 自动方式(读写分离):
# 插入,修改,删除使用主库(default)
Book.objects.create(name='杀无赦', price=100)
# 查询使用从库(db1)
res = Book.objects.filter(pk=1).first()
print(res.name)
# models.py
from django.db import models
class Book(models.Model):
name = models.CharField(max_length=32)
price = models.IntegerField()
# 1.在setting.py中配置
DATABASES = {
# 主库
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'db_test',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '47.102.133.190',
'PORT': 33307,
},
# 从库
'db1': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'db_test',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '47.102.133.190',
'PORT': 33306,
},
}
# 在setting中注册
# 注册一下
# 配置全局数据库路由
DATABASE_ROUTERS = ['app01.db_router.DataRouter']
# 以后只要是写操作,就会用default,只要是读操作自动去db1
# db_router.py
# 数据库路由
class DataRouter:
def db_for_read(self, model, **hints):
return 'db1'
def db_for_write(self, model, **hints):
return 'default'
# 迁移数据库,同步
makemigrations --merge # 需要跟同事写的合并一下数据
makemigrations
migrate --database=default # 将迁移记录同步到default库中
migrate --database=db1 # 将迁移记录同步到db1中

# 创建数据库db_test

makemigrations # 迁移数据库
migrate # 同步数据库

# 实现读写分离

22.cnblogs.com/blog/2608805/202205/2608805-20220513143813970-1951533188.png)
linux中MySQL主从配置(Django实现主从读写分离)的更多相关文章
- linux下mysql基于mycat做主从复制和读写分离之基础篇
Linux下mysql基于mycat实现主从复制和读写分离1.基础设施 两台虚拟机:172.20.79.232(主) 172.20.79.233(从) 1.1软件设施 mysql5.6.39 , my ...
- Linux下Mysql主从复制(Master-Slave)与读写分离(Amoeba)实践
一.为什么要做Mysql的主从复制(读写分离)?通俗来讲,如果对数据库的读和写都在同一个数据库服务器中操作,业务系统性能会降低.为了提升业务系统性能,优化用户体验,可以通过做主从复制(读写分离)来减轻 ...
- MySQL主从复制配置指导及PHP读写分离源码分析
开发环境 master环境:ubuntu16.04.5LTS/i5/8G/500G/64位/mysql5.7.23/php7/apache2 slave环境:kvm虚拟机/ubuntu14.04.01 ...
- Docker中mysql大小写敏感配置不起作用的问题排查
由于linux中mysql的的表名是区分大小写的.所以需要配置my.conf. 所以在docker中需要把配置文件带进去.在宿主机的目录中新建my.conf文件,然后写入如下配置. [mysqld]u ...
- 关于linux中的目录配置标准以及文件基本信息
关于Linux中的目录配置标准 在查看docker.k8的运行日志,修改相关的运行记录的时候,学长总是能很快地找到目录,这个多多少少和Linux的FHS(File Hierarchy Standard ...
- 转载-清除Linux中MySQL的使用痕迹~/.mysql_history
原文地址:清除Linux中MySQL的使用痕迹~/.mysql_history 作者:RogerZhuo 原贴:http://bbs.chinaunix.net/thread-3676498-1-1. ...
- Linux中VSFTP的配置
配置VSFTP服务器: 1.安装VSFTP,可以参考Linux 中yum的配置来安装: yum installvsftpd.x86_64 -y 2.修改SELinux: setenforce 0 查看 ...
- Linux中redis安装配置及使用详解
Linux中redis安装配置及使用详解 一. Redis基本知识 1.Redis 的数据类型 字符串 , 列表 (lists) , 集合 (sets) , 有序集合 (sorts sets) , 哈 ...
- linux服务器安装mysql并配置外网访问
linux服务器安装mysql并配置外网访问 更新系统,如果不运行该命令,直接安装mysql,会出现"有几个软件包无法下载 sudo apt-get update 安装mysql sudo ...
随机推荐
- lvs dr 模式请求过程
一. lvs dr 模式请求过程 1.整个请求过程如下: client在发起请求之前,会发一个arp广播的包,在网络中找"谁是vip",由于所有的服务器,lvs和rs都有vip,为 ...
- wx-sdk 打包安装到本地maven仓库
下载官方sdk项目,导入idea 给WXPayConfig.java 中抽象方法加上public修饰符 进行 mav install ,在target 目录下找到wxpay-sdk-**.jar cm ...
- 【Web Audio API】 — 那些年的 web audio
转 TAT.Jdo:[Web Audio API] - 那些年的 web audio 这主题主要是早期对 web audio api的一些尝试,这里整理一下以便以后翻阅,如有错误,诚请指正. 在这之前 ...
- 深入理解ES6(二)(解构赋值)
变量的解构赋值 (1) 数组的解构赋值 1.基本用法 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring ). 只要等号两边的模式相同,左边的变量 ...
- vue+koa2即时聊天,实时推送比特币价格,爬取电影网站
技术栈 vue+vuex+vue-router+socket.io+koa2+mongodb+pm2自动化部署+图灵机器人+[npm script打包,cdn同步,服务器上传一个命令全搞定] 功能清单 ...
- 设计一个基于svg的涂鸦组件(一)
基于svg写了一个涂鸦组件,说项目之前先附上几张效果图: 项目地址:SVGraffiti 由于篇幅问题,本文先总体介绍一下项目的大概情况,重点介绍一下组件间的通信方式. 一.项目说明 该项目是基于we ...
- visio2019专业版激活码
这里面有 : 最新Project2019+ Visio2019专业增强版和专业版永久激活密钥分享 (weibo.com)
- Python数据展示 - 生成表格图片
前言 前一篇文章介绍了推送信息到企业微信群里,其中一个项目推送的信息是使用Python自动生成的表格,本文来讲讲如何用Python生成表格图片. 选一个合适库 Python最大的优点就是第三方库丰富, ...
- Codeforces Round #705 (Div. 2) B. Planet Lapituletti(镜像时钟) 思维
传送门: https://codeforces.com/contest/1493/problem/B 题目: Example input 5 24 60 12:21 24 60 23:59 90 8 ...
- OpenHarmony 3.1 Beta版本关键特性解析——OpenHarmony图形框架
(以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点) 李煜 华为技术有限公司 崔坤华为技术有限公司 众所周知,动画是系统和应用与用户交互的重要环节.动画效果的好坏会直接影响 ...