之前写了一个 mysql 主从同步,那么做了这个同步之后,在它的根底上,咱们做读写拆散这个操作就比较简单了。
读写拆散,顾名思义,咱们能够把读和写两个操作离开,加重数据的拜访压力,解决高并发的问题。
那么咱们明天就 Python 两大框架来做这个读写拆散的操作。
1.Django 框架实现读写拆散
Django 做读写拆散十分的简略,间接在 settings.py 中把从机退出到数据库的配置文件中就能够了。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1', # 主服务器的运行 ip
'PORT': 3306, # 主服务器的运行 port
'USER': 'django_master', # 主服务器的用户名
'PASSWORD': 'django_master', # 主服务器的明码
'NAME': 'djangobase_master' # 数据表名
},
'slave': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1',
'PORT': 3307,
'USER': 'django_slave',
'PASSWORD': 'django_slave',
'NAME': 'djangobase_slave'
}
}
在我的项目的 app 文件中创立 db_route.py 文件,间接在文件里定义一个数据库路由类,用以辨别读写操作。
"""数据库读写路由"""
def db_for_read(self, model, **hints):
"""读"""
return "slave"
def db_for_write(self, model, **hints):
"""写"""
return "default"
def allow_relation(self, obj1, obj2, **hints):
"""是否运行关联操作"""
return True
最初咱们在 settings.py 中写个路由配置就能够了。
DATABASE_ROUTERS = ["app001.db_router.MasterSlaveDBRouter"]
- Flask 框架实现读写拆散
首先自定义 Session 类,重写 get_bind 办法,依据 self.flushing 判断读写操作,抉择对应的数据库。
from flask import Flask
from flask_sqlalchemy import SQLAlchemy, SignallingSession, get_state
from sqlalchemy import orm
class RoutingSession(SignallingSession):
def get_bind(self, mapper=None, clause=None):
state = get_state(self.app)
# 判断读写操作
if self._flushing: # 写操作 , 应用主数据库
print("写入数据")
return state.db.get_engine(self.app, bind='master')
else: # 读操作, 应用从数据库
print('读取数据')
return state.db.get_engine(self.app, bind='slave')
自定义 SQLAlchemy 类,重写 create_session 办法,并在其内应用自定义的 Session 类。
class RoutingSQLAlchemy(SQLAlchemy):
def create_session(self, options):
return orm.sessionmaker(class_=RoutingSession, db=self, **options)
接下来创立 app 实例,配置数据库的监听文件,而后创立 db 连贯对象就能够了。
app = Flask(__name__)
# 设置数据库的连贯地址
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@192.168.105.134:3306/demo'
# 设置数据库的绑定地址
app.config['SQLALCHEMY_BINDS'] = {
'master': "mysql://root:mysql@192.168.105.134:3306/demo",
'slave': "mysql://root:mysql@192.168.105.134:8306/demo"
}
# 设置是否追踪数据库变动 个别不会开启, 影响性能
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 设置是否打印底层执行的 SQL 语句
app.config['SQLALCHEMY_ECHO'] = False
# 创立数据库连贯对象
db = RoutingSQLAlchemy(app)
那么这些就是 Python 的读写拆散操作,你学废了吗?