最近在研究ProxySQL,觉得还挺不错的,所以就简单的折腾了一下,ProxySQL目前也是Percona在推荐的一个读写分离的中间件。关于详细的介绍可以参考官方文档。https://github.com/sysown/proxysql/wiki

本文主要介绍的是MHA+ProxySQL读写分离以及高可用,ProxySQL的细节请参考文档,目前已经有人写的非常详细了,文章最后会给出链接。当然和Group Replication,PXC搭配那是更完美的。关于MHA的配置参考我前面的文章,本文就不再介绍。下面来看看

MHA和ProxySQL搭配使用的架构图:

测试环境(1主2从):

M-> 192.168.0.20S1-> 192.168.0.30S2-> 192.168.0.40proxysql-> 192.168.0.10

1. 检查主从复制是否正常:

[root@db_server_yayun_04 ~]# masterha_check_repl --conf=/data/mha/3306/mha.cnf

Thu Jun15 17:45:32 2017 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.

Thu Jun15 17:45:32 2017 - [info] Reading application default configuration from /data/mha/3306/mha.cnf..

Thu Jun15 17:45:32 2017 - [info] Updating application default configuration from /usr/local/bin/load_cnf..

Thu Jun15 17:45:32 2017 - [info] Reading server configuration from /data/mha/3306/mha.cnf..

Thu Jun15 17:45:32 2017 - [info] Setting max_ping_errors to 10, ping_interval to 3.

Thu Jun15 17:45:32 2017 - [info] MHA::MasterMonitor version 0.57.

Thu Jun15 17:45:32 2017 - [info] GTID failover mode = 1Thu Jun15 17:45:32 2017 - [info] Dead Servers:

Thu Jun15 17:45:32 2017 - [info] Alive Servers:

Thu Jun15 17:45:32 2017 - [info] 192.168.0.20(192.168.0.20:3306)

Thu Jun15 17:45:32 2017 - [info] 192.168.0.30(192.168.0.30:3306)

Thu Jun15 17:45:32 2017 - [info] 192.168.0.40(192.168.0.40:3306)

Thu Jun15 17:45:32 2017 - [info] Alive Slaves:

Thu Jun15 17:45:32 2017 - [info] 192.168.0.30(192.168.0.30:3306) Version=5.7.17-log (oldest major version between slaves) log-bin:enabled

Thu Jun15 17:45:32 2017 - [info] GTID ON

Thu Jun15 17:45:32 2017 - [info] Replicating from 192.168.0.20(192.168.0.20:3306)

Thu Jun15 17:45:32 2017 - [info] Primary candidate forthe new Master (candidate_master is set)

Thu Jun15 17:45:32 2017 - [info] 192.168.0.40(192.168.0.40:3306) Version=5.7.17-log (oldest major version between slaves) log-bin:enabled

Thu Jun15 17:45:32 2017 - [info] GTID ON

Thu Jun15 17:45:32 2017 - [info] Replicating from 192.168.0.20(192.168.0.20:3306)

Thu Jun15 17:45:32 2017 - [info] Primary candidate forthe new Master (candidate_master is set)

Thu Jun15 17:45:32 2017 - [info] Current Alive Master: 192.168.0.20(192.168.0.20:3306)

Thu Jun15 17:45:32 2017 - [info] Checking slave configurations..

Thu Jun15 17:45:32 2017 - [info] Checking replication filtering settings..

Thu Jun15 17:45:32 2017 - [info] binlog_do_db= , binlog_ignore_db=Thu Jun15 17:45:32 2017 - [info] Replication filtering check ok.

Thu Jun15 17:45:32 2017 - [info] GTID (with auto-pos) is supported. Skipping all SSH and Node package checking.

Thu Jun15 17:45:32 2017 - [info] Checking SSH publickey authentication settings on the current master..

Thu Jun15 17:45:33 2017 - [info] HealthCheck: SSH to 192.168.0.20is reachable.

Thu Jun15 17:45:33 2017 - [info]192.168.0.20(192.168.0.20:3306) (current master)+--192.168.0.30(192.168.0.30:3306)+--192.168.0.40(192.168.0.40:3306)

Thu Jun15 17:45:33 2017 - [info] Checking replication health on 192.168.0.30..

Thu Jun15 17:45:33 2017 - [info] ok.

Thu Jun15 17:45:33 2017 - [info] Checking replication health on 192.168.0.40..

Thu Jun15 17:45:33 2017 - [info] ok.

Thu Jun15 17:45:33 2017 -[warning] master_ip_failover_script is not defined.

Thu Jun15 17:45:33 2017 -[warning] shutdown_script is not defined.

Thu Jun15 17:45:33 2017 - [info] Got exit code 0(Not master dead).

MySQL Replication Health is OK.

[root@db_server_yayun_04~]#

View Code

2. 配置后端MySQL。登入ProxySQL,把MySQL主从的信息添加进去。将主库master也就是做写入的节点放到HG 100中,salve节点做读放到HG 1000。在proxysql输入命令:

mysql -uadmin -padmin -h127.0.0.1 -P6032

[admin@127.0.0.1][(none)]> insert into mysql_servers(hostgroup_id,hostname,port,weight,max_connections,max_replication_lag,comment) values(100,'192.168.0.20',3306,1,1000,10,'test my proxysql');

Query OK,1 row affected (0.00sec)[admin@127.0.0.1][(none)]> insert into mysql_servers(hostgroup_id,hostname,port,weight,max_connections,max_replication_lag,comment) values(1000,'192.168.0.30',3306,1,1000,10,'test my proxysql');

Query OK,1 row affected (0.00sec)[admin@127.0.0.1][(none)]> insert into mysql_servers(hostgroup_id,hostname,port,weight,max_connections,max_replication_lag,comment) values(1000,'192.168.0.40',3306,1,1000,10,'test my proxysql');

Query OK,1 row affected (0.00sec)[admin@127.0.0.1][(none)]> select * frommysql_servers;+--------------+--------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+------------------+

| hostgroup_id | hostname | port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |

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

| 100 | 192.168.0.20 | 3306 | ONLINE | 1 | 0 | 1000 | 10 | 0 | 0 | test my proxysql |

| 1000 | 192.168.0.30 | 3306 | ONLINE | 1 | 0 | 1000 | 10 | 0 | 0 | test my proxysql |

| 1000 | 192.168.0.40 | 3306 | ONLINE | 1 | 0 | 1000 | 10 | 0 | 0 | test my proxysql |

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

3 rows in set (0.00 sec)

3. 配置后端MySQL用户。这个用户需要先在后端MySQL(20,30,40)里真实存在,一个是监控账号、一个是程序账号。

(1) 监控账号(用来监控后端mysql是否存活以及read_only变量):

GRANT SUPER, REPLICATION CLIENT ON *.* TO 'proxysql'@'192.168.0.10' IDENTIFIED BY 'proxysql';

(2) 程序账号(这里为了后面测试方便给了all权限):

GRANT all ON *.* TO 'yayun'@'192.168.0.10' identified by 'yayun';

4. 在后端MySQL里添加完之后再配置ProxySQL:这里需要注意,default_hostgroup需要和上面的对应。(proxysql)

[admin@127.0.0.1][(none)]> insert into mysql_users(username,password,active,default_hostgroup,transaction_persistent) values('yayun','yayun',1,100,1);

Query OK,1 row affected (0.00sec)[admin@127.0.0.1][(none)]> select * frommysql_users;+----------+----------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+

| username | password | active | use_ssl | default_hostgroup | default_schema | schema_locked | transaction_persistent | fast_forward | backend | frontend | max_connections |

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

| yayun | yayun | 1 | 0 | 100 | NULL | 0 | 1 | 0 | 1 | 1 | 10000 |

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

1 row in set (0.00sec)[admin@127.0.0.1][(none)]>

5. 设置健康监测账号(proxysql):

[admin@127.0.0.1][(none)]> set mysql-monitor_username='proxysql';

Query OK,1 row affected (0.00sec)[admin@127.0.0.1][(none)]> set mysql-monitor_password='proxysql';

Query OK,1 row affected (0.00sec)[admin@127.0.0.1][(none)]>

6. 加载配置和变量:因为修改了servers、users和variables,所以加载的时候要执行:

[admin@127.0.0.1][(none)]> load mysql servers toruntime;

Query OK,0 rows affected (0.01sec)[admin@127.0.0.1][(none)]> load mysql users toruntime;

Query OK,0 rows affected (0.00sec)[admin@127.0.0.1][(none)]> load mysql variables toruntime;

Query OK,0 rows affected (0.00sec)[admin@127.0.0.1][(none)]> save mysql servers to disk;

Query OK,0 rows affected (0.05sec)[admin@127.0.0.1][(none)]> save mysql users to disk;

Query OK,0 rows affected (0.02sec)[admin@127.0.0.1][(none)]> save mysql variables to disk;

Query OK,74 rows affected (0.01sec)[admin@127.0.0.1][(none)]>

7. 连接数据库,通过proxysql的客户端接口访问(6033):(我这里从40从库上面发起连接)

mysql -uyayun -pyayun -h192.168.0.10 -P6033

[root@db_server_yayun_04 ~]# mysql -uyayun -pyayun -h192.168.0.10 -P6033

mysql:[Warning] Using a password onthe command line interface can be insecure.

Welcometo the MySQL monitor. Commands end with ; or\g.

Your MySQL connection idis 4Server version:5.5.30(ProxySQL)

Copyright (c)2000, 2016, Oracle and/or its affiliates. Allrights reserved.

Oracleis a registered trademark of Oracle Corporation and/orits

affiliates. Other names may be trademarksoftheir respective

owners.

Type'help;' or '\h' for help. Type '\c' to clear the currentinput statement.[yayun@192.168.0.10][(none)]>show databases;+--------------------+

| Database |

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

| information_schema |

| mysql |

| performance_schema |

| sys |

| yayun |

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

5 rows in set (0.01sec)[yayun@192.168.0.10][(none)]>

8. 创建表并且写入数据进行查询:

[yayun@192.168.0.10][(none)]> useyayunDatabase changed, 2warnings[yayun@192.168.0.10][yayun]> create table t1 ( id int);

Query OK,0 rows affected (0.08sec)[yayun@192.168.0.10][yayun]> insert into t1 select 1;

Query OK,1 row affected (0.05sec)

Records:1 Duplicates: 0 Warnings: 0

[yayun@192.168.0.10][yayun]> select * fromt1;+------+

| id |

+------+

| 1 |

+------+

1 row in set (0.00sec)[yayun@192.168.0.10][yayun]>

可以看到创建了表,并且插入了数据,查询也没问题。proxysql有个类似审计的功能,可以查看各类SQL的执行情况。在proxysql执行SQL查看。

[admin@127.0.0.1][(none)]> select * fromstats_mysql_query_digest;+-----------+--------------------+----------+--------------------+----------------------------------+------------+------------+------------+----------+----------+----------+

| hostgroup | schemaname | username | digest | digest_text | count_star | first_seen | last_seen | sum_time | min_time | max_time |

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

| 100 | yayun | yayun | 0xA9518ABEA63705E6 | create table t1 ( id int) | 1 | 1497577980 | 1497577980 | 79733 | 79733 | 79733 |

| 100 | yayun | yayun | 0x3765930C7143F468 | select * from t1 | 1 | 1497577997 | 1497577997 | 1537 | 1537 | 1537 |

| 100 | yayun | yayun | 0x4BBB5CD4BC2CFD94 | insert into t1 select ? | 1 | 1497577986 | 1497577986 | 33350 | 33350 | 33350 |

| 100 | information_schema | yayun | 0x620B328FE9D6D71A | SELECT DATABASE() | 1 | 1497577955 | 1497577955 | 4994 | 4994 | 4994 |

| 100 | information_schema | yayun | 0x594F2C744B698066 | select USER() | 1 | 1497577951 | 1497577951 | 0 | 0 | 0 |

| 100 | information_schema | yayun | 0x226CD90D52A2BA0B | select @@version_comment limit ? | 1 | 1497577951 | 1497577951 | 0 | 0 | 0 |

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

6 rows in set (0.00sec)[admin@127.0.0.1][(none)]>

9. 可以看到读写都发送到了组100上面,组100是主库,说明没有读写分离。那是因为还有配置没有完成,我们需要自己定义规则。

定义路由规则,如:除select * from tb for update的select全部发送到slave,其他的的语句发送到master。

[admin@127.0.0.1][(none)]> INSERT INTO mysql_query_rules(active,match_pattern,destination_hostgroup,apply) VALUES(1,'^SELECT.*FOR UPDATE$',100,1);

Query OK,1 row affected (0.00sec)[admin@127.0.0.1][(none)]> INSERT INTO mysql_query_rules(active,match_pattern,destination_hostgroup,apply) VALUES(1,'^SELECT',1000,1);

Query OK,1 row affected (0.00sec)[admin@127.0.0.1][(none)]> load mysql query rules toruntime;

Query OK,0 rows affected (0.00sec)[admin@127.0.0.1][(none)]> save mysql query rules to disk;

Query OK,0 rows affected (0.02sec)[admin@127.0.0.1][(none)]> select rule_id,active,match_pattern,destination_hostgroup,apply fromruntime_mysql_query_rules;+---------+--------+----------------------+-----------------------+-------+

| rule_id | active | match_pattern | destination_hostgroup | apply |

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

| 1 | 1 | ^SELECT.*FOR UPDATE$ | 100 | 1 |

| 2 | 1 | ^SELECT | 1000 | 1 |

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

2 rows in set (0.00sec)[admin@127.0.0.1][(none)]>

清理掉统计信息,再次进行测试。

select * from stats_mysql_query_digest_reset;

再次运行读写,然后再查看,发现已经实现读写分离。

[admin@127.0.0.1][(none)]> select * fromstats_mysql_query_digest;+-----------+------------+----------+--------------------+-------------------------+------------+------------+------------+----------+----------+----------+

| hostgroup | schemaname | username | digest | digest_text | count_star | first_seen | last_seen | sum_time | min_time | max_time |

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

| 1000 | yayun | yayun | 0x3765930C7143F468 | select * from t1 | 1 | 1497578494 | 1497578494 | 21751 | 21751 | 21751 |

| 100 | yayun | yayun | 0x4BBB5CD4BC2CFD94 | insert into t1 select ? | 1 | 1497578492 | 1497578492 | 54852 | 54852 | 54852 |

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

2 rows in set (0.00sec)[admin@127.0.0.1][(none)]>

重点来了,如何配合MHA实现高可用呢?那么需要利用到proxysql里面的mysql_replication_hostgroups表。mysql_replication_hostgroups 表的主要作用是监视指定主机组中所有服务器的read_only值,并且根据read_only的值将服务器分配给写入器或读取器主机组,定义 hostgroup 的主从关系。ProxySQL monitor 模块会监控 HG 后端所有servers 的 read_only 变量,如果发现从库的 read_only 变为0、主库变为1,则认为角色互换了,自动改写 mysql_servers 表里面 hostgroup 关系,达到自动 Failover 效果。

我们看看mysql_replication_hostgroups表结构:

[admin@127.0.0.1][(none)]> show create tablemysql_replication_hostgroups\G*************************** 1. row ***************************

table: mysql_replication_hostgroupsCreate Table: CREATE TABLEmysql_replication_hostgroups (

writer_hostgroupINT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY,

reader_hostgroupINT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND reader_hostgroup>0),

commentVARCHAR,UNIQUE(reader_hostgroup))1 row in set (0.00sec)[admin@127.0.0.1][(none)]>

3个字段很明显,写主机组,读主机组,备注。那么我们现在插入数据。我们的100是写,1000是读。

[admin@127.0.0.1][(none)]> insert into mysql_replication_hostgroups (writer_hostgroup,reader_hostgroup,comment)values(100,1000,'测试我的读写分离高可用');

Query OK,1 row affected (0.00sec)[admin@127.0.0.1][(none)]> load mysql servers toruntime;

Query OK,0 rows affected (0.01sec)[admin@127.0.0.1][(none)]> save mysql servers to disk;

Query OK,0 rows affected (0.03sec)[admin@127.0.0.1][(none)]> select * fromruntime_mysql_replication_hostgroups;+------------------+------------------+-----------------------------------+

| writer_hostgroup | reader_hostgroup | comment |

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

| 100 | 1000 | 测试我的读写分离高可用 |

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

1 row in set (0.00sec)[admin@127.0.0.1][(none)]>

我们用vc-mysql-sniffer在从库抓一下。看看能看见什么。

[root@db_server_yayun_03 ~]# ./vc-mysql-sniffer

# Time:061617 10:26:45# User@Host: unknown_user[unknown_user] @192.168.0.10:36371[]

# Query_time:0.005198SHOW GLOBAL VARIABLES LIKE'read_only';

# Time:061617 10:26:46# User@Host: unknown_user[unknown_user] @192.168.0.10:36372[]

# Query_time:0.000564SHOW SLAVE STATUS;

# Time:061617 10:26:46# User@Host: unknown_user[unknown_user] @192.168.0.10:36372[]

# Query_time:0.004008SHOW GLOBAL VARIABLES LIKE'read_only';

# Time:061617 10:26:48# User@Host: unknown_user[unknown_user] @192.168.0.10:36371[]

# Query_time:0.004923SHOW GLOBAL VARIABLES LIKE'read_only';

# Time:061617 10:26:49# User@Host: unknown_user[unknown_user] @192.168.0.10:36372[]

# Query_time:0.003617SHOW GLOBAL VARIABLES LIKE'read_only';

可以看见在检查read_only变量。我们先看看现在主机组的关系:

[admin@127.0.0.1][(none)]> select * fromruntime_mysql_servers;+--------------+--------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+------------------+

| hostgroup_id | hostname | port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |

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

| 100 | 192.168.0.20 | 3306 | ONLINE | 1 | 0 | 1000 | 10 | 0 | 100 | test my proxysql |

| 1000 | 192.168.0.30 | 3306 | ONLINE | 1 | 0 | 1000 | 10 | 0 | 100 | test my proxysql |

| 1000 | 192.168.0.40 | 3306 | ONLINE | 1 | 0 | 1000 | 10 | 0 | 100 | test my proxysql |

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

3 rows in set (0.00sec)[admin@127.0.0.1][(none)]>

可以看见100主机组是主库,1000主机组是从库。下面使用MHA在线变换主从关系。我们把从库40提升为主库。

[root@db_server_yayun_04 ~]# masterha_master_switch --master_state=alive --conf=/data/mha/3306/mha.cnf --new_master_host=192.168.0.40 --new_master_port=3306 --orig_master_is_new_slave

Fri Jun16 10:30:39 2017 - [info] MHA::MasterRotate version 0.57.

Fri Jun16 10:30:39 2017 - [info] Starting online master switch..

Fri Jun16 10:30:39 2017 - [info]

Fri Jun16 10:30:39 2017 - [info] * Phase 1: Configuration Check Phase..

Fri Jun16 10:30:39 2017 - [info]

Fri Jun16 10:30:39 2017 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.

Fri Jun16 10:30:39 2017 - [info] Reading application default configuration from /data/mha/3306/mha.cnf..

Fri Jun16 10:30:39 2017 - [info] Updating application default configuration from /usr/local/bin/load_cnf..

Fri Jun16 10:30:39 2017 - [info] Reading server configuration from /data/mha/3306/mha.cnf..

Fri Jun16 10:30:39 2017 - [info] Setting max_ping_errors to 10, ping_interval to 3.

Fri Jun16 10:30:39 2017 - [info] GTID failover mode = 1Fri Jun16 10:30:39 2017 - [info] Current Alive Master: 192.168.0.20(192.168.0.20:3306)

Fri Jun16 10:30:39 2017 - [info] Alive Slaves:

Fri Jun16 10:30:39 2017 - [info] 192.168.0.30(192.168.0.30:3306) Version=5.7.17-log (oldest major version between slaves) log-bin:enabled

Fri Jun16 10:30:39 2017 - [info] GTID ON

Fri Jun16 10:30:39 2017 - [info] Replicating from 192.168.0.20(192.168.0.20:3306)

Fri Jun16 10:30:39 2017 - [info] Primary candidate forthe new Master (candidate_master is set)

Fri Jun16 10:30:39 2017 - [info] 192.168.0.40(192.168.0.40:3306) Version=5.7.17-log (oldest major version between slaves) log-bin:enabled

Fri Jun16 10:30:39 2017 - [info] GTID ON

Fri Jun16 10:30:39 2017 - [info] Replicating from 192.168.0.20(192.168.0.20:3306)

Fri Jun16 10:30:39 2017 - [info] Primary candidate forthe new Master (candidate_master is set)

It is better to execute FLUSH NO_WRITE_TO_BINLOG TABLES on the master before switching. Is it ok to execute on192.168.0.20(192.168.0.20:3306)? (YES/no): y

Fri Jun16 10:30:40 2017 - [info] Executing FLUSH NO_WRITE_TO_BINLOG TABLES. This may take long time..

Fri Jun16 10:30:40 2017 - [info] ok.

Fri Jun16 10:30:40 2017 - [info] Checking MHA is not monitoring or doing failover..

Fri Jun16 10:30:40 2017 - [info] Checking replication health on 192.168.0.30..

Fri Jun16 10:30:40 2017 - [info] ok.

Fri Jun16 10:30:40 2017 - [info] Checking replication health on 192.168.0.40..

Fri Jun16 10:30:40 2017 - [info] ok.

Fri Jun16 10:30:40 2017 - [info] 192.168.0.40can be new master.

Fri Jun16 10:30:40 2017 - [info]

From:192.168.0.20(192.168.0.20:3306) (current master)+--192.168.0.30(192.168.0.30:3306)+--192.168.0.40(192.168.0.40:3306)

To:192.168.0.40(192.168.0.40:3306) (new master)+--192.168.0.30(192.168.0.30:3306)+--192.168.0.20(192.168.0.20:3306)

Starting master switch from192.168.0.20(192.168.0.20:3306) to 192.168.0.40(192.168.0.40:3306)? (yes/NO): yes

Fri Jun16 10:30:42 2017 - [info] Checking whether 192.168.0.40(192.168.0.40:3306) is ok forthe new master..

Fri Jun16 10:30:42 2017 - [info] ok.

Fri Jun16 10:30:42 2017 - [info] 192.168.0.20(192.168.0.20:3306): SHOW SLAVE STATUS returned empty result. To check replication filtering rules, temporarily executing CHANGE MASTER to a dummy host.

Fri Jun16 10:30:42 2017 - [info] 192.168.0.20(192.168.0.20:3306): Resetting slave pointing to the dummy host.

Fri Jun16 10:30:42 2017 - [info] ** Phase 1: Configuration Check Phase completed.

Fri Jun16 10:30:42 2017 - [info]

Fri Jun16 10:30:42 2017 - [info] * Phase 2: Rejecting updates Phase..

Fri Jun16 10:30:42 2017 - [info]

Fri Jun16 10:30:42 2017 - [info] Executing master ip online change script to disable writeon the current master:

Fri Jun16 10:30:42 2017 - [info] /usr/local/bin/master_ip_online_change --command=stop --orig_master_host=192.168.0.20 --orig_master_ip=192.168.0.20 --orig_master_port=3306 --orig_master_user='root' --orig_master_password='123' --new_master_host=192.168.0.40 --new_master_ip=192.168.0.40 --new_master_port=3306 --new_master_user='root' --new_master_password='123' --orig_master_ssh_user=root --new_master_ssh_user=root --orig_master_is_new_slave

Fri Jun16 10:30:42 2017 783184Set read_only on the new master.. ok.

Fri Jun16 10:30:42 2017 786894Drpping app user on the orig master..

Fri Jun16 10:30:42 2017 787716 Waiting all running 3 threads are disconnected.. (max 1500milliseconds)

{'Time' => '0','Command' => 'Sleep','db' => undef,'Id' => '282','Info' => undef,'User' => 'proxysql','State' => '','Host' => '192.168.0.10:54482'}

{'Time' => '1620','Command' => 'Binlog Dump GTID','db' => undef,'Id' => '296','Info' => undef,'User' => 'repl','State' => 'Master has sent all binlog to slave; waiting for more updates','Host' => '192.168.0.30:53451'}

{'Time' => '874','Command' => 'Binlog Dump GTID','db' => undef,'Id' => '310','Info' => undef,'User' => 'repl','State' => 'Master has sent all binlog to slave; waiting for more updates','Host' => '192.168.0.40:53136'}

Fri Jun16 10:30:43 2017 294399 Waiting all running 2 threads are disconnected.. (max 1000milliseconds)

{'Time' => '1621','Command' => 'Binlog Dump GTID','db' => undef,'Id' => '296','Info' => undef,'User' => 'repl','State' => 'Master has sent all binlog to slave; waiting for more updates','Host' => '192.168.0.30:53451'}

{'Time' => '875','Command' => 'Binlog Dump GTID','db' => undef,'Id' => '310','Info' => undef,'User' => 'repl','State' => 'Master has sent all binlog to slave; waiting for more updates','Host' => '192.168.0.40:53136'}

Fri Jun16 10:30:43 2017 800400 Waiting all running 2 threads are disconnected.. (max 500milliseconds)

{'Time' => '1621','Command' => 'Binlog Dump GTID','db' => undef,'Id' => '296','Info' => undef,'User' => 'repl','State' => 'Master has sent all binlog to slave; waiting for more updates','Host' => '192.168.0.30:53451'}

{'Time' => '875','Command' => 'Binlog Dump GTID','db' => undef,'Id' => '310','Info' => undef,'User' => 'repl','State' => 'Master has sent all binlog to slave; waiting for more updates','Host' => '192.168.0.40:53136'}

Fri Jun16 10:30:44 2017 306937 Set read_only=1on the orig master.. ok.

Fri Jun16 10:30:44 2017 311939 Waiting all running 3 queries are disconnected.. (max 500milliseconds)

{'Time' => '0','Command' => 'Sleep','db' => undef,'Id' => '281','Info' => undef,'User' => 'proxysql','State' => '','Host' => '192.168.0.10:54481'}

{'Time' => '1622','Command' => 'Binlog Dump GTID','db' => undef,'Id' => '296','Info' => undef,'User' => 'repl','State' => 'Master has sent all binlog to slave; waiting for more updates','Host' => '192.168.0.30:53451'}

{'Time' => '876','Command' => 'Binlog Dump GTID','db' => undef,'Id' => '310','Info' => undef,'User' => 'repl','State' => 'Master has sent all binlog to slave; waiting for more updates','Host' => '192.168.0.40:53136'}

Fri Jun16 10:30:44 2017 810421Killing all application threads..

Fri Jun16 10:30:44 2017 816513 done.

SIOCSIFFLAGS: Cannot assign requested address

Fri Jun16 10:30:45 2017 - [info] ok.

Fri Jun16 10:30:45 2017 - [info] Locking all tables on the orig master to reject updates from everybody (including root):

Fri Jun16 10:30:45 2017 - [info] Executing FLUSH TABLES WITH READ LOCK..

Fri Jun16 10:30:45 2017 - [info] ok.

Fri Jun16 10:30:45 2017 - [info] Orig master binlog:pos is mysql-bin.000001:1610.

Fri Jun16 10:30:45 2017 - [info] Waiting to execute all relay logs on 192.168.0.40(192.168.0.40:3306)..

Fri Jun16 10:30:45 2017 - [info] master_pos_wait(mysql-bin.000001:1610) completed on 192.168.0.40(192.168.0.40:3306). Executed 0events.

Fri Jun16 10:30:45 2017 - [info] done.

Fri Jun16 10:30:45 2017 - [info] Getting new master's binlog name and position..

Fri Jun 16 10:30:45 2017 - [info] mysql-bin.000002:194Fri Jun16 10:30:45 2017 - [info] All other slaves should start replication from here. Statement should be: CHANGE MASTER TO MASTER_HOST='192.168.0.40', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='xxx';

Fri Jun16 10:30:45 2017 - [info] Executing master ip online change script to allow writeon the new master:

Fri Jun16 10:30:45 2017 - [info] /usr/local/bin/master_ip_online_change --command=start --orig_master_host=192.168.0.20 --orig_master_ip=192.168.0.20 --orig_master_port=3306 --orig_master_user='root' --orig_master_password='123' --new_master_host=192.168.0.40 --new_master_ip=192.168.0.40 --new_master_port=3306 --new_master_user='root' --new_master_password='123' --orig_master_ssh_user=root --new_master_ssh_user=root --orig_master_is_new_slave

Fri Jun16 10:30:45 2017 744690 Set read_only=0on the new master.

Fri Jun16 10:30:45 2017 745124Creating app user on the new master..

Fri Jun16 10:30:45 2017 - [info] ok.

Fri Jun16 10:30:45 2017 - [info]

Fri Jun16 10:30:45 2017 - [info] * Switching slaves inparallel..

Fri Jun16 10:30:45 2017 - [info]

Fri Jun16 10:30:45 2017 - [info] -- Slave switch on host 192.168.0.30(192.168.0.30:3306) started, pid: 9457Fri Jun16 10:30:45 2017 - [info]

Fri Jun16 10:30:45 2017 - [info] Log messages from 192.168.0.30...

Fri Jun16 10:30:45 2017 - [info]

Fri Jun16 10:30:45 2017 - [info] Waiting to execute all relay logs on 192.168.0.30(192.168.0.30:3306)..

Fri Jun16 10:30:45 2017 - [info] master_pos_wait(mysql-bin.000001:1610) completed on 192.168.0.30(192.168.0.30:3306). Executed 0events.

Fri Jun16 10:30:45 2017 - [info] done.

Fri Jun16 10:30:45 2017 - [info] Resetting slave 192.168.0.30(192.168.0.30:3306) and starting replication from the new master 192.168.0.40(192.168.0.40:3306)..

Fri Jun16 10:30:45 2017 - [info] Executed CHANGE MASTER.

Fri Jun16 10:30:45 2017 - [info] Slave started.

Fri Jun16 10:30:45 2017 - [info] End of log messages from 192.168.0.30...

Fri Jun16 10:30:45 2017 - [info]

Fri Jun16 10:30:45 2017 - [info] -- Slave switch on host 192.168.0.30(192.168.0.30:3306) succeeded.

Fri Jun16 10:30:45 2017 - [info] Unlocking all tables on the orig master:

Fri Jun16 10:30:45 2017 - [info] Executing UNLOCK TABLES..

Fri Jun16 10:30:45 2017 - [info] ok.

Fri Jun16 10:30:45 2017 - [info] Starting orig master as a new slave..

Fri Jun16 10:30:45 2017 - [info] Resetting slave 192.168.0.20(192.168.0.20:3306) and starting replication from the new master 192.168.0.40(192.168.0.40:3306)..

Fri Jun16 10:30:45 2017 - [info] Executed CHANGE MASTER.

Fri Jun16 10:30:46 2017 - [info] Slave started.

Fri Jun16 10:30:46 2017 - [info] All new slave servers switched successfully.

Fri Jun16 10:30:46 2017 - [info]

Fri Jun16 10:30:46 2017 - [info] * Phase 5: New master cleanup phase..

Fri Jun16 10:30:46 2017 - [info]

Fri Jun16 10:30:46 2017 - [info] 192.168.0.40: Resetting slave infosucceeded.

Fri Jun16 10:30:46 2017 - [info] Switching master to 192.168.0.40(192.168.0.40:3306) completed successfully.

View Code

可以看见已经成功切换。我们再来看看运行主机组的状态:

[admin@127.0.0.1][(none)]> select * fromruntime_mysql_servers;+--------------+--------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+------------------+

| hostgroup_id | hostname | port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |

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

| 100 | 192.168.0.40 | 3306 | ONLINE | 1 | 0 | 1000 | 10 | 0 | 100 | test my proxysql |

| 1000 | 192.168.0.30 | 3306 | ONLINE | 1 | 0 | 1000 | 10 | 0 | 100 | test my proxysql |

| 1000 | 192.168.0.40 | 3306 | ONLINE | 1 | 0 | 1000 | 10 | 0 | 100 | test my proxysql |

| 1000 | 192.168.0.20 | 3306 | ONLINE | 1 | 0 | 1000 | 10 | 0 | 100 | test my proxysql |

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

4 rows in set (0.00sec)[admin@127.0.0.1][(none)]>

可以看见40自动设置成了主机组100,也就是master。我们进行读写测试。

[admin@127.0.0.1][(none)]> select * fromstats_mysql_query_digest;+-----------+------------+----------+--------------------+-----------------------------+------------+------------+------------+----------+----------+----------+

| hostgroup | schemaname | username | digest | digest_text | count_star | first_seen | last_seen | sum_time | min_time | max_time |

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

| 1000 | yayun | yayun | 0x3765930C7143F468 | select * from t1 | 1 | 1497580568 | 1497580568 | 34920 | 34920 | 34920 |

| 100 | yayun | yayun | 0x5A680F86B3D8FB2B | select * from t1 for update | 1 | 1497580565 | 1497580565 | 9609 | 9609 | 9609 |

| 100 | yayun | yayun | 0x4BBB5CD4BC2CFD94 | insert into t1 select ? | 1 | 1497580557 | 1497580557 | 133003 | 133003 | 133003 |

| 100 | yayun | yayun | 0x99531AEFF718C501 | show tables | 1 | 1497580544 | 1497580544 | 2051 | 2051 | 2051 |

| 100 | yayun | yayun | 0x74A739578E179F19 | show processlist | 1 | 1497580532 | 1497580532 | 4335 | 4335 | 4335 |

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

5 rows in set (0.00sec)[admin@127.0.0.1][(none)]>

可以看见除了for update语句和insert发送到主库,查询是发送到了从库。当然虽然1000主机组里面有40,也就是会有非常少量的查询才会发送到主库。这个没法避免。

下面进行主库宕机测试,启动mha监控,关闭主库。mha切换日志,可以看见30当选主库:

[root@db_server_yayun_04 log]# catmanager.log

Fri Jun16 10:38:59 2017 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.

Fri Jun16 10:38:59 2017 - [info] Reading application default configuration from /data/mha/3306/mha.cnf..

Fri Jun16 10:38:59 2017 - [info] Updating application default configuration from /usr/local/bin/load_cnf..

Fri Jun16 10:38:59 2017 - [info] Reading server configuration from /data/mha/3306/mha.cnf..

Fri Jun16 10:38:59 2017 - [info] Setting max_ping_errors to 10, ping_interval to 3.

Fri Jun16 10:39:53 2017 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.

Fri Jun16 10:39:53 2017 - [info] Reading application default configuration from /data/mha/3306/mha.cnf..

Fri Jun16 10:39:53 2017 - [info] Updating application default configuration from /usr/local/bin/load_cnf..

Fri Jun16 10:39:53 2017 - [info] Reading server configuration from /data/mha/3306/mha.cnf..

Fri Jun16 10:39:53 2017 - [info] Setting max_ping_errors to 10, ping_interval to 3.

nfo]192.168.0.20(192.168.0.20:3306) Version=5.7.17-log (oldest major version between slaves) log-bin:enabled

Fri Jun16 10:38:59 2017 - [info] GTID ON

Fri Jun16 10:38:59 2017 - [info] Replicating from 192.168.0.40(192.168.0.40:3306)

Fri Jun16 10:38:59 2017 - [info] 192.168.0.30(192.168.0.30:3306) Version=5.7.17-log (oldest major version between slaves) log-bin:enabled

Fri Jun16 10:38:59 2017 - [info] GTID ON

Fri Jun16 10:38:59 2017 - [info] Replicating from 192.168.0.40(192.168.0.40:3306)

Fri Jun16 10:38:59 2017 - [info] Primary candidate forthe new Master (candidate_master is set)

Fri Jun16 10:38:59 2017 - [info] Current Alive Master: 192.168.0.40(192.168.0.40:3306)

Fri Jun16 10:38:59 2017 - [info] Checking slave configurations..

Fri Jun16 10:38:59 2017 - [info] Checking replication filtering settings..

Fri Jun16 10:38:59 2017 - [info] binlog_do_db= , binlog_ignore_db=Fri Jun16 10:38:59 2017 - [info] Replication filtering check ok.

Fri Jun16 10:38:59 2017 - [info] GTID (with auto-pos) is supported. Skipping all SSH and Node package checking.

Fri Jun16 10:38:59 2017 - [info] Checking SSH publickey authentication settings on the current master..

Fri Jun16 10:38:59 2017 - [info] HealthCheck: SSH to 192.168.0.40is reachable.

Fri Jun16 10:38:59 2017 - [info]192.168.0.40(192.168.0.40:3306) (current master)+--192.168.0.20(192.168.0.20:3306)+--192.168.0.30(192.168.0.30:3306)

Fri Jun16 10:38:59 2017 -[warning] master_ip_failover_script is not defined.

Fri Jun16 10:38:59 2017 -[warning] shutdown_script is not defined.

Fri Jun16 10:38:59 2017 - [info] Set master ping interval 3seconds.

Fri Jun16 10:38:59 2017 - [warning] secondary_check_script is not defined. It is highly recommended setting it to check master reachability from two or moreroutes.

Fri Jun16 10:38:59 2017 - [info] Starting ping health check on 192.168.0.40(192.168.0.40:3306)..

Fri Jun16 10:38:59 2017 - [info] Ping(SELECT) succeeded, waiting until MySQL doesn't respond..

Fri Jun 16 10:39:26 2017 - [warning] Got error on MySQL select ping: 2006(MySQL server has gone away)

Fri Jun16 10:39:26 2017 - [info] Executing SSH check script: exit 0Fri Jun16 10:39:27 2017 - [info] HealthCheck: SSH to 192.168.0.40is reachable.

Fri Jun16 10:39:29 2017 - [warning] Got error on MySQL connect: 2013 (Lost connection to MySQL server at 'reading initial communication packet', system error: 111)

Fri Jun16 10:39:29 2017 - [warning] Connection failed 2 time(s)..

Fri Jun16 10:39:32 2017 - [warning] Got error on MySQL connect: 2013 (Lost connection to MySQL server at 'reading initial communication packet', system error: 111)

Fri Jun16 10:39:32 2017 - [warning] Connection failed 3 time(s)..

Fri Jun16 10:39:35 2017 - [warning] Got error on MySQL connect: 2013 (Lost connection to MySQL server at 'reading initial communication packet', system error: 111)

Fri Jun16 10:39:35 2017 - [warning] Connection failed 4 time(s)..

Fri Jun16 10:39:38 2017 - [warning] Got error on MySQL connect: 2013 (Lost connection to MySQL server at 'reading initial communication packet', system error: 111)

Fri Jun16 10:39:38 2017 - [warning] Connection failed 5 time(s)..

Fri Jun16 10:39:41 2017 - [warning] Got error on MySQL connect: 2013 (Lost connection to MySQL server at 'reading initial communication packet', system error: 111)

Fri Jun16 10:39:41 2017 - [warning] Connection failed 6 time(s)..

Fri Jun16 10:39:44 2017 - [warning] Got error on MySQL connect: 2013 (Lost connection to MySQL server at 'reading initial communication packet', system error: 111)

Fri Jun16 10:39:44 2017 - [warning] Connection failed 7 time(s)..

Fri Jun16 10:39:47 2017 - [warning] Got error on MySQL connect: 2013 (Lost connection to MySQL server at 'reading initial communication packet', system error: 111)

Fri Jun16 10:39:47 2017 - [warning] Connection failed 8 time(s)..

Fri Jun16 10:39:50 2017 - [warning] Got error on MySQL connect: 2013 (Lost connection to MySQL server at 'reading initial communication packet', system error: 111)

Fri Jun16 10:39:50 2017 - [warning] Connection failed 9 time(s)..

Fri Jun16 10:39:53 2017 - [warning] Got error on MySQL connect: 2013 (Lost connection to MySQL server at 'reading initial communication packet', system error: 111)

Fri Jun16 10:39:53 2017 - [warning] Connection failed 10 time(s)..

Fri Jun16 10:39:53 2017 - [warning] Master is not reachable from health checker!Fri Jun16 10:39:53 2017 - [warning] Master 192.168.0.40(192.168.0.40:3306) is not reachable!Fri Jun16 10:39:53 2017 -[warning] SSH is reachable.

Fri Jun16 10:39:53 2017 - [info] Connecting to a master server failed. Reading configuration file /etc/masterha_default.cnf and /data/mha/3306/mha.cnf again, and trying to connect to all servers to check server status..

Fri Jun16 10:39:53 2017 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.

Fri Jun16 10:39:53 2017 - [info] Reading application default configuration from /data/mha/3306/mha.cnf..

Fri Jun16 10:39:53 2017 - [info] Updating application default configuration from /usr/local/bin/load_cnf..

Fri Jun16 10:39:53 2017 - [info] Reading server configuration from /data/mha/3306/mha.cnf..

Fri Jun16 10:39:53 2017 - [info] Setting max_ping_errors to 10, ping_interval to 3.

Fri Jun16 10:39:53 2017 - [info] GTID failover mode = 1Fri Jun16 10:39:53 2017 - [info] Dead Servers:

Fri Jun16 10:39:53 2017 - [info] 192.168.0.40(192.168.0.40:3306)

Fri Jun16 10:39:53 2017 - [info] Alive Servers:

Fri Jun16 10:39:53 2017 - [info] 192.168.0.20(192.168.0.20:3306)

Fri Jun16 10:39:53 2017 - [info] 192.168.0.30(192.168.0.30:3306)

Fri Jun16 10:39:53 2017 - [info] Alive Slaves:

Fri Jun16 10:39:53 2017 - [info] 192.168.0.20(192.168.0.20:3306) Version=5.7.17-log (oldest major version between slaves) log-bin:enabled

Fri Jun16 10:39:53 2017 - [info] GTID ON

Fri Jun16 10:39:53 2017 - [info] Replicating from 192.168.0.40(192.168.0.40:3306)

Fri Jun16 10:39:53 2017 - [info] 192.168.0.30(192.168.0.30:3306) Version=5.7.17-log (oldest major version between slaves) log-bin:enabled

Fri Jun16 10:39:53 2017 - [info] GTID ON

Fri Jun16 10:39:53 2017 - [info] Replicating from 192.168.0.40(192.168.0.40:3306)

Fri Jun16 10:39:53 2017 - [info] Primary candidate forthe new Master (candidate_master is set)

Fri Jun16 10:39:53 2017 - [info] Checking slave configurations..

Fri Jun16 10:39:53 2017 - [info] Checking replication filtering settings..

Fri Jun16 10:39:53 2017 - [info] Replication filtering check ok.

Fri Jun16 10:39:53 2017 - [info] Master is down!Fri Jun16 10:39:53 2017 - [info] Terminating monitoring script.

Fri Jun16 10:39:53 2017 - [info] Got exit code 20(Master dead).

Fri Jun16 10:39:53 2017 - [info] MHA::MasterFailover version 0.57.

Fri Jun16 10:39:53 2017 - [info] Starting master failover.

Fri Jun16 10:39:53 2017 - [info]

Fri Jun16 10:39:53 2017 - [info] * Phase 1: Configuration Check Phase..

Fri Jun16 10:39:53 2017 - [info]

Fri Jun16 10:39:54 2017 - [info] GTID failover mode = 1Fri Jun16 10:39:54 2017 - [info] Dead Servers:

Fri Jun16 10:39:54 2017 - [info] 192.168.0.40(192.168.0.40:3306)

Fri Jun16 10:39:54 2017 - [info] Checking master reachability via MySQL(doublecheck)...

Fri Jun16 10:39:54 2017 - [info] ok.

Fri Jun16 10:39:54 2017 - [info] Alive Servers:

Fri Jun16 10:39:54 2017 - [info] 192.168.0.20(192.168.0.20:3306)

Fri Jun16 10:39:54 2017 - [info] 192.168.0.30(192.168.0.30:3306)

Fri Jun16 10:39:54 2017 - [info] Alive Slaves:

Fri Jun16 10:39:54 2017 - [info] 192.168.0.20(192.168.0.20:3306) Version=5.7.17-log (oldest major version between slaves) log-bin:enabled

Fri Jun16 10:39:54 2017 - [info] GTID ON

Fri Jun16 10:39:54 2017 - [info] Replicating from 192.168.0.40(192.168.0.40:3306)

Fri Jun16 10:39:54 2017 - [info] 192.168.0.30(192.168.0.30:3306) Version=5.7.17-log (oldest major version between slaves) log-bin:enabled

Fri Jun16 10:39:54 2017 - [info] GTID ON

Fri Jun16 10:39:54 2017 - [info] Replicating from 192.168.0.40(192.168.0.40:3306)

Fri Jun16 10:39:54 2017 - [info] Primary candidate forthe new Master (candidate_master is set)

Fri Jun16 10:39:54 2017 - [info] Starting GTID based failover.

Fri Jun16 10:39:54 2017 - [info]

Fri Jun16 10:39:54 2017 - [info] ** Phase 1: Configuration Check Phase completed.

Fri Jun16 10:39:54 2017 - [info]

Fri Jun16 10:39:54 2017 - [info] * Phase 2: Dead Master Shutdown Phase..

Fri Jun16 10:39:54 2017 - [info]

Fri Jun16 10:39:54 2017 - [info] Forcing shutdown so that applications never connect to the current master..

Fri Jun16 10:39:54 2017 -[warning] master_ip_failover_script is not set. Skipping invalidating dead master IP address.

Fri Jun16 10:39:54 2017 -[warning] shutdown_script is not set. Skipping explicit shutting down of the dead master.

Fri Jun16 10:39:54 2017 - [info] * Phase 2: Dead Master Shutdown Phase completed.

Fri Jun16 10:39:54 2017 - [info]

Fri Jun16 10:39:54 2017 - [info] * Phase 3: Master Recovery Phase..

Fri Jun16 10:39:54 2017 - [info]

Fri Jun16 10:39:54 2017 - [info] * Phase 3.1: Getting Latest Slaves Phase..

Fri Jun16 10:39:54 2017 - [info]

Fri Jun16 10:39:54 2017 - [info] The latest binary log file/position on all slaves is mysql-bin.000002:497Fri Jun16 10:39:54 2017 - [info] Retrieved Gtid Set: 900f20f2-f48c-11e6-8d78-000c2930a8b9:1Fri Jun16 10:39:54 2017 - [info] Latest slaves (Slaves that received relay log files to the latest):

Fri Jun16 10:39:54 2017 - [info] 192.168.0.20(192.168.0.20:3306) Version=5.7.17-log (oldest major version between slaves) log-bin:enabled

Fri Jun16 10:39:54 2017 - [info] GTID ON

Fri Jun16 10:39:54 2017 - [info] Replicating from 192.168.0.40(192.168.0.40:3306)

Fri Jun16 10:39:54 2017 - [info] 192.168.0.30(192.168.0.30:3306) Version=5.7.17-log (oldest major version between slaves) log-bin:enabled

Fri Jun16 10:39:54 2017 - [info] GTID ON

Fri Jun16 10:39:54 2017 - [info] Replicating from 192.168.0.40(192.168.0.40:3306)

Fri Jun16 10:39:54 2017 - [info] Primary candidate forthe new Master (candidate_master is set)

Fri Jun16 10:39:54 2017 - [info] The oldest binary log file/position on all slaves is mysql-bin.000002:497Fri Jun16 10:39:54 2017 - [info] Retrieved Gtid Set: 900f20f2-f48c-11e6-8d78-000c2930a8b9:1Fri Jun16 10:39:54 2017 - [info] Oldest slaves:

Fri Jun16 10:39:54 2017 - [info] 192.168.0.20(192.168.0.20:3306) Version=5.7.17-log (oldest major version between slaves) log-bin:enabled

Fri Jun16 10:39:54 2017 - [info] GTID ON

Fri Jun16 10:39:54 2017 - [info] Replicating from 192.168.0.40(192.168.0.40:3306)

Fri Jun16 10:39:54 2017 - [info] 192.168.0.30(192.168.0.30:3306) Version=5.7.17-log (oldest major version between slaves) log-bin:enabled

Fri Jun16 10:39:54 2017 - [info] GTID ON

Fri Jun16 10:39:54 2017 - [info] Replicating from 192.168.0.40(192.168.0.40:3306)

Fri Jun16 10:39:54 2017 - [info] Primary candidate forthe new Master (candidate_master is set)

Fri Jun16 10:39:54 2017 - [info]

Fri Jun16 10:39:54 2017 - [info] * Phase 3.3: Determining New Master Phase..

Fri Jun16 10:39:54 2017 - [info]

Fri Jun16 10:39:54 2017 - [info] Searching new master from slaves..

Fri Jun16 10:39:54 2017 - [info] Candidate masters from the configuration file:

Fri Jun16 10:39:54 2017 - [info] 192.168.0.30(192.168.0.30:3306) Version=5.7.17-log (oldest major version between slaves) log-bin:enabled

Fri Jun16 10:39:54 2017 - [info] GTID ON

Fri Jun16 10:39:54 2017 - [info] Replicating from 192.168.0.40(192.168.0.40:3306)

Fri Jun16 10:39:54 2017 - [info] Primary candidate forthe new Master (candidate_master is set)

Fri Jun16 10:39:54 2017 - [info] Non-candidate masters:

Fri Jun16 10:39:54 2017 - [info] Searching from candidate_master slaves whichhave received the latest relay log events..

Fri Jun16 10:39:54 2017 - [info] New master is 192.168.0.30(192.168.0.30:3306)

Fri Jun16 10:39:54 2017 - [info] Starting master failover..

Fri Jun16 10:39:54 2017 - [info]

From:192.168.0.40(192.168.0.40:3306) (current master)+--192.168.0.20(192.168.0.20:3306)+--192.168.0.30(192.168.0.30:3306)

To:192.168.0.30(192.168.0.30:3306) (new master)+--192.168.0.20(192.168.0.20:3306)

Fri Jun16 10:39:54 2017 - [info]

Fri Jun16 10:39:54 2017 - [info] * Phase 3.3: New Master Recovery Phase..

Fri Jun16 10:39:54 2017 - [info]

Fri Jun16 10:39:54 2017 - [info] Waiting all logs to be applied..

Fri Jun16 10:39:54 2017 - [info] done.

Fri Jun16 10:39:54 2017 - [info] Replicating from the latest slave 192.168.0.20(192.168.0.20:3306) and waiting to apply..

Fri Jun16 10:39:54 2017 - [info] Waiting all logs to be applied on the latest slave..

Fri Jun16 10:39:54 2017 - [info] Resetting slave 192.168.0.30(192.168.0.30:3306) and starting replication from the new master 192.168.0.20(192.168.0.20:3306)..

Fri Jun16 10:39:54 2017 - [info] Executed CHANGE MASTER.

Fri Jun16 10:39:54 2017 - [info] Slave started.

Fri Jun16 10:39:54 2017 - [info] Waiting to execute all relay logs on 192.168.0.30(192.168.0.30:3306)..

Fri Jun16 10:39:54 2017 - [info] master_pos_wait(mysql-bin.000001:1879) completed on 192.168.0.30(192.168.0.30:3306). Executed 4events.

Fri Jun16 10:39:54 2017 - [info] done.

Fri Jun16 10:39:54 2017 - [info] done.

Fri Jun16 10:39:54 2017 - [info] Getting new master's binlog name and position..

Fri Jun 16 10:39:54 2017 - [info] mysql-bin.000002:459Fri Jun16 10:39:54 2017 - [info] All other slaves should start replication from here. Statement should be: CHANGE MASTER TO MASTER_HOST='192.168.0.30', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='xxx';

Fri Jun16 10:39:54 2017 - [info] Master Recovery succeeded. File:Pos:Exec_Gtid_Set: mysql-bin.000002, 459, 56195f28-36e2-11e7-991b-000c29e3f5ab:1-6,

900f20f2-f48c-11e6-8d78-000c2930a8b9:1Fri Jun16 10:39:54 2017 -[warning] master_ip_failover_script is not set. Skipping taking over new master IP address.

Fri Jun16 10:39:54 2017 - [info] Setting read_only=0 on 192.168.0.30(192.168.0.30:3306)..

Fri Jun16 10:39:54 2017 - [info] ok.

Fri Jun16 10:39:54 2017 - [info] **Finished master recovery successfully.

Fri Jun16 10:39:54 2017 - [info] * Phase 3: Master Recovery Phase completed.

Fri Jun16 10:39:54 2017 - [info]

Fri Jun16 10:39:54 2017 - [info] * Phase 4: Slaves Recovery Phase..

Fri Jun16 10:39:54 2017 - [info]

Fri Jun16 10:39:54 2017 - [info]

Fri Jun16 10:39:54 2017 - [info] * Phase 4.1: Starting Slaves inparallel..

Fri Jun16 10:39:54 2017 - [info]

Fri Jun16 10:39:54 2017 - [info] -- Slave recovery on host 192.168.0.20(192.168.0.20:3306) started, pid: 9905. Check tmp log /data/mha/3306/log/192.168.0.20_3306_20170616103953.log if it takes time..

Fri Jun16 10:39:54 2017 - [info]

Fri Jun16 10:39:54 2017 - [info] Log messages from 192.168.0.20...

Fri Jun16 10:39:54 2017 - [info]

Fri Jun16 10:39:54 2017 - [info] Resetting slave 192.168.0.20(192.168.0.20:3306) and starting replication from the new master 192.168.0.30(192.168.0.30:3306)..

Fri Jun16 10:39:54 2017 - [info] Executed CHANGE MASTER.

Fri Jun16 10:39:54 2017 - [info] Slave started.

Fri Jun16 10:39:54 2017 - [info] gtid_wait(56195f28-36e2-11e7-991b-000c29e3f5ab:1-6,

900f20f2-f48c-11e6-8d78-000c2930a8b9:1) completed on 192.168.0.20(192.168.0.20:3306). Executed 0events.

Fri Jun16 10:39:54 2017 - [info] End of log messages from 192.168.0.20.

Fri Jun16 10:39:54 2017 - [info] -- Slave on host 192.168.0.20(192.168.0.20:3306) started.

Fri Jun16 10:39:54 2017 - [info] All new slave servers recovered successfully.

Fri Jun16 10:39:54 2017 - [info]

Fri Jun16 10:39:54 2017 - [info] * Phase 5: New master cleanup phase..

Fri Jun16 10:39:54 2017 - [info]

Fri Jun16 10:39:54 2017 - [info] Resetting slave infoon the new master..

Fri Jun16 10:39:54 2017 - [info] 192.168.0.30: Resetting slave infosucceeded.

Fri Jun16 10:39:54 2017 - [info] Master failover to 192.168.0.30(192.168.0.30:3306) completed successfully.

Fri Jun16 10:39:54 2017 - [info]----- Failover Report -----mha: MySQL Master failover192.168.0.40(192.168.0.40:3306) to 192.168.0.30(192.168.0.30:3306) succeeded

Master192.168.0.40(192.168.0.40:3306) is down!Check MHA Manager logs at db_server_yayun_04:/data/mha/3306/log/manager.log fordetails.

Started automated(non-interactive) failover.

Selected192.168.0.30(192.168.0.30:3306) as a new master.192.168.0.30(192.168.0.30:3306): OK: Applying all logs succeeded.192.168.0.20(192.168.0.20:3306): OK: Slave started, replicating from 192.168.0.30(192.168.0.30:3306)192.168.0.30(192.168.0.30:3306): Resetting slave infosucceeded.

Master failover to192.168.0.30(192.168.0.30:3306) completed successfully.

View Code

再来看看proxysql里面现在主机组的情况:

[admin@127.0.0.1][(none)]> select * fromruntime_mysql_servers;+--------------+--------------+------+---------+--------+-------------+-----------------+---------------------+---------+----------------+------------------+

| hostgroup_id | hostname | port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |

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

| 100 | 192.168.0.30 | 3306 | ONLINE | 1 | 0 | 1000 | 10 | 0 | 100 | test my proxysql |

| 1000 | 192.168.0.30 | 3306 | ONLINE | 1 | 0 | 1000 | 10 | 0 | 100 | test my proxysql |

| 1000 | 192.168.0.40 | 3306 | SHUNNED | 1 | 0 | 1000 | 10 | 0 | 100 | test my proxysql |

| 1000 | 192.168.0.20 | 3306 | ONLINE | 1 | 0 | 1000 | 10 | 0 | 100 | test my proxysql |

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

4 rows in set (0.01sec)[admin@127.0.0.1][(none)]>

可以看见40已经是SHUNNED状态,这个已经自动被踢出。30当选主库,自动被设置在主机组100. 再次运行读写测试:

[admin@127.0.0.1][(none)]> select * fromstats_mysql_query_digest;+-----------+--------------------+----------+--------------------+----------------------------------+------------+------------+------------+----------+----------+----------+

| hostgroup | schemaname | username | digest | digest_text | count_star | first_seen | last_seen | sum_time | min_time | max_time |

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

| 100 | yayun | yayun | 0x4BBB5CD4BC2CFD94 | insert into t1 select ? | 1 | 1497581038 | 1497581038 | 114743 | 114743 | 114743 |

| 1000 | information_schema | yayun | 0x620B328FE9D6D71A | SELECT DATABASE() | 1 | 1497581026 | 1497581026 | 31128 | 31128 | 31128 |

| 100 | information_schema | yayun | 0x594F2C744B698066 | select USER() | 1 | 1497581025 | 1497581025 | 0 | 0 | 0 |

| 1000 | yayun | yayun | 0x3765930C7143F468 | select * from t1 | 1 | 1497581045 | 1497581045 | 3283 | 3283 | 3283 |

| 100 | information_schema | yayun | 0x226CD90D52A2BA0B | select @@version_comment limit ? | 1 | 1497581025 | 1497581025 | 0 | 0 | 0 |

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

5 rows in set (0.00 sec)

可以看见依然没有问题。到这里本文就结束了,上面是1主2从,如果是1主1从,那么从挂了怎么办呢?需要额外一条规则,那就是在mysql_servers的hostgroup 1000 里面要插一条主库的记录,然后把weight设小,当读不到从库,回去主库查询。

关于ProxySQL比较详细的文章可以参考如下:

mysql mha sqlproxy_MHA+ProxySQL实现读写分离高可用相关推荐

  1. mysql mha sqlproxy_MHA+ProxySQL实现读写分离高可用 - yayun - 博客园

    最近在研究ProxySQL,觉得还挺不错的,所以就简单的折腾了一下,ProxySQL目前也是Percona在推荐的一个读写分离的中间件.关于详细的介绍可以参考官方文档. https://github. ...

  2. MySQL用中间件ProxySQL实现读写分离和主节点故障应用无感应

    昨天做的用proxysql实现的读写分离,但是在实际的应用中这样的结构还很不完整,如果主节点出现故障那么整个拓扑的数据库也无法通过proxysql来调用了,所以还需要增加主节点故障后proxysql能 ...

  3. 高性能高可用MySQL(主从同步,读写分离,分库分表,去中心化,虚拟IP,心跳机制)

    高性能高可用MySQL(主从同步,读写分离,分库分表,去中心化,虚拟IP,心跳机制) 视频地址:https://www.bilibili.com/video/BV1ry4y1v7Tr?p=8& ...

  4. mysql replication health is not ok_MySQL的高可用——MHA

    在之前的博客中,介绍了mysql的主从模型以及深层次的mysql的读写分离插件--ProxySQL,让我们可以很大程度上提升数据库服务器的性能和优化用户的体验,但是,我们对于数据库的可靠性似乎缺了一点 ...

  5. Linux随笔19-MySQL主从复制、Percona XtraBackup实现全量和增量备份、ProxySQL实现读写分离

    Contents 1. MySQL5.7实现主从复制 1.1 基础环境 1.2. 配置主从复制 1.2.1. master节点上的配置 1.2.2. slave节点上的配置 1.2.3. 中继日志问题 ...

  6. ProxySQL(读写分离)部署

    proxySQL是MySQL的中间件产品,是灵活强大的代理层,实现读写分离,支持Query路由功能,支持动态指定某个SQL进行缓存,支持动态加载配置,故障切换和一些SQL 过滤功能 环境: 192.1 ...

  7. java spring mysql配置_java相关:mysql+spring+mybatis实现数据库读写分离的代码配置

    java相关:mysql+spring+mybatis实现数据库读写分离的代码配置 发布于 2020-4-4| 复制链接 分享一篇关于关于mysql+spring+mybatis实现数据库读写分离的代 ...

  8. Mysql主从配置,实现读写分离

    大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库连接操作,数据库必然会崩溃,数据丢 ...

  9. MySQL主从配置与Mycat读写分离

    MySQL主从配置与Mycat读写分离 一.主数据库配置 编辑配置文件 添加如下内容 server-id=1 binlog-do-db=master_db1 #备份的数据库 log-bin=mysql ...

最新文章

  1. php的防csrf攻击,zblog php添加Token防止CSRF攻击
  2. storm apache_Apache Storm的实时情绪分析示例
  3. JSON补丁:JSON-P 1.1概述系列
  4. 有感软件安装称呼的变化
  5. mysql 8.0远程连接_安装mysql 8.0.17并配置远程访问的方法
  6. golang搭建微服务遇到的问题(不断更新)
  7. JS语法apply()与call()的区别
  8. html 控制边框长度,如何控制CSS边框长度的示例代码分享
  9. 自动驾驶感知系统(图)侵删
  10. servlet的四种响应
  11. Kettle入门操作——输入流(表输入、excel)详细
  12. 怎么用计算机打出音乐符号,音乐符号怎么打(教你word文档音乐符号怎么打)...
  13. c语言编程星号输出图形的步骤,使用C语言打印不同星号图案
  14. 常见的自动化测试工具汇总
  15. 华为国际专利申请数量全球第一,然而美国周刊评了IT行业影响最大的十人
  16. Linux下按照时间段过滤日志
  17. 联发科 MTK6765 八核安卓核心板主板定制方案
  18. 2021年凤翔中学高考成绩查询,宝鸡高中学校实力排名,2021年宝鸡所有的高中分数线排名...
  19. BAT文件语法和技巧(bat文件的编写及使用)
  20. HRS 请求走私 学习记录

热门文章

  1. Vue.js基础-14-axios(json-server,get,post,put,delete,传参,Query,Params,Body)
  2. Java集合之Map集合
  3. WEBP图片怎么打开?如何转成JPEG
  4. 江苏海洋大学计算机专业排名,江苏海洋大学怎么样是几本?师资排名揭秘?有哪些热门优势专业?...
  5. 【Linux-编译器gcc/glibc升级】CentOS7.9使用NodeJS18时报错/lib64/libm.so.6: version `GLIBC_2.27‘ not found
  6. PBR:应用于虚幻引擎4贴图和材质创建的启示
  7. 锤子便签探究之拖拽效果的实现猜想
  8. android电视 防沉迷,防沉迷电视,教导孩子就看这些!
  9. android基础--短信库解析
  10. 使用ShaderGraph 实现水面效果