MySQL篇:MySQL主从搭建、django读写分离

一、MySQL主从搭建

1.1 什么是主从同步?

一个主库,写数据都写到主库,从库只用来读数据,可以一主一从,可以是一主多从
两台机器:主库,从库(mysql版本必须一致)

1.2 原理

复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
mysql主从配置的流程大体如图: 1)master会将变动记录到二进制日志(binlog)里面(主库要开启binlog日志); 2)master有一个I/O线程将二进制日志发送到slave; 3)slave有一个I/O线程把master发送的二进制写入到relay log日志里面; 4)slave有一个SQL线程,按照relay log 日志处理slave的数据;

image-20220816151544041

1.3 搭建步骤

1.3.1 拉取mysql5.7镜像

复制代码
  • 1
docker pull mysql:5.7

1.3.2 创建一些文件夹,用来做目录映射

复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
# 主库用的 mkdir /home/mysql mkdir /home/mysql/conf.d mkdir /home/mysql/data vim /home/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 log-bin=mysql-bin #从库用的 mkdir /home/mysql2 mkdir /home/mysql2/conf.d mkdir /home/mysql2/data/ vim /home/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 log-bin=mysql-slave-bin relay_log=edu-mysql-relay-bin

1.3.3 启动两个docker容器

复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
###主库 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 3306:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 ## 从库 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 3307:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

1.3.4 链接主库

复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
mysql -h 10.0.0.205 -P 3306 -uroot -p ##创建test用户 create user 'test'@'%' identified by '123'; ##授权用户 grant all privileges on *.* to 'test'@'%' ; ###刷新权限 flush privileges; #查看主服务器状态(显示如下图) show master status;

image-20220816152958238

1.3.5 链接从库

复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
mysql -h 10.0.0.205 -P 3307 -uroot -p change master to master_host='10.0.0.205',master_port=3306,master_user='test',master_password='123',master_log_file='mysql-bin.000003',master_log_pos=0; # 开启从库 start slave; # 查看从库状态 show slave status\G;

1.3.6 测试

复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
# 在主库上创建数据库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 test1;

二、django读写分离

步骤

复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
# 第一步:配置文件配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), }, 'db1': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite31'), } } # 第二步:手动读写分离 # 写到主库 # Book.objects.using('default').create(name='西游记') # 从从库中读 # res=Book.objects.using('db1').all() # print(res) # 第三步:自动读写分离 第一步:写一个类 class AuthRouter(object): def db_for_read(self, model, **hints): return 'db1' def db_for_write(self, model, **hints): return 'default' 第二步:在配置文件中配置 DATABASE_ROUTERS = ['django_test.db_router.AuthRouter', ]
posted @   马氵寿  阅读(62)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开