乐趣区

关于python:Python实现mysql数据库读写分离

之前写了一个 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"]
  1. 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 的读写拆散操作,你学废了吗?

退出移动版