python如何实现mysql的读写分离及负载均衡

  介绍

这篇文章将为大家详细讲解有关python如何实现mysql的读写分离及负载均衡,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

甲骨文数据库有其公司开发的配套rac来实现负载均衡,目前已知的最大节点数能到128个,但是其带来的维护成本无疑是很高的,并且rac的稳定性也并不是特别理想,尤其是节点很多的时候。

,,,,,,但是,相对mysql来说,rac的实用性要比mysql的配套集群软件mysql-cluster要高很多。因为从网上了解到情况来看,很少公司在使用mysql-cluster,大多数企业都会选择第三方代理软件,例如mysql代理,字符集,haproxy等,但是这会引起另外一个问题:单点故障(包括mysql-cluster:管理节点)。如果要解决这个问题,就需要给代理软件搭建集群,在访问量很大的情况下,代理软件的双机或三机集群会成为访问瓶颈,继续增加其节点数,无疑会带来各方面的成本。

那么,如何可以解决这个问题呢?

,,,,,,,,,解决上述问题,最好的方式个人认为应该是在程序中实现。通过和其他mysql DBA的沟通,也证实了这个想法。但是由此带来的疑问也就产生了:会不会增加开发成本?对现有的应用系统做修改会不会改动很大?会不会增加后期版本升级的难度?等等。

,,,,,,,对于一个架构设计良好的应用系统可以很肯定的回答:不会。

,,,,,,,那么怎么算一个架构设计良好的应用系统呢?

,,,,,,简单来说,就是分层合理,功能模块之间耦合性底。以本人的经验来说,系统设计基本上可以划分为以下四层:

,,,,,,1只;实体层:主要定义一些实体类

,,,,,,2只;数据层:也可以叫SQL处理层。主要负责跟数据库交互取得数据

,,,,,,3只;业务处:主要是根据业务流程及功能区分模块(或者说定义不同的业务类)

,,,,,,4只;表现层:呈现最终结果给用户

,,,,,,实现上述功能(mysql的读写分离及负载均衡),在这四个层次中,仅仅涉及到数据层。

严格来说,对于设计良好的系统,只涉及到一个类的一个函数:在数据层中,一般都会单独划分出一个连接类,并且这个连接类中会有一个连接函数,需要改动的就是这个函数:在读取连接字符串之前加一个功能函数返回需要的主机,ip,端口号等信息(没有开发经历的同学可能理解这段话有点费劲)。

,,,,,,流程图如下:

 python如何实现mysql的读写分离及负载均衡”> </p> <p>,,,,,,,,,,代码如下:</p> <pre类= import  mmap   import  json   import 随机   import  mysql.connector   import 时间   # #公有变量   # dbinfo={   #,,,“db0":{& # 39;主机# 39;:& # 39;192.168.42.60& # 39;,& # 39;用户# 39;:& # 39;根# 39;,& # 39;pwd # 39;: & # 39;这样的# 39;,& # 39;my_user& # 39;: & # 39;根# 39;,& # 39;my_pwd& # 39;: & # 39; Abcd.1234& # 39;,“port": 3306年,“database":““,“role":“RW",“weight": 10“status": 1},   #,,,“db1":{& # 39;主机# 39;:& # 39;192.168.42.61& # 39;,& # 39;用户# 39;:& # 39;根# 39;,& # 39;pwd # 39;: & # 39;这样的# 39;,& # 39;my_user& # 39;: & # 39;根# 39;,& # 39;my_pwd& # 39;: & # 39; Abcd.1234& # 39;,“port": 3306年,“database":““:“R",“weight": 20,“status": 1}   #,,,}   dbinfo={}   时间=mmap_file 没有   mmap_time=没有   # #这个函数返回json格式的字符串,也是实现初始化数据库信息的地方   # #使用json格式是为了方便数据转换,从字符串- - - - - -》二进制——》字符串- - - - - -》字典   # #如果采用其它方式共享dbinfo的方法,可以不用此方式   # #配置库的地址   def  get_json_str1 ():   ,return  json.dumps (dbinfo)   # #读取配置库中的内容   def  get_json_str ():   ,试一试:   global  dbinfo才能   时间=cnx 才能;mysql.connector.connect(用户=& # 39;根# 39;,,密码=& # 39;Abcd.1234& # 39;,   ,,,,,,,主机=& # 39;192.168.42.60& # 39;   ,,,,,,,数据库=& # 39;rwlb& # 39;)   时间=cursor 才能;cnx.cursor ()   cmdString才能=皊elect  *,得到rwlb"   ,问=1   cursor.execute才能(cmdString)   for 才能;(主机、用户pwd, my_user my_pwd,角色,体重、状态、端口,db ),拷贝指针:   ,,问=问+ 1   ,,dict_db={& # 39;主机# 39;:主机,& # 39;用户# 39;:用户,& # 39;pwd # 39;: pwd, & # 39; my_user& # 39;: my_user, & # 39; my_pwd& # 39;: my_pwd,“port":港口,“database": db,“role":角色,“weight":体重,“status":地位}   ,,dbinfo [“db" + str(问)]=dict_db   cursor.close才能()   cnx.close才能()   return 才能json.dumps (dbinfo)   ,除了:   cursor.close才能()   cnx.close才能()   return 才能;“;“   # #判断是否能正常连接到数据库   def  check_conn_host ():   ,试一试:   时间=cnx 才能;mysql.connector.connect(用户=& # 39;根# 39;,,密码=& # 39;Abcd.1234& # 39;,   ,,,,,,,主机=& # 39;192.168.42.60& # 39;   ,,,,,,,数据库=& # 39;rwlb& # 39;)   时间=cursor 才能;cnx.cursor ()   cmdString才能=皊elect 用户()“;   ,问=1   cursor.execute才能(cmdString)   for 才能;user 拷贝指针:   ,,问=len(用户)   cursor.close才能()   cnx.close才能()   ,return 问   ,except :   return 才能;1;   # # select 属于读操作,其他属于写操作- - - - - -这里可以划分的更详细,比如执行存储过程等   def  analyze_sql_state (sql):   ,if “选择”sql:拷贝   return 才能“R"   ,其他的:   return 才能“W"   # #读取时间信息   def  read_mmap_time ():   global  mmap_time, mmap_file   ,mmap_time.seek (0)   ,# #初始时间   ,inittime=int (mmap_time.read () .translate(没有,,b # 39; \ x00 # 39;) .decode ())   ,# #当前时间   ,endtime=int (time.time ())   ,# #时间差   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

python如何实现mysql的读写分离及负载均衡