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 获取最新节点 .. code:: shell # 执行后查看日志 mysqld --wsrep-recover # 执行后会输出到屏幕 /usr/bin/galera_recovery 7.15.2 配置总结 --------------- ``/etc/my.cnf.d/galera.cnf`` .. code:: ini 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指定 启动方法 .. code:: shell $ mysqld_safe --defaluts-file=/etc/mysql/my.cnf & $ mysqld --defaults-file=/etc/mysql/my.cnf & 启动集群,\ ``4567`` 是wsrep使用的默认端口。 .. code:: shell $ /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** .. code:: mysql 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``\ :列出了构成当前集群所有的节点 2. **节点状态检查**\ : ``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,则可以从该项查看原因。 3. **复制健康检查**\ : ``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 的值越高,该节点的速度相对来说会更慢,所以这两个值应尽量低。 4. **检测慢网络问题**\ : ``wsrep_local_send_queue_avg``\ :网络瓶颈的预兆.如果这个值比较高的话,可能存在网络瓶 5. **冲突或死锁的数目**\ : ``wsrep_last_committed``\ :最后提交的事务数目 ``wsrep_local_cert_failures`` 和\ ``wsrep_local_bf_aborts``\ :回滚,检测到的冲突数目 参考文章 -------- - https://blog.csdn.net/weixin_42867972/article/details/84198696 - http://www.360doc.com/content/13/0817/15/834950_307820923.shtml - http://blog.itpub.net/30126024/viewspace-2221483/ |image2| .. |image0| image:: http://image.iswbm.com/20200602135014.png .. |image1| image:: http://image.iswbm.com/20191213162259.png .. |image2| image:: http://image.iswbm.com/20200607174235.png