高可用架构代表产品
- MHa
- PXC
- InnoDB Cluster
- MGC
- MySQL Cluster
- Mycat
读写分离代表产品
- Atlas
- ProxySQL
- Mycat
- Maxscale
分布式架构代表产品
- Mycat
- DBLE
- sharding-jdbc
- ProxySQL
Newsql
- PinCAP TiDB
- Aliyun PolarDB
- Goole Spanner
MHA架构搭建
0.56下载地址
-
创建软链接
ln -s /data/app/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
ln -s /data/app/mysql/bin/mysql /usr/bin/mysql -
各节点相互通信
-
各节点创建用户
grant all privileges on . to mha@‘10.0.0.%’ identified by ‘mha’; -
创建配置文件目录
mkdir -p /etc/mha -
创建日志文件目录
mkdir -p /var/log/mha/app1 -
编辑配置文件
vim /etc/mha/app1.cnf [server default] manager_log=/var/log/mha/app1/manager manager_workdir=/var/log/mha/app1 master_binlog_dir=/data/binlog #主库binlog文件目录 user=mha password=mha ping_interval=2 #隔两秒通信主库,通信四次失败会切换 repl_password=123 repl_user=repl ssh_user=root [server1] hostname=10.0.0.51 port=3306 [server2] hostname=10.0.0.52 port=3306 [server3] hostname=10.0.0.53 port=3306
-
互信检查
masterha_check_ssh --conf=/etc/mha/app1.cnf -
主从状态检查
masterha_check_repl --conf=/etc/mha/app1.cnf -
开启MHA
关闭MHA masterha_stop --conf=/etc/mha/app1.cnfnohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null> /var/log/mha/app1/manager.log 2>&1 & #nohup僵尸进程,--remove_dead_master_conf故障切换时把故障的主机从配置文件中删除,默认的话转移失败,八小时之内不进行转移,ignore_last_failover忽略
-
查看MHA状态
masterha_check_status --conf=/etc/mha/app1.cnf
MHA软件结构
manager组件
masterha_manger 启动MHA
masterha_check_ssh 检查MHA的SSH配置状况
masterha_check_repl 检查MySQL复制状况
masterha_master_monitor 检测master是否宕机
masterha_check_status 检测当前MHA运行状态
masterha_master_switch 控制故障转移(自动或者手动)
masterha_conf_host 添加或删除配置的server信息
node组件
save_binary_logs 保存和复制master的二进制日志
apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的
purge_relay_logs 清除中继日志(不会阻塞SQL线程)
MHA原理
选主
candidate_master=1 强制某个节点为备选主。如果日志量超过100M差异,放弃掉他。
check_repl_delay=0 不检查日志量的差异。
如果都没有配置,则选择日志量写入多的实例,如果都一致,按配置文件的先后顺序
日志补偿
主库宕机后如果能ssh连接,会立即保存缺失部分的binlog到/var/tmp/xxxxx
主库宕机后如果不能sshh连接,计算两个从节点的relay-log日志差异。
vip故障转移脚本
- master_ip_failover上传到/usr/local/bin目录下
-
my $vip = '10.0.0.55/24'; #vip地址 my $key = '1'; #辅助网卡序号 my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip"; #网卡名称 my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down"; my $ssh_Bcast_arp= "/sbin/arping -I eth0 -c 3 -A 10.0.0.55";
vim /etc/mha/app1.cnf master_ip_failover_script=/usr/local/bin/master_ip_failover
- 手工添加vip
故障提醒脚本
vim send_report
my $smtp='smtp.qq.com'; # smtp服务器
my $mail_from='22654481@qq.com'; # 发件箱
my $mail_user='22654481'; # 用户名 QQ号
my $mail_pass='gemghsvgkeyzcagh'; # 授权码
my $mail_to=['22654481@qq.com']; # 收件箱
vim /etc/mha/app1.cnf
report_script=/usr/local/bin/send_report
日志补偿的冗余方案
mha节点拉取主库的binlog日志,一定能保证和主库是一模一样的日志
- mkdir -p /data/binlog_server/ 创建存放日志的目录并授权
- cd /data/binlog_server/
mysqlbinlog -R --host=10.0.0.51 --user=mha --password=mha --raw --stop-never mysql-bin.000008 &
--stop-nerer一直拉取
拉取日志的起点,需要按照目前从库的已经获取到的二进制日志点为起点 -
vim /etc/mha/app1.cnf [binlog1] master_binlog_dir=/data/binlog_server/
MHA在线切换
-
vim /usr/local/bin/master_ip_online_change my $vip = "10.0.0.55/24"; my $key = "1"; my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip"; my $ssh_stop_vip = "/sbin/ifconfig ens33:$key $vip down"; my $ssh_Bcast_arp= "/sbin/arping -I ens33 -c 3 -A 10.0.0.55";
vim /etc/mha/app1.cnf master_ip_online_change_script=/usr/local/bin/master_ip_online_change
- 停MHA
-
masterha_master_switch --conf=/etc/mha/app1.cnf --master_state=alive --new_master_host=10.0.0.51 --orig_master_is_new_slave --running_updates_limit=10000 #--master_state=alive在线切换,--orig_master_is_new_slave原来的主库变成从库,--running_updates_limit=10000延迟大于一万毫秒切换失败
- 重新拉取日志