Galera Cluster

关于Galera Cluster

  Galera Cluster:集成了Galera插件的MySQL集群,是一种新型的,数据不共享的,高度冗余的高可用方案,目前Galera Cluster有两个版本,分别是Percona Xtradb Cluster及MariaDB Cluster,Galera本身是具有多主特性的,即采用multi-master的集群架构,是一个既稳健,又在数据一致性、完整性及高性能方面有出色表现的高可用解决方案

Galera Cluster特点

  1. 多主架构:真正的多点读写的集群,在任何时候读写数据,都是最新的
  2. 同步复制:集群不同节点之间数据同步,没有延迟,在数据库挂掉之后,数据不会丢失
  3. 并发复制:从节点APPLY数据时,支持并行执行,更好的性能
  4. 故障切换:在出现数据库故障时,因支持多点写入,切换容易
  5. 热插拔:在服务期间,如果数据库挂了,只要监控程序发现的够快,不可服务时间就会非常少。在节点故障期间,节点本身对集群的影响非常小
  6. 自动节点克隆:在新增节点,或者停机维护时,增量数据或者基础数据不需要人工手动备份提供,Galera Cluster会自动拉取在线节点数据,最终集群会变为一致
  7. 对应用透明:集群的维护,对应用程序是透明的

Galera Cluster工作过程

利用Galera Cluster解决主主复制单点问题_第1张图片

Galera Cluster场景模拟

利用Galera Cluster解决主主复制单点问题_第2张图片

  三个节点组成了一个集群,与普通的主从架构不同,它们都可以作为主节点,三个节点是对等的,称为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=galera
baseurl=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/
[email protected]'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/
[email protected]'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 settings
wsrep_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/
[email protected]'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/
[email protected]'s password:
server.cnf                                                           100% 1111    42.0KB/s   00:00

启动服务:要求先启动一个,初始化集群,然后再启用其余节点(--wsrep-new-cluster启动一个新的集群节点)

[root@CentOS7 ~]#service mysql start --wsrep-new-cluster
Starting 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 start
Starting 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 start
Starting 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!

同时创建表,模仿冲突案例

利用Galera Cluster解决主主复制单点问题_第3张图片

成功解决冲突问题

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 -pmagedu
mysqlslap ---auto-generate-sql-add-autoincrement -a
mysqlslap -a --auto-generate-sql-load-type=read
mysqlslap -a --auto-generate-secondary-indexes=3
mysqlslap -a --auto-generate-sql-write-number=1000
mysqlslap --create-schema world -q "select count(*) from City”
mysqlslap -a -e innodb -uroot -pmagedu
mysqlslap -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