1. 程式人生 > >ProxySQL新版本對MGR的原生支援

ProxySQL新版本對MGR的原生支援

導讀

譯者:張銳志(微訊號:516160507),知數堂第10期MySQL學員

原文出處:http://lefred.be/content/mysql-group-replication-native-support-in-proxysql/

原文作者:lefred

ProxySQL在MySQL的代理和負載均衡中一直處於領先地位。其中包含了諸如快取查詢,多路複用,流量映象,讀寫分離,路由等等的強力功能。在最新的功能性增強中,包含了對MGR的原生支援,不在需要使用第三方指令碼進行適配。

ProxySQL is the leader in proxy and load balancing solution for MySQL. It has great features like query caching, multiplexing, mirroring, read/write splitting, routing, etc… The latest enhancement in ProxySQL is the 

native support of MySQL Group Replication. No more need to use an external script within the scheduler like I explained in this previous post.

最新的增強中,提供了對單寫和多寫叢集組的支援,甚至可以在多寫組上指定只由某個成員進行寫入操作。

This implementation supports Groups in Single-Primary and in Multi-Primary mode. It is even possible to setup a Multi-Primary Group but dedicate writes on only one member.

ProxySQL的主要開發者René,更進一步的可以(利用ProxySQL)做到例如在一個七個節點的多寫叢集中,指定2組寫節點,2組備用寫節點,3個只讀節點的操作。即ProxySQL雖然識別出來所有的節點皆為寫節點,但只路由寫操作到選定的兩個寫節點(通過Hostgroup的方式),同時將另外兩個寫節點新增到備用寫節點組中,最後三個讀節點加入讀組。(本段中的組皆為ProxySQL中的hostgroup含義)。

René, the main developer of ProxySQL, went even further. For example in a 7 nodes clusters (Group of 7 members) where all nodes are writers (Multi-Primary mode), it’s possible to decide to have only 2 writers, 3 readers and 2 backup-writers. This mean that ProxySQL will see all the nodes as possible writers but will only route writes on 2 nodes (add them in the writer hostgroup, because we decided to limit it to 2 writers for example), then it will add the others in the backup-writers group, this group defines the other writer candidates. An finally add 2 in the readers hostgroup.

除此之外,還可以限制連線訪問叢集中超出最大設定落後事務值的慢節點。

It’s also possible to limit the access to a member that is slower in applying the replicated transactions (applying queue reaching a threshold).

ProxySQL從1.4.0版本開始增加對MGR的原生支援,若發行版中沒有,可以從GitHub中編譯獲取。

It is time to have a look at this new ProxySQL version. The version supporting MySQL Group Replication is 1.4.0 and currently is only available on github (but stay tuned for a new release soon).

下面我們看下對於使用者來說有哪些明顯的變化,開始進行admin埠連線後會發現比之前多了一個mysql_group_replication_hostgroups

So let’s have a look at what is new for users. When you connect to the admin interface of ProxySQL, you can see a new table: mysql_group_replication_hostgroups

ProxySQL> show tables ;
+--------------------------------------------+
| tables                                     |
+--------------------------------------------+
| global_variables                           |
| mysql_collations                           |
| mysql_group_replication_hostgroups         |
| mysql_query_rules                          |
| mysql_replication_hostgroups               |
| mysql_servers                              |
| mysql_users                                |
...
| scheduler                                  |
+--------------------------------------------+
15 rows in set (0.00 sec)

我們將在這個表中進行節點的歸屬組(hostgroup)的設定。

This is the table we will use to setup in which hostgroup a node will belongs.

為了闡明ProxySQL 對MGR支援的原理,下面我會用到一個三節點的叢集。

To illustrate how ProxySQL supports MySQL Group Replication, I will use a cluster of 3 nodes:

              name                          ip
             mysql1                  192.168.90.2
             mysql2                  192.168.90.3
             mysql3                  192.168.90.4

首先,我們照舊插入三個節點的資訊到mysql_servers表中。

So first, as usual we need to add our 3 members into the mysql_servers table:

mysql> insert into mysql_servers (hostgroup_id,hostname,port) values (2,'192.168.90.2',3306);
Query OK, 1 row affected (0.00 sec)

mysql> insert into mysql_servers (hostgroup_id,hostname,port) values (2,'192.168.90.3',3306);
Query OK, 1 row affected (0.00 sec)

mysql> insert into mysql_servers (hostgroup_id,hostname,port) values (2,'192.168.90.4',3306);
Query OK, 1 row affected (0.00 sec)


mysql> select * from mysql_servers;
+--------------+--------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| hostgroup_id | hostname     | port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |
+--------------+--------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| 2            | 192.168.90.2 | 3306 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
| 2            | 192.168.90.3 | 3306 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
| 2            | 192.168.90.4 | 3306 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
+--------------+--------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+

在設定MGR節點在ProxySQL中的行為之前,先檢視下新加入的mysql_group_replication_hostgroups表的DDL。

Now we can setup ProxySQL’s behavior with our Group Replication cluster, but before let’s check the definition of the new mysql_group_replication_hostgroups table:

ProxySQL> show create table mysql_group_replication_hostgroups\G
*************************** 1. row ***************************
       table: mysql_group_replication_hostgroups
Create Table: CREATE TABLE mysql_group_replication_hostgroups (
    writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY,
    backup_writer_hostgroup INT CHECK (backup_writer_hostgroup>=0 AND backup_writer_hostgroup<>writer_hostgroup) NOT NULL,
    reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND backup_writer_hostgroup<>reader_hostgroup AND reader_hostgroup>0),
    offline_hostgroup INT NOT NULL CHECK (offline_hostgroup<>writer_hostgroup AND offline_hostgroup<>reader_hostgroup AND backup_writer_hostgroup<>offline_hostgroup AND offline_hostgroup>=0),
    active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1,
    max_writers INT NOT NULL CHECK (max_writers >= 0) DEFAULT 1,
    writer_is_also_reader INT CHECK (writer_is_also_reader IN (0,1)) NOT NULL DEFAULT 0,
    max_transactions_behind INT CHECK (max_transactions_behind>=0) NOT NULL DEFAULT 0,
    comment VARCHAR,
    UNIQUE (reader_hostgroup),
    UNIQUE (offline_hostgroup),
    UNIQUE (backup_writer_hostgroup))

看一下之前沒有出現過的新列的含義

There are many new columns, let’s have a look at their meaning:

         Column Name                                   Description
writer_hostgroupthe id of the hostgroup that will contain all the members that are writer
backup_writer_hostgroupif the group is running in multi-primary mode, there are multi writers (read_only=0) but if the amount of these writer is
larger than the max_writers, the extra nodes are located in that backup writer group
reader_hostgroupthe id of the hostgroup that will contain all the members in read_only
offline_hostgroupthe id of the hostgroup that will contain the host not being online or not being part of the Group
activewhen enabled, ProxySQL monitors the Group and move the server according in the appropriate hostgroups
max_writerslimit the amount of nodes in the writer hostgroup in case of group in multi-primary mode
writer_is_also_readerboolean value, 0 or 1, when enabled, a node in the writer hostgroup will also belongs the the reader hostgroup

熟悉了表的定義後,整個拓補將會如下圖所示:

Now that we are (or should be) more familiar with that table, we will set it up like this:

640?wx_fmt=png

下面我們將MGR叢集的分組定義和關鍵引數寫入

mysql_group_replication_hostgroups表中

So let’s add this:

ProxySQL> insert into mysql_group_replication_hostgroups (writer_hostgroup,backup_writer_hostgroup,
reader_hostgroup, offline_hostgroup,active,max_writers,writer_is_also_reader,max_transactions_behind) 
values (2,4,3,1,1,1,0,100);

然後將新更改的配置儲存到磁碟上,並載入到執行環境。

We should not forget to save our mysql servers to disk and load them on runtime:

ProxySQL> save mysql servers to disk;
Query OK, 0 rows affected (0.01 sec)

ProxySQL> load mysql servers to runtime;
Query OK, 0 rows affected (0.00 sec)

同時,我們需要在MGR中新增如下的檢視,及其依賴的儲存過程。

It’s also important with the current version of MySQL Group Replication to add a view and its dependencies in sys schema: addition_to_sys.sql:

# mysql -p < addition_to_sys.sql

如此,我們便可以從MGR叢集中任意一個節點上執行下面的語句獲取MGR成員的基本資訊,ProxySQL 也是根據這個辦法進行監測節點的健康與落後情況。

So now from every members of the group, we can run the following statement. ProxySQL based its internal monitoring this same view:

mysql> select * from gr_member_routing_candidate_status;
+------------------+-----------+---------------------+----------------------+
| viable_candidate | read_only | transactions_behind | transactions_to_cert |
+------------------+-----------+---------------------+----------------------+
| YES              | YES       |                  40 |                    0 |
+------------------+-----------+---------------------+----------------------+

同時,我們需要講sys庫的讀許可權賦給ProxySQL配置的監控MySQL的賬戶:

We also must not forget to create in our cluster the monitor user needed by ProxySQL:

mysql> GRANT SELECT on sys.* to 'monitor'@'%' identified by 'monitor';

接下來,我們馬上檢查下ProxySQL是如何將MGR節點分發到ProxySQL各個組中:

We can immediately check how ProxySQL has distributed the servers in the hostgroups :

ProxySQL>  select hostgroup_id, hostname, status  from runtime_mysql_servers;
+--------------+--------------+--------+
| hostgroup_id | hostname     | status |
+--------------+--------------+--------+
| 2            | 192.168.90.2 | ONLINE |
| 3            | 192.168.90.3 | ONLINE |
| 3            | 192.168.90.4 | ONLINE |
+--------------+--------------+--------+

寫節點被分配到之前定義好的ID為2的寫組中,其他所有的節點被分配到ID為3的只讀組中。(單寫模式)

The Writer (Primary-Master) is mysql1 (192.168.90.2 in hostgroup 2) and the others are in the read hostgroup (id=3).

這樣,我們就省掉了通過定時器去呼叫第三方複雜定義的指令碼將MGR節點匹配並分配到對應的ProxySQL組中的操作。

As you can see, there is no more need to create a scheduler calling an external script with complex rules to move the servers in the right hostgroup.

接下來,你就可以按照之前的做法對ProxySQL進行配置,例如關聯使用者到預設ProxySQL組中,或者新增查詢路由規則。

Now to use the proxy, it’s exactly as usual, you need to create users associated to default hostgroup or add routing rules.

另外,ProxySQL比之前多了一個監控MySQL例項的表,具體資訊如下面所示:

An extra table has also been added for monitoring:

ProxySQL> SHOW TABLES FROM monitor ;
+------------------------------------+
| tables                             |
+------------------------------------+
| mysql_server_connect               |
| mysql_server_connect_log           |
| mysql_server_group_replication_log |
| mysql_server_ping                  |
| mysql_server_ping_log              |
| mysql_server_read_only_log         |
| mysql_server_replication_lag_log   |
+------------------------------------+
7 rows in set (0.00 sec)

ProxySQL> select * from mysql_server_group_replication_log order by time_start_us desc  limit 5 ;
+--------------+------+------------------+-----------------+------------------+-----------+---------------------+-------+
| hostname     | port | time_start_us    | success_time_us | viable_candidate | read_only | transactions_behind | error |
+--------------+------+------------------+-----------------+------------------+-----------+---------------------+-------+
| 192.168.90.4 | 3306 | 1490187314429511 | 1887            | YES              | NO        | 0                   | NULL  |
| 192.168.90.3 | 3306 | 1490187314429141 | 1378            | YES              | YES       | 0                   | NULL  |
| 192.168.90.2 | 3306 | 1490187314428743 | 1478            | NO               | NO        | 0                   | NULL  |
| 192.168.90.4 | 3306 | 1490187309406886 | 3639            | YES              | NO        | 0                   | NULL  |
| 192.168.90.3 | 3306 | 1490187309406486 | 2444            | YES              | YES       | 0                   | NULL  |
+--------------+------+------------------+-----------------+------------------+-----------+---------------------+-------+

Enjoy MySQL Group Replication & ProxySQL !

640.gif?

掃碼加入知數堂技術交流QQ群

(群號:579036588)

群內可@各位助教了解更多課程資訊

640.png?

640?wx_fmt=png640?wx_fmt=jpeg640?wx_fmt=jpeg640?wx_fmt=png

知數堂

葉金榮與吳炳錫聯合打造

領跑IT精英培訓

行業資深專家強強聯合,傾心定製

MySQL實戰/MySQL優化/大資料實戰 / Python/ SQL優化

數門精品課程

緊隨技術發展趨勢,定期優化培訓教案

融入大量生產案例,貼合企業一線需求

社群陪伴學習,一次報名,可學1年

DBA、開發工程師必修課

上千位學員已華麗轉身,薪資翻番,職位提升

改變已悄然發生,你還在等什麼?

640.png?

掃碼下載知數堂精品課程試聽視訊

(MySQL 實戰/優化、大資料實戰、Python開發,及SQL優化等課程)

密碼:hg3h

640?wx_fmt=png

640.png?640.png?