
MariaDB Galera Cluster 集群介绍
MariaDB Galera Cluster(下文简称MGC集群),是一套在MySQL innodb存储引擎上面实现多主、数据实时同步以及强一致性的关系存储架构,业务层面无需做读写分离工作,数据库读写压力都能按照既定的规则分发到 各个节点上去,在数据方面完全兼容 MariaDB 和 MySQL。
- MGC 是基于 Galera 协议的高可用方案:
Galera 是 Codership 提供的多主数据同步复制机制,可以实现多个节点间的数据同步复制以及读写,并且可保障数据库的服务高可用及数据一致性。- MGC 集群是由节点组成的,推荐配置至少 3 个节点,但是也可以运行在 2 个节点上。
- 每个节点都包含完整的数据副本。
MGC 最大的优势:强一致性、无同步延迟
- MGC 的优点:
1、同步复制 Synchronous replication
2、Active-active multi-master 拓扑逻辑
3、可对集群中任一节点进行数据读写
4、自动成员控制,故障节点自动从集群中移除
5、自动节点加入
6、真正并行的复制,基于行级
7、直接客户端连接,原生的 MySQL 接口
8、每个节点都包含完整的数据副本
9、多台数据库中数据同步由 wsrep 接口实现
- MGC 的缺点:
1、目前的复制仅仅支持InnoDB存储引擎,任何写入其他引擎的表,包括mysql.*表将不会复制,但是DDL语句会被复制,因此创建用户将会被复制,但是insert into mysql.user…将不会被复制
2、DELETE操作不支持没有主键的表,没有主键的表在不同的节点顺序将不同,如果执行SELECT…LIMIT… 将出现不同的结果集.
3、在多主环境下LOCK/UNLOCK TABLES不支持,以及锁函数GET_LOCK(), RELEASE_LOCK()…
4、查询日志不能保存在表中。如果开启查询日志,只能保存到文件中。
5、允许最大的事务大小由wsrep_max_ws_rows和wsrep_max_ws_size定义。任何大型操作将被拒绝。如大型的LOAD DATA操作。
6、由于集群是乐观的并发控制,事务commit可能在该阶段中止。如果有两个事务向在集群中不同的节点向同一行写入并提交,失败的节点将中止。对 于集群级别的中止,集群返回死锁错误代码(Error: 1213 SQLSTATE: 40001 (ER_LOCK_DEADLOCK)).
7、XA事务不支持,由于在提交上可能回滚。
8、整个集群的写入吞吐量是由最弱的节点限制,如果有一个节点变得缓慢,那么整个集群将是缓慢的。为了稳定的高性能要求,所有的节点应使用统一的硬件。
9、集群节点建议最少3个。
10、如果DDL语句有问题将破坏集群。

- MGC 原理描述
MGC 会使用大概 4 个端口号
3306:数据库对外服务的端口号
4444:请求 SST。 SST: 指数据镜象传输端口,使用方法 xtrabackup , rsync ,mysqldump
4567: 组成员之间进行沟通的一个端口号
4568: 传输 IST 用的。相对于 SST 来说的一个增量。
PXC 的架构示意图
部署 MGC 高可用集群
- 集群 统一使用 CentOS 7.9
主 机 名 IP 地 址 版 本 mysql1 192.168.1.231 MariaDB 10.7 mysql2 192.168.1.232 MariaDB 10.7 mysql3 192.168.1.233 MariaDB 10.7 首先配置好主机名、静态IP、关闭 firewalld 防火墙、SElinux、交换分区 swap、修改内核参数、配置阿里云 repo 源、配置时间同步等等
安装 MGC 集群
Installing MariaDB with yum/dnf - MariaDB Knowledge Base- MGC 属于 Multi-master Replication(多主复制)。
- 多主复制意味着支持对任意节点的读写,数据会同步复制到其他节点。
配置 yum 源
分别在 mysql1 、mysql2 和 mysql3 上做如下操作:
vim /etc/yum.repos.d/MariaDB.repo[mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.7/centos7-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1 或者使用国内yum源 [mariadb] name=mariadb baseurl=https://mirrors.tuna.tsinghua.edu.cn/mariadb/yum/10.7/centos7-amd64/ gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1导入 KEY
rpm --import https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
#安装 qpress
yum -y install https://repo.percona.com/yum/release/7/RPMS/x86_64/qpress-11-1.el7.x86_64.rpm
yum -y install MariaDB-server galera-4 MariaDB-client MariaDB-shared MariaDB-backup MariaDB-common MariaDB-server-debuginfo MariaDB-client-debuginfo MariaDB-shared-debuginfo MariaDB-backup-debuginfo MariaDB-common-debuginfo修改数据库 root 密码
- 三个节点都安装完软件包之后,接下来只对第一个节点 mysql1 进行修改密码操作。
#先启动 maridbd服务。
systemctl start mysqld
使用空密码登录 MySQL
mysql -u root -p
更改 root 用户的密码,之后退出。
mysql> alter user 'root'@'localhost' identified by 'NEWPASSWORD';
mysql> exit
关闭 MySQL 服务。
systemctl stop mysqld
注意:以上修改密码操作只需在第一个节点进行即可。配置好第二个和第三个节点,启动服务操作后会自动复制到其他节点中。
mysql2 和 mysql3 上的 mysql 服务,现在不需要启动。
- 配置 MGC 集群第 1 个节点
配置第一个节点 mysql1 的 /etc/my.cnf.d/server.cnf
vim /etc/my.cnf.d/server.cnf[client] socket=/var/lib/mysql/mysql.sock [mysqld] server-id=1 datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid binlog_expire_logs_seconds=604800 skip-external-locking skip-name-resolve max_connections=5000 connect_timeout=5 wait_timeout=600 max_allowed_packet=16M thread_cache_size=128 sort_buffer_size=4M bulk_insert_buffer_size=16M tmp_table_size=32M max_heap_table_size=32M character-set-client-handshake = FALSE character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect='SET NAMES utf8mb4' wsrep_causal_reads=ON wsrep_provider_options="gcache.size=128M" wsrep_certify_nonPK=ON log-bin=/data/mariadb/data/mysql-bin log_slave_updates=1 query_cache_size=0 wsrep_on=ON wsrep_provider=/usr/lib64/galera-4/libgalera_smm.so wsrep_cluster_name=MGC-Cluster wsrep_cluster_address=gcomm://192.168.1.231,192.168.1.232,192.168.1.233 wsrep_node_name=mysql1 wsrep_node_address=192.168.1.231 wsrep_sst_method=xtrabackup-v2 wsrep_sst_method=rsync binlog_format=row default_storage_engine=InnoDB innodb_autoinc_lock_mode=2 wsrep_slave_threads=8 innodb_flush_log_at_trx_commit=0 innodb_buffer_pool_size=500M/etc/my.cnf.d/server.cnf 增加的参数说明:
# 集群通讯地址
wsrep_cluster_address=gcomm://192.168.1.231,192.168.1.232,192.168.1.233
# 本节点的地址
wsrep_node_address=192.168.1.231
# 本节点的名称
wsrep_node_name= mysql1
这些内容也同样对 mysql2.和 mysql3 进行配置,只有两个参数 wsrep_node_name, wsrep_node_address 配置的值需要修改一下扩展:主配置文件 my.cnf 其他参数说明
wsrep_provider #指定 Galera 库的路径。
wsrep_cluster_name #指定集群的逻辑名称,集群内的所有节点,这个名称必须一致。
wsrep_cluster_address #指定集群内节点的 IP 地址,建议将集群节点都配上。
wsrep_node_name #指定单个节点的逻辑名称,如果没有指定,将使用 hostname 作为逻辑名称。
wsrep_node_address #指定此特定节点的 IP 地址。
wsrep_sst_method #默认的使用 Percona Xtrabackup 进行 State Snapshot Transfer
(SST),强烈建议使用 wsrep_sst_method=xtrabackup-v2
binlog_format #Galera 只支持 row-level replication,默认设置为 binlog_format=ROW。
innodb_autoinc_lock_mode #Galera 只支持 lock mode 为 2 的 InnoDB 引擎,默认设置为 innodb_autoinc_lock_mode=2。引导 GRC 集群启动并将其他节点加到集群中
1、在第一个节点上引导 GRC 集群启动
在第一个节点 mysql1 使用如下命令引导 PXC 集群启动
galera_new_cluster
为确保初始化完成,可以使用如下命令查看
登录 MySQL
mysql -u root -p
mysql> show status like 'wsrep%';
可以看到集群数量是 1,本节点为 Synced 状态,表示连接成功,并且准备好进行 write-set replication。
注意:所有其他节点的数据和配置都会被第一个节点的数据覆盖,不要同时加入多个节点,避免数据或网络开销过大。等一个节点加入成功后,再加入另一个新节点。
启动第二个节点
systemctl start mysqld
可以看到 wsrep_cluster_size 的值是 2 表示集群已经有 2 个节点了。
启动完成后,mysql2 会接到 mysql1的数据,可以使用如下命令查看状态
mysql -u root -p
登录到 MySQL 后,输入如下命令
mysql> show status like 'wsrep%';
wsrep_local_state_comment 的值是 Synced 表示已经同步了。- 注意 如果 wsrep_local_state_comment 的状态是 Joiner,表示正在同步,请不要启动第三个节点的服务。
启动第三个节点
- 注意:确认好第二个节点的状态为 Synced 后,再启动第三个节点。
步骤与启动第二个节点相同
systemctl start mysqld
启动完成后,mysql3 会接到集群,可以使用如下命令查看状态
mysql -u root -p
登录到 MySQL 后,输入如下命令
mysql> show status like 'wsrep%';
测试数据同步
- 在 mysql3 上删除 test 库
drop database test;
模拟故障
测试 单点故障
- 首先停止 mysql3
- 在 mysql2 上观察
- 停止 mysql1
- 测试 全部故障
这时候直接 start 发现无法启动
因为是同时关闭,seqno 号无法提供有效的信息,无从判断最后的有效节点
在任意节点
模拟 2台故障
MGC 集群只有有任意节点存活,其他节点即可加入。
seqno 选择数值大的优先启动
全新节点加入
- 配置好主机名、静态IP、关闭 firewalld 防火墙、SElinux、交换分区 swap、修改内核参数、配置阿里云 repo 源、配置时间同步等等
- 所有节点都要添加 新节点的 IP和主机名
- 准备工作做完后,在新节点安装 MGC
- yum -y install MariaDB-server MariaDB-Galera-server galera-4 MariaDB-client MariaDB-shared MariaDB-backup MariaDB-common MariaDB-server-debuginfo MariaDB-client-debuginfo MariaDB-shared-debuginfo MariaDB-backup-debuginfo MariaDB-common-debuginfo
- 启动 mysql
- 加入 slave 节点
- 创建 slave 复制用户
我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel
我的rails3.1.6应用程序中有一个自定义访问器方法,它为一个属性分配一个值,即使该值不存在。my_attr属性是一个序列化的哈希,除非为空白,否则应与给定值合并指定了值,在这种情况下,它将当前值设置为空值。(添加了检查以确保值是它们应该的值,但为简洁起见被删除,因为它们不是我的问题的一部分。)我的setter定义为:defmy_attr=(new_val)cur_val=read_attribute(:my_attr)#storecurrentvalue#makesureweareworkingwithahash,andresetvalueifablankvalueisgiven
Linux操作系统——网络配置与SSH远程安装完VMware与系统后,需要进行网络配置。第一个目标为进行SSH连接,可以从本机到VMware进行文件传送,首先需要进行网络配置。1.下载远程软件首先需要先下载安装一款远程软件:FinalShell或者xhell7FinalShellxhell7FinalShell下载:Windows下载http://www.hostbuf.com/downloads/finalshell_install.exemacOS下载http://www.hostbuf.com/downloads/finalshell_install.pkg2.配置CentOS网络安装好
文章目录一基础定义二创建逻辑卷2-1准备物理设备2-2创建物理卷2-3创建卷组2-4创建逻辑卷2-5创建文件系统并挂载文件三扩展卷组和缩减卷组3-1准备物理设备3-2创建物理卷3-3扩展卷组3-4查看卷组的详细信息以验证3-5缩减卷组四扩展逻辑卷4-1检查卷组是否有可用的空间4-2扩展逻辑卷4-3扩展文件系统五删除逻辑卷5-1备份数据5-2卸载文件系统5-3删除逻辑卷5-4删除卷组5-5删除物理卷六LVM逻辑卷缩容6-1缩容注意事项6-2标准缩容步骤一基础定义LVM,LogicalVolumeManger,逻辑卷管理,Linux磁盘分区管理的一种机制,建立在硬盘和分区上的一个逻辑层,提高磁盘分
如何在Ruby中获取linux系统(这必须适用于Fedora、Ubuntu等)的软件/硬件信息? 最佳答案 Chef背后的优秀人才,拥有一颗名为Ohai的优秀gemhttps://github.com/opscode/ohai以散列形式返回系统信息,例如操作系统、内核、规范、fqdn、磁盘、空间、内存、用户、接口(interface)、sshkey等。它非常完整,非常好。它还会安装命令行二进制文件(也称为ohai)。 关于ruby-如何在Ruby中获取linux系统信息,我们在Stack
我在LinuxMint17.2上。我最近使用apt-getpurgeruby删除了ruby。然后我安装了rbenv然后rbenvinstall2.3.0所以现在,~/.rbenv/versions/2.3.0/bin/ruby存在。但是现在,我无法执行geminstallrubocop。我明白了:$geminstallrubocoprbenv:gem:commandnotfoundThe`gem'commandexistsintheseRubyversions:2.3.0但是我可以~/.rbenv/versions/2.3.0/bin/geminstallrubocop。但是,
我是Ruby和RoR的新手。我有一个带有Ubuntu镜像的干净Linode实例,我想从源代码编译Ruby而不是使用apt-get。我已经在谷歌上搜索了执行此操作的说明,但经过一些尝试后,当我尝试运行一些教程示例时,我不断收到有关缺少zlib和其他一些包的错误。任何人都可以给我详细的说明(或链接),教我如何在从源代码编译Ruby之前安装必要的必备包吗?我的目的是编译Ruby的最新稳定版本,然后安装Rubygems和Rails。提前感谢您的帮助!!! 最佳答案 Thisblogpost涵盖从源代码编译ruby所需的包和安装过程;它引
有没有办法在liquidtemplate中输出(用于调试/信息目的)可用对象和对象属性??也就是说,假设我正在使用jekyll站点生成工具,并且我在我的index.html模板中(据我所知,这是一个液体模板)。它可能看起来像这样{%forpostinsite.posts%}{{post.date|date_to_string}}»{{post.title}}{%endfor%}是否有任何我可以使用的模板标签会告诉我/输出名为post的变量在此模板(以及其他模板)中可用。此外,是否有任何模板标签可以告诉我post对象具有键date、title、url、摘录、永久链接等
我尝试在我的应用中只使用:symbols作为关键词。我尝试在:symbol=>logic或string=>UI/languagespecific之间做出严格的决定但我也得到了每个JSON的一些“值”(即选项等),因为JSON中没有:symbols,所以我调用的所有哈希都具有“with_indifferent_access”属性。但是:数组是否有相同的东西?像那样a=['std','elliptic',:cubic].with_indifferent_accessa.include?:std=>true?编辑:将rails添加到标签 最佳答案
我进行了一些谷歌搜索,似乎缺少用于jRuby的IDE。我读过TextMate和Sublime,但它们不提供调试或代码完成功能。有人可以提出建议吗(或者这项技术还处于起步阶段)? 最佳答案 有几个选项;我更喜欢JetBrains'IntelliJ(RubyMine).AptanahasanEclipseplugin.NetBeansusedtohaveofficialsupport,不确定currentstate是什么是。 关于ruby-哪些IDE可用于jRuby?,我们在StackOve