mysql 主从模式总结(一)

1. 主从模式的部署步骤

目标:部署一个有3台主机的单主模式的MySQL分组。

Primary:192.168.197.110。

Secondary:192.168.197.111。

Secondary:192.168.197.112。

MySQL端口:3306,MySQL分组复制端口:33061。

(1)主机192.168.197.110上的操作。

按照如下步骤完成MySQL配置,并且将自己加入到分组中,最后启动分组。

(a)修改MySQL配置。

修改MySQL服务的配置文件。

[mysqld]

server_id=110

gtid_mode=ON

enforce_gtid_consistency=ON

master_info_repository=TABLE

relay_log_info_repository=TABLE

binlog_checksum=NONE

log_slave_updates=ON

log_bin=binlog

binlog_format=ROW 

transaction_write_set_extraction=XXHASH64

loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"

loose-group_replication_start_on_boot=off

loose-group_replication_local_address= "192.168.197.110:33061"

loose-group_replication_group_seeds="192.168.197.110:33061,192.168.197.110:33061,192.168.197.110:33061"

loose-group_replication_bootstrap_group= off

其中,

transaction_write_set_extraction表示需要为每个事务收集写集合并使用XXHASH64算法编码。

loose-group_replication_group_name表示本MySQL服务将加入的分组的名称。

loose-group_replication_start_on_boot表示在MySQL服务启动时是否自动启动分组复制服务。

loose-group_replication_local_address表示分组复制服务的本地监听地址。

loose-group_replication_group_seeds表示分组复制服务的种子成员,当本MySQL服务需要联系MySQL分组时,应当与这些种子成员联系。

loose-group_replication_bootstrap_group表示是否应当启动MySQL分组。在一个分组中,只应当允许一个成员启动MySQL分组。

(b)添加分组复制用户。

mysql>SET SQL_LOG_BIN=0

Query OK, 0 rows affected (0.03 sec)

mysql> create user ‘repl‘@‘%.coe2coe.me‘ identified by ‘123456‘;

Query OK, 0 rows affected (0.03 sec)

mysql> grant replication slave on *.* to ‘repl‘@‘%‘;

Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.01 sec)

mysql> SET SQL_LOG_BIN=1;

Query OK, 0 rows affected (0.03 sec)

(c)建立分组复制关系。

使用MySQL分组复制专门的复制通道,建立复制关系。

mysql> CHANGE MASTER TO MASTER_USER=‘repl‘, MASTER_PASSWORD=‘123456‘  FOR CHANNEL  ‘group_replication_recovery‘;

Query OK, 0 rows affected, 2 warnings (0.04 sec)

(d)安装分组复制插件。

mysql> INSTALL PLUGIN group_replication SONAME ‘group_replication.so‘;

Query OK, 0 rows affected (0.17 sec)

安装完成后使用show plugins;命令查看已安装的插件,应该可以看到有一个插件:

| group_replication          | ACTIVE   | GROUP REPLICATION  | group_replication.so | GPL     |

(e)启动分组和分组复制服务。
启动分组:

mysql> SET GLOBAL group_replication_bootstrap_group=ON;

Query OK, 0 rows affected (0.00 sec)

启动分组复制服务:

mysql> START GROUP_REPLICATION;

Query OK, 0 rows affected (2.17 sec)

mysql> SET GLOBAL group_replication_bootstrap_group=OFF;

Query OK, 0 rows affected (0.00 sec)

至此,MySQL分组已经启动。可以通过以下命令查看分组成员,应该有一个在线成员。

mysql> SELECT * FROM performance_schema.replication_group_members;

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

| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST    | MEMBER_PORT | MEMBER_STATE |

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

| group_replication_applier | a2392929-6dfb-11e7-b294-000c29b1c110 | 110.coe2coe.me |        3306 | ONLINE       |

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

1 row in set (0.00 sec)

(2)主机192.168.197.111上的操作。

对该主机的MySQL服务进行相似的配置,将该主机上的MySQL服务加入到MySQL分组中。

区别在于192.168.197.110上启动了MySQL分组以及分组复制服务,而其它主机上仅仅需要启动分组复制服务,而不能再次启动MySQL分组。

mysql> start group_replication;

Query OK, 0 rows affected (4.94 sec) 

正常情况下,可以看到110和111两台主机上的MySQL都已经处于在线状态。

mysql> SELECT * FROM performance_schema.replication_group_members;

No connection. Trying to reconnect...

Connection id:    16

Current database: mysql

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

| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST    | MEMBER_PORT | MEMBER_STATE |

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

| group_replication_applier | a2392929-6dfb-11e7-b294-000c29b1c110 | 110.coe2coe.me |        3306 | ONLINE       |

| group_replication_applier | a2392929-6dfb-11e7-b294-000c29b1c111 | 111.coe2coe.me |        3306 | ONLINE       |

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

2 rows in set (0.00 sec)

在执行start group_replication时,有时会出错,或者长时间处于Recoverying状态并最终变成ERROR状态。查看MySQL的log,可以看到以下的错误:

2017-08-19T06:12:16.471125Z 15 [ERROR] Slave I/O for channel ‘group_replication_recovery‘: error connecting to master ‘[email protected]:3306‘ - retry-time: 60  retries: 1, Error_code: 2003

2017-08-19T06:12:16.471163Z 15 [Note] Slave I/O thread for channel ‘group_replication_recovery‘ killed while connecting to master

2017-08-19T06:12:16.471169Z 15 [Note] Slave I/O thread exiting for channel ‘group_replication_recovery‘, read up to log ‘FIRST‘, position 4

2017-08-19T06:12:16.471315Z 10 [ERROR] Plugin group_replication reported: ‘There was an error when connecting to the donor server. Check group replication recovery‘s connection credentials.‘

此时需要检查主机上的DNS解析是否正常,以及是否可以正常连接其它已经在线的MySQL服务。

(3)部署192.168.197.112节点。

按照与(2)中类似的方式进行设置和部署即可。
(4)验证部署结果。
部署完毕后,查看MySQL分组中的节点:

mysql> SELECT * FROM performance_schema.replication_group_members;

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

| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST    | MEMBER_PORT | MEMBER_STATE |

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

| group_replication_applier | a2392929-6dfb-11e7-b294-000c29b1c110 | 110.coe2coe.me |        3306 | ONLINE       |

| group_replication_applier | a2392929-6dfb-11e7-b294-000c29b1c111 | 111.coe2coe.me |        3306 | ONLINE       |

| group_replication_applier | a2392929-6dfb-11e7-b294-000c29b1c112 | 112.coe2coe.me |        3306 | ONLINE       |

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

3 rows in set (0.00 sec)

三个节点均已经处于在线状态。

继续进行数据验证。

先在192.168.197.110(Primary)上创建数据库和数据表并插入数据:

mysql> create database mydb;

Query OK, 1 row affected (0.01 sec)

mysql> use mydb;

Database changed

mysql> create table test (name varchar(100) primary key);

Query OK, 0 rows affected (0.03 sec)

mysql> insert into test (name) values (‘001‘),(‘002‘),(‘003‘);

Query OK, 3 rows affected (0.00 sec)

Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from test;

+------+

| name |

+------+

| 001  |

| 002  |

| 003  |

+------+

3 rows in set (0.00 sec)
 

然后在192.168.197.111(Secondary)和192.168.197.112(Secondary)上查看数据:

mysql> use mydb;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

mysql> select * from test;

+------+

| name |

+------+

| 001  |

| 002  |

| 003  |

+------+

3 rows in set (0.00 sec)

结果表明数据已经正确的复制到了其余两个节点上了。

至此,MySQL分组复制体系部署成功。

两个Secondary节点已经自动被设置为read_only模式了。

mysql> show variables like ‘%read_only%‘;

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

| Variable_name    | Value |

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

| innodb_read_only | OFF   |

| read_only        | ON    |

| super_read_only  | ON    |

| tx_read_only     | OFF   |

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

4 rows in set (0.01 sec)

而Primary节点仍然为可读写模式。

mysql> show variables like ‘%read_only%‘;

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

| Variable_name    | Value |

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

| innodb_read_only | OFF   |

| read_only        | OFF   |

| super_read_only  | OFF   |

| tx_read_only     | OFF   |

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

4 rows in set (0.01 sec)

1.2. 主主模式的Primary故障自动切换

在基于单主模式的MySQL分组复制体系正常运行时,将Primary节点停止服务,此时分组复制体系中将自动选举一个新的节点作为Primary。

故障发生之前的在线状态列表:

mysql> SELECT * FROM performance_schema.replication_group_members;

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

| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST    | MEMBER_PORT | MEMBER_STATE |

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

| group_replication_applier | a2392929-6dfb-11e7-b294-000c29b1c110 | 110.coe2coe.me |        3306 | ONLINE       |

| group_replication_applier | a2392929-6dfb-11e7-b294-000c29b1c111 | 111.coe2coe.me |        3306 | ONLINE       |

| group_replication_applier | a2392929-6dfb-11e7-b294-000c29b1c112 | 112.coe2coe.me |        3306 | ONLINE       |

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

3 rows in set (0.00 sec)

在192.168.197.110(Primary)上执行如下命令使得Primary停止服务:

mysql> shutdown;

Query OK, 0 rows affected (0.00 sec)

此时在192.168.197.111(Secondary)上查看在线状态列表:

mysql> SELECT * FROM performance_schema.replication_group_members;

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

| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST    | MEMBER_PORT | MEMBER_STATE |

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

| group_replication_applier | a2392929-6dfb-11e7-b294-000c29b1c111 | 111.coe2coe.me |        3306 | ONLINE       |

| group_replication_applier | a2392929-6dfb-11e7-b294-000c29b1c112 | 112.coe2coe.me |        3306 | ONLINE       |

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

2 rows in set (0.00 sec)

查看111的系统变量:

mysql> show variables like ‘%read_only%‘;

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

| Variable_name    | Value |

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

| innodb_read_only | OFF   |

| read_only        | OFF   |

| super_read_only  | OFF   |

| tx_read_only     | OFF   |

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

4 rows in set (0.00 sec)

查看目前的Primary节点:

mysql> SELECT VARIABLE_NAME,VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME like  ‘group_replication%‘;

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

| VARIABLE_NAME                    | VARIABLE_VALUE                       |

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

| group_replication_primary_member | a2392929-6dfb-11e7-b294-000c29b1c111 |

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

1 row in set (0.00 sec)

查看111的日志记录:

2017-08-19T07:16:51.519461Z 0 [Note] Plugin group_replication reported: ‘getstart group_id 4317e324‘

2017-08-19T07:16:52.634010Z 0 [Note] Plugin group_replication reported: ‘Unsetting super_read_only.‘

2017-08-19T07:16:52.634129Z 98 [Note] Plugin group_replication reported: ‘A new primary was elected, enabled conflict detection until the new primary applies all relay logs‘

查看112的日志记录:

2017-08-19T07:00:43.407749Z 0 [Note] Plugin group_replication reported: ‘getstart group_id 4317e324‘

2017-08-19T07:00:45.570407Z 0 [Note] Plugin group_replication reported: ‘Marking group replication view change with view_id 15031230388599955:19‘

2017-08-19T07:00:45.849564Z 0 [Note] Plugin group_replication reported: ‘The member with address 111.coe2coe.me:3306 was declared online within the replication group‘

2017-08-19T07:16:50.830199Z 0 [Note] Plugin group_replication reported: ‘getstart group_id 4317e324‘

2017-08-19T07:16:51.944908Z 0 [Note] Plugin group_replication reported: ‘Setting super_read_only.‘

2017-08-19T07:16:51.945033Z 33 [Note] Plugin group_replication reported: ‘A new primary was elected, enabled conflict detection until the new primary applies all relay logs‘

综合上述信息,说明此时192.168.197.111已经成为Primary节点了:

(a)111已经变成可读写状态。

(b)111的在线状态发生了变化,尽管仍然是ONLINE状态。

此时,如果再次启动曾经的Primary(192.168.197.110)节点,则该节点的位置比较尴尬,即使仍然作为启动分组的节点启动,观察到的结果也是该节点所在的分组与目前已经存在的分组不是同一个分组。

重启110后110所在的分组:

mysql> SELECT * FROM performance_schema.replication_group_members;

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

| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST    | MEMBER_PORT | MEMBER_STATE |

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

| group_replication_applier | a2392929-6dfb-11e7-b294-000c29b1c110 | 110.coe2coe.me |        3306 | ONLINE       |

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

1 row in set (0.00 sec)

原来的分组仍然只有2个节点成员在线:

mysql> SELECT * FROM performance_schema.replication_group_members;

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

| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST    | MEMBER_PORT | MEMBER_STATE |

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

| group_replication_applier | a2392929-6dfb-11e7-b294-000c29b1c111 | 111.coe2coe.me |        3306 | ONLINE       |

| group_replication_applier | a2392929-6dfb-11e7-b294-000c29b1c112 | 112.coe2coe.me |        3306 | ONLINE       |

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

2 rows in set (0.00 sec)

在发生这种情况后,如果只是希望110节点以Secondary方式加入原来的分组,则可以按照以下方式在110上进行操作:

110原来是是bootstrap_group方式启动的,需要屏蔽掉。

mysql> set @@global.group_replication_bootstrap_group=off;

Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM performance_schema.replication_group_members;

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

| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST    | MEMBER_PORT | MEMBER_STATE |

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

| group_replication_applier | a2392929-6dfb-11e7-b294-000c29b1c110 | 110.coe2coe.me |        3306 | ONLINE       |

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

1 row in set (0.00 sec)

mysql> stop group_replication;

Query OK, 0 rows affected (9.51 sec)

mysql> start group_replication;

ERROR 3092 (HY000): The server is not configured properly to be an active member of the group. Please see more details on error log.

出现这个错误的原因是110上出现了新的Primary(111)上没有的数据,此时使用以下命令直接忽略。不忽略则不能加入到原来的分组中。

mysql> set @@global.group_replication_allow_local_disjoint_gtids_join=1;

Query OK, 0 rows affected (0.00 sec)

mysql> start group_replication;

Query OK, 0 rows affected (3.18 sec)

mysql> SELECT * FROM performance_schema.replication_group_members;

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

| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST    | MEMBER_PORT | MEMBER_STATE |

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

| group_replication_applier | a2392929-6dfb-11e7-b294-000c29b1c110 | 110.coe2coe.me |        3306 | ONLINE       |

| group_replication_applier | a2392929-6dfb-11e7-b294-000c29b1c111 | 111.coe2coe.me |        3306 | ONLINE       |

| group_replication_applier | a2392929-6dfb-11e7-b294-000c29b1c112 | 112.coe2coe.me |        3306 | ONLINE       |

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

3 rows in set (0.00 sec)

到此,在模拟故障恢复之后的110已经成功加入到原来的分组中了。

时间: 2024-08-15 19:03:09

mysql 主从模式总结(一)的相关文章

Mycat在MySQL主从模式(1主1从)下读写分离和及自动切换模式的验证

实验环境 两台Centos7  MySQL5.7.12 IP地址为:192.168.10.36  192.168.10.37 一台Centos7 Mycat IP地址为:192.168.10.31 一:安装mysql,如下图所示(这里采用yum安装): 二:配置MYSQL,以及建立MYSQL主从 1:初始化密码,由于我没在/root目录下找到第一次启动的随机密码,所以我只能用如下操作 vi /etc/my.cnf mysqd 字段添加 #skip-grant-tables 然后重启mysql  

MYSQL主从模式

MYSQL的主从介绍 1.在主服务器将客户端对数据操作的指令传到master的服务端,服务端会根据事务的提交顺序写到二进制日志. 2.在有新的操作后,master会通知slave有新的数据变化.slave通过IO线程将master的二进制日志传到slave的中继日志中. 3.slave会将中继日志中的事件通过SQL线程在备库上执行.从而实现数据更新,直到追赶上master的数据. 4.在master上并行执行的sql语句,在存储到备库的中继日志后,只有一个SQL语句对中继日志中的事务进行串行执行

搭建mysql主从模式

第一步:先安装两个mysql,我分别装在了 192.168.45.128 192.168.45.131 第二步:修改 Master 配置文件 命令:vim /etc/my.cnf 分别修改其中的server_id和log_in 第三步:重启MySQL,并连接 命令:service mysqld restart mysql -uusername -ppassword 第四步: 在 MySQL 数据库中,为不存在的用户授权,就是同步创建用户并授权. 此用户是从库访问主库使用的用户 ip 地址不能写为

Mysql之主从模式、读写分离概念

MySQL主从架构复制: 在主server上每次进行可能引起数据变化的操作都要先记录到二进制文件中,并将数据同步到主server的磁盘上,与此同时还要通过端口(3306)将二进制日志发送到从server上,在从server上,从server会先将接受的二进制日志保存为中继日志(relay log),在从中继日志中进行读取,重新执行一遍操作,进行数据的复制 但一般来说,如果主server有多个cpu,当数据量变化很频繁时,可能会在每个cpu上都运行一个事务,而注server只能一个个的记录入二进制

mysql 主从半同步模式和数据库同步过滤

在mysql主从架构中,默认采用的是异步模式,也就是在master中将数据保存在数据库,再将操作写到bin-log中即响应给客户端.至于slave是否同步了二进制文件,是否完成了本地操作,master无从得知.异步模式固然能以最快的速度响应给客户端,减少用户的等待时间,但在一些数据同步.安全性较高的场景,要求slave中的数据要尽最大能力与master保持一致,那么半同步模式就可以用上了. mysql的半同步模式是以插件的方式由google提供的.主要文件在${mysql_home}/lib/p

MySQL 主从同步(1) - 概念和原理介绍 以及 主从/主主模式 部署记录

Mysql复制概念Mysql内建的复制功能是构建大型高性能应用程序的基础, 将Mysql数据分布到多个系统上,这种分布机制是通过将Mysql某一台主机数据复制到其它主机(slaves)上,并重新执行一遍来实现的.复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环.这些日志可以记录发送到从服务器的更新.当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置.从服务器接收从那时起

高性能Mysql主从架构的复制原理及配置详解

1 复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的.复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环.这些日志可以记录发送到从服务器的更新.当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置.从服务器接收

2-18,19 搭建MySQL主从服务器并并通过mysql-proxy实现读写分离

MySQL主从服务器 实现方式: MySQL  REPLICATION Replication可以实现将数据从一台数据库服务器(master)复制到一台或多台数据库服务器(slave) 默认情况下这种情况属于异步复制,无需维持长连接 通过配置,可以复制所有库或者几个库,甚至库中的一些表 它是MySQL内建的,自带 Replication的原理 主服务器master将数据库的改变写入二进制日志文件,从服务器slave同步这些二进制日志,并生成中继日志,从服务器根据中继日志,执行这些改变 DML:S

mysql-poxy 实现mysql主从架构读写分离

在高并发系统设计中,后端数据库的性能往往会成为系统的瓶颈,这时候就需要进行合理的设计,以分摊后端数据库的压力,比如在数据层前面构建缓存层.数据文件存放在RAID这样的设备.对数据进行分库分表分区存放.合理利用索引.进行数据的读写分离等.mysql-proxy提供了mysql数据库的读写分离能力,mysql-proxy通过Lua脚本能分析得出用户的sql请求,如果发现在是read请求,则会转化到master-slave模型的slave中,如果是write请求,则会转发到master中,以达到读写分