一、摘要
分别在北京、日本、美国部署3台MySQLDB,组成一个Cluster,测试DB集群的健壮性。
Controller:10.13.25.254 北京
Nodes:
10.13.25.2—北京
10.13.25.3—北京
10.13.25.4—北京
10.13.5.2—日本
10.13.5.3—日本
10.13.5.4—日本
10.13.13.2—美国
10.13.13.3—美国
10.13.13.4—美国
二、数据库集群部署:
1、安装ClusterControl
10.13.25.254:
$ wget http://www.severalnines.com/downloads/cmon/install-cc $ chmod +x install-cc $ ./install-cc # as root or sudo user
这里需要注意的是,安装时尽量只保留一块网卡,如果有多块网卡,需要指定HOST。E.g.:
$ HOST=10.13.25.254 ./install-cc
Controller安装过程中会一起安装Apache,完成之后点击页面操作部署集群;
参考链接:
http://severalnines.com/getting-started
2、部署MySQL集群
2.1.打开浏览器,输入:
http://10.13.25.254/clustercontrol
输入邮箱地址和密码,创建管理员用户
2.2.设置ClusterControl和nodes之间的密钥登陆:
$ ssh-keygen -t rsa # press enter on all prompts $ ssh-copy-id -i ~/.ssh/id_rsa [ClusterControl IP address] $ ssh-copy-id -i ~/.ssh/id_rsa [ClusterControl IP address] # repeat this to all target database nodes
2.3.部署新的DB Server或者已经建好的DB Server到ClusterControl,通过:
Add Existing Servers/Clusters | Create Database Cluster | Create Database Node
这里我全部新建测试MariaDB,9个Node,中日美各三个:配置好之后部署即可,程序会自动在9个server上安装DB服务并统一规划到一个Cluster里面:
集群创建完成:
三、集群测试
3.1.
测试工具:SYSBENCH
数据库:MariaDB-10.0.23
sysbench版本:0.5
wsrep_sst_method=xtrabackup-v2和rsync
3.2.测试方法
1.创建Cluster:部署9台DB Server:北京3台,日本3台,达拉斯3台;9台DB Server组成一个Cluster,通过北京的Control Server进行管理;
2.创建初始化数据库:分别在9台DB上创建测试数据库,每个数据库包含8个表,10万条记录;
3.并发测试:sysbench采用16线程并发,混合读写模式(包含SELECT、UPDATE、INSERT、DELETE)分别同时从中、日、美对数据库进行操作;在操作过程中down掉中日或者中美的链路;
4.更改wsrep_sst的method值,测试以上几种情况数据库的可用性;
3.3.测试案例
1. 数据库在压测过程中,只中断中美或者中日之间的链路之后,观察中、日、美各个节点数据库的可操作性;
2. 数据库在压测过程中,同时中断中美和中日之间的链路,观察中、日、美各个节点数据库的可操作性;
3. 链路恢复之后观察中、日、美各个节点数据库是否同步成功和同步时间;
4. wsrep_sst_method分别设置为xtrabackup-v2和rsync分别进行相同的测试;
3.4. 测试结果
1.隔离任何一个site的网络之后,被隔离的site数据库server无法进行读写操作,报错“WSREP has not yet prepared”,其他节点能够正常操作并同步;链路恢复之后,被隔离site服务恢复,并能够同步成功;
2.同时隔离两个site之后,全部site的数据库操作均被中断,链路恢复之后所有节点能够正常提供服务,并同步成功;
3.链路恢复之后,中日美各个节点之间的数据库同步,在修改大概千条记录的情况下,需要的同步时间在秒级别。
4.wsrep_sst_method分别设置为xtrabackup-v2和rsync,测试结果没有区别。
总结:在没有备用链路的情况下,该DB集群架构在任何一个site的网络被隔离之后,由于集群机制会导致被中断的节点数据库无法进行读写操作,在多节点同时对数据库进行操作的情况下不建议实施。
注:
此测试全部用的安装完成之后的默认配置,测试结果仅供参考。
相关截图:
测试数据库:
压测过程:
网络隔离后读写失败:
网络恢复后同步成功:
附:
测试脚本
#!/usr/local/envpython ##This script is used to test Mysql DB Cluter from fabric.api import run from fabric.context_managers import env from fabric.context_managers import cd env.hosts=['10.13.25.2','10.13.25.3','10.13.25.4','10.13.5.2','10.13.5.3','10.13.5.4','10.13.13.2','10.13.13.3','10.13.13.4'] env.user= 'root' env.password= 'mypassword' env.parallel= True #def install(): # # First install 'sysbench' pkg(ubuntu/debian) # #rpm -Uvh --forcehttp://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm(redhat/centos) # run("aptitude -y installsysbench") #defcreateDB(): # run("mysql -ucmon -pcds-china -e'create database sbtest'") # You need to create a default testdatabase called 'sbtest' def testDB(): run('sysbench--test=/usr/share/doc/sysbench/tests/db/oltp.lua --num-threads=16--max-requests=10000 --db-driver=mysql --mysql-user=cmon--mysql-password=cds-china --mysql-socket=/var/lib/mysql/mysql.sock \ --mysql-port=3306 --oltp-table-size=100000 --oltp-tables-count=8 --oltp-reconnect-mode=transaction \ --mysql-table-engine=innodb prepare') run('sysbench--test=/usr/share/doc/sysbench/tests/db/oltp.lua --num-threads=16--max-requests=10000 --db-driver=mysql --mysql-user=cmon--mysql-password=cds-china --mysql-socket=/var/lib/mysql/mysql.sock \ --mysql-port=3306 --oltp-table-size=100000 --oltp-tables-count=8 --oltp-reconnect-mode=transaction \ --mysql-table-engine=innodb --report-interval=5 run') run('sysbench--test=/usr/share/doc/sysbench/tests/db/oltp.lua --num-threads=16--max-requests=10000 --db-driver=mysql --mysql-user=cmon--mysql-password=cds-china --mysql-socket=/var/lib/mysql/mysql.sock\ --mysql-port=3306 --oltp-table-size=100000 --oltp-tables-count=8 --oltp-reconnect-mode=transaction \ --mysql-table-engine=innodb cleanup')
sysbench常用参数说明:
1、 --test=/usr/share/doc/sysbench/tests/db/oltp.lua,使用oltp.lua脚本进行测试.(包括SELECT/UPDATE/DELETE/INSERT等数据库混合操作)
2、 --max-requests=10000设置最大请求数;如果使用--max-time(这里设置600s),需要设置--max-request为0,默认是10000(总请求数)
3、 --oltp-table-size:指定表的大小,即表的行数
4、 --mysql-table-engine:指定存储引擎,如myisam,innodb,heap,ndbcluster,bdb,maria,falcon,pbxt
5、 --mysql-db:指定在哪个数据库创建测试表,默认为sbtest库,需要提前创建好
6、 --test:指定Lua脚本,参数选项大部分同老版本的--test=oltp help
7、 --db-driver:指定驱动,默认为Mysql
8、 --myisam-max-rows:指定Myisam表的MAX_ROWS选项
9、 --oltp-secondary:测试表将使用二级索引KEY xid (ID) 替代 PRIMARY KEY (ID),innodb引擎内部为每个表创建唯一6字节的主键索引
10、--oltp-auto-inc:设置id列为auto-incremental,值为on或off,默认为on
11、--oltp-read-only:执行仅仅SELECT测试,默认off
12、创建多个表,使用--oltp-tables-count指定,默认为1:
--num-threads=: 使用多线程创建多表,节省准备时间;--oltp-tables-count的数量应该是--num-threads的倍数。
sysbench测试过程中可能会遇到的错误:
1、PANIC: unprotected error in call to Lua API (cannot open sysbench/tests/db/oltp.lua: No such file or directory)
解决:stsbench版本问题导致,--test=/usr/share/doc/sysbench/tests/db/oltp.lua指定lua脚本的位置即可解决。
2. FATAL: unable to connect to MySQL server, aborting...
[10.13.13.4] out: FATAL: error 2002: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2 "No such file or directory")
[10.13.13.4] out: FATAL: failed to execute function `prepare': /usr/share/doc/sysbench/tests/db/common.lua:103: Failed to connect to the database
[10.13.13.4] out:
一种方法更改/etc/mysql/my.cnf的socket路径,另一种方法添加sysbench参数,指定socket路径。