标签:tps 同步 简单的 mysql数据库 准备 mha 命令帮助 backend 检测
MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在较大程度上保证数据的一致性,以达到真正意义上的高可用。
该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。
在MHA自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,较大程度的保证数据的不丢失,但这并不总是可行的。例如,如果主服务器硬件故障或无法通过ssh访问,MHA没法保存二进制日志,只进行故障转移而丢失了的数据。使用MySQL 5.5的半同步复制,可以大大降低数据丢失的风险。MHA可以与半同步复制结合起来。如果只有一个slave已经收到了的二进制日志,MHA可以将的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性。
1)把宕机的master二进制日志保存下来。
2)找到binlog位置点最新的slave。
3)在binlog位置点最新的slave上用relay log(差异日志)修复其它slave。
4)将宕机的master上保存下来的二进制日志恢复到含有最新位置点的slave上。
5)将含有最新位置点binlog所在的slave提升为master。
6)将其它slave重新指向新提升的master,并开启主从复制。
MHA软件由两部分组成,Manager工具包和Node工具包
1.Manager工具:
2. Node工具
MHA优点总结
1)自动故障转移快
2) 主库崩溃不存在数据一致性问题
3)不需要对当前mysql环境做重大修改
4) 不需要添加额外的服务器(仅一台manager就可管理上百个replication)
5) 性能优秀,可工作在半同步复制和异步复制,当监控mysql状态时,仅需要每隔N秒向master发送ping包(默认 3秒),所以对性能无影响。你可以理解为MHA的性能和简单的主从复制框架性能一样。
6) 只要replication支持的存储引擎,MHA都支持,不会局限于innodb
GTID原理介绍
GTID又叫全局事务ID(Global Transaction ID),是一个已提交事务的编号,并且是一个全局唯一的编号。MySQL5.6版本之后在主从复制类型上新增了GTID复制。
GTID是由server_uuid和事务id组成的,即GTID = server_uuid:transaction_id。 server_uuid是在数据库启动过程中自动生成的,每台机器的server-uuid不一样。uuid存放在数据目录的auto.cnf文件下。而transaction_id就是事务提交时由系统顺序分配的一个不会重复的序列号。
GTID存在的价值
(1)GTID使用master_auto_position=1代替了基于binlog和position号的主从复制搭建方式,更便于主从复制的搭建。
(2)GTID可以知道事务在最开始是在哪个实例上提交的。
(3)GTID方便实现主从之间的failover,再也不用不断地去找position和binlog 了。
主从复制中GTID的管理与维护
GTID带来最方便的一点就是主从复制的搭建过程了。它跟异步复制、半同步复制类似,只不过不再利用传统复制模式的binlog文件和position号了,而是在从库“change master to”时使用master_auto_position=1的方式进行搭建,这就让操作变得更加方便和可靠。
先决条件
1.主库和从库开启binlog
2.主库和从库server-id不同
3.创建主从复制用户
主库操作
修改配置文件
#编辑mysql配置文件
[root@mysql-db01 ~]# vim /etc/my.cnf
#在mysqld标签下配置
[mysqld]
server_id =1 #主库server-id为1,从库不等于1
log_bin=mysql-bin #开启binlog日志
#重启mysql
[root@mysql-db01 ~]# /etc/init.d/mysqld restart
创建主从复制用户
#登录数据库
[root@mysql-db01 ~]# mysql -uroot -poldboy123
#创建rep用户(做MHA每个机器都要创建这个用户)
mysql> grant replication slave on *.* to rep@‘172.16.1.5%‘ identified by ‘123‘;
从库操作
修改配置文件
#修改mysql-db02配置文件
[root@mysql-db02 ~]# vim /etc/my.cnf
#在mysqld标签下配置
[mysqld]
server_id = 2 #主库server-id为1,从库必须大于1
log_bin=mysql-bin #开启binlog日志
#重启mysql
[root@mysql-db02 ~]# /etc/init.d/mysqld restart
#修改mysql-db03配置文件
[root@mysql-db03 ~]# vim /etc/my.cnf
#在mysqld标签下配置
[mysqld]
server_id = 3 #主库server-id为1,从库必须大于1
log_bin=mysql-bin #开启binlog日志
#重启mysql
[root@mysql-db03 ~]# /etc/init.d/mysqld restart
开启GID
#编辑mysql配置文件(主库从库都需要修改)
[root@mysql-db01 ~]# vim /etc/my.cnf
#在[mysqld]标签下添加
[mysqld]
gtid_mode=ON
log_slave_updates
enforce_gtid_consistency
#重启数据库
[root@mysql-db01 ~]# /etc/init.d/mysqld restart
[root@mysql-db02 ~]# vim /etc/my.cnf
#在[mysqld]标签下添加
[mysqld]
gtid_mode=ON
log_slave_updates
enforce_gtid_consistency
#重启数据库
[root@mysql-db02 ~]# /etc/init.d/mysqld restart
[root@mysql-db03 ~]# vim /etc/my.cnf
#在[mysqld]标签下添加
[mysqld]
gtid_mode=ON
log_slave_updates
enforce_gtid_consistency
#重启数据库
[root@mysql-db03 ~]# /etc/init.d/mysqld restart
#检查GTID状态
mysql> show global variables like ‘%gtid%‘;
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| enforce_gtid_consistency | ON | #执行GTID一致
| gtid_executed | |
| gtid_mode | ON | #开启GTID模块
| gtid_owned | |
| gtid_purged | |
+--------------------------+-------+
配置主从复制
#所有从库执行 chang master to语句,配置复制主机信息
mysql> change master to
-> master_host=‘172.16.1.51‘,
-> master_user=‘rep‘,
-> master_password=‘123‘,
-> master_auto_position=1;
#开启slave
mysql> start slave;
#查看slave状态
mysql> show slave status\G
部署MHA之前的配置:
1.只有从库配置:
#从库设置只读
mysql> set global read_only=1;
2.主库和从库都执行:
#在配置文件中设置,关闭MySQL自动清除relaylog的功能,跳过反向解析
[root@mysql-db01 ~]# vim /etc/my.cnf
[mysqld]
relay_log_purge = 0
skip_name_resolve
#关闭MySQL自动清除relaylog的功能
mysql> set global relay_log_purge = 0;
环境准备:
#每台机器上传MHA的rpm包
[root@mysql-db01 ~]# ll
mha4mysql-manager-0.56-0.el6.noarch.rpm
mha4mysql-node-0.56-0.el6.noarch.rpm
部署node节点(3台):
#安装依赖包
[root@mysql-db01 ~]# yum install perl-DBD-MySQL -y
#安装node包(3台):
[root@db-01 ~]# yum localinstall -y mha4mysql-node-0.56-0.el6.noarch.rpm
[root@db-02 ~]# yum localinstall -y mha4mysql-node-0.56-0.el6.noarch.rpm
[root@db-03 ~]# yum localinstall -y mha4mysql-node-0.56-0.el6.noarch.rpm
部署manager节点(1台:10.0.0.53)
#安装manager依赖包
[root@mysql-db03 ~]# yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
#安装manager包
[root@db-03 ~]# yum localinstall -y mha4mysql-manager-0.56-0.el6.noarch.rpm
#添加mha管理账号(所有节点)
mysql> grant all on *.* to mha@‘172.16.1.5%‘ identified by ‘mha‘;
命令软连接(所有节点)
#如果不创建命令软连接,检测mha复制情况的时候会报错
[root@db-01 ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/
[root@db-01 ~]# ln -s /usr/local/mysql/bin/mysql /usr/bin/
配置ssh免密登录
#做ssh 免密登录(下面4条命令,所以节点都执行)
#创建秘钥对
[root@db-01 ~]## ssh-keygen -t dsa -P ‘‘ -f ~/.ssh/id_dsa >/dev/null 2>&1
#发送公钥,包括自己
[root@db-01 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@10.0.0.51
[root@db-01 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@10.0.0.52
[root@db-01 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@10.0.0.53
编辑配置文件
#在安装manager节点的机器上,创建mha配置文件目录
[root@db-03 ~]# mkdir /etc/mha/
#编辑mha配置文件
[root@mysql-db03 ~]# vim /etc/mha/app1.cnf
[server default]
manager_log=/etc/mha/manager.log #manager的日志
manager_workdir=/etc/mha/app1/ #manager的工作目录
master_binlog_dir=/usr/local/mysql/data #master保存binlog的位置,以便MHA可找到master的日志
password=mha #MHA管理账号的密码
ping_interval=2 #监控主库发送ping包的时间间隔,尝试三次没有回应则切换主库
repl_password=123 #主从复制环境中的用户的密码
repl_user=rep #主从复制环境中的用户名
ssh_user=root #ssh的登录用户名
user=mha #MHA管理账号
[server1]
hostname=172.16.1.51
port=3306
[server2]
hostname=172.16.1.52
port=3306
[server3]
hostname=172.16.1.53
port=3306
MHA启动前检测
#测试ssh
[root@db03 ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf
#看到如下字样,则测试成功
Tue Mar 7 01:03:33 2017 - [info] All SSH connection tests passed successfully.
#测试复制
[root@db03 ~]# masterha_check_repl --conf=/etc/mha/app1.cnf
#看到如下字样,则测试成功
MySQL Replication Health is OK.
启动MHA
#启动MHA
[root@db03 ~]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /etc/mha/manager.log 2>&1 &
#检测MHA启动状态
[root@db03 ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:10434) is running(0:PING_OK), master:172.16.1.52
#启动命令分析
nohup
masterha_manager #MHA的启动程序
--conf=/etc/mha/app1.cnf #指定配置文件
--remove_dead_master_conf #移除宕机的server标签从配置文件里
--ignore_last_failover #忽略上一次的切换
< /dev/null > /etc/mha/manager.log 2>&1 &
MHA的工作机制:
1.完成一次切换后,会生成一个锁文件在工作目录中
2.下次切换之前,会检测锁文件是否存在
3.如果锁文件存在,8个小时之内不允许第二次切换
切换主库测试
#STOP主库
[root@db01 ~]# /etc/init.d/mysqld stop
#在STOP主库同时可以看着manager日志
[root@db03 ~]# tail -f /etc/mha/manager.log
#在db03上可以看到主库以切换成db02
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.16.1.52
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000009
Read_Master_Log_Pos: 231
Relay_Log_File: db03-relay-bin.000002
Relay_Log_Pos: 361
Relay_Master_Log_File: mysql-bin.000009
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
MHA环境修复
1.修复宕机的主库
[root@db01 ~]# /etc/init.d/mysqld start
2.在MHA的日志中,找到change master 语句
[root@db-03 ~]# grep -i ‘change master to‘ /etc/mha/manager.log
Thu Jul 25 04:38:35 2019 - [info] All other slaves should start replication from here. Statement should be: CHANGE MASTER TO MASTER_HOST=‘172.16.1.52‘, MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER=‘rep‘, MASTER_PASSWORD=‘xxx‘;
3.在宕机的主库中执行change master语句
mysql> CHANGE MASTER TO MASTER_HOST=‘172.16.1.52‘, MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER=‘rep‘, MASTER_PASSWORD=‘123‘;
4.开启IO和SQL线程,将宕机的主库重新加入集群变成从库
mysql> start slave;
5.在manager配置文件中,将server标签重新添加
[root@db03 ~]# vim /etc/mha/app1.cnf
[server1]
hostname=172.16.1.51
port=3306
6.启动MHA
[root@db03 ~]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /etc/mha/manager.log 2>&1 &
7.检测MHA启动状态
[root@db03 ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:10434) is running(0:PING_OK), master:172.16.1.52
修改MHA主配置文件
[root@db03 ~]# vim /etc/mha/app1.cnf
#在[server default]标签下添加
master_ip_failover_script=/etc/mha/master_ip_failover #使用MHA自带脚本
编辑脚本
#根据配置文件中脚本路径编辑
[root@db03 ~]# vim /etc/mha/master_ip_failover
#修改以下几行内容
my $vip = ‘172.16.1.55/24‘;
my $key = ‘1‘;
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
#添加执行权限,否则mha无法启动
[root@db03 ~]# chmod +x /etc/mha/master_ip_failover
手动绑定VIP
#绑定vip
[root@db01 ~]# ifconfig eth1:1 172.16.1.55/24
修改mha配置文件
[root@db03 ~]# vim /etc/mha/app1.cnf
[binlog1]
no_master=1
hostname=10.0.0.53
master_binlog_dir=/data/mysql/binlog/
备份binlog
#创建备份binlog目录
[root@db03 ~]# mkdir -p /data/mysql/binlog/
#进入该目录
[root@db03 ~]# cd /data/mysql/binlog/
#备份binlog
[root@db03 binlog]# mysqlbinlog -R --host=172.16.1.51 --user=mha --password=mha --raw --stop-never mysql-bin.000001 &
#启动mha
[root@mysql-db03 binlog]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &
Atlas主要功能
1.读写分离
2.从库负载均衡
3.IP过滤
4.自动分表
5.DBA可平滑上下线DB
6.自动摘除宕机的DB
下载安装Atlas
#下载Atlas
[root@db03 ~]#
wget httpss://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm
#安装
[root@db03 ~]# rpm -ivh Atlas-2.2.1.el6.x86_64.rpm
Preparing... ########################################### [100%]
1:Atlas ########################################### [100%]
编辑配置文件
#进入Atlas工具目录
[root@db03 ~]# cd /usr/local/mysql-proxy/bin/
#生成密码
[root@db03 bin]# ./encrypt 123
#修改Atlas配置文件
[root@db03 ~]# vim /usr/local/mysql-proxy/conf/test.cnf
#Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔
proxy-backend-addresses = 172.16.1.51:3306
#Atlas后端连接的MySQL从库的IP和端口
proxy-read-only-backend-addresses = 10.0.0.52:3306,10.0.0.53:3306
#用户名与其对应的加密过的MySQL密码
pwds = rep:3yb5jEku5h4=
#SQL日志的开关
sql-log = ON
#Atlas监听的工作接口IP和端口
proxy-address = 0.0.0.0:1234
#默认字符集,设置该项后客户端不再需要执行SET NAMES语句
charset = utf8
启动
[root@db03 ~]# /usr/local/mysql-proxy/bin/mysql-proxyd test start
OK: MySQL-Proxy of test is started
Atlas管理操作
#用atlas管理用户登录
[root@db03 ~]# mysql -uuser -ppwd -h127.0.0.1 -P2345
#查看可用命令帮助
mysql> select * from help;
#查看后端代理的库
mysql> SELECT * FROM backends;
+-------------+----------------+-------+------+
| backend_ndx | address | state | type |
+-------------+----------------+-------+------+
| 1 | 10.0.0.51:3307 | up | rw |
| 2 | 10.0.0.53:3307 | up | ro |
| 3 | 10.0.0.52:3307 | up | ro |
+-------------+----------------+-------+------+
#平滑摘除mysql
mysql> REMOVE BACKEND 2;
Empty set (0.00 sec)
#检查是否摘除成功
mysql> SELECT * FROM backends;
+-------------+----------------+-------+------+
| backend_ndx | address | state | type |
+-------------+----------------+-------+------+
| 1 | 10.0.0.51:3307 | up | rw |
| 2 | 10.0.0.52:3307 | up | ro |
+-------------+----------------+-------+------+
#保存到配置文件中
mysql> SAVE CONFIG;
Empty set (0.06 sec)
标签:tps 同步 简单的 mysql数据库 准备 mha 命令帮助 backend 检测
原文地址:https://www.cnblogs.com/zabcd/p/13366390.html