欢迎投稿

今日深度:

Fabric结合GTID实现Mysql复制高可用(1)(2)

6、启动或禁用故障检测

如果primary故障,可能想自动提升一个次级到primary,重定向剩余的secondaries到新的primary:

  1. # mysqlfabric group activate my_group  
  2. Procedure :  
  3. { uuid        = 1d78324a-d39d-4098-8774-b0c2359a57ed,  
  4.   finished    = True,  
  5.   success     = True,  
  6.   return      = True,  
  7.   activities  =   
  8. }  

状态检测语句:

[DEBUG] 1409157170.648943 - FailureDetector(my_group) - Statement (SELECT server_uuid, server_address, mode, status, weight FROM servers WHERE group_id = %s, Params(('my_group',)).

[DEBUG] 1409157172.655084 - FailureDetector(my_group) - Statement (SELECT group_id, description, master_uuid, master_defined, status FROM groups WHERE group_id = %s, Params(('my_group',)).

测试关闭当前master,看是否选取新的master,fabric能自动进程故障切换:

查看当前组的状态:当前master为"172.17.0.51"

  1. # mysqlfabric group lookup_servers my_group  
  2. Command :  
  3. success     = True 
  4.   return      = [{'status': 'SECONDARY', 'server_uuid': '19a37552-2d44-11e4-af5c-763d1493518d', 'mode': 'READ_ONLY', 'weight': 1.0, 'address': '172.17.0.50:3306'}, {'status': 'PRIMARY', 'server_uuid': '3ecc746f-2e05-11e4-b448-560d7281695e', 'mode': 'READ_WRITE', 'weight': 1.0, 'address': '172.17.0.51:3306'}, {'status': 'SECONDARY', 'server_uuid': 'ade3ee53-2d44-11e4-af60-de532998e8a6', 'mode': 'READ_ONLY', 'weight': 1.0, 'address': '172.17.0.48:3306'}]  
  5.   activities  =   

关闭当前master实例:

  1. # mysqladmin -h172.17.0.51 -uroot -padmin@123 shutdown 
关闭172.17.0.51实例后,fabric已经标记它的状态为"FAULTY";
  1. # mysqlfabric group lookup_servers my_group  
  2. Command :  
  3. success     = True 
  4.   return      = [{'status': 'SECONDARY', 'server_uuid': '19a37552-2d44-11e4-af5c-763d1493518d', 'mode': 'READ_ONLY', 'weight': 1.0, 'address': '172.17.0.50:3306'}, {'status': 'FAULTY', 'server_uuid': '3ecc746f-2e05-11e4-b448-560d7281695e', 'mode': 'READ_ONLY', 'weight': 1.0, 'address': '172.17.0.51:3306'}, {'status': 'PRIMARY', 'server_uuid': 'ade3ee53-2d44-11e4-af60-de532998e8a6', 'mode': 'READ_WRITE', 'weight': 1.0, 'address': '172.17.0.48:3306'}]  
  5.   activities  =   

重新启动172.17.0.51:3306实例,但是状态不会恢复:

  1. # mysql -h172.17.0.51 -uroot -padmin@123 -e "show master status"  
  2. +------------------+----------+--------------+------------------+-------------------------------------------+  
  3. | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                         |  
  4. +------------------+----------+--------------+------------------+-------------------------------------------+  
  5. | mysql-bin.000003 |      191 |              |                  | 19a37552-2d44-11e4-af5c-763d1493518d:1-10 |  
  6. +------------------+----------+--------------+------------------+-------------------------------------------+  
  7.  
  8. # mysqlfabric group lookup_servers my_group  
  9. Command :  
  10. success     = True 
  11.   return      = [{'status': 'SECONDARY', 'server_uuid': '19a37552-2d44-11e4-af5c-763d1493518d', 'mode': 'READ_ONLY', 'weight': 1.0, 'address': '172.17.0.50:3306'}, {'status': 'FAULTY', 'server_uuid': '3ecc746f-2e05-11e4-b448-560d7281695e', 'mode': 'READ_ONLY', 'weight': 1.0, 'address': '172.17.0.51:3306'}, {'status': 'PRIMARY', 'server_uuid': 'ade3ee53-2d44-11e4-af60-de532998e8a6', 'mode': 'READ_WRITE', 'weight': 1.0, 'address': '172.17.0.48:3306'}]  
  12.   activities  =   

需要手动设置服务器的状态:

查看帮助命令:

# mysqlfabric help server set_status

server set_status server_id status [--update_only] [--synchronous]

Set a server's status.

支持的状态值为primary,secondary,spare,faulty。

能手动改变服务器的状态,改变到spare,避免写和读访问,同时保证当故障切换时不会被选取。

改变错误状态的实例(172.17.0.51)的状态为secondary,注意需要先转换成spare:

  1. # mysqlfabric server set_status 3ecc746f-2e05-11e4-b448-560d7281695e spare  
  2. Procedure :  
  3. uuid        = e96802d7-5fc1-4a70-94d4-4d8d31d13960,  
  4.   finished    = True,  
  5.   success     = True,  
  6.   return      = True,  
  7.   activities  =   
  8. }  
  9.  
  10. # mysqlfabric server set_status 3ecc746f-2e05-11e4-b448-560d7281695e secondary  
  11. Procedure :  
  12. uuid        = c74edd89-ac4a-45ce-8d18-22423ed73561,  
  13.   finished    = True,  
  14.   success     = True,  
  15.   return      = True,  
  16.   activities  =   

查看状态:

  1. # mysqlfabric group lookup_servers my_group  
  2. Command :  
  3. success     = True 
  4.   return      = [{'status': 'SECONDARY', 'server_uuid': '19a37552-2d44-11e4-af5c-763d1493518d', 'mode': 'READ_ONLY', 'weight': 1.0, 'address': '172.17.0.50:3306'}, {'status': 'SECONDARY', 'server_uuid': '3ecc746f-2e05-11e4-b448-560d7281695e', 'mode': 'READ_ONLY', 'weight': 1.0, 'address': '172.17.0.51:3306'}, {'status': 'PRIMARY', 'server_uuid': 'ade3ee53-2d44-11e4-af60-de532998e8a6', 'mode': 'READ_WRITE', 'weight': 1.0, 'address': '172.17.0.48:3306'}]  
  5.   activities  =   

禁用故障检测自动切换:

  1. # mysqlfabric group deactivate my_group  
  2. Procedure :  
  3. uuid        = a88d2bb7-f0c7-46d8-925a-c982287d6447,  
  4.   finished    = True,  
  5.   success     = True,  
  6.   return      = True,  
  7.   activities  =   

7、执行更新和查询

应用程序通过fabric-aware连接器连接到fabric,获取服务器、组信息。

测试脚本:

  1. # cat fabric_test1.py  
  2. #!/usr/bin/env python  
  3. #coding:utf-8  
  4. # Author:  AnthonyYau --<q_yxian@163.com> 
  5. # Purpose: fabric test scripts1.  
  6. # Created: 2014/8/26  
  7.  
  8. import sys  
  9. import mysql.connector  
  10. from mysql.connector import fabric  
  11.  
  12.  
  13. def  main():  
  14.     try:  
  15.         conn = mysql.connector.connect(  
  16.             fabric = {"host":"localhost","port":32274,"username":"admin",  
  17.                       "password":"admin"},  #指定使用xml-rpm连接fabric的用户名和密码  
  18.             user = 'root',database = 'test',password = 'admin@123',autocommit = True  #指定mysql实例的用户名和密码  
  19.         )  
  20.     except Exception,e:  
  21.         print e  
  22.         sys.exit(1)  
  23.     else:  
  24.         conn.set_property(mode=fabric.MODE_READWRITE,group="my_group") #指定访问模式,以及需要访问的HA组  
  25.         cur = conn.cursor()  
  26.         cur.execute(  
  27.             "CREATE TABLE IF NOT EXISTS subscribers ("  #创建表  
  28.         " sub_no INT,"  
  29.         " first_name CHAR(40),"  
  30.         " last_name CHAR(4)"  
  31.         ")"  
  32.         )  
  33.     finally:  
  34.         conn.close()  
  35.       
  36. if  __name__ == '__main__':  
  37.     main()  
  1. # cat fabric_test2.py     
  2. #!/usr/bin/env python  
  3. #coding:utf-8  
  4. # Author:  AnthonyYau --<q_yxian@163.com> 
  5. # Purpose: fabric test scripts2.  
  6. # Created: 2014/8/26  
  7.  
  8. import sys  
  9. import mysql.connector  
  10. from mysql.connector import fabric  
  11.  
  12. def add_subscriber(conn,sub_no,first_name,last_name):  
  13.     conn.set_property(group="my_group",mode=fabric.MODE_READWRITE)  #指定访问模式,以及访问的组  
  14.     cur = conn.cursor()  
  15.     cur.execute(  
  16.         "INSERT INTO subscribers VALUES (%s,%s,%s)",  
  17.         (sub_no,first_name,last_name)  
  18.     )  
  19.  
  20. def  main():  
  21.     try:  
  22.         conn = mysql.connector.connect(  
  23.             fabric = {"host":"localhost","port":32274,"username":"admin",  
  24.                       "password":"admin"}, #指定使用xml-rpc连接fabric的用户名和密码  
  25.             user="root",database="test",password="admin@123",autocommit=True  #指定访问mysql实例的用户名和密码  
  26.         )  
  27.     except Exception,e:  
  28.         print e  
  29.         sys.exit(1)  
  30.     else:  
  31.         #conn.set_property(group="my_group",mode=fabric.MODE_READWRITE)  
  32.         add_subscriber(conn, 72, "Billy", "Fish")  #调用函数,插入数据  
  33.         add_subscriber(conn, 500, "Billy", "Joel")  
  34.         add_subscriber(conn, 1500, "Arthur", "Askey")  
  35.         add_subscriber(conn, 5000, "Billy", "Fish")  
  36.         add_subscriber(conn, 15000, "Jimmy", "White")  
  37.         add_subscriber(conn, 17542, "Bobby", "Ball")      
  38.     finally:  
  39.         conn.close()  
  40.       
  41. if  __name__ == '__main__':  

执行测试程序:

  1. python fabric_test1.py  
  2. python fabric_test2.py  

检查结果(查看两台从服务器的数据):当前slave为172.17.0.50和172.17.0.51

  1. # mysqlfabric group lookup_servers my_group  
  2. Command :  
  3. success     = True 
  4.   return      = [{'status': 'SECONDARY', 'server_uuid': '19a37552-2d44-11e4-af5c-763d1493518d', 'mode': 'READ_ONLY', 'weight': 1.0, 'address': '172.17.0.50:3306'}, {'status': 'SECONDARY', 'server_uuid': '3ecc746f-2e05-11e4-b448-560d7281695e', 'mode': 'READ_ONLY', 'weight': 1.0, 'address': '172.17.0.51:3306'}, {'status': 'PRIMARY', 'server_uuid': 'ade3ee53-2d44-11e4-af60-de532998e8a6', 'mode': 'READ_WRITE', 'weight': 1.0, 'address': '172.17.0.48:3306'}]  
  5.   activities  =   

使用脚本检查结果:

  1. # python fabric_test3.py   
  2. 72  Billy   Fish  
  3. 500 Billy   Joel  
  4. 1500    Arthur  Aske  
  5. 5000    Billy   Fish  
  6. 15000   Jimmy   Whit  
  7. 17542   Bobby   Ball  

查询脚本如下:

  1. #!/usr/bin/env python  
  2. #coding:utf-8  
  3. # Author:  AnthonyYau --<q_yxian@163.com> 
  4. # Purpose: fabric test scripts3.  
  5. # Created: 2014/8/27  
  6.  
  7. import sys  
  8. import mysql.connector  
  9. from mysql.connector import fabric  
  10.  
  11. def  main():  
  12.     try:  
  13.         conn = mysql.connector.connect(  
  14.             fabric = {"host":"localhost","port":32274,"username":"admin",  
  15.                                   "password":"admin"},  
  16.                         user="root",database="test",password="admin@123",autocommit=True          
  17.         )  
  18.     except Exception,e:  
  19.         print e  
  20.         sys.exit(1)  
  21.     else:  
  22.         conn.set_property(group="my_group",mode=fabric.MODE_READONLY) #使用readonly访问模式(从slave获取数据),也可以使用readwrite  
  23.         cur = conn.cursor()  
  24.         cur.execute('select * from test.subscribers')  
  25.         results = cur.fetchall()  
  26.         if results:  
  27.             for id,f_name,l_name in results:  
  28.                 print "%s\t%s\t%s" %(id,f_name,l_name)  
  29.     finally:  
  30.         conn.close()  
  31.       
  32. if  __name__ == '__main__':  
  33.     main()  

使用mysql客户端进行检查:

  1. # mysql -uroot -padmin@123 -h172.17.0.51 -e "select * from test.subscribers"  
  2. +--------+------------+-----------+  
  3. | sub_no | first_name | last_name |  
  4. +--------+------------+-----------+  
  5. |     72 | Billy      | Fish      |  
  6. |    500 | Billy      | Joel      |  
  7. |   1500 | Arthur     | Aske      |  
  8. |   5000 | Billy      | Fish      |  
  9. |  15000 | Jimmy      | Whit      |  
  10. |  17542 | Bobby      | Ball      |  
  11. +--------+------------+-----------+  
  12. [root@yau620 ~]# mysql -uroot -padmin@123 -h172.17.0.50 -e "select * from test.subscribers"  
  13. +--------+------------+-----------+  
  14. | sub_no | first_name | last_name |  
  15. +--------+------------+-----------+  
  16. |     72 | Billy      | Fish      |  
  17. |    500 | Billy      | Joel      |  
  18. |   1500 | Arthur     | Aske      |  
  19. |   5000 | Billy      | Fish      |  
  20. |  15000 | Jimmy      | Whit      |  
  21. |  17542 | Bobby      | Ball      |  
  22. +--------+------------+-----------+  


www.htsjk.Com true http://www.htsjk.com/shujukukf/17659.html NewsArticle 6、启动或禁用故障检测 如果primary故障,可能想自动提升一个次级到primary,重定向剩余的secondaries到新的primary: #mysqlfabric group activatemy_group Procedure : {uu...
评论暂时关闭