mysql 主从 MySQLroute_mysql主从复制
一: mysql主從復制大體流程
1. master會將變動記錄到二進制日志里面
2. master有一個i/o將二進制日志發(fā)送到slave
3. slave有一個i/o線程把master發(fā)送來的二進制寫入到relay日志里面
4. slave有一個SQL線程, 按照relay日志處理slave的數據
二: 主庫和從庫的配置
注意: 主庫和從庫的版本要一樣
1. 主庫配置
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
server-id=100log-bin=mysql-bin
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
2. 從庫配置
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
server-id=101log-bin=mysql-slave-bin
relay_log=edu-mysql-relay-bin
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
三: 操作步驟
四: Python代碼的實現(讀寫分離)
1. 實現讀寫分離的準備
settings.py配置
DATABASES ={
'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'test','USER': 'root','PASSWORD': '123456','HOST': '39.105.40.122','PORT': 33307,
},'slave': {'ENGINE': 'django.db.backends.mysql','NAME': 'test','USER': 'root','PASSWORD': '123456','HOST': '39.105.40.122','PORT': 33306,
}
}
DATABASE_ROUTERS= ['router.Router1',]
views.py
from django.shortcuts importrender,HttpResponse#Create your views here.
from app01.models importBookdefindex(request):#Book.objects.using("default").create(title="xx",price=10)
#ret=Book.objects.all().using("slave")
#using 是queryset對象的方法
#print(ret)
#Book.objects.create(title="yyy", price=100)
ret =Book.objects.all()print(ret)return HttpResponse('ok')
創(chuàng)建router.py文件
classRouter1:
# 只讀數據庫def db_for_read(self, model, **hints):"""Attempts to read auth models go to auth_db."""
return 'slave'
# 只寫數據庫
def db_for_write(self, model, **hints):"""Attempts to write auth models go to auth_db."""
return 'default'
# 數據庫進行遷移的時候進行約束(但不會報錯)
def allow_migrate(self, db, app_label, model_name=None, **hints):#print("zzzz")
if db == 'slave' and app_label=="app01":return False
2. 實現讀寫分離(手動和自動操作)
2.1 共同操作
python manage.py makemigrations#python manage.py migrate app名字 --database=配置文件數據庫名稱 注意: 寫數據庫
python manage.py migrate app01 --database=default
2.2 手動操作(一般不使用)
#用using說明你要往哪個庫寫還是讀
models.UserType.objects.using('default').create(title='普通用戶')
result= models.UserType.objects.all().using('slave')
2.3自動操作
創(chuàng)建router.py文件(在里面寫入如上面的router.py文件)
問題: (分庫)
app01中的表在default數據庫創(chuàng)建
app02中的表在db1數據庫創(chuàng)建
如何解決不同的應用使用不同的數據庫?
實現步驟:(settings配置如上)
1.
python manage.py makemigrations
2.
#app01中的表在default數據庫創(chuàng)建
python manage.py migrate app01 --database=default
3.
#app02中的表在db1數據庫創(chuàng)建
python manage.py migrate app02 --database=db1
手動操作
m1.UserType.objects.using('default').create(title='VVIP')
m2.Users.objects.using('db1').create(name='VVIP',email='xxx')
自動操作
classRouter1:def db_for_read(self, model, **hints):"""Attempts to read auth models go to auth_db."""
if model._meta.app_label == 'app01':return 'default'
else:return 'db1'
def db_for_write(self, model, **hints):"""Attempts to write auth models go to auth_db."""
if model._meta.app_label == 'app01':return 'default'
else:return 'db1'DATABASE_ROUTERS= ['db_router.Router1', ]
#使用:
m1.UserType.objects.using('default').create(title='VVIP')
m2.Users.objects.using('db1').create(name='VVIP', email='xxx')#其他:
classRouter1:#數據庫遷移時進行約束:
def allow_migrate(self, db, app_label, model_name=None, **hints):"""All non-auth models end up in this pool."""
if db == 'db1' and app_label == 'app02':returnTrueelif db == 'default' and app_label == 'app01':returnTrueelse:returnFalse#如果返回None,那么表示交給后續(xù)的router,如果后續(xù)沒有router,則相當于返回True
def db_for_read(self, model, **hints):"""Attempts to read auth models go to auth_db."""
if model._meta.app_label == 'app01':return 'default'
else:return 'db1'
def db_for_write(self, model, **hints):"""Attempts to write auth models go to auth_db."""
if model._meta.app_label == 'app01':return 'default'
else:return 'db1'
總結
以上是生活随笔為你收集整理的mysql 主从 MySQLroute_mysql主从复制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 毫秒转时间字符串_java 时
- 下一篇: java某市出租车_智慧职教mooc的A