一、摘要

分别在北京、日本、美国部署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

wKioL1aQ_1GTazvjAABzE3usp08730.png


wKioL1aQ_37znrCZAABYnrDmKDM364.png


wKiom1aQ_1TCByQvAABNpa_rGdQ473.png


wKiom1aQ_1Xj54PIAABjGz_opss207.png

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,中日美各三个:wKiom1aRAxTi7wFTAAC0dbyGljM759.png配置好之后部署即可,程序会自动在9个server上安装DB服务并统一规划到一个Cluster里面:

wKiom1aRBMTDA7YyAABoxAfArs8391.pngwKiom1aRBJmSbsRpAABfKwv4WwE898.png

集群创建完成:

wKioL1aRBXHjqhviAAJbYZx2j7g384.png

三、集群测试

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的网络被隔离之后,由于集群机制会导致被中断的节点数据库无法进行读写操作,在多节点同时对数据库进行操作的情况下不建议实施。

注:

  此测试全部用的安装完成之后的默认配置,测试结果仅供参考。

相关截图:

测试数据库:

wKioL1aRCd7iumI3AAE9itZKOwo308.png

压测过程:

wKiom1aRCdyyi0k7AAgHN5nLrAw296.png

网络隔离后读写失败:

wKioL1aRClGQlS0sAATcwZZvWAY481.png

网络恢复后同步成功:

wKiom1aRCjaRer2sAADWtIdDNiM716.png

附:

测试脚本

#!/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路径。