MySQL高可用集群
一、MySQL-MMM高可用
1、MMM简介
(1)MMM(Master-Master replication manager for MySQL)是一套支持双主故障切换和双主日常管理的脚本程序。MMM使用Perl语言开发,是Google的开源项目(Perl脚本),主要用来监控和管理MySQL Master-Master(双主)复制,虽然叫做双主复制,但是业务上同一时刻只允许对一个主进行写入,另一台备选主上提供部分读服务,以加速在主主切换时刻备选主的预热,可以说MMM这套脚本程序一方面实现了故障切换的功能,另一方面其内部附加的工具脚本也可以实现多个slave的read负载均衡。
(2)功能:
①双主复制,实现故障自动切换
②实现多个slave的read负载均衡
③可以备份数据
(3)原理:
其原理是将真实数据库节点的IP(RIP)映射为虚拟IP(VIP)集,在这个虚拟的IP集中,有一个专用于write的IP,多个用于read的IP,这个用于Write的VIP映射着数据库集群中的两台master的真实IP(RIP),以此来实现Failover的切换,其他read的VIP可以用来均衡读(balance)。
(4)架构说明
①mmm_mond:监控进程,负责所有的监控工作,决定和处理所有节点角色活动。此脚本需要在监管机上运行。
②mmm_agentd:运行在每个mysql服务器上的代理进程,完成监控的探针工作和执行简单的远端服务设置。此脚本需要在被监管机上运行。
③mmm_control:管理脚本,查看和管理集群运行状态,同时提供管理mmm_mond进程的命令。
(5)授权用户:授权的用户包括一个mmm_monitor用户和一个mmm_agent用户,如果想使用mmm的备份工具则还要添加一个mmm_tools用户。
2、案例实施
(1)搭建多主多从模式
①配置主主模式
1)修改配置文件my.cnf
a.server-id=1:设置为不同id
b.log-bin=master-bin:开启二进制日志
c.log-slave-updates=ture:宕机后启用备用库
d.auto_increment_increment=2:设置相同数
e.auto_increment_offset=1:设置为不同数
2)两主机互提升访问权限
a.grant replication slave on *.* to 'replication'@'192.168.11.%' identified by '111111';
b.change master to master_host='192.168.11.44',master_user='replication',master_password='111111',master_log_file='master2-bin.000002',master_log_pos=107;
c.start slave;
②配置从服务器与1号主服务器的主从复制
1)change master to master_host='192.168.11.41',master_user='replication',master_password='111111',master_log_file='master1-bin.000002',master_log_pos=107;
(2)安装配置MySQL-MMM
①安装MMM:yum install -y mysql-mmm*
②在所有主、从数据库授权monitor访问
1)grant replication client on *.* to 'mmm_monitor'@'192.168.11.%' identified by '111111';
2)grant super,replication client,process on *.* to 'mmm_agent'@'192.168.11.%' identified by '111111';
③修改/etc/mysql-mmm/mmm_common.conf文件(所有主机相同配置,包括监控机)
<host default>
cluster_interface eth0
pid_path /var/run/mysql-mmm/mmm_agentd.pid
bin_path /usr/libexec/mysql-mmm/
replication_user replicant
replication_password 111111
agent_user mmm_agent
agent_password 111111
</host>
<host db1>
ip 192.168.11.41
mode master
peer db2
</host>
<host db2>
ip 192.168.11.44
mode master
peer db1
</host>
<host db3>
ip 192.168.11.42
mode slave
</host>
<host db4>
ip 192.168.11.43
mode slave
</host>
<role writer>
hosts db1, db2
ips 192.168.11.241
mode exclusive
</role>
<role reader>
hosts db3, db4
ips 192.168.11.242, 192.168.11.243
mode balanced
</role>
④数据库主机编辑mmm_agent.conf文件,修改为对应db
⑤修改监控主机mmm_mon.conf文件
<monitor>
ip 127.0.0.1
pid_path /var/run/mysql-mmm/mmm_mond.pid
bin_path /usr/libexec/mysql-mmm
status_path /var/lib/mysql-mmm/mmm_mond.status
ping_ip 192.168.11.41,192.168.11.42,192.168.11.43,192.168.11.44
auto_set_online 10
</monitor>
<host default>
monitor_user mmm_monitor
monitor_password 111111
</host>
⑥启动代理和监控
1)数据库服务器:service mysql-mmm-agent start
2)监控主机:service mysql-mmm-monitor start
⑦测试集群:开关主服务器的mysql服务,使用mmm_control show查看运行状态(主db1是对外一个写入的角色,但不真正提供只写,要想实现读写分离还需要结合amoeba。而后面的虚拟IP是真正来访问Mysql数据库的。)
二、MHA配置
1、配置主从复制(一台master、两台slave)
2、安装MHA依赖软件perl(所有机器):
(1)yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-CPAN
3、安装node节点组件(所有机器):
(1)tar zxf mha4mysql-node-0.56.tar.gz
(2)cd mha4mysql-node-0.56
(3)perl Makefile.PL
(4)make && make install
4、监控机安装mha4mysql-manager-0.56
5、配置无密码登录(每台机器都要做到互通)
(1)ssh-keygen -t rsa(命令存在于openssh-clients)
(2)ssh-copy-id 192.168.11.41
(3)ssh-copy-id 192.168.11.42
(4)ssh-copy-id 192.168.11.43
6、配置MHA
(1)复制脚本
①cp -ra /root/mha4mysql-manager-0.56/samples/scripts /usr/local/bin
(2)cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin并进行修改
①my $vip = '192.168.11.250/24';
②my $key = "1";
③my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
④my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
⑤my $exit_code = 0;
(3)mysql用户授权
①在所有的数据上都要授权两个用户 myslave (主从复制时已经创建,但是只在master授权) mha用户
②mysql -uroot -p111111 -e "grant all on *.* to 'myslave'@'%' identified by '111111';grant all on *.* to 'mha'@'%' identified by '111111';flush privileges;"
(4)创建 MHA 软件目录并拷贝配置文件
①mkdir /etc/masterha
②cp /root/mha4mysql-manager-0.56/samples/conf/app1.cnf /etc/masterha/
③vim /etc/masterha/app1.cnf
[server default]
manager_workdir=/var/log/masterha/app1
manager_log=/var/log/masterha/app1/manager.log
master_binlog_dir=/usr/local/mysql/data #二进制日志文件保存路径
master_ip_failover_script= /usr/local/bin/master_ip_failover #上一步配置的文件
master_ip_online_change_script= /usr/local/bin/master_ip_online_change
password=manager
user=mha
ping_interval=1
remote_workdir=/tmp
repl_password=123456
repl_user=myslave
secondary_check_script= /usr/local/bin/masterha_secondary_check -s 192.168.100.4 -s 192.168.100.5
shutdown_script=""
ssh_user=root
[server1]
hostname=192.168.100.4
port=3306
candidate_master=1 //设置为候选master
check_repl_delay=0 //忽略复制延时
[server2]
hostname=192.168.100.5
port=3306
candidate_master=1
check_repl_delay=0
[server3]
hostname=192.168.100.6
port=3306
(5)测试SSH:masterha_check_ssh -conf=/etc/masterha/app1.cnf
①监控机及所有node机,都需要做相互的无密码登录设置
(6)测试 mysq 主从连接情况:masterha_check_repl -conf=/etc/masterha/app1.cnf
①如果报Binlog setting check failed!错误,那么有可能是master服务器保存二进制日志文件地址错误。
(7)启动MHA
①nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
②--remove_dead_master_conf 该参数代表当发生主从切换后,老的主库的 ip 将会从配置文件中移除。
③--manger_log 日志存放位置
④--ignore_last_failover 在缺省情况下,如果 MHA 检测到连续发生宕机,且两次宕机间隔不足 8 小时的话,则不会进行 Failover,之所以这样限制是为了避免 ping-pong 效应。该参数代表忽略上次 MHA 触发切换产生的文件,默认情况下, MHA 发生切换后会在日志记目录,也就是上面设置的日志 app1.failover.complete 文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件,为了方便,这里设置为–ignore_last_failover
(8)查看MHA状态:masterha_check_status --conf=/etc/masterha/app1.cnf