MySQL运维实战之ProxySQL(9.4)proxysql和后端MySQL自动切换

俊达2年前技术文章1611

ha.png


如上图架构,当后端MySQL主库出现问题,发生主备切换后,如何自动将ProxySQL的读写切换到新的主库上?


可以通过mysql_replication_hostgroups表配置实现:

insert into mysql_replication_hostgroups
(writer_hostgroup, reader_hostgroup, check_type, comment)
values(100, 101, 'read_only', 'mysql mm cluster');

load mysql servers to runtime;
save mysql servers to disk;


将主库和备库的hostgroup配置到mysql_replication_hostgroups表中后,proxysql会检测主备库的read_only状态。

当检测到read_only从OFF变成ON时,会将writer_hostgroup中的主机添加的reader_hostgrup中。

当检测到read_only从ON变成OFF时,会将主机从reader_hostgroup中移到writer_hostgroup中。


当一个后端mysql实例的read_only状态从ON变成OFF时,会将该实例加入到writer_hostgroup中,同时该实例依然位于read_hostgroup中:

mysql> select hostgroup_id, hostname, port , status from runtime_mysql_servers where hostgroup_id in (100,101);
+--------------+----------------+------+--------+
| hostgroup_id | hostname       | port | status |
+--------------+----------------+------+--------+
| 100          | 172.16.121.237 | 3380 | ONLINE |
| 101          | 172.16.121.236 | 3380 | ONLINE |
| 101          | 172.16.121.237 | 3380 | ONLINE |
+--------------+----------------+------+--------+


可以看到,节点172.16.121.237:3380 同时位于两个hostgroup。


如果需要将该实例从read hostgroup中移除,需要将参数mysql-monitor_writer_is_also_reader设置为false:

set mysql-monitor_writer_is_also_reader='false';
load mysql variables to runtime;

然后再重新加载mysql server,就可以将设置了read_only状态的后端实例从read hostgroup中移除。

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

mysql> select hostgroup_id, hostname, port , status from runtime_mysql_servers where hostgroup_id in (100,101);
+--------------+----------------+------+--------+
| hostgroup_id | hostname       | port | status |
+--------------+----------------+------+--------+
| 100          | 172.16.121.237 | 3380 | ONLINE |
| 101          | 172.16.121.236 | 3380 | ONLINE |
+--------------+----------------+------+--------+
2 rows in set (0.00 sec)


proxysql只根据后端mysql的read_only状态来判断将实例放到write hostgroup或read hostgroup。所以需要正确地设置read_only状态。

  • 如果主备实例都设置了read_only=OFF,则会发生双写,容易引起数据不一致。

  • 如果在备库复制有延迟或备库复制中断的情况下,将备库的read only设置为OFF,同样也可能会引起数据不一致。

  • 后端MySQL实例的高可用,需要借助其它方式来实现,如MHA。或者使用MySQL Group Replication。



相关文章

 MySQL运维实战之Clone插件(10.1)使用Clone插件

MySQL运维实战之Clone插件(10.1)使用Clone插件

clone插件介绍mysql 8.0.17版本引入了clone插件。使用clone插件可以对本地l或远程的mysql实例进行clone操作。clone插件会拷贝innodb存储引擎表,clone得到的...

MySQL运维实战之备份和恢复(8.2)xtrabackup备份到云端(OSS)

xtrabackup工具中有一个xbcloud程序,可以将数据库直接备份到S3对象存储中,本地不落盘。这里介绍将数据库直接备份到OSS的一种方法。具体方法如下:1、准备OSS我们使用ossutil工具...

MySQL运维实战之备份和恢复(8.5)xtrabackup恢复增量备份

恢复增量备份时,需要先对基础全量备份进行恢复,然后再依次按增量备份的时间进行恢复。这个例子中,相关备份文件的目录结构如下:/data/backup ├── full │ &nb...

MySQL运维实战(4.4) SQL_MODE之STRICT_TRANS_TABLES和STRICT_ALL_TABLES

如果设置STRICT模式,则如果数据写入时,如果数据不符合字段定义(字符串超出长度、数值类型数据超出范围、违反not null约束等),SQL会报错。如果不设置STRICT模式,会对异常数据进行截断处...

MySQL优化器特性(七)成本估算常数

成本估算常数表示执行一些MySQL基础操作时的成本,如读取一个页面,创建一个临时表,比较一条记录,解析一行记录等操作。mysql.engine_cost和mysql.server_cost表分别记录存...

MySQL运维实战(2.2)忘记密码如何处理

如果忘记了一个普通用户的密码,可以使用管理员账号登录,修改其他用户的密码。但是如果所有管理员账号的密码都忘记了,应该怎么处理呢?如果忘记root密码,可以使用skip-grant-tables参数启动...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。