目录
mysql主从
目的: 主要做读写分离,单个数据库并发量太低,提高并发量。
一定要开启binlog日志,是mysql的一个日志机制,只要有变化binlog就会执行
# 原理:
主库db的更新事件会被写到binlog中
从库发起链接连接主库
主库有个binlog线程 把binglog的内容发送到从库
从库有个io线程从读取binlog内容,写到自己的relay log里面
从库还有一个sql线程,读relay log写到从库的db
搭建步骤
1.准备两台机器
拉取mysql5.7的镜像
2.创建文件夹,文件(目录映射)
mkdir /home/mysql
mkdir /home/mysql/conf.d
mkdir /home/mysql/data/
touch /home/mysql/my.cnf
3 编写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
log-bin=mysql-bin
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
从的
[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
[client]
default-character-set=utf8
[mysql]
default-character-set=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 33306: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 -h 10.0.0.200 -P33306 -p
#在主库创建用户并授权
create user 'test'@'%' identified by '123';
grant all privileges on *.* to 'test'@'%' ;
#刷新权限
flush privileges;
查看主服务器状态
show master status; # 文件名在从库中需要用到
连接从库修改配置
mysql -uroot -P33306 -h 10.0.0.201 -p
#配置详解
'''
change master to
master_host='MySQL主服务器IP地址',
master_user='之前在MySQL主服务器上面创建的用户名',
master_password='之前创建的密码',
master_log_file='MySQL主服务器状态中的二进制文件名',
master_log_pos='MySQL主服务器状态中的position值';
'''
# 根据主服务器查出来的状态填写mysql-bin文件名
change master to master_host='10.0.0.200',master_port=33306,master_user='test',master_password='123',master_log_file='mysql-bin.000004',master_log_pos=0;
#启用从库
start slave;
#查看从库状态(如下图)
show slave status\G;
django操作多数据库方法
这里使用sqlite 来做示范
1.配置文件
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
},
'db1': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db1.sqlite3',
}
}
"可以配多个数据库"
mysql:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'lxj',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '10.0.0.200',
'PORT': '33306'
},
'db1': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'lxj',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '10.0.0.201',
'PORT': '33306'
}
}
2.手动读写分离
using() 指定数据库
Book.objects.using('db1').create(name='西游记')
3.自动读写分离
写一个py文件,db_router.py,写一个类:
class DBRouter(object):
def db_for_read(self, model, **hints):
# 多个从库 ['db1','db2','db3'] 可以使用random_choice 随机拿从库
return 'db1'
def db_for_write(self, model, **hints):
return 'default'
4.配置文件添加
DATABASE_ROUTERS = ['mysql_master_demo.db_router.DBRouter', ]
新点
python38 manage.py makemigrations app01 # 后面可以指定迁移的app
python38 manage.pu migrate --databases=db1 # 指定迁移到哪个数据库中,前提是配置文件中DATABASES 配置好
标签:log,db,django,master,mysql,home,从库,主从
From: https://www.cnblogs.com/LiaJi/p/17346826.html