欢迎投稿

今日深度:

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

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


mysql版本:Percona server 5.6.19-67.0 Percona Server (GPL), Release 67.0, Revision 618

Mysql安装参考:http://my.oschina.net/anthonyyau/blog/284092

Fabric State store安装参考:http://my.oschina.net/anthonyyau/blog/307165

半同步复制参考:http://my.oschina.net/anthonyyau/blog/269800

环境:

4个服务器实例运行Percona server 5.6.19-67.0,fabric node安装在单独的服务器,每个Mysql实例在一台服务器上;

fabric为启用复制的3个mysql实例提供高可用,应用使用fabric-aware的连接器路由事务和SQL语句到合适的服务器,透明的进行读和写操作;

当前仅仅支持异步primary backup复制(半同步复制需要手工完成)。primary处理所有写操作,Secondaries使用mysql复制从primary同步,可以进行读操作。

服务器信息:

一、mysql实例和fabric state store准备

Mysql安装好后,每个fabric管理的实例需要开启gtid、二进制日志(不需要启动复制,由fabric完成,但是不支持配置异步复制),将以下配置放到[mysqld]段下面:

  1. log-bin=mysql-bin  
  2. binlog_format=ROW 
  3. server-id = 29 #保证每个mysql实例唯一  
  4. log-slave-updates=true 
  5. gtid-mode=on 
  6. enforce-gtid-consistency=true 
  7. sync-master-info=1 

数据库用户账号准备:

1、超级管理员账号,本例使用root@'172.17.42.1',密码为admin@123;

2、fabric管理mysql实例的账号,本例使用fabric@'172.17.42.1',密码为fabric@456;

3、mysql复制专用账号,本例使用fabric@'172.17.0.%',密码为fabric@456,需要与fabric管理mysql的账号密码一致;

查看mysqlfabric命令帮助:

mysqlfabric help:显示简短的语法信息和帮忙命令

mysqlfabric help commands: 列出所有可用命令和描述

mysqlfabric help groups: 列出可用命令组

mysqlfabric help [group] [command]: 提供命令的详细帮助信息

二、使用Fabric创建mysql复制高可用组

1、创建组

  1. # mysqlfabric group create my_group  
  2. Password for admin:   
  3. Procedure :  
  4. uuid        = 3f7e82bc-4291-4002-8688-1929fc63ed3e,  
  5.   finished    = True,  
  6.   success     = True,  
  7.   return      = True,  
  8.   activities  =   

要输入xml-rpc密码,可以将密码指定到fabric的配置文件,或者设置disable_authentication = yes,需要重启fabric(先mysqlfabric manage stop,然后修改配置文件,不然将报"Permission denied."错误)。

2、添加mysql实例到组

  1. # mysqlfabric group add my_group 172.17.0.50:3306  
  2. Procedure :  
  3. uuid        = 6e69a5a7-667b-4e63-92c3-2f9f4269d633,  
  4.   finished    = True,  
  5.   success     = True,  
  6.   return      = True,  
  7.   activities  =   
  8. }  
  9.  
  10. # mysqlfabric group add my_group 172.17.0.47:3306  
  11. Procedure :  
  12. uuid        = 70a66b03-a16d-426d-a711-8f13da78fc8d,  
  13.   finished    = True,  
  14.   success     = True,  
  15.   return      = True,  
  16.   activities  =   
  17. }  
  18.  
  19. # mysqlfabric group add my_group 172.17.0.48:3306  
  20. Procedure :  
  21. uuid        = 15a2e1ad-b726-4fa8-bdf3-a1701e870166,  
  22.   finished    = True,  
  23.   success     = True,  
  24.   return      = True,  
  25.   activities  =   

添加实例到组错误:

  1. # mysqlfabric --param=servers.user=fabric --param=servers.password=fabric@456 group add my_group 172.17.0.50:3306  
  2. Password for admin:   
  3. Procedure :  
  4. uuid        = d2c0d969-5b8a-40c2-ba7a-1bc963c08824,  
  5.   finished    = True,  
  6.   success     = False,  
  7.   return      = ServerError: Error accessing server (172.17.0.50:3306).,  
  8.   activities  =   

日志:

  1. [DEBUG] 1409151193.274349 - Executor-4 - Statement (BEGIN, Params(()).  
  2. [DEBUG] 1409151193.274764 - Executor-4 - Executing _add_server  
  3. [DEBUG] 1409151193.274849 - Executor-4 - Statement (SELECT group_id, description, master_uuid, master_defined, status FROM groups WHERE group_id = %s, Params(('my_group',)).  
  4. [DEBUG] 1409151193.275494 - Executor-4 - Start executing function: discover_uuid((), {'connection_timeout': 5, 'address': '172.17.0.50:3306'}).  
  5. [DEBUG] 1409151193.276136 - Executor-4 - Error executing function: discover_uuid.  
  6. [DEBUG] 1409151193.276203 - Executor-4 - _add_server failed, executing compensation  
  7. [DEBUG] 1409151193.276255 - Executor-4 - Error accessing server (172.17.0.50:3306).  
  8. [DEBUG] 1409151193.276308 - Executor-4 - Statement (ROLLBACK, Params(()).  
  9. [DEBUG] 1409151193.276664 - Executor-4 - Complete job (60b0fa1f-3a39-43f3-aa71-46ea732aae84, 946e0199-53ca-4fdc-9b49-f134d44db476, mysql.fabric.services.server._add_server, Error). 

将密码写到fabric配置文件是可以,使用命令行参数不能覆盖配置文件参数,暂时没有找到是什么原因。

3、查看组中信息

可以看到所有实例的状态都是SECONDARY

  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': '7bd52611-2d44-11e4-af5f-3ecad7c2f82a', 'mode': 'READ_ONLY', 'weight': 1.0, 'address': '172.17.0.47:3306'}, {'status': 'SECONDARY', 'server_uuid': 'ade3ee53-2d44-11e4-af60-de532998e8a6', 'mode': 'READ_ONLY', 'weight': 1.0, 'address': '172.17.0.48:3306'}]  
  5.   activities  =   

4、查看组健康详细信息

  1. # mysqlfabric group health my_group  
  2. Command :  
  3. success     = True 
  4.   return      = {'19a37552-2d44-11e4-af5c-763d1493518d': {'status': 'SECONDARY', 'is_alive': True, 'threads': {'is_configured': False}}, '7bd52611-2d44-11e4-af5f-3ecad7c2f82a': {'status': 'SECONDARY', 'is_alive': True, 'threads': {'is_configured': False}}, 'ade3ee53-2d44-11e4-af60-de532998e8a6': {'status': 'SECONDARY', 'is_alive': True, 'threads': {'is_configured': False}}}  
  5.   activities  =   

5、提升和降级master服务

创建高可用组后,fabric没有意识到任何复制拓扑。需要提升一个为primary,降级剩余的服务器自动为secondaries(slaves)。

查看命令帮助:

# mysqlfabric help group promote

group promote group_id [--slave_id=NONE] [--update_only] [--synchronous]

如果只是想更新state store,跳过复制配置,使用--update_only参数。

如果slave没有提供,将选择一个最好的候选者,候选者必须开启二进制日志,同时跟master属于同一个组,跟master延时小。进行故障切换操作,选择这个候选者,同时将其他slave指向到新的master,同时更新state store。

提升一个mysql实例为master:

  1. # mysqlfabric group promote my_group  
  2. Procedure :  
  3. uuid        = 21eb4d58-d7ec-41eb-a0e5-560eb5976272,  
  4.   finished    = True,  
  5.   success     = True,  
  6.   return      = True,  
  7.   activities  =   

执行同样的命名将设置不同的服务器为primary,同时降级当前primary并选取一个新的。如果当前primary错误,执行同样的命令能手动触发选取一个新的primary。

一个标记位"faulty"状态的服务器不能提升为secondary或primary,需要先转换成"spare"状态。使用命令mysqlfabric server set_status <server-address> spare

如果直接从"faulty"转换成"secondary"将报错:

  1. # mysqlfabric server set_status 3ecc746f-2e05-11e4-b448-560d7281695e secondary  
  2. Procedure :  
  3. uuid        = 06d0acb1-ad01-483b-a1d4-e13c4b775fcd,  
  4.   finished    = True,  
  5.   success     = False,  
  6.   return      = ServerError: Cannot change server's (3ecc746f-2e05-11e4-b448-560d7281695e) status from (FAULTY) to (SECONDARY).,  
  7.   activities  =   

查看组状态和验证是否复制正常:

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

使用show slave status查看slave状态:

  1. # mysql -ufabric -pfabric@456 -h172.17.0.47 -e "show slave status\G;"  
  2. *************************** 1. row ***************************  
  3.                Slave_IO_State: Connecting to master  
  4.                   Master_Host: 172.17.0.50  
  5.                   Master_User: fabric  
  6.                   Master_Port: 3306  
  7.                 Connect_Retry: 60  
  8.               Master_Log_File:   
  9.           Read_Master_Log_Pos: 4  
  10.                Relay_Log_File: d4f404f647b0-relay-bin.000001  
  11.                 Relay_Log_Pos: 4  
  12.         Relay_Master_Log_File:   
  13.              Slave_IO_Running: Connecting  
  14.             Slave_SQL_Running: Yes  
  15.               Replicate_Do_DB:   
  16.           Replicate_Ignore_DB:   
  17.            Replicate_Do_Table:   
  18.        Replicate_Ignore_Table:   
  19.       Replicate_Wild_Do_Table:   
  20.   Replicate_Wild_Ignore_Table:   
  21.                    Last_Errno: 0  
  22.                    Last_Error:   
  23.                  Skip_Counter: 0  
  24.           Exec_Master_Log_Pos: 0  
  25.               Relay_Log_Space: 151  
  26.               Until_Condition: None  
  27.                Until_Log_File:   
  28.                 Until_Log_Pos: 0  
  29.            Master_SSL_Allowed: No  
  30.            Master_SSL_CA_File:   
  31.            Master_SSL_CA_Path:   
  32.               Master_SSL_Cert:   
  33.             Master_SSL_Cipher:   
  34.                Master_SSL_Key:   
  35.         Seconds_Behind_Master: 0  
  36. Master_SSL_Verify_Server_Cert: No  
  37.                 Last_IO_Errno: 1045  
  38.                 Last_IO_Error: error connecting to master 'fabric@172.17.0.50:3306' - retry-time: 60  retries: 31  
  39.                Last_SQL_Errno: 0  
  40.                Last_SQL_Error:   
  41.   Replicate_Ignore_Server_Ids:   
  42.              Master_Server_Id: 0  
  43.                   Master_UUID:   
  44.              Master_Info_File: /usr/local/Percona-Server-5.6.19-rel67.0-618.Linux.x86_64/data/master.info  
  45.                     SQL_Delay: 0  
  46.           SQL_Remaining_Delay: NULL  
  47.       Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it  
  48.            Master_Retry_Count: 86400  
  49.                   Master_Bind:   
  50.       Last_IO_Error_Timestamp: 140827 16:42:50  
  51.      Last_SQL_Error_Timestamp:   
  52.                Master_SSL_Crl:   
  53.            Master_SSL_Crlpath:   
  54.            Retrieved_Gtid_Set:   
  55.             Executed_Gtid_Set: 7bd52611-2d44-11e4-af5f-3ecad7c2f82a:1-6  
  56.                 Auto_Position: 1 

看到连接错误:

因fabric使用其连接管理mysql实例的用户配置slave,所有需要重新授权slave访问master:

  1. # mysql -uroot -padmin@123 -h172.17.0.50 -e "grant replication slave on *.* to fabric@'172.17.0.%' identified by 'fabric@456'"   
  2. # mysql -uroot -padmin@123 -h172.17.0.47 -e "grant replication slave on *.* to fabric@'172.17.0.%' identified by 'fabric@456'"   
  3. # mysql -uroot -padmin@123 -h172.17.0.48 -e "grant replication slave on *.* to fabric@'172.17.0.%' identified by 'fabric@456'"  

授权后重新查看slave状态:看到连接正常,复制正常工作

  1.  
  2. # mysql -ufabric -pfabric@456 -h172.17.0.48 -e 'show slave status\G'  
  3. *************************** 1. row ***************************  
  4.                Slave_IO_State: Waiting for master to send event  
  5.                   Master_Host: 172.17.0.50  
  6.                   Master_User: fabric  
  7.                   Master_Port: 3306  
  8.                 Connect_Retry: 60  
  9.               Master_Log_File: mysql-bin.000004  
  10.           Read_Master_Log_Pos: 3451  
  11.                Relay_Log_File: e294ab366580-relay-bin.000003  
  12.                 Relay_Log_Pos: 448  
  13.         Relay_Master_Log_File: mysql-bin.000004  
  14.              Slave_IO_Running: Yes  
  15.             Slave_SQL_Running: Yes  
  16.               Replicate_Do_DB:   
  17.           Replicate_Ignore_DB:   
  18.            Replicate_Do_Table:   
  19.        Replicate_Ignore_Table:   
  20.       Replicate_Wild_Do_Table:   
  21.   Replicate_Wild_Ignore_Table:   
  22.                    Last_Errno: 0  
  23.                    Last_Error:   
  24.                  Skip_Counter: 0  
  25.           Exec_Master_Log_Pos: 3451  
  26.               Relay_Log_Space: 4169  
  27.               Until_Condition: None  
  28.                Until_Log_File:   
  29.                 Until_Log_Pos: 0  
  30.            Master_SSL_Allowed: No  
  31.            Master_SSL_CA_File:   
  32.            Master_SSL_CA_Path:   
  33.               Master_SSL_Cert:   
  34.             Master_SSL_Cipher:   
  35.                Master_SSL_Key:   
  36.         Seconds_Behind_Master: 0  
  37. Master_SSL_Verify_Server_Cert: No  
  38.                 Last_IO_Errno: 0  
  39.                 Last_IO_Error:   
  40.                Last_SQL_Errno: 0  
  41.                Last_SQL_Error:   
  42.   Replicate_Ignore_Server_Ids:   
  43.              Master_Server_Id: 27  
  44.                   Master_UUID: 19a37552-2d44-11e4-af5c-763d1493518d  
  45.              Master_Info_File: /usr/local/Percona-Server-5.6.19-rel67.0-618.Linux.x86_64/data/master.info  
  46.                     SQL_Delay: 0  
  47.           SQL_Remaining_Delay: NULL  
  48.       Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it  
  49.            Master_Retry_Count: 86400  
  50.                   Master_Bind:   
  51.       Last_IO_Error_Timestamp:   
  52.      Last_SQL_Error_Timestamp:   
  53.                Master_SSL_Crl:   
  54.            Master_SSL_Crlpath:   
  55.            Retrieved_Gtid_Set: 19a37552-2d44-11e4-af5c-763d1493518d:1-10  
  56.             Executed_Gtid_Set: 19a37552-2d44-11e4-af5c-763d1493518d:1-10  
  57.                 Auto_Position: 1  
  58.  
  59. # mysql -ufabric -pfabric@456 -h172.17.0.47 -e 'show slave status\G'  
  60. *************************** 1. row ***************************  
  61.                Slave_IO_State: Waiting for master to send event  
  62.                   Master_Host: 172.17.0.50  
  63.                   Master_User: fabric  
  64.                   Master_Port: 3306  
  65.                 Connect_Retry: 60  
  66.               Master_Log_File: mysql-bin.000004  
  67.           Read_Master_Log_Pos: 3451  
  68.                Relay_Log_File: d4f404f647b0-relay-bin.000004  
  69.                 Relay_Log_Pos: 448  
  70.         Relay_Master_Log_File: mysql-bin.000004  
  71.              Slave_IO_Running: Yes  
  72.             Slave_SQL_Running: Yes  
  73.               Replicate_Do_DB:   
  74.           Replicate_Ignore_DB:   
  75.            Replicate_Do_Table:   
  76.        Replicate_Ignore_Table:   
  77.       Replicate_Wild_Do_Table:   
  78.   Replicate_Wild_Ignore_Table:   
  79.                    Last_Errno: 0  
  80.                    Last_Error:   
  81.                  Skip_Counter: 0  
  82.           Exec_Master_Log_Pos: 3451  
  83.               Relay_Log_Space: 1205  
  84.               Until_Condition: None  
  85.                Until_Log_File:   
  86.                 Until_Log_Pos: 0  
  87.            Master_SSL_Allowed: No  
  88.            Master_SSL_CA_File:   
  89.            Master_SSL_CA_Path:   
  90.               Master_SSL_Cert:   
  91.             Master_SSL_Cipher:   
  92.                Master_SSL_Key:   
  93.         Seconds_Behind_Master: 0  
  94. Master_SSL_Verify_Server_Cert: No  
  95.                 Last_IO_Errno: 0  
  96.                 Last_IO_Error:   
  97.                Last_SQL_Errno: 0  
  98.                Last_SQL_Error:   
  99.   Replicate_Ignore_Server_Ids:   
  100.              Master_Server_Id: 27  
  101.                   Master_UUID: 19a37552-2d44-11e4-af5c-763d1493518d  
  102.              Master_Info_File: /usr/local/Percona-Server-5.6.19-rel67.0-618.Linux.x86_64/data/master.info  
  103.                     SQL_Delay: 0  
  104.           SQL_Remaining_Delay: NULL  
  105.       Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it  
  106.            Master_Retry_Count: 86400  
  107.                   Master_Bind:   
  108.       Last_IO_Error_Timestamp:   
  109.      Last_SQL_Error_Timestamp:   
  110.                Master_SSL_Crl:   
  111.            Master_SSL_Crlpath:   
  112.            Retrieved_Gtid_Set: 19a37552-2d44-11e4-af5c-763d1493518d:1-10  
  113.             Executed_Gtid_Set: 19a37552-2d44-11e4-af5c-763d1493518d:1-10  
  114.                 Auto_Position: 1 


www.htsjk.Com true http://www.htsjk.com/shujukukf/17659.html NewsArticle Fabric结合GTID实现Mysql复制高可用(1) mysql版本:Percona server 5.6.19-67.0 Percona Server (GPL), Release 67.0, Revision 618 Mysql安装参考: http://my.oschina.net/anthonyyau/blog/284092 Fabric State store安装参考: http...
评论暂时关闭