7.15 Mariadb 与 Galera 集群总结

image0

MariaDB是MySQL的一个分支,由MySQL的创始人Michael Widenius主导开发,采用GPL授权许可。

开发这个分支的原因之一是Oracle公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的方式来避开这个风险。

MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。

Galera 是一个MySQL(也支持MariaDB,Percona) 的同步多主集群软件,目前只支持 InnoDB 引擎。

它有什么特点呢?

  1. 真正的 multi-master,即所有的节点都可以读写数据库,无主备延迟的问题

  2. 自动的节点成员控制,失效的节点自动清除

  3. 新节点加入后,数据会自动复制进行同步

  4. 真正的并行同步,行级

  5. 用户连接集群后,使用跟 MySQL 基本一致。

  6. 不会写binlog

关于Galera是如何做到多主的,可以借助这张图来看看image1

来源:https://blog.csdn.net/weixin_42867972/article/details/84198696

集群里的节点,实际上可以分为两种角色

  • 协调者:程序直接操作的节点

  • 参与者:被动同步的节点

当你的程序往数据库写入数据时,做为协调者会经历下面4个步骤

  1. 接收客户端请求

  2. 广播请求到其他参与者(包括自己)

  3. 作为参与者进行数据更新

  4. 更新失败或者成功返回给客户端

而做为参与者,只要接收协调者的广播请求,配合进行数据的更新即可。

7.15.1 命令总结

如何查看 mysqld 的参数选项

mysqld --verbose --help

获取最新节点

# 执行后查看日志
mysqld --wsrep-recover

# 执行后会输出到屏幕
/usr/bin/galera_recovery

7.15.2 配置总结

/etc/my.cnf.d/galera.cnf

wsrep_on=on

# 要确认插件是存在的
wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so

# 集群名称
wsrep_cluster_name='cluster1'

# 首次作为发起人,此处为空,不向任何人同步数据。不为空,则向这些机器同步数据。
# 感觉这里不应该包括自己的ip
wsrep_cluster_address='gcomm://172.20.20.202,172.20.20.203'

# 本机的主机名
wsrep_node_name='rehl-14'

# 本机的 IP 地址
wsrep_node_address='192.168.10.14'

#同步数据时,使用的账号密码,各个集群节点应该一致。
wsrep_sst_auth=mary:123123

#同步数据时使用的组件
wsrep_sst_method=rsync

更多的配置详情,可以查看 官方文档

7.15.3 启动方法

主要有两种启动方法:

  • mysqld

  • mysqld_safe

mysqld_safe相当于多了一个守护进程,mysqld挂了会自动把mysqld进程拉起来

  1. 可以读取的配置部分[mysqld],[server],[myslqd_safe],为了兼容mysql_safe也会读取[safe_mysqld]中的配

  2. 调用的mysqld是可以在[mysqld_safe]中用-mysqld, –mysqld-version指定

启动方法

$ mysqld_safe --defaluts-file=/etc/mysql/my.cnf &
$ mysqld --defaults-file=/etc/mysql/my.cnf &

启动集群,4567 是wsrep使用的默认端口。

$ /usr/local/mysql/bin/mysqld_safe --wsrep_cluster_address=gcomm:// >/dev/null &

# 或者
$service mysql start --wsrep_cluster_address=gcomm://

7.15.4 mysql_safe是什么?

mysql_safe 经常在ps进程中见过,它有什么用,跟mysqld 是什么关系?有什么区别呢?

  1. mysqld_safe是服务端工具,用于启动mysqld,并且是mysqld的守护进程,mysqld_safe加&在后台运行$BASEDIR/bin/mysqld_safe &

  2. 因为mysqld_safe是mysqld的守护进程,所以mysqld_safe脚本会在启动MySQL服务器后继续监控其运行情况,并在其死机时重新启动它。

  3. 直接使用mysqld_safe启动mysqld时,mysqld_safe可以使用参数选项见mysqld_safe –help,此时可以使用其他配置文件,相当于mysqld_safe把参数传递给mysqld

  4. mysql.server脚本其实也是调用mysqld_safe脚本去启动MySQL服务器的,但此时mysqld_safe不能使用参数选项即不能mysqld_safe –defaults-file这样的模式,此时只能使用默认的/etc/my.cnf配置文件,就算是ps -ef|grep mysql显式看到的信息也只是parse_server_arguments函数指定的参数,也是来自my.cnf,相当于mysql.server把my.cnf中的参数传递给mysqld_safe,mysqld_safe再传递给mysqld,如下看到的–datadir也是来自my.cnf

  5. mysqld_safe指定的–defaults-file会覆盖my.cnf中的配置

    ./bin/mysqld_safe --defaults-file=/etc/my.cnf2
    
  6. mysqld_safe指定的–datadir参数会覆盖my.cnf中的配置

    ./bin/mysqld_safe --datadir=/mysql/mysql57/data2 &
    

    mysqld_safe中这条语句they are added to mysqld command line to override settings from my.cnf

    它们被添加到mysqld命令行以覆盖my.cnf中的设置

  7. mysqld直接启动使用–datadi参数,也会覆盖my.cnf中的配置

    &BASEDIR/bin/mysqld –datadir=/mysql/mysql57/data2 –user=root &

  8. mysqld_safe多长时间检测一次mysqld呢,即多长时间去把mysqld拉起

    这是linux的机制,不是mysql的机制,因为mysqld_safe是父进程,mysqld是子进程,一旦子进程奔溃,linux信号机制下父进程马上就知道自己名下的子进程出问题了,会立即重新fork出一个新的子进程

  9. mysqld的端口默认3306,mysqld_safe没有端口

7.15.5 查看集群状态

使用 mysql status

show status like '%wsrep%';

选几个比较重要的说下,监测状态说明

  1. 集群完整性检查wsrep_cluster_state_uuid:在集群所有节点的值应该是相同的,有不同值的节点,说明其没有连接入集群. wsrep_cluster_conf_id:正常情况下所有节点上该值是一样的.如果值不同,说明该节点被临时”分区”了.当节点之间网络连接恢复的时候应该会恢复一样的值. wsrep_cluster_size:如果这个值跟预期的节点数一致,则所有的集群节点已经连接. wsrep_cluster_status:集群组成的状态.如果不为”Primary”,说明出现”分区”或是”split-brain”状况

wsrep_incoming_addresses:列出了构成当前集群所有的节点

  1. 节点状态检查wsrep_ready:该值为ON,则说明可以接受SQL负载。如果为Off,则需要检查wsrep_connected. wsrep_connected:如果该值为Off,且wsrep_ready的值也为Off,则说明该节点没有连接到集群(可能是wsrep_cluster_address或wsrep_cluster_name等配置错造成的.具体错误需要查看错误日志) wsrep_local_state_comment:如果wsrep_connected为On,但wsrep_ready为OFF,则可以从该项查看原因。

  2. 复制健康检查wsrep_flow_control_paused:表示复制停止了多长时间.即表明集群因为Slave延迟而慢的程度.值为0~1,越靠近0越好,值为1表示复制完全停止,可优化wsrep_slave_threads的值来改善. wsrep_cert_deps_distance:有多少事务可以并行应用处理.wsrep_slave_threads设置的值不应该高出该值太多。 wsrep_flow_control_sent:表示该节点已经停止复制了多少次. wsrep_local_recv_queue_avg:表示slave事务队列的平均长度.slave瓶颈的预兆.

wsrep_flow_control_sent 和 wsrep_local_recv_queue_avg 的值越高,该节点的速度相对来说会更慢,所以这两个值应尽量低。

  1. 检测慢网络问题

    wsrep_local_send_queue_avg:网络瓶颈的预兆.如果这个值比较高的话,可能存在网络瓶

  2. 冲突或死锁的数目

    wsrep_last_committed:最后提交的事务数目

    wsrep_local_cert_failureswsrep_local_bf_aborts:回滚,检测到的冲突数目