MySQL中间件之ProxySQL(15):ProxySQL代理MySQL组复制 (2)

所以,ProxySQL代理每一个后端MGR集群时,都必须为这个MGR定义读组、写组、备写组、离线组,且这四个组的值各不相同、不允许NULL、具有唯一性。此外,每个username还有一个默认组,一般这个默认组会设置为写组,这样在定义select规则时比较容易。

1.2 ProxySQL代理MGR时必须考虑的问题

ProxySQL代理MGR时有几种情况:ProxySQL代理的MGR运行模式是单主模型还是多主模型,ProxySQL代理的是一个还是多个MGR集群。需要单独考虑这些不同的情况,它们影响ProxySQL如何分配组,甚至配置步骤不同。

1.2.1 ProxySQL代理单主模型的MGR

MRG以单主模型运行时,有两个相关特性:

1.非master节点会自动设置read_only=1

2.master节点故障时,会自动选举新的master节点,选举时根据权重(group_replication_member_weigth,较老版本的组复制根据server_uuid按字典排序,值小的优先选为master)决定谁是新的master

所以ProxySQL代理单主MGR时,ProxySQL中 要设置对后端节点read_only值的监控 。因为ProxySQL会根据read_only值自动调整读、写组中的节点,所以代理单主模型时非常方便。当然,如果不想让ProxySQL来自动调整MGR节点所属组,则无需设置read_only监控,见下文"ProxySQL代理单个MGR集群"中的描述。

由于只有一个写节点,所以用不上备写组,但仍然需要定义好它。例如:
写组 -->hg=10
备写组 -->hg=20
读组 -->hg=30
离线组 -->hg=40

1.2.2 ProxySQL代理多主模型的MGR

多主模型的MGR,可以同时有多个写节点,并且允许少数节点出现故障。

仍然假设组的分配情况:

写组 -->hg=10
备写组 -->hg=20
读组 -->hg=30
离线组 -->hg=40

192.168.100.{22,23,24}分别命名为node1、node2、node3节点。

假设max_writers=2,则node1、node2、node3其中2个节点(假设node1、node2)在写组hg=10中,node3在备写组hg=20中。此时必须设置writer_is_also_reader=1,否则没有节点负责读操作,所以hg=30中有node1、node2、node3共3个节点。假如node2节点故障,node3节点将从hg=20转移到hg=10,读组hg=30也只有node1和node3,node2会转移到hg=40中,并ProxySQL不断监控它是否上线。

所以,ProxySQL代理多主模型的MGR时,必须设置writer_is_also_reader=1。

1.2.3 ProxySQL代理单个MGR集群

ProxySQL代理单个MGR集群时,如果不定制复杂的路由规则,完全由ProxySQL来控制读、写组的节点分配,那么在mysql_group_replication_hostgroups表中只能有一条记录。

但是如果想要实现复杂的需求,例如想要将开销大的select语句路由到某个固定的slave上或自定义的某个hostgroup中,就不能再让ProxySQL来管理MGR,这时不能在mysql_group_replication_hostgroups中插入和该MGR集群有关的记录(如果可以,也不要去监控read_only值),而是在mysql_servers中定义好目标组。这种情况下,ProxySQL不关心后端是MGR还是普通的MySQL实例。

1.2.4 ProxySQL代理多个MGR集群

很不幸,ProxySQL的mysql_group_replication_hostgroups表对多MGR集群并不友好。因为ProxySQL通过监控read_only值来自动调整节点所属组。如果ProxySQL代理两个MGR集群X、Y,在mysql_group_replication_hostgroups添加一条记录后,MGR集群X、Y中的节点都会加入到这条记录所定义的组中,于是两个MGR集群就混乱了。添加多条记录也无济于事,因为这个表中并没有识别集群的方法。其实mysql_replication_hostgroups也一样存在这样的问题。

这时只能在mysql_servers中对不同MGR集群中的各个节点定义好所属组,然后在规则中指定路由目标。也就是说,用不上mysql_group_replication_hostgroups表,也无需去监控read_only值。

1.3 配置组复制

本文配置的单主模型的组复制。

1.设置主机名和DNS解析(必须保证各mysql实例的主机名不一致,且能通过主机名找到各成员)

# node1上: hostnamectl set-hostname --static node1.longshuai.com hostnamectl -H root@192.168.100.23 set-hostname node2.longshuai.com hostnamectl -H root@192.168.100.24 set-hostname node3.longshuai.com # 写/etc/hosts # node1上: cat >>/etc/hosts<<eof 192.168.100.22 node1.longshuai.com 192.168.100.23 node2.longshuai.com 192.168.100.24 node3.longshuai.com eof scp /etc/hosts 192.168.100.23:/etc scp /etc/hosts 192.168.100.24:/etc

2.提供node1、node2、node3的配置文件

node1的/etc/my.cnf内容:

[mysqld] datadir=http://www.likecs.com/data socket=http://www.likecs.com/data/mysql.sock server-id=100 # 各节点不一致 gtid_mode=on enforce_gtid_consistency=on log-bin=http://www.likecs.com/data/master-bin binlog_format=row binlog_checksum=none master_info_repository=TABLE relay_log_info_repository=TABLE relay_log=http://www.likecs.com/data/relay-log log_slave_updates=ON sync-binlog=1 log-error=http://www.likecs.com/data/error.log pid-file=http://www.likecs.com/data/mysqld.pid 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_member_weigth = 40 # 建议各节点设置不同值 loose-group_replication_local_address="192.168.100.22:20002" # 各节点不一致 loose-group_replication_group_seeds="192.168.100.22:20002,192.168.100.23:20003,,192.168.100.24:20004"

node2和node3的配置文件只需修改几项需要不一致的值即可:

以下为node2的/etc/my.cnf的部分内容

server-id=110 loose-group_replication_member_weigth = 30 loose-group_replication_local_address="192.168.100.23:20003"

以下为node3的/etc/my.cnf的部分内容

server-id=120 loose-group_replication_member_weigth = 20 loose-group_replication_local_address="192.168.100.24:20004"

3.启动node1,引导组复制

先启动node1的MySQL服务。

systemctl start mysqld

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyzdgy.html