MYSQL使用MHA实现主从复制高可用、Galera Cluster介绍、压力测试、my.cnf配置参考

MHA介绍

MHA: Master High Availability,对主节点进行监控,可实现自动故障转移至其它从节点;通过提升某一从节点为新的主节点,基于主从复制实现,还需要客户端配合实现,目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库。

官网:https://code.google.com/archive/p/mysql-master-ha/

MHA工作原理

1 从宕机崩溃的master保存二进制日志事件(binlog events)
2 识别含有最新更新的slave
3 应用差异的中继日志(relay log)到其他的slave
4 应用从master保存的二进制日志事件(binlog events)
5 提升一个slave为新的master
6 使其他的slave连接新的master进行复制

MHA软件由两部分组成,Manager工具包和Node工具包
Manager工具包主要包括以下几个工具:
masterha_check_ssh 检查MHA的SSH配置状况
masterha_check_repl 检查MySQL复制状况
masterha_manger 启动MHA
masterha_check_status 检测当前MHA运行状态
masterha_master_monitor 检测master是否宕机
masterha_master_switch 故障转移(自动或手动)
masterha_conf_host 添加或删除配置的server信息

Node工具包:这些工具通常由MHA Manager的脚本触发,无需人为操作)主要包括以下几个工具:
save_binary_logs 保存和复制master的二进制日志
apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的slave
filter_mysqlbinlog 去除不必要的ROLLBACK事件(MHA已不再使用此工具)
purge_relay_logs 清除中继日志(不会阻塞SQL线程)

注意:为了尽可能的减少主库硬件损坏宕机造成的数据丢失,因此在配置MHA的同时建议配置成MySQL 5.5的半同步复制

自定义扩展:
secondary_check_script: 通过多条网络路由检测master的可用性
master_ip_ailover_script: 更新Application使用的masterip
shutdown_script: 强制关闭master节点
report_script: 发送报告
init_conf_load_script: 加载初始配置参数
master_ip_online_change_script:更新master节点ip地址

配置文件:
global配置,为各application提供默认配置
application配置:为每个主从复制集群

MHA配置步骤参考

现有
主服务器A:192.168.1.11
从服务器
B1:192.168.1.12
B2:192.168.1.13
用来搭建MHA的
服务器M:192.168.1.5

1.安装包
在M上
mha4mysql-manager
mha4mysql-node

在A B1 B2上安装
mha4mysql-node

2.在M上添加配置文件
在管理节点建立配置文件
vim /app/mha/mha1.cnf
[server default]
user=mhauser
password=test112
manager_workdir=/data/mha/app1/
manager_log=/data/mha/app1/mha.log
remote_workdir=/data/mha/app1/
ssh_user=root
repl_user=repluser
repl_password=test112
ping_interval=1
[server1]
hostname=192.168.1.11
candidate_master=1
[server2]
hostname=192.168.1.12
candidate_master=1
[server3]
hostname=192.168.1.13

3.添加用户和修改配置文件
在M上的配置需要增加:
[mysqld]
skip_name_resolve=1

如果没有用户则创建用户

grant replication slave on *.* to repluser@'192.168.1.%' identified by 'test11';
grant all on *.* to mhauser@'192.168.1.%' identified by 'test11';

在B1 B2上
[mysqld]
relay_log_purge=0 不清除中继日志
skip_name_resolve=1
注意,如果有正常搭建好主从复制,上面创建的两个用户应该已同步,如果没有则手动创建。

4.配置KEY验证

这里在M上配置
使用命令
ssh-keygen

生成公钥私钥后复制给自己
ssh-copy-id 192.168.1.5

复制到其他服务器上
scp -r .ssh 192.168.1.11:/root/
scp -r .ssh 192.168.1.12:/root/
scp -r .ssh 192.168.1.13:/root/

5.验证和启动
验证配置是否成功
masterha_check_ssh --conf=/app/mha/mha1.cnf
masterha_check_repl --conf=/app/mha/mha1.cnf

启动MHA
masterha_manager --conf=/app/mha/mha1.cnf

MHR日志文件路径在上面配置过:
/data/mha/app1/mha.log

Galera Cluster介绍

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

三个节点组成了一个集群,与普通的主从架构不同,它们都可以作为主节点,三个节点是对等的,称为multi-master架构,当有客户端要写入或者读取数据时,连接哪个实例都是一样的,读到的数据是相同的,写入某一个节点之后,集群自己会将新数据同步到其它节点上面,这种架构不共享任何数据,是一种高冗余架构

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

Galera Cluster包括两个组件
Galera replication library (galera-3)
WSREP:MySQL extended with the Write Set Replication

WSREP复制实现:
PXC:Percona XtraDB Cluster,是Percona对Galera的实现
MariaDB Galera Cluster
参考仓库:https://mirrors.tuna.tsinghua.edu.cn/mariadb/mariadb-5.5.59/yum/centos7-amd64/
注意:都至少需要三个节点,不能安装mariadb-server

搭建步骤参考

1.三台服务器上安装
yum install MariaDB-Galera-server

2.修改配置文件
vim /etc/my.cnf.d/server.cnf

[galera]
wsrep_provider = /usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.1.10,192.168.1.11,192.168.1.12"
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0

可选配置项
wsrep_cluster_name = ‘mycluster‘ 	集群名字
wsrep_node_name = 'node1'			第一台机子的节点名
wsrep_node_address =192.168.1.10	集群中第一台机子的IP

3.启动
在任意一台机子上使用此命令启动创建集群
/etc/init.d/mysql start --wsrep-new-cluster

另外2台机子正常启动即可
service mysql start

查看集群中相关系统变量和状态变量
SHOW VARIABLES LIKE 'wsrep_%‘;
SHOW STATUS LIKE 'wsrep_%‘;
SHOW STATUS LIKE 'wsrep_cluster_size‘;

压力测试

压力测试工具:
mysqlslap
Sysbench:功能强大
tpcc-mysql
MySQL Benchmark Suite
MySQL super-smack
MyBench

Mysqlslap

来自于mariadb包,测试的过程默认生成一个mysqlslap的
schema,生成测试表t1,查询和插入测试数据,mysqlslap库自动生成,如果已经存在则先删除。用–only-print来打印实际的测试过程,整个测试完成后不会在数据库中留下痕迹

使用格式:mysqlslap [options]
常用参数 [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 -a -uroot -ptest112

多线程测试。使用–concurrency来模拟并发连接
mysqlslap -a -c 100 -uroot -ptest112

迭代测试。用于需要多次执行测试得到平均值
mysqlslap -a -i 10 -uroot -ptest112
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 -ptest112
mysqlslap -a --number-of-queries=10 -uroot -ptest112

测试同时不同的存储引擎的性能进行对比
mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 --engine=myisam,innodb --debug-info -uroot -ptest112

执行一次测试,分别50和100个并发,执行1000次总查询
mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --debug-info -uroot -ptest112

50和100个并发分别得到一次测试结果(Benchmark),并发数越多,执行完所有查询的时间越长。为了准确起见,可以多迭代测试几次
mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 --debug-info -uroot -ptest112

my.cnf配置参考

硬件:内存32G
innodb_file_per_table = 1
打开独立表空间

max_connections = 8000
#MySQL 服务所允许的同时会话数的上限,经常出现Too Many Connections的错误提示,则需要增大此值
如果修改无效,需要修改service文件里,添加
LimitNOFILE=10000

back_log = 300
#back_log 是操作系统在监听队列中所能保持的连接数

max_connect_errors = 1000
#每个客户端连接最大的错误允许数量,当超过该次数,MYSQL服务器将禁止此主机的连接请求,直到MYSQL服务器重启或通过flush hosts命令清空此主机的相关信息

open_files_limit = 10240
#所有线程所打开表的数量,适用于直接使用程序启动,如用service文件启动的此项无效

max_allowed_packet = 32M
#每个连接传输数据大小.最大1G,须是1024的倍数,一般设为最大的BLOB的值

wait_timeout = 10
#指定一个请求的最大连接时间

sort_buffer_size = 16M
#排序缓冲被用来处理类似ORDER BY以及GROUP BY队列所引起的排序

join_buffer_size = 16M
#不带索引的全表扫描.使用的buffer的最小值

query_cache_size = 128M
#查询缓冲大小

query_cache_limit = 4M
#指定单个查询能够使用的缓冲区大小,缺省为1M

transaction_isolation = REPEATABLE-READ
#设定默认的事务隔离级别

thread_stack = 512K
#线程使用的堆大小. 此值限制内存中能处理的存储过程的递归深度和SQL语句复杂性,此容量的内存在每次连接时被预留

log-bin
#二进制日志功能

binlog_format=row
#二进制日志格式

innodb_buffer_pool_size = 24G
#InnoDB使用一个缓冲池来保存索引和原始数据, 可设置这个变量到服务器物理内存大小的80%

innodb_file_io_threads = 4
#用来同步IO操作的IO线程的数量

innodb_thread_concurrency = 16
#在InnoDb核心内的允许线程数量,建议的设置是CPU数量加上磁盘数量的两倍

innodb_log_buffer_size = 16M
#用来缓冲日志数据的缓冲区的大小

innodb_log_file_size = 512M
在日志组中每个日志文件的大小

innodb_log_files_in_group = 3
#在日志组中的文件总数

innodb_lock_wait_timeout = 120
#SQL语句在被回滚前,InnoDB事务等待InnoDB行锁的时间

long_query_time = 2
#慢查询时长

log-queries-not-using-indexes
#将没有使用索引的查询也记录下来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值