一. SSH public key authentication
MHA manager连接mysql集群各实例是通过SSH来连接的,另外,当mysql-master有问题或者所在机器直接宕机情况下,MHA manager会检测出含有最新信息的slave,将该slave上的relay log发送到其他slave上,使slave彼此数据一致,所有,各slave之间也应该可以互相ssh连接,这个是通过公钥来实现的
实现方法
- 如果是单独的管理机器,先在manager机器上用ssh-keygen生成公钥,将id_rsa.pub中的内容拷贝到各节点上的~/.ssh/authorized_keys文件中
- 在某一节点上用ssh-keygen生成公钥,并把id_rsa.pub中的内容拷贝到~/.ssh/authorized_keys文件中,然后将这三个文件一起拷贝到其他各节点相同位置
- 注意修改这三个文件的权限为600!!!
测试ssh可用性的方法
masterha_check_ssh --conf=/etc/app1.cnf
二. 操作系统
只支持linux
三. 支持一主多从或双主多从结构
一主多从/一从结构是最普遍的,当主宕机后,如果有预设的备选master,该实例被推选为新的master,否则,含有最新relay log的slave被推选为master并将发送其余slave上缺失的relaylog,最后实现数据一致性,另外,如果旧的master所在服务器还可以通过ssh连接,manager会将宕掉的master还未来的及发送的binlog推送给其他的slave,使数据的损失最小
如果是双主多从结构,需要注意:
- 只有主master可以被设为可写,另一个master必须被设为"read-only=1"
- 只接受二级复制,如Master1 -> Slave2 -> Slave3,Slave3服务不可被管理
四. 三级或三级以上的级联复制结构处理
即上述的Master1 -> Slave2 -> Slave3结构,Slave3服务是不可被管理,如果master1宕掉,能提升为新的master的只有slave2
对于这种结构,需要注意
- 配置文件中只写一级和二级服务器的信息
- 在各服务器配置中添加参数"multi_tier_slave=1"
五. MySQL版本要求
必须是5.0以上版本,因为从5.0版本以后binlog格式都是采用了v4 format,MHA需要通过v4 format的binlog来识别relay log的位置,所以即使是5.0版本以上,也必须要保证binlog是v4 format,所以强烈建议使用MySQL 5.0.60以上的版本
六. mysqlbinlog版本要求
MHA利用mysqlbinlog来应用binlog到目标slaves,而mysql5.0中的mysqlbinlog不能识别row格式的日志,所以如果使用mysql5.1以上的版本,mysqlbinlog必须是3.3或更高版本才可以,否则会直接报错退出
七. 备选master的log-bin必须开启
备选master的log-bin没有开启时其不能被推选为master,所以如果备选master或现存的所有slaves都没有开启log-bin,MHA-manager启动报错,直接退出
八. Binary log 和 relay log的过滤规则必须完全相同
集群中所有实例的过滤规则(binlog-do-db, replicate-ignore-db, etc)都必须相同
九. 备选Master上必须有用于复制的用户
必须有用于备份的用户且用户名、密码必须与配置文件masterha_default.conf中的配置信息相同
十. 保存relay log并定期清理
一般情况下slave的sql线程执行完后吗,relay log会自动清除,但是在MHA集群中,relay log有可能会需要用于宕机后的数据一致性补齐,所以需要设置relay_log_purge=0
但是relay log并没有binlog的自动定期清理功能,所以需要手动清理,在MHA中有一个用于清理relay log的工具--purge_relay_logs
该工具会自动连接到mysql上执行relay_log_purge=1,等清理完后再执行relay_log_purge=0,所以需要为工具提供登录到mysql所需的信息
参数有:
--user
--password
--host
--port
--workdir
如果文件系统是ext3,一次性删除大量文件会引起严重的性能问题甚至严重的复制延迟,所以可以建立硬链接来缓解这种问题,该参数用来设置用来建立硬链接的指定位置,执行完成后会被自动删除,默认位置是 /var/tmp
--disable_relay_log_purge
默认的,如果relay_log_purge是开启的话,脚本会什么都不做自动退出,设置该参数后,脚本检测到relay_log_purge=1后会自动设置relay_log_purge=0
purge_relay_logs的使用
[app@slave_host1]$ cat /etc/cron.d/purge_relay_logs
# purge relay logs at 5am
0 5 * * * app /usr/bin/purge_relay_logs --user=root --password=PASSWORD --disable_relay_log_purge >> /var/log/masterha/purge_relay_logs.log 2>&1
建议:不同slave之间调用该服务的时间尽量错开,避免master突然宕机导致无relay log可用
十一. LOAD DATA INFILE
不要在binlog的statement模式下使用 LOAD DATA INFILE,能不用就不要用这个,如果必须用,先设sql_log_bin=0;待数据导完后再sql_log_bin=1;
网友评论