Mysql Fabric高可用集群分片功能测试

发表于:2015-2-09 10:48

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:kw107301    来源:51Testing软件测试网采编

分享:
  3、测试mysqlfabric的qbs
  结论
  从以上数据说明,mysqlfabric的ips和qbs的性能是随着进程数的增加而呈正比例上升的,上升的幅度不大,以上测试采用的是默认的mysql配置,可以调整innodb_buffuer_size这个参数来增加mysql的性能,得出来的不尽如人意。
  此外,在测试mysqlfabric的过程中,还有以下几点问题需要解决:
  a.    分片时,发生以下错误
  [ERROR] 1420771468.040900 - Executor-24 - Error in _check_shard_information.
  Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/mysql/fabric/executor.py", line 378, in execute
  self.__result = self.__action(*self.__args, **self.__kwargs)
  File "/usr/local/lib/python2.7/site-packages/mysql/fabric/events.py", line 80, in wrapped
  return wrapped.function(*args, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/mysql/fabric/services/resharding.py", line 250, in _check_shard_information
  upper_bound
  File "/usr/local/lib/python2.7/site-packages/mysql/fabric/sharding.py", line 979, in split_value
  upper_bound = int(upper_bound, 16)
  TypeError: int() can't convert non-string with explicit base
  Procedure :
  { uuid = 859e1cdd-24fd-4ccd-9363-186d7df91971,
  finished = True,
  success = False,
  return = TypeError: int() can't convert non-string with explicit base,
  activities =
  }
  对于python来说,是进制之间不能正常转换,因此,在添加分片的数据库的数据,不能只添加自增长id的数据
  b.mysqlfabric进程数的限制
  配置文件/etc/mysql/fabric.cfg,当threads=100、executors=49,会发现执行mysqlfabric manage start &报错
  Procedure :
  { uuid = fea93aaf-4f01-43ae-b1ca-89d4abee6b2e,
  finished = True,
  success = False,
  return = ConfigurationError: Too many threads requested. Session threads (100), Executor threads (49), Control threads (1) and Failure Detector threads (0). The maximum number of threads allowed is (150). Increase the maximum number of connections in the state store in order to increase this limit.,
  activities =
  }
  由源代码可知,进程数与执行数之和不能大于150-1
  c.mysqlfabric程序本身的不稳定性
  mysqlfabrci程序本身容错性比较弱,当操作失误时,有时会卡住不执行,然后需要将进程kill掉重新启动,使用stop命令停不掉;另外,当在分片时,进程突然中断,重启mysqlfabric后,不会继续执行上次分片的位置,而是需要重新分片。
  d.mysqlfabric同时进行多进程插入查询时,会报错
  在进行测试时,当同时插入数据的进程数或查询的进程数大于40,会报以下错误
Process Process-25:
Traceback (most recent call last):
File "/usr/local/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/usr/local/lib/python2.7/multiprocessing/process.py", line 114, in run
self._target(*self._args, **self._kwargs)
File "thread_tps_test.py", line 43, in run_test
conn = create_conn_by_fabric()
File "thread_tps_test.py", line 23, in create_conn_by_fabric
user="root", password="", autocommit=True,database='test'
File "/usr/local/lib/python2.7/site-packages/mysql/connector/__init__.py", line 144, in connect
return mysql.connector.fabric.connect(*args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/mysql/connector/fabric/__init__.py", line 53, in connect
return MySQLFabricConnection(**kwargs)
File "/usr/local/lib/python2.7/site-packages/mysql/connector/fabric/connection.py", line 809, in __init__
self.store_config(**kwargs)
File "/usr/local/lib/python2.7/site-packages/mysql/connector/fabric/connection.py", line 948, in store_config
self._configure_fabric(config['fabric'])
File "/usr/local/lib/python2.7/site-packages/mysql/connector/fabric/connection.py", line 929, in _configure_fabric
self._fabric.seed()
File "/usr/local/lib/python2.7/site-packages/mysql/connector/fabric/connection.py", line 332, in seed
fabinst.connect()
File "/usr/local/lib/python2.7/site-packages/mysql/connector/fabric/connection.py", line 763, in connect
self._proxy = self._xmlrpc_get_proxy()
File "/usr/local/lib/python2.7/site-packages/mysql/connector/fabric/connection.py", line 747, in _xmlrpc_get_proxy
proxy._some_nonexisting_method() # pylint: disable=W0212
File "/usr/local/lib/python2.7/xmlrpclib.py", line 1224, in __call__
return self.__send(self.__name, args)
File "/usr/local/lib/python2.7/xmlrpclib.py", line 1578, in __request
verbose=self.__verbose
File "/usr/local/lib/python2.7/site-packages/mysql/connector/fabric/connection.py", line 272, in request
raise InterfaceError("Connection with Fabric failed: " + msg)
InterfaceError: Connection with Fabric failed: <urlopen error [Errno 110] Connection timed out>
  5.    测试mysqlfabric性能的脚本
  测试mysqlfabric ips
__author__ = 'kw107301'
import mysql.connector
from mysql.connector import fabric
import random
import sys
from multiprocessing import Process
import time
table_count=1000
requests = int(sys.argv[1])
type = int(sys.argv[2])
threads = int(sys.argv[3])
print "requests:%d, type:%d, threads:%d"%(requests,type,threads)
print time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
cur = None
def create_conn_by_fabric():
conn = mysql.connector.connect(
fabric={"host" : "localhost", "port" : 32274,
"username": "admin", "password" : "admin"
},
user="root", password="", autocommit=True,database='test'
)
conn.set_property(tables=["test.subscribers"], scope=fabric.SCOPE_LOCAL, mode=fabric.MODE_READONLY)
return conn
def get_result(conn):
sub_no = random.randint(1, table_count)
if type == 1:
conn = create_conn_by_fabric()
conn.set_property(tables=["test.subscribers"], key=sub_no, mode=fabric.MODE_READONLY)
"""conn.reset_cache()"""
cur = conn.cursor()
cur.execute(
"INSERT INTO subscribers VALUES (%s, 'Billy', 'Fish')",
(sub_no,first_name, last_name)
)
def run_test():
conn = create_conn_by_fabric()
for i in range(requests/threads):
get_result(conn)
if __name__ == '__main__':
thd = []
s_time = time.time()
for i in range(threads):
t = Process(target=run_test)
thd.append(t)
t.start()
for m in thd:
m.join()
print "test finished, total cost %.2f second, TPS is %.2f"%((time.time()-s_time),requests/(time.time()-s_time))
  测试mysqlfabric qbs
import mysql.connector
from mysql.connector import fabric
import random
import sys
from multiprocessing import Process
import time
table_count=10000
requests = int(sys.argv[1])
type = int(sys.argv[2])
threads = int(sys.argv[3])
print "requests:%d, type:%d, threads:%d"%(requests,type,threads)
print time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
cur = None
def create_conn_by_fabric():
conn = mysql.connector.connect(
fabric={"host" : "localhost", "port" : 32274,
"username": "admin", "password" : "admin"
},
user="root", password="", autocommit=True,database='test'
)
conn.set_property(tables=["test.subscribers"], scope=fabric.SCOPE_LOCAL, mode=fabric.MODE_READONLY)
return conn
def get_result(conn):
sub_no = random.randint(0, table_count)
if type == 1:
conn = create_conn_by_fabric()
conn.set_property(tables=["test.subscribers"], key=sub_no, mode=fabric.MODE_READONLY)
cur = conn.cursor()
cur.execute(
"SELECT * FROM subscribers "
"WHERE sub_no = %s", (sub_no, )
)
def run_test():
conn = create_conn_by_fabric()
for i in range(requests/threads):
get_result(conn)
if __name__ == '__main__':
thd = []
s_time = time.time()
for i in range(threads):
t = Process(target=run_test)
thd.append(t)
t.start()
for m in thd:
m.join()
print "test finished, total cost %.2f second, QPS is %.2f"%((time.time()-s_time),requests/(time.time()-s_time))
44/4<1234
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号