利用Galera Cluster解决主主复制单点问题
Galera Cluster
关于Galera Cluster
Galera Cluster:集成了Galera插件的MySQL集群,是一种新型的,数据不共享的,高度冗余的高可用方案,目前Galera Cluster有两个版本,分别是Percona Xtradb Cluster及MariaDB Cluster,Galera本身是具有多主特性的,即采用multi-master的集群架构,是一个既稳健,又在数据一致性、完整性及高性能方面有出色表现的高可用解决方案
Galera Cluster特点
- 多主架构:真正的多点读写的集群,在任何时候读写数据,都是最新的
- 同步复制:集群不同节点之间数据同步,没有延迟,在数据库挂掉之后,数据不会丢失
- 并发复制:从节点APPLY数据时,支持并行执行,更好的性能
- 故障切换:在出现数据库故障时,因支持多点写入,切换容易
- 热插拔:在服务期间,如果数据库挂了,只要监控程序发现的够快,不可服务时间就会非常少。在节点故障期间,节点本身对集群的影响非常小
- 自动节点克隆:在新增节点,或者停机维护时,增量数据或者基础数据不需要人工手动备份提供,Galera Cluster会自动拉取在线节点数据,最终集群会变为一致
- 对应用透明:集群的维护,对应用程序是透明的
Galera Cluster工作过程
Galera Cluster场景模拟
三个节点组成了一个集群,与普通的主从架构不同,它们都可以作为主节点,三个节点是对等的,称为multi-master架构,当有客户端要写入或者读取数据时,连接哪个实例都是一样的,读到的数据是相同的,写入某一个节点之后,集群自己会将新数据同步到其它节点上面,这种架构不共享任何数据,是一种高冗余架构
IP地址分配
主机 | IP地址 | 类型 |
---|---|---|
CentOS7.6 | 192.168.36.101 | Master |
CentOS7.6 | 192.168.36.103 | Master |
CentOS7.6 | 192.168.36.104 | Master |
创建Galera源
[root@CentOS7 ~]#cd /etc/yum.repos.d/[root@CentOS7 yum.repos.d]#vim galera.repo[galera]name=galerabaseurl=https://mirrors.tuna.tsinghua.edu.cn/mariadb/mariadb-5.5.64/yum/centos7-amd64/gpgcheck=0
将Galera源scp至其余两个节点
[root@CentOS7 yum.repos.d]#scp galera.repo 192.168.36.104:/etc/yum.repos.d/root@192.168.36.104's password:galera.repo 100% 119 3.6KB/s 00:00[root@CentOS7 yum.repos.d]#scp galera.repo 192.168.36.103:/etc/yum.repos.d/root@192.168.36.103's password:galera.repo 100% 119 40.2KB/s 00:00
安装MariaDB-Galera-server
[root@CentOS7 ~]#yum install MariaDB-Galera-server
修改Galera配置文件
[root@CentOS7 ~]#vim /etc/my.cnf.d/server.cnf[galera]# Mandatory settingswsrep_provider=/usr/lib64/galera/libgalera_smm.so # 模块库文件所在路径wsrep_cluster_address="gcomm://192.168.36.101,192.168.36.103,192.168.36.104" # 集群IP地址binlog_format=row # 基于行语句#default_storage_engine=InnoDB#innodb_autoinc_lock_mode=2#bind-address=0.0.0.0
将Galera配置文件同步到所有机器上
[root@CentOS7 ~]#scp /etc/my.cnf.d/server.cnf 192.168.36.103:/etc/my.cnf.d/root@192.168.36.103's password:server.cnf 100% 1111 92.4KB/s 00:00[root@CentOS7 ~]#scp /etc/my.cnf.d/server.cnf 192.168.36.104:/etc/my.cnf.d/root@192.168.36.104's password:server.cnf 100% 1111 42.0KB/s 00:00
启动服务:要求先启动一个,初始化集群,然后再启用其余节点(--wsrep-new-cluster启动一个新的集群节点)
[root@CentOS7 ~]#service mysql start --wsrep-new-clusterStarting MariaDB.190511 10:53:55 mysqld_safe Logging to '/var/lib/mysql/CentOS7.magedu36.com.err'.190511 10:53:55 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql...... SUCCESS![root@CentOS7-1 ~]#service mysql startStarting MariaDB.190510 10:54:29 mysqld_safe Logging to '/var/lib/mysql/CentOS7-1.err'.190510 10:54:29 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql...SST in progress, setting sleep higher.. SUCCESS![root@CentOS7-2 ~]#service mysql startStarting MariaDB.190510 10:54:37 mysqld_safe Logging to '/var/lib/mysql/CentOS7-2.err'.190510 10:54:37 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql...SST in progress, setting sleep higher.... SUCCESS!
此时已经实现多主复制
安全初始化
[root@CentOS7 ~]#mysql_secure_installation/usr/bin/mysql_secure_installation: line 393: find_mysql_client: command not found....Set root password? [Y/n]New password:Re-enter new password:Password updated successfully!Reloading privilege tables.. ... Success!Remove anonymous users? [Y/n] ... Success!Disallow root login remotely? [Y/n] ... Success!Remove test database and access to it? [Y/n] - Dropping test database... ... Success! - Removing privileges on test database... ... Success!Reload privilege tables now? [Y/n] ... Success!Thanks for using MariaDB!
同时创建表,模仿冲突案例
成功解决冲突问题
MySQL压力测试
简介
Mysqlslap:来自于mariadb包,测试的过程默认生成一个mysqlslap的schema,生成测试表t1,查询和插入测试数据,mysqlslap库自动生成,如果已经存在则先删除。用--only-print来打印实际的测试过程,整个测试完成后不会在数据库中留下痕迹
使用格式
mysqlslap [options]
常用参数
--auto-generate-sql, -a 自动生成测试表和数据,表示用mysqlslap工具自己生成的SQL脚本来测试并发压力
--auto-generate-sql-load-type=type 测试语句的类型。代表要测试的环境是读操作还是写操作还是两者混合的。取值包括:read,key,write,update和mixed(默认)
--auto-generate-sql-add-auto-increment 代表对生成的表自动添加auto_increment列,从5.1.18版本开始支持
--number-char-cols=N, -x N 自动生成的测试表中包含多少个字符类型的列,默认1
--number-int-cols=N, -y N 自动生成的测试表中包含多少个数字类型的列,默认1
--number-of-queries=N 总的测试查询次数(并发客户数×每客户查询次数)
--query=name,-q 使用自定义脚本执行测试,例如可以调用自定义的存储过程或者sql语句来执行测试
--create-schema 代表自定义的测试库名称,测试的schema
--commint=N 多少条DML后提交一次
--compress, -C 如服务器和客户端都支持压缩,则压缩信息
--concurrency=N, -c N 表示并发量,即模拟多少个客户端同时执行select。可指定多个值,以逗号或者--delimiter参数指定值做为分隔符如:--concurrency=100,200,500
--engine=engine_name, -e engine_name 代表要测试的引擎,可以有多个,用分隔符隔开。例如:--engines=myisam,innodb
--iterations=N, -i N 测试执行的迭代次数,代表要在不同并发环境下,各自运行测试多少次
--only-print 只打印测试语句而不实际执行。
--detach=N 执行N条语句后断开重连
--debug-info, -T 打印内存和CPU的相关信息
mysqlslap示例
单线程测试
mysqlslap -a -uroot -pmagedu
多线程测试。使用-concurrency来模拟并发连接
mysqlslap -a -c 100 -uroot -pmagedu
迭代测试。用于需要多次执行测试得到平均值
mysqlslap -a -i 10 -uroot -pmagedumysqlslap ---auto-generate-sql-add-autoincrement -amysqlslap -a --auto-generate-sql-load-type=readmysqlslap -a --auto-generate-secondary-indexes=3mysqlslap -a --auto-generate-sql-write-number=1000mysqlslap --create-schema world -q "select count(*) from City"mysqlslap -a -e innodb -uroot -pmagedumysqlslap -a --number-of-queries=10 -uroot -pmagedu
测试同时不同的存储引擎的性能进行对比
mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 --engine=myisam,innodb --debug-info -uroot -pmagedu
执行一次测试,分别50和100个并发,执行1000次总查询
mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --debuginfo -uroot -pmagedu
50和100个并发分别得到一次测试结果(Benchmark),并发数越多,执行完所有查询的时间越长。为了准确起见,可以多迭代测试几次
mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 --debug-info -uroot -pmagedu