6、启动或禁用故障检测
如果primary故障,可能想自动提升一个次级到primary,重定向剩余的secondaries到新的primary:
- # mysqlfabric group activate my_group
- Procedure :
- { uuid = 1d78324a-d39d-4098-8774-b0c2359a57ed,
- finished = True,
- success = True,
- return = True,
- activities =
- }
状态检测语句:
[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"
- # mysqlfabric group lookup_servers my_group
- Command :
- { success = True
- 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'}]
- activities =
- }
关闭当前master实例:
关闭172.17.0.51实例后,fabric已经标记它的状态为"FAULTY";
- # mysqladmin -h172.17.0.51 -uroot -padmin@123 shutdown
- # mysqlfabric group lookup_servers my_group
- Command :
- { success = True
- 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'}]
- activities =
- }
重新启动172.17.0.51:3306实例,但是状态不会恢复:
- # mysql -h172.17.0.51 -uroot -padmin@123 -e "show master status"
- +------------------+----------+--------------+------------------+-------------------------------------------+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
- +------------------+----------+--------------+------------------+-------------------------------------------+
- | mysql-bin.000003 | 191 | | | 19a37552-2d44-11e4-af5c-763d1493518d:1-10 |
- +------------------+----------+--------------+------------------+-------------------------------------------+
- # mysqlfabric group lookup_servers my_group
- Command :
- { success = True
- 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'}]
- 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:
- # mysqlfabric server set_status 3ecc746f-2e05-11e4-b448-560d7281695e spare
- Procedure :
- { uuid = e96802d7-5fc1-4a70-94d4-4d8d31d13960,
- finished = True,
- success = True,
- return = True,
- activities =
- }
- # mysqlfabric server set_status 3ecc746f-2e05-11e4-b448-560d7281695e secondary
- Procedure :
- { uuid = c74edd89-ac4a-45ce-8d18-22423ed73561,
- finished = True,
- success = True,
- return = True,
- activities =
- }
查看状态:
- # mysqlfabric group lookup_servers my_group
- Command :
- { success = True
- 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'}]
- activities =
- }
禁用故障检测自动切换:
- # mysqlfabric group deactivate my_group
- Procedure :
- { uuid = a88d2bb7-f0c7-46d8-925a-c982287d6447,
- finished = True,
- success = True,
- return = True,
- activities =
- }
7、执行更新和查询
应用程序通过fabric-aware连接器连接到fabric,获取服务器、组信息。
测试脚本:
- # cat fabric_test1.py
- #!/usr/bin/env python
- #coding:utf-8
- # Author: AnthonyYau --<q_yxian@163.com>
- # Purpose: fabric test scripts1.
- # Created: 2014/8/26
- import sys
- import mysql.connector
- from mysql.connector import fabric
- def main():
- try:
- conn = mysql.connector.connect(
- fabric = {"host":"localhost","port":32274,"username":"admin",
- "password":"admin"}, #指定使用xml-rpm连接fabric的用户名和密码
- user = 'root',database = 'test',password = 'admin@123',autocommit = True #指定mysql实例的用户名和密码
- )
- except Exception,e:
- print e
- sys.exit(1)
- else:
- conn.set_property(mode=fabric.MODE_READWRITE,group="my_group") #指定访问模式,以及需要访问的HA组
- cur = conn.cursor()
- cur.execute(
- "CREATE TABLE IF NOT EXISTS subscribers (" #创建表
- " sub_no INT,"
- " first_name CHAR(40),"
- " last_name CHAR(4)"
- ")"
- )
- finally:
- conn.close()
- if __name__ == '__main__':
- main()
- # cat fabric_test2.py
- #!/usr/bin/env python
- #coding:utf-8
- # Author: AnthonyYau --<q_yxian@163.com>
- # Purpose: fabric test scripts2.
- # Created: 2014/8/26
- import sys
- import mysql.connector
- from mysql.connector import fabric
- def add_subscriber(conn,sub_no,first_name,last_name):
- conn.set_property(group="my_group",mode=fabric.MODE_READWRITE) #指定访问模式,以及访问的组
- cur = conn.cursor()
- cur.execute(
- "INSERT INTO subscribers VALUES (%s,%s,%s)",
- (sub_no,first_name,last_name)
- )
- def main():
- try:
- conn = mysql.connector.connect(
- fabric = {"host":"localhost","port":32274,"username":"admin",
- "password":"admin"}, #指定使用xml-rpc连接fabric的用户名和密码
- user="root",database="test",password="admin@123",autocommit=True #指定访问mysql实例的用户名和密码
- )
- except Exception,e:
- print e
- sys.exit(1)
- else:
- #conn.set_property(group="my_group",mode=fabric.MODE_READWRITE)
- add_subscriber(conn, 72, "Billy", "Fish") #调用函数,插入数据
- add_subscriber(conn, 500, "Billy", "Joel")
- add_subscriber(conn, 1500, "Arthur", "Askey")
- add_subscriber(conn, 5000, "Billy", "Fish")
- add_subscriber(conn, 15000, "Jimmy", "White")
- add_subscriber(conn, 17542, "Bobby", "Ball")
- finally:
- conn.close()
- if __name__ == '__main__':
执行测试程序:
- python fabric_test1.py
- python fabric_test2.py
检查结果(查看两台从服务器的数据):当前slave为172.17.0.50和172.17.0.51
- # mysqlfabric group lookup_servers my_group
- Command :
- { success = True
- 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'}]
- activities =
- }
使用脚本检查结果:
- # python fabric_test3.py
- 72 Billy Fish
- 500 Billy Joel
- 1500 Arthur Aske
- 5000 Billy Fish
- 15000 Jimmy Whit
- 17542 Bobby Ball
查询脚本如下:
- #!/usr/bin/env python
- #coding:utf-8
- # Author: AnthonyYau --<q_yxian@163.com>
- # Purpose: fabric test scripts3.
- # Created: 2014/8/27
- import sys
- import mysql.connector
- from mysql.connector import fabric
- def main():
- try:
- conn = mysql.connector.connect(
- fabric = {"host":"localhost","port":32274,"username":"admin",
- "password":"admin"},
- user="root",database="test",password="admin@123",autocommit=True
- )
- except Exception,e:
- print e
- sys.exit(1)
- else:
- conn.set_property(group="my_group",mode=fabric.MODE_READONLY) #使用readonly访问模式(从slave获取数据),也可以使用readwrite
- cur = conn.cursor()
- cur.execute('select * from test.subscribers')
- results = cur.fetchall()
- if results:
- for id,f_name,l_name in results:
- print "%s\t%s\t%s" %(id,f_name,l_name)
- finally:
- conn.close()
- if __name__ == '__main__':
- main()
使用mysql客户端进行检查:
- # mysql -uroot -padmin@123 -h172.17.0.51 -e "select * from test.subscribers"
- +--------+------------+-----------+
- | sub_no | first_name | last_name |
- +--------+------------+-----------+
- | 72 | Billy | Fish |
- | 500 | Billy | Joel |
- | 1500 | Arthur | Aske |
- | 5000 | Billy | Fish |
- | 15000 | Jimmy | Whit |
- | 17542 | Bobby | Ball |
- +--------+------------+-----------+
- [root@yau620 ~]# mysql -uroot -padmin@123 -h172.17.0.50 -e "select * from test.subscribers"
- +--------+------------+-----------+
- | sub_no | first_name | last_name |
- +--------+------------+-----------+
- | 72 | Billy | Fish |
- | 500 | Billy | Joel |
- | 1500 | Arthur | Aske |
- | 5000 | Billy | Fish |
- | 15000 | Jimmy | Whit |
- | 17542 | Bobby | Ball |
- +--------+------------+-----------+