Linux 第74天 mariadb高可用

时间: 20181016

个人小站: www.winthcloud.top


目录

mariadb高可用目的

MHA和Galera

MHA原理和配置

Galera Cluster特性和配置

MYSQL压力测试

生产环境my.cnf配置示例

总结



mariadb高可用

上边讲的主从虽然可以实现读写分离,但是当主的如果出现故障,即用来执行写入的服务器出

现问题时,在线还是无法实现自动恢复,即会影响线上服务的正常运行,这里提出的高可以即

可实现多台主机同时为主,主服务器出现问题不会影响线上服务的正常运行,其它的服务器依

然可以执行写操作MMM是一个非常古老的项目,很长时间没有更新了,MHA相对较新一些,但是

也是有点老了,而且出现故障时只能执行一次切换主从,Galera Cluster是有专门的人员来

维护的项目,新项目上线建议使用此种,个人未测试过哈哈


MMM: Multi-Master Replication Manager for MySQL

Mysql主主复制管理器是一套灵活的脚本程序,基于perl实现,用来对mysql 

replication进行监控和故障迁移,并能管理mysql Master-Master复制的配置

(同一时间只有一个节点是可写的)

官网: http://www.mysql-mmm.org

https://code.google.com/archive/p/mysql-master-master/downloads

MHA: Master High Availability

对主节点进行监控,可实现自动故障转移至其它从节点;通过提升某一从节点为新的主

节点,基于主从复制实现,还需要客户端配合实现,目前MHA主要支持一主多从的架构

要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当

master,一台充当备用master,另外一台充当从库,出于机器成本的考虑,淘宝进行

了改造,目前淘宝TMHA已经支持一主一从

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

Galera Cluster:wsrep(MySQL extended with the Write Set Replication)

通过wsrep协议在全局实现复制;任何一节点都可读写,不需要主从复制,实现多主读写



MHA原理和配置

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配置:为每个主从复制集群


在管理节点上安装两个包:

mha4mysql-manager

mha4mysql-node

在被管理节点安装:

mha4mysql-node

在管理节点建立配置文件(注意集群的每个服务器和MHA服务器之间使用ssh基于key通信)

vim /etc/mastermha/app1.cnf

[server default]

user=mhauser # 数据库监控用户名

password=mhapass # 数据库监控密码

manager_workdir=/data/mastermha/app1/

manager_log=/data/mastermha/app1/manager.log

remote_workdir=/data/mastermha/app1/    #主mysql binlog目录

ssh_user=root # ssh基于key验证的用户名

repl_user=repluser   # 主从同步时用的用户名和密码

repl_password=replpass

ping_interval=1

[server1]   #数据库节点IP以及将要成为主节点的优先级

hostname=192.168.8.17

candidate_master=1 

# 设置为候选master,如果设置该参数以后,发生主从切换以后将会将此从库提升

# 为主库,即使这个主库不是集群中事件最新的slave

check_repl_delay=0

# 默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不

# 会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费

# 很长时间,通过设置check_repl_delay=0,MHA触发切换在选择一个新的

# master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1

# 的主机非常有用,因为这个候选主在切换的过程中一定是新的master

[server2]

hostname=192.168.8.27

[server3]

hostname=192.168.8.37


实现slave

vim /etc/my.cnf

[mysqld]

server_id=2 不同节点此值各不相同

log-bin

read_only

relay_log_purge=0

skip_name_resolve=1

mysql>CHANGE MASTER TO MASTER_HOST='master-IP',

MASTER_USER='cpuser', 

MASTER_PASSWORD='cppass',

MASTER_LOG_FILE='mariadb-bin.000001', 

MASTER_LOG_POS=245;


所有mysql集群共同需要的配置

添加监控用户,即MHA服务访问数据库的用户

添加复制用户,每个节点都需要,从节点也需要,因为有可能会被切换为主

并且复制用户账号密码需要相同


在所有节点实现相互之间ssh key验证

Mha验证和启动

masterha_check_ssh --conf=/etc/mastermha/app1.cnf

masterha_check_repl --conf=/etc/mastermha/app1.cnf

masterha_manager --conf=/etc/mastermha/app1.cnf

排错日志:

/data/mastermha/app1/manager.log



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复制实现:

percona-cluster

MariaDB-Cluster

注意:都至少需要三个节点,不能安装mariadb-server


配置步骤

yum install MariaDB-Galera-server

vim /etc/my.cnf.d/server.cnf

wsrep_provider = /usr/lib64/galera/libgalera_smm.so

wsrep_cluster_address="gcomm://192.168.8.7,192.168.8.17,192.168.8.27"

binlog_format=row

default_storage_engine=InnoDB

innodb_autoinc_lock_mode=2

bind-address=0.0.0.0

下面配置可选项

wsrep_cluster_name = 'mycluster'默认my_wsrep_cluster

wsrep_node_name = 'node1'

wsrep_node_address = ‘192.168.8.7'


首次启动时,需要初始化集群,在其中一个节点上执行命令

/etc/init.d/mysql start --wsrep-new-cluster

而后正常启动其它节点

service mysql start

查看集群中相关系统变量和状态变量

SHOW VARIABLES LIKE 'wsrep_%';

SHOW STATUS LIKE 'wsrep_%';

SHOW STATUS LIKE 'wsrep_cluster_size';



MYSQL压力测试

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 -pwinth

多线程测试。使用–concurrency来模拟并发连接

mysqlslap -a -c 100 -uroot -prootps

迭代测试。用于需要多次执行测试得到平均值

mysqlslap -a -i 10 -uroot -prootps

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 -prootps

mysqlslap -a --number-of-queries=10 -uroot -prootps


测试同时不同的存储引擎的性能进行对比

mysqlslap -a --concurrency=50,100 --number-of-queries 1000 

--iterations=5 --engine=myisam,innodb --debug-info -uroot -ppass

执行一次测试,分别50和100个并发,执行1000次总查询

mysqlslap -a --concurrency=50,100 --number-of-queries 1000 

--debug-info -uroot -ppass

50和100个并发分别得到一次测试结果(Benchmark),并发数越多,执行完所有查询的

时间越长。为了准确起见,可以多迭代测试几次

mysqlslap -a --concurrency=50,100 --number-of-queries 1000 

--iterations=5 --debug-info -uroot -ppass



生产环境my.cnf配置示例


innodb_file_per_table = 1 打开独立表空间


max_connections = 8000

#MySQL 服务所允许的同时会话数的上限,经常出现Too Many 

Connections的错误提示,则需要增大此值

back_log = 300

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

max_connect_errors = 1000

#每个客户端连接最大的错误允许数量,当超过该次数,MYSQL服务器将禁止此主机

的连接请求,直到MYSQL服务器重启或通过flush hosts命令清空此主机的相关信息

open_files_limit = 10240

#所有线程所打开表的数量

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

#将没有使用索引的查询也记录下来


总结

1. MHA配置里remote_workdir此一定要配置正确,是要配置为主mysql的binlog日志目录

2. MHA配置[server2] 数值一定要不一样,设置成同一个会报奇怪的错误,脚本年代太老

3. MHA不能安装在任何一个mysql集群节点上,因为要监控他们,如果安装在上边并且

这台机器不幸死机了,你的MHA也就挂掉了,切记切记!!!