mysql主从
mysql主从搭建的目的
1.读写分离
2.单个实例并发量低,提高并发量
3.只在主库写,读数据都去从库
mysql主从原理
步骤一:主库db的更新事件(update,insert,delete)被写道binlog
步骤二:从库发起连接,连接到主库
步骤三:此时主库创建一个binlog dump thread线程,把binlog的内容发送到从库
步骤四:从库启动后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log.
步骤五:还会创建一个sql线程,从relay log里面读取内容,从Exec_Master_Log_Pos位置开始执行读取到的更新事件,将更新内容写入到slave的db
搭建步骤:准备两台机器(mysql的docker镜像模拟两台机器)
主库:10.0.0.102 33307
从库:10.0.0.102 33306
第一步:docker拉取mysql5.7的镜像
docker pull mysql:5.7
第二步:创建文件夹,文件(做目录映射)
mkdir /root/mysql
mkdir /root/mysql/conf.d
mkdir /root/mysql/data/
touch /root/mysql/my.cnf
mkdir /root/mysql1
mkdir /root/mysql1/conf.d
mkdir /root/mysql1/data/
touch /root/mysql1/my.cnf
第三步(重要):编写mysql配置文件(主,从)
主的配置文件
/root/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
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
从配置文件
/root/mysql1/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
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
第三步:启动mysql容器,并做端口和目录映射
主库容器
docker run -di -v /root/mysql/data/:/var/lib/mysql -v /root/mysql/conf.d:/etc/mysql/conf.d -v /root/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 /root/mysql1/data/:/var/lib/mysql -v /root/mysql1/conf.d:/etc/mysql/conf.d -v /root/mysql1/my.cnf:/etc/mysql/my.cnf -p 33306:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
第四步:连接主库
mysql -uroot -P33307 -h 10.0.0.200 -p123456
再主库创建用户并授予所以权限
## 创建test用户
create user 'test'@'%' identified by '123';
## 授权用户
grant all privileges on *.* to 'test'@'%' ;
## 刷新权限
flush privileges;
# 查看主服务器状态(显示如下图)
show master status;
第五步:连接从库
mysql -uroot -P33306 -h 10.0.0.200 -p123456
配置详解
'''
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='10.0.0.200',master_port=33307,master_user='test',master_password='123',master_log_file='mysql-bin.000003',master_log_pos=0;
第六步:再主库创建库,创建表,插入数据,看从库
如果不小心再从库进行了写操作那么,之后在主库进行写操作是会产生冲突,导致主从断开
采用以下方式进行可以再次启动主从解决
stop slave; # 先停止主从库
set GLOBAL SQL_SLAVE_SKIP_COUNTER=2; # 这里是跳过binlog的命令条数。也就是把错误条数给跳过就行了
start slave; # 启动主从就ok了
django使用多数据做读写分离
第一步:配置文件配置多数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
},
'db1': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db1.sqlite3',
}
}
migrate --database db1 app01
# 迁移指定数据库
第二步:手动读写分离
Book.objects.using('db1').create(name='西游记')
第三步:自动读写分离
写一个py文件,db_router.py,写一个类
class DBRouter(object):
def db_for_read(self, model, **hints):
# 多个从库 ['db1','db2','db3']
# model是哪个模型表
return 'db1'
def db_for_write(self, model, **hints):
return 'default'
配置文件配置
DATABASE_ROUTERS = ['utils.db_router.DBRouter', ]
以后自动读写分离
标签:主库,db,django,master,mysql,从库,root,主从 From: https://www.cnblogs.com/clever-cat/p/17356820.html