MariaDB作为Mysql的一个分支,在开源项目中已经广泛使用,例如大热的openstack,所以,为了保证服务的高可用性,同时提高系统的负载能力,集群部署是必不可少的。
MariaDB Galera Cluster 介绍
MariaDB集群是MariaDB同步多主机集群。它仅支持XtraDB/ InnoDB存储引擎(虽然有对MyISAM实验支持 – 看wsrep_replicate_myisam系统变量)。
主要功能:
1、同步复制
2、真正的multi-master,即所有节点可以同时读写数据库
3、自动的节点成员控制,失效节点自动被清除
4、新节点加入数据自动复制
5、真正的并行复制,行级
6、用户可以直接连接集群,使用感受上与MySQL完全一致
优势:
1、因为是多主,所以不存在Slavelag(延迟)
2、不存在丢失事务的情况
3、同时具有读和写的扩展能力
4、更小的客户端延迟
5、节点间数据是同步的,而Master/Slave模式是异步的,不同slave上的binlog可能是不同的
技术:
Galera集群的复制功能基于Galeralibrary实现,为了让MySQL与Galera library通讯,特别针对MySQL开发了wsrep API。
Galera插件保证集群同步数据,保持数据的一致性,靠的就是可认证的复制。
当客户端发出一个commit的指令,在事务被提交之前,所有对数据库的更改都会被write-set收集起来,并且将 write-set 纪录的内容发送给其他节点。
write-set 将在每个节点进行认证测试,测试结果决定着节点是否应用write-set更改数据。
如果认证测试失败,节点将丢弃 write-set ;如果认证测试成功,则事务提交。
安装
安装环境准备
安装MariaDB集群至少需要3台服务器(如果只有两台的话需要特殊配置,请参照官方文档)
在这里,我列出试验机器的配置:
操作系统版本:CentOS]7.9
MariaDB-Galra-Cluster-1:172.30.88.112
MariaDB-Galra-Cluster-2:172.30.88.113
MariaDB-Galra-Cluster-3:172.30.88.114
修改/etc/hosts
文件
echo " 172.30.88.112 MariaDB-Galra-Cluster-1 172.30.88.113 MariaDB-Galra-Cluster-2 172.30.88.114 MariaDB-Galra-Cluster-3 " >> /etc/hosts
为了保证节点间相互通信,需要禁用防火墙设置(如果需要防火墙,则参照官方网站增加防火墙信息设置)
systemctl disable firewalld --now
然后将/etc/sysconfig/selinux
的 selinux
设置成 disabled
,这样初始化环境就完成了。
安装 MariaDB
编辑/etc/yum.repos.d/MariaDB.repo
文件
# MariaDB 10.11 CentOS repository list - created 2023-08-23 09:49 UTC # https://mariadb.org/download/ [mariadb] name = MariaDB # rpm.mariadb.org is a dynamic mirror if your preferred mirror goes offline. See https://mariadb.org/mirrorbits/ for details. # baseurl = https://rpm.mariadb.org/10.11/centos/$releasever/$basearch baseurl = https://mirrors.aliyun.com/mariadb/yum/10.11/centos/$releasever/$basearch module_hotfixes = 1 # gpgkey = https://rpm.mariadb.org/RPM-GPG-KEY-MariaDB gpgkey = https://mirrors.aliyun.com/mariadb/yum/RPM-GPG-KEY-MariaDB gpgcheck = 1
安装
yum install -y MariaDB-server MariaDB-client
可能会报错,需要pv
依赖包
yum install -y epel-release
安装 MariaDB Galera Cluster
yum install galera rsync
配置 MariaDB Galera Cluster
systemctl start mariadb # mysql_secure_installation (这个在10.11.5-MariaDB版本中没有) systemctl stop mariadb
在各个结点上进行Cluster的安装配置
MariaDB-Galra-Cluster-1
编辑/etc/my.cnf.d/server.cnf
# this is only for the mysqld standalone daemon [mysqld] skip_name_resolve=ON relay_log=mysql-relaylog relay_log_index=mysql-relaylog relay_log_purge=OFF slow_query_log=ON server-id=10 innodb_file_per_table=ON binlog_format=ROW log_bin=node1-binlog log_slave_updates=ON expire_logs_days=10 max_binlog_size=50M # # * Galera-related settings # [galera] # Mandatory settings wsrep_on=ON wsrep_provider=/usr/lib64/galera-4/libgalera_smm.so wsrep_cluster_address="gcomm://MariaDB-Galra-Cluster-1,MariaDB-Galra-Cluster-2,MariaDB-Galra-Cluster-3" wsrep_node_name=MariaDB-Galra-Cluster-1 binlog_format=row default_storage_engine=InnoDB innodb_autoinc_lock_mode=2 # # Allow server to accept connections on all interfaces. # bind-address=0.0.0.0 wsrep_cluster_name=“MariaDB_Cluster” wsrep_node_address=172.30.88.112 ##wsrep_sst_method=rsyn # # Optional setting wsrep_slave_threads=1 innodb_flush_log_at_trx_commit=2 innodb_buffer_pool_size=1024M ##wsrep_sst_auth=sstuser:sStUser_PassWd
在MariaDB-Galra-Cluster-1
节点数据库命令行执行:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'your_password' WITH GRANT OPTION; FLUSH PRIVILEGES; use mysql; select user,host,password,plugin from user; ## 下面的语句暂时不执行 # create user 'sstuser'@'localhost' identified by 'sStUser_PassWd'; # grant reload, lock tables, replication client, process on *.* to 'sstuser'@'localhost';
MariaDB-Galra-Cluster-2
编辑/etc/my.cnf.d/server.cnf
# this is only for the mysqld standalone daemon [mysqld] skip_name_resolve=ON relay_log=mysql-relaylog relay_log_index=mysql-relaylog relay_log_purge=OFF slow_query_log=ON server-id=20 innodb_file_per_table=ON binlog_format=ROW log_bin=node2-binlog log_slave_updates=ON expire_logs_days=10 max_binlog_size=50M # # * Galera-related settings # [galera] # Mandatory settings wsrep_on=ON wsrep_provider=/usr/lib64/galera-4/libgalera_smm.so wsrep_cluster_address="gcomm://MariaDB-Galra-Cluster-1,MariaDB-Galra-Cluster-2,MariaDB-Galra-Cluster-3" wsrep_node_name=MariaDB-Galra-Cluster-2 binlog_format=row default_storage_engine=InnoDB innodb_autoinc_lock_mode=2 # # Allow server to accept connections on all interfaces. # bind-address=0.0.0.0 wsrep_cluster_name=“MariaDB_Cluster” wsrep_node_address=172.30.88.113 ##wsrep_sst_method=rsyn # # Optional setting wsrep_slave_threads=1 innodb_flush_log_at_trx_commit=2 innodb_buffer_pool_size=1024M ##wsrep_sst_auth=sstuser:sStUser_PassWd
MariaDB-Galra-Cluster-3
编辑/etc/my.cnf.d/server.cnf
# this is only for the mysqld standalone daemon [mysqld] skip_name_resolve=ON relay_log=mysql-relaylog relay_log_index=mysql-relaylog relay_log_purge=OFF slow_query_log=ON server-id=30 innodb_file_per_table=ON binlog_format=ROW log_bin=node3-binlog log_slave_updates=ON expire_logs_days=10 max_binlog_size=50M # # * Galera-related settings # [galera] # Mandatory settings wsrep_on=ON wsrep_provider=/usr/lib64/galera-4/libgalera_smm.so wsrep_cluster_address="gcomm://MariaDB-Galra-Cluster-1,MariaDB-Galra-Cluster-2,MariaDB-Galra-Cluster-3" wsrep_node_name=MariaDB-Galra-Cluster-3 binlog_format=row default_storage_engine=InnoDB innodb_autoinc_lock_mode=2 # # Allow server to accept connections on all interfaces. # bind-address=0.0.0.0 wsrep_cluster_name=“MariaDB_Cluster” wsrep_node_address=172.30.88.114 ##wsrep_sst_method=rsyn
在各个节点上启动Cluster
MariaDB-Galra-Cluster-1
/usr/sbin/mysqld --wsrep-new-cluster --user=mysql &
警告⚠:–wsrep-new-cluster 这个参数只能在初始化集群使用,且只能在一个节点使用。
出现 ready for connections ,证明我们启动成功,继续启动其他节点。
MariaDB-Galra-Cluster-2
systemctl restart mariadb
可以查看/var/log/mariadb/mariadb.log,在日志可以看到节点均加入了集群中。
MariaDB-Galra-Cluster-3
systemctl restart mariadb
可以查看/var/log/mariadb/mariadb.log,在日志可以看到节点均加入了集群中。
在各个节点上登录Cluster进行验证
任意节点登录数据库,得到以下结果说明Cluster成功
show status like "wsrep_cluster_size";
show status like "wsrep_%";
验证数据同步
我们在MariaDB-Galera-Cluster-1上
新建数据库 galera_test
,然后在MariaDB-Galera-Cluster-2
和MariaDB-Galera-Cluster-3
上查询,如果可以查询到 galera_test
这个库,说明数据同步成功,集群运行正常。
# MariaDB-Galera-Cluster-1 mysql -uroot -proot -e "create database galera_test" # MariaDB-Galera-Cluster-2 mysql -uroot -proot -e "show databases" # MariaDB-Galera-Cluster-3 mysql -uroot -proot -e "show databases"
至此,我们的 MariaDB Galera Cluster 已经成功部署。
参考
Mariadb10 Galera 实验小结
https://blog.51cto.com/u_450955/2353245
MariaDB Galera Cluster 部署(如何快速部署MariaDB集群)
https://www.duoluosb.com/324.html
mariadb galera集群如何启动第一个节点
http://blog.chinaunix.net/uid-77311-id-5766680.html
centos下 mysql/mariadb 开启允许用户远程访问。
https://www.cnblogs.com/guowenrui/p/17145659.html
ChiuYut
2023年08月26日