当前位置: 首页 > 后端技术 > Python

python实现mysql数据库的读写分离

时间:2023-03-25 21:38:36 Python

我之前写过一个mysql的主从同步,所以在做了这个同步之后,在它的基础上,我们做读写分离的操作就比较简单了。读写分离,顾名思义,我们可以将读写这两个操作分开,来降低数据访问的压力,解决高并发的问题。所以今天我们使用Python的两大框架来做这个读写分离的操作。一、Django框架实现读写分离Django做读写分离很简单,只需要在settings.py中的数据库配置文件中添加slave机器即可。DATABASES={'default':{'ENGINE':'django.db.backends.mysql','HOST':'127.0.0.1',#主服务器运行ip'PORT':3306,#主服务器运行端口mainserver'USER':'django_master',#主服务器用户名'PASSWORD':'django_master',#主服务器密码'NAME':'djangobase_master'#数据表名},'slave':{“引擎”:“django.db.backends.mysql”,“主机”:“127.0.0.1”,“端口”:3307,“用户”:“django_slave”,“密码”:“django_slave”,“名称”:'djangobase_slave'}}在项目的app文件中创建一个db_route.py文件,在文件中直接定义一个数据库路由类来区分读写操作。"""数据库读写路由"""defdb_for_read(self,model,**hints):"""read"""return"slave"defdb_for_write(self,model,**hints):"""write"""return"default"defallow_relation(self,obj1,obj2,**hints):"""是否运行关联操作"""returnTrue最后我们可以在settings.py中写路由配置。DATABASE_ROUTERS=["app001.db_router.MasterSlaveDBRouter"]Flask框架实现了读写分离。首先自定义Session类,重写get_bind方法,根据self.flushing判断读写操作,选择对应的数据库。fromflaskimportFlaskfromflask_sqlalchemyimportSQLAlchemy,SignallingSession,get_statefromsqlalchemyimportormclassRoutingSession(SignallingSession):defget_bind(self,mapper=None,clause=None):read-write.state=get_state(self.app)#operation_flushing:#写操作,使用主库print("writedata")returnstate.db.get_engine(self.app,bind='master')else:#读操作,使用从库print('readdata')returnstate.db.get_engine(self.app,bind='slave')自定义SQLAlchemy类,重写create_session方法,在其中使用自定义的Session类。classRoutingSQLAlchemy(SQLAlchemy):defcreate_session(self,options):returnorm.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的读写分离操作,你学会了吗?