java mysql failover_mysqlfailover测试

mysqlfailover是mysql官方用python语言写的一款工具,包含在mysql utilities工具集中。主要作用是保障mysql高可用。他会定时检测节点状态,当master节点不可用时,会自动转移到从节点上,同时剩余的从节点都会指向转以后的节点。如何保证数据一致,在下面分析中会有说明。

mysqlfailover使用前提:

1、必须开启GTID模式,在GTID模式下,复制延迟已经减小到最低。用压测工具会有3秒左右的延迟。这取决于设置多少SQL线程。如果秒插1万,可以设置为16。

2、配置文件中必须添加:

report-host=

report-port=

master-info-repository=TABLE

relay-log-info-repository=TABLE

用于从节点可以被检测到。

3、权限:

必须要有with grant option权限。

安装也非常简单。

下载好mysql utilities工具集:https://downloads.mysql.com/archives/utilities/

unzip mysql-utilities-1.6.5.zip

cd mysql-utilities-1.6.5

python ./setup.py build

python ./setup.py install

到此为止安装完成。

使用:

mysqlfailover --master=failover:123456@'192.168.0.106':3306 --discover-slaves-login=failover:123456 --daemon=start --log=/data/failover.log

建立好主从服务。这里略。

检测事物是否完整转移:

这里使用sysbentch工具来进行批量插入。

sysbench --test=oltp --mysql-db=test --mysql-user=root --mysql-password=123456 --oltp-table-size=1000000000 --oltp-num-tables=15 prepare    批量插入

sysbench 0.4.12.10: multi-threaded system evaluation benchmark

No DB drivers specified, using mysql

Creating table 'sbtest1'...

Creating table 'sbtest5'...

Creating table 'sbtest4'...

Creating table 'sbtest8'...

Creating table 'sbtest9'...

Creating table 'sbtest6'...

Creating table 'sbtest2'...

Creating table 'sbtest'...

Creating table 'sbtest3'...

Creating table 'sbtest14'...

Creating table 'sbtest10'...

Creating table 'sbtest12'...

Creating table 'sbtest11'...

Creating table 'sbtest7'...

Creating table 'sbtest13'...

Creating 1000000000 records in table 'sbtest11'...

Creating 1000000000 records in table 'sbtest6'...

Creating 1000000000 records in table 'sbtest4'...

Creating 1000000000 records in table 'sbtest5'...

Creating 1000000000 records in table 'sbtest8'...

Creating 1000000000 records in table 'sbtest14'...

Creating 1000000000 records in table 'sbtest3'...

Creating 1000000000 records in table 'sbtest13'...

Creating 1000000000 records in table 'sbtest9'...

Creating 1000000000 records in table 'sbtest10'...

Creating 1000000000 records in table 'sbtest1'...

Creating 1000000000 records in table 'sbtest12'...

Creating 1000000000 records in table 'sbtest'...

Creating 1000000000 records in table 'sbtest7'...

Creating 1000000000 records in table 'sbtest2'...

等待几分钟后:

kill -9 17448

kill -9 18350

之后,该工具自动转移输出,可以看到已经转移到了丛机上:

Q-quit R-refresh H-health G-GTID Lists U-UUIDs

Failed to reconnect to the master after 3 attemps.

Failover starting in 'auto' mode...

# Checking eligibility of slave 192.168.0.109:3306 for candidate.

# GTID_MODE=ON ... Ok

# Replication user exists ... Ok

# Candidate slave 192.168.0.109:3306 will become the new master.

# Checking slaves status (before failover).

# Preparing candidate for failover.

WARNING: IP lookup by name failed for 44,reason: Unknown host

WARNING: IP lookup by address failed for 192.168.0.109,reason: Unknown host

WARNING: IP lookup by address failed for 192.168.0.112,reason: Unknown host

# Missing transactions found on 192.168.0.112:3306. SELECT gtid_subset() = 0

# LOCK STRING: FLUSH TABLES WITH READ LOCK

# Read only is ON for 192.168.0.112:3306.

# Connecting candidate to 192.168.0.112:3306 as a temporary slave to retrieve unprocessed GTIDs.

# Change master command for 192.168.0.109:3306

# CHANGE MASTER TO MASTER_HOST = '192.168.0.112', MASTER_USER = 'backup', MASTER_PASSWORD = '123456', MASTER_PORT = 3306, MASTER_AUTO_POSITION=1

# Read only is OFF for 192.168.0.112:3306.

# UNLOCK STRING: UNLOCK TABLES

# Waiting for candidate to catch up to slave 192.168.0.112:3306.

# Slave 192.168.0.109:3306:

# QUERY = SELECT WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS('c142ca67-b898-11e8-86e8-000c29367e64:1', 300)

# Return Code = 3

# Slave 192.168.0.109:3306:

# QUERY = SELECT WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS('c777e02f-b898-11e8-86a0-000c29c6f346:1-4', 300)

# Return Code = 0

# Creating replication user if it does not exist.

# Stopping slaves.

# Performing STOP on all slaves.

WARNING: IP lookup by name failed for 44,reason: Unknown host

WARNING: IP lookup by address failed for 192.168.0.109,reason: Unknown host

WARNING: IP lookup by address failed for 192.168.0.112,reason: Unknown host

# Executing stop on slave 192.168.0.109:3306 WARN - slave is not configured with this master

# Executing stop on slave 192.168.0.109:3306 Ok

WARNING: IP lookup by address failed for 192.168.0.106,reason: Unknown host

# Executing stop on slave 192.168.0.112:3306 WARN - slave is not configured with this master

# Executing stop on slave 192.168.0.112:3306 Ok

WARNING: IP lookup by name failed for 44,reason: Unknown host

WARNING: IP lookup by address failed for 192.168.0.109,reason: Unknown host

# Switching slaves to new master.

# Change master command for 192.168.0.112:3306

# CHANGE MASTER TO MASTER_HOST = '192.168.0.109', MASTER_USER = 'backup', MASTER_PASSWORD = '123456', MASTER_PORT = 3306, MASTER_AUTO_POSITION=1

# Disconnecting new master as slave.

# Execute on 192.168.0.109:3306: RESET SLAVE ALL

# Starting slaves.

# Performing START on all slaves.

# Executing start on slave 192.168.0.112:3306 Ok

# Checking slaves for errors.

# 192.168.0.112:3306 status: Ok

# Failover complete.

# Discovering slaves for master at 192.168.0.109:3306

Failover console will restart in 5 seconds.

# Attempting to contact 192.168.0.109 ... Success

# Attempting to contact 192.168.0.112 ... Success

MySQL Replication Failover Utility

Failover Mode = auto Next Interval = Sat Sep 15 14:15:30 2018

Master Information

------------------

Binary Log File Position Binlog_Do_DB Binlog_Ignore_DB

mysql-bin.000001 657

GTID Executed Set

b5c5054c-b898-11e8-8670-000c299e1daf:1 [...]

# Attempting to contact 192.168.0.109 ... Success

# Attempting to contact 192.168.0.112 ... Success

Replication Health Status

+----------------+-------+---------+--------+------------+---------+-------------+-------------------+-----------------+------------+-------------+--------------+------------------+---------------+-----------+----------------+------------+---------------+

| host | port | role | state | gtid_mode | health | version | master_log_file | master_log_pos | IO_Thread | SQL_Thread | Secs_Behind | Remaining_Delay | IO_Error_Num | IO_Error | SQL_Error_Num | SQL_Error | Trans_Behind |

+----------------+-------+---------+--------+------------+---------+-------------+-------------------+-----------------+------------+-------------+--------------+------------------+---------------+-----------+----------------+------------+---------------+

| 192.168.0.109 | 3306 | MASTER | UP | ON | OK | 5.7.22-log | mysql-bin.000001 | 657 | | | | | | | | | |

| 192.168.0.112 | 3306 | SLAVE | UP | ON | OK | 5.7.22-log | mysql-bin.000001 | 657 | Yes | Yes | 0 | No | 0 | | 0 | | 0 |

+----------------+-------+---------+--------+------------+---------+-------------+-------------------+-----------------+------------+-------------+--------------+------------------+---------------+-----------+----------------+------------+---------------+

分析:

当程序检测到master服务停止后:

1、检查指定的候选服务器是否正常,检查GTID模式是否开启

2、锁表,防止事物提交带来的数据不一致问题。

3、如果开启了read_only模式,则会自动将其关闭,并且先change master to到另一台从机上以保证数据一致

4、解锁表,保证候选服务器和另一台从机的事物一致

5、检测候选服务器的事物号,然后停止全部从机:stop slave;

6、切换到新master,也就是候选服务器,将所有从机指向候选服务器。断开与原master的连接,执行reset slave语句

7、在从机开启start slave,开始复制,这时从机都已经指向了新master。故障转移完成。

现在在主机上输出二进制日志,看最后一次插入是哪个事物:

mysqlbinlog --base64-output=decode-rows -v mysql-bin.000005 > ~/bin.log

vim ~/bin.log

截取最后一部分:

### INSERT INTO `test`.`sbtest8`

### SET

### @1=289999

### @2=0

### @3=''

### @4='qqqqqqqqqqwwwwwwwwwweeeeeeeeeerrrrrrrrrrtttttttttt'

### INSERT INTO `test`.`sbtest8`

### SET

### @1=290000

### @2=0

### @3=''

### @4='qqqqqqqqqqwwwwwwwwwweeeeeeeeeerrrrrrrrrrtttttttttt'

# at 265373582

#180901 15:41:10 server id 1 end_log_pos 265373613 CRC32 0xa53bca62 Xid = 7014

COMMIT/*!*/;

SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;

DELIMITER ;

# End of log file

/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

可以看到在主库上最后一次插入的操作是在test库下的sbtest8表,第一列值为290000,也就是id列。

现在切换到从库上进入sbtest8这张表,看看这条事物是否已经复制到了从库:

mysql> use test

Database changed

mysql> select * from sbtest8 where id = '290000';

+--------+---+---+----------------------------------------------------+

| id | k | c | pad |

+--------+---+---+----------------------------------------------------+

| 290000 | 0 | | qqqqqqqqqqwwwwwwwwwweeeeeeeeeerrrrrrrrrrtttttttttt |

+--------+---+---+----------------------------------------------------+

1 row in set (0.00 sec)

可以看到已经有了数据,看看是不是最后一条,从库是否回滚了未提交的事物:

mysql> select * from sbtest8 where id = '290001';

Empty set (0.00 sec)

mysql> select * from sbtest8 order by id desc limit 1;

+--------+---+---+----------------------------------------------------+

| id | k | c | pad |

+--------+---+---+----------------------------------------------------+

| 290000 | 0 | | qqqqqqqqqqwwwwwwwwwweeeeeeeeeerrrrrrrrrrtttttttttt |

+--------+---+---+----------------------------------------------------+

1 row in set (0.00 sec)

mysql> \q

Bye

可以看出id=290000确实是最后一条事物,如果有未提交的事物可能已经回滚,证明主库与复制到从库的事物不会丢失。

最后,可以使用mysqldiff工具来检查主从之间的不一致:

[root@node2 data]# mysqldiff --server1=failover:123456@192.168.0.109:3306 --server2=failover:123456@192.168.0.112:3306 --difftype=sql test:test

# WARNING: Using a password on the command line interface can be insecure.

# server1 on 192.168.0.109: ... connected.

# server2 on 192.168.0.112: ... connected.

# Comparing `test` to `test` [PASS]

# Comparing `test`.`sbtest` to `test`.`sbtest` [PASS]

# Comparing `test`.`sbtest1` to `test`.`sbtest1` [PASS]

# Comparing `test`.`sbtest10` to `test`.`sbtest10` [PASS]

# Comparing `test`.`sbtest11` to `test`.`sbtest11` [PASS]

# Comparing `test`.`sbtest12` to `test`.`sbtest12` [PASS]

# Comparing `test`.`sbtest13` to `test`.`sbtest13` [PASS]

# Comparing `test`.`sbtest14` to `test`.`sbtest14` [PASS]

# Comparing `test`.`sbtest2` to `test`.`sbtest2` [PASS]

# Comparing `test`.`sbtest3` to `test`.`sbtest3` [PASS]

# Comparing `test`.`sbtest4` to `test`.`sbtest4` [PASS]

# Comparing `test`.`sbtest5` to `test`.`sbtest5` [PASS]

# Comparing `test`.`sbtest6` to `test`.`sbtest6` [PASS]

# Comparing `test`.`sbtest7` to `test`.`sbtest7` [PASS]

# Comparing `test`.`sbtest8` to `test`.`sbtest8` [PASS]

# Comparing `test`.`sbtest9` to `test`.`sbtest9` [PASS]

# Success. All objects are the same.

说明在延迟的情况下,事物并没有丢失。

注意:

mysqlfailover程序适合于只做纯粹的单点写入复制架构。

不适合于从机当测试库或从机做审计做其他服务器等操作。必须要严格保证所有从库没有任何的写入。

在使用MySQLfailover时,最好在所有从库开启read_only参数,以保证数据一致性。

在多从拓补中,如果master挂掉后,要将master再重新加入到原来的拓补中,并且还是将旧master设置为主。server1为旧master,server2为故障转移后的master。

1、停止mysqlfailover故障转移工具。并且启动旧master实例。server1

2、将旧master服务器设置为现在的master的从服务器,用以检查事物完整性和二进制日志完整性:

mysqlreplicate --master=failover:123456@192.168.88.196:3307 --slave=failover:123456@192.168.88.194:3307 --rpl-user=backup:123456

3、用mysqlrpladmin 工具将旧master设置为整个拓补的新主:

mysqlrpladmin --master=failover:123456@192.168.88.196:3307 --new-master=failover:123456@192.168.88.194:3307 --discover-slaves-login=failover:123456 --demote-master switchover

4、恢复mysqlfailover工具启动,这里要使用--force选项来启动。

未经允许,谢绝转载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/262408.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RGB/YUV/YCbCr--关于显示,颜色你需要了解的一些事

工作中常听说RGB/YUV/YCbCr 这样一些名词,概念上似乎很混淆?这里是一个简介,部分内容来自wiki,理解不对的地方欢迎指正。 A:首先两个基本概念: Color model和Color Space. 1. Color Model: 为了表达人眼观察…

C# winfrom listView

转自http://hi.baidu.com/gaoisbest/item/84034943d4d94195823ae12b 1.如何为listview手动添加第一列和第二列数据 for (int i 0; i < 10; i) { ListViewItem Item new ListViewItem(); Item.Text dt.Rows[i][1].ToString();//读取数据库中字段 Item.Tag dt.…

淘宝评价网----类反淘宝联盟上线

反淘宝联盟&#xff0c;淘宝该反吗&#xff1f; 淘宝该反对吗&#xff1f; 其实淘宝已经做的很好了 我们反对的只是商家的不诚信的行为&#xff0c;但是在淘宝上我们又得不到对商家的全面的全面了解&#xff0c;所以我们反了&#xff1b;反&#xff0c;只是途径&#xff0c;不是…

Python从键盘输入多行文本数据的方法

Python中的Input()函数在输入时&#xff0c;遇到回车符&#xff0c;那么一次输入就结束了。这不能满足输入多行文本并且行数也不确定的情形&#xff0c;当然输入空行也是允许的。 方法1&#xff1a;直接利用input()函数逐行读取数据&#xff0c;直到EOF。利用异常处理机制实现…

[教程指导]索尼官方4.0.3系统一键root方法! [复制链接]

[教程指导]索尼官方4.0.3系统一键root方法&#xff01; [复制链接] 青青子衿198976青青子衿198976注册时间2011-9-26最后登录2012-9-15在线时间730 小时阅读权限150积分3996帖子1173精华32UID13306151版主 在线时间730 小时经验1629 分贡献2693 点极币10442 极币最后登录2012-9…

creator图片循环显示_CocosCreator背景图循环播放

以前在玩小游戏的时候发现有的小游戏背景图一直再动&#xff0c;视觉效果挺好&#xff0c;给人一种炫炫的感觉&#xff0c;让我这写后台的码农很是羡慕和膜拜。没想到天意弄人&#xff0c;我也开始写游戏前端了刚接触CocosCreator,好多东西都不懂&#xff0c;整个懵逼状态&…

完全卸载oracle11g步骤

1、 开始&#xff0d;&#xff1e;设置&#xff0d;&#xff1e;控制面板&#xff0d;&#xff1e;管理工具&#xff0d;&#xff1e;服务 停止所有Oracle服务。2、 开始&#xff0d;&#xff1e;程序&#xff0d;&#xff1e;Oracle - OraHome81&#xff0d;&#xff1e;Oracl…

PyCharm安装开发游戏的Pygame

方式一&#xff1a;利用PyCharm导入Pygame包 通常情况下&#xff0c;Pygame可以通过Pycharm的单击菜单File-->Settings...&#xff0c;弹出Settings窗口&#xff0c;在左侧栏中选择Project ***&#xff08;此处***是你的当前项目名&#xff09;-->Project Interpreter&a…

Jsp-Servlet 概要总结[转]

Servlet三个要素: 1.必须继承自HttpServlet 2.必须实现doGet()或者doPost() 3.必须在web.xml中配置Servlet <servlet> <servlet-name> </servlet-name> <servlet-class> </servlet-class> </servlet><servlet-mapping> <servlet-…

php函数学习二

rename():修改文件的名字 addcslashes(&#xff09;&#xff1a;过滤用户提交的敏感字符&#xff0c;一般通过转义提高安全性 dechex():把十进制数据转化为十六进制数据 Abs: 取得绝对值。 Acos: 取得反余弦值。 ada_afetch: 取得资料库的传回列。 ada_autocommit: 开关自动更…

sybase数据库导出mysql_使用BCP从Sybase远程数据库中导出数据

1.在本机安装Sybase ASE 15&#xff0c;我装的开发版全套&#xff0c;懒得去仔细看需要哪个了2.在Sybase安装目录里找到ini\sql.ini&#xff0c;在里面添加数据源例如&#xff1a;[MYDS]masterNLWNSCK,192.168.1.201,5000queryNLWNSCK,192.168.1.201,5000其中MYDS是数据源名称&…

Web项目,要求:保存用户名和密码在Cookie中,下次登录不再重新输入

设计一个实现登录功能的Web项目&#xff0c;要求&#xff1a;保存用户名和密码在Cookie中&#xff0c;下次登录不再重新输入 var cookie {};//设置 cookie.SetCookiesfunction(name,value,exptime){ try{ if(arguments.length 2) return arguments.callee(…

Pycharm使用black作为Python代码格式化外部工具

Pycharm菜单Code->Reformat Code能对Python代码进行格式化&#xff0c;但是black能进一步规范格式&#xff0c;它是PEP8的严格子集。 本次操作的相关环境信息如下&#xff1a;Pycharm 2018版&#xff0c;Python3.6,&#xff08;注意&#xff0c;写本文时的black只支持在Pyt…

WCF的学习资源

这一两天开始学习WCF&#xff0c;两天前我对WCF一无所知&#xff0c;现在也所知甚少&#xff0c;不过倒是在网上找到了一些学习WCF的不错的资源&#xff0c;在这里收录整理如下&#xff1a;1、http://www.cnblogs.com/jillzhang/tag/WCF/博主张玉彬&#xff0c;其对分布式应用程…

python --函数

转http://www.cnblogs.com/vamei/archive/2012/06/01/2529500.html 函数最重要的目的是方便我们重复使用相同的一段程序。 将一些操作隶属于一个函数&#xff0c;以后你想实现相同的操作的时候&#xff0c;只用调用函数名就可以&#xff0c;而不需要重复敲所有的语句。 函数的定…

mysql slave 线程 简书_【MySQL】你真的读懂了slave status吗?

前言:大家平时在检查主从复制的时候基本上都会使用 show slave status来看主从复制的情况&#xff0c;那么你真的读懂每个指标项了吗&#xff1f;一、status指标解读rootlocalhost [(none)]>show slave status\GERROR 2006 (HY000): MySQL server has gone awayNo connectio…

Python中用input()和print()体现输入输出重定向

众所周知&#xff0c;在Python中&#xff0c; 语句&#xff1a;变量input() 的功能是&#xff1a;从键盘读取数据到内存变量&#xff0c;此过程为输入。此时&#xff0c;键盘为标准输入设备&#xff0c;对应的文件对象名为sys.stdin。 语句&#xff1a;input(变量) 的功能是&…

【DI专题】在 DI 脚本文件中调用存储过程

以前用过&#xff0c;但是隔很久不用&#xff0c;还是会有点忘记&#xff0c;还是记下来吧&#xff1a;&#xff09; 1.在左侧datastore区域&#xff0c;选择数据库&#xff0c;选择 Function,单击右键&#xff0c;选择 import by name; 2.在弹出对话框中&#xff0c;输入待导入…

国外网站设计欣赏:30个优秀的国外咖啡网站设计

梦想天空博客向大家分享各种类型的优秀网站作品&#xff0c;有电子商务网站设计、旅游网站设计、餐馆网站设计、设计工作室网站设计、大学网站设计以及各种色系&#xff0c;各种风格的网站设计作品。今天这篇文章给大家带来30个优秀的国外咖啡网站设计作品&#xff0c;一起欣赏…

mysql查询连续3个月以上_MySQL查询显示连续的结果

#mysql中 对于查询结果只显示n条连续行的问题#在领扣上碰到的一个题目:求满足条件的连续3行结果的显示x city built a new stadium, each day many people visit it and the stats are saved as these columns: id, date, people&#xff1b;please write a query to display t…