安装mariadb+galera搭建数据库集群

记一次安装mariadb+galera搭建数据库集群过程。

背景:使用单机mariadb数据库提供服务,存在数据无实时备份,数据服务器无切换等问题,无法应对服务器故障停服,无法持续提供数据服务的情况。之前使用几种方法解决

  1. mysqldump每天定时将数据打包备份,但库表数据量变大时,硬盘空间也成了问题。
  1. binlog设置主从服务器,但经常出现 从库停止同步,需手工设置更新点,维护成本较高。

于是尝试采用mariadb+galera搭建数据库集群,好处如下:

主要功能:

  • 同步复制
  • 真正的 multi-master,即所有节点可以同时读写数据库
  • 自动的节点成员控制,失效节点自动被清除
  • 新节点加入数据自动复制
  • 真正的并行复制,行级
  • 用户可以直接连接集群,使用感受上与MySQL完全一致

优势:

  • 因为是多主,所以不存在Slavelag(延迟)
  • 不存在丢失事务的情况
  • 同时具有读和写的扩展能力
  • 更小的客户端延迟
  • 节点间数据是同步的,而 Master/Slave 模式是异步的,不同 slave 上的 binlog 可能是不同的

以下总结搭建过程,以及遇到的问题。

一、材料准备:

linux系统:cat /proc/version 查看版本Debian 8.3.0-6 promox ve的版本

数据库版本:10.3.38-MariaDB(需要安装同一版本)

节点1:192.168.1.131

节点2:192.168.1.132

节点3:192.168.1.133

安装的软件包:

apt install -y mariadb mariadb-server mariadb-common galera rsync

galera官网安装视频:

installing galera vedio

二、安装数据库版本时遇到的问题:

一台服务器的mariadb版本10.5,另一台的版本是10.3,配置完启动后,没有进行数据同步。于是将10.5版本卸载,安装10.3版本。本来是挺简单的事,卸载--查看版本--安装指定版。结果提示无法安装,提示部分包无法安装。

bash 复制代码
root@: apt-get remove --auto-remove mariadb-server
root@: apt search mariadb-server 
正在排序... 完成
全文搜索... 完成
mariadb-server/oldstable,now 1:10.3.38-0+deb10u1 all [已安装]
  MariaDB database server (metapackage depending on the latest version)
mariadb-server-10.3/oldstable,now 1:10.3.38-0+deb10u1 amd64 [已安装,自动]
  MariaDB database server binaries
mariadb-server-core-10.3/oldstable,now 1:10.3.38-0+deb10u1 amd64 [已安装,自动]
root@: apt-get install mariadb-server=10.3.38

后来分析一下,应该是回退至低版本,相应的依赖包是高版本,无法回退至低版本。于是我做了如下的操作:

  1. 配置apt源,添加清华源pve依赖包
bash 复制代码
deb http://deb.debian.org/debian/ buster main
deb http://deb.debian.org/debian/ buster-updates main contrib non-free
deb http://security.debian.org/debian-security buster/updates main
#清华源pve依赖包
deb https://mirrors.tuna.tsinghua.edu.cn/proxmox/debian/pve buster pve-no-subscription
  1. apt update和apt upgrade,一番系统更新之后,改用aptitude install -y mariadb-server=10.3.38

提示需安装100多个包。最后终于安装mariadb-server及相应的依赖应安装下去。

三、配置mariadb可远程访问

主要三步操作:

  1. 在/etc/mysql/mariadb.conf.d/50-server.cnf ,将127.0.0.1注释掉;
  1. 使用grant给root赋权;

grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;

或者使用mysql_secure_installation 设置root权限和密码

3、查看root是否赋值成功

bash 复制代码
root@:# mysql -u root
MariaDB [(none)]> user mysql
select host,password,user from user;
+-----------+-------------------------------------------+------+
| host      | password                                  | user |
+-----------+-------------------------------------------+------+
| localhost |                                           | root |
| %         | *1B29504121B3B0BD0511F27DD632AF519B3AAFF2 | root |
+-----------+-------------------------------------------+------+

可参考:Mysql创建用户和授权

四、防火墙放通端口

galera端口4444,4567,4568等3个端口,mariadb端口3306,均需要放通可访问。

3306:对于使用mysqldump方法的MySQL客户端连接和状态快照传输。

4567:对于在此端口上同时使用UDP和TCP的Galera Cluster复制流量和多播复制。

4568:增量状态转移。

4444:用于所有其他状态快照转移。

以下用放通3306为例,其他端口访照。

bash 复制代码
#仅放通端口访问
root@:firewall-cmd --permanent --zone=public --add-port=3306/tcp
root@:iptables -I INPUT -p tcp  --dport 3306 -j ACCEPT
#对部分ip段可访问
root@:firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="10.245.182.0/24" port port="4444" protocol="tcp" accept"
root@:iptables -I INPUT s 192.168.1.0/24 -p tcp  --dport 3306 -j ACCEPT

五、配置第一个节点

1、关闭数据库,新建配置文件:
bash 复制代码
root@:/etc/mysql/mariadb.conf.d# cat galara.conf
[mysqld]
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
binlog_format=row
default-storage-engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
wsrep_cluster_name=node101
wsrep_cluster_address="gcomm://192.168.1.101,192.168.1.102,192.168.1.103"
wsrep_sst_method=rsync   
wsrep_node_address=192.168.1.101
wsrep_node_name=node101

相应的说明如下:

wsrep_on:在10.1以上版本的mariadb中,该参数的默认值为OFF,意为该节点的事务将不会发送给集群中的其他节点;

wsrep_provider:wsrep库的路径,请自行确认;

wsrep_cluster_name:集群名称,可自定义;

wsrep_cluster_address:第一个启动的节点务必设置为以上代码中的值;

wsrep_node_address:定义本节点的wsrep地址与端口,默认端口为4567;

wsrep_sst_receive_address:定义本节点接受传入请求的域名或IP,可附带端口,默认的端口根据wsrep_sst_method定义的快照传输方式的不同而不同;

wsrep_node_name:本节点名称,在集群中需唯一;

wsrep_sst_auth:快照传输方式的验证信息;

wsrep_sst_method:定义快照传输方式;

bind-address:数据库监听的IP地址。

默认情况下,wsrep会监听TCP 4567端口,当有新节点加入时,新节点会通过wsrep_cluster_address中设定的节点信息,拉取该节点的信息。

当没有设定wsrep_node_address或wsrep_sst_receive_address,galera将监听数据库bind-address中设定的IP地址,如果没有设定bind-address,则监听默认的IP地址。

如果mariadb服务器有多个IP地址,则可以通过上面两个变量设定监听特定的IP地址或端口。例如在腾讯云环境中,系统中的IP地址为10开头的内网IP,公网请求则通过NAT的方式传入,此时就需要设定上面的两个变量,指定域名或公网IP,否则galera集群将无法正常工作。

如果内网IP可达,则无需设定上面两个变量。

wsrep_sst_method可以设定不同的数据库同步方式,默认是使用rsync,请根据实际情况设定并在防火墙中放行特定的端口。

2、启动节点:

要调出第一个节点,我们需要使用特殊的启动脚本。每个联机的节点都尝试连接到其galera.cnf文件中指定的至少一个其他节点以获取其初始状态。如果不使用galera_new_cluster允许systemd传递--wsrep-new-cluster参数的脚本,则systemctl start mariadb会失败,因为没有节点为第一个节点连接而运行。

bash 复制代码
root@: galera_new_cluster
#或者
root@: service  mariadb start --wsrep-new-cluster

当此脚本成功时,该节点将注册为集群的一部分,我们可以使用以下命令查看它:

bash 复制代码
mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 1     |
+--------------------+-------+

六、配置第二三个节点

1、关闭数据库,新建配置文件:

配置与第五点一致,只需改下ip地址即可。

2、启动节点:

在剩余的节点上,我们可以正常启动mysql。他们将搜索联机的集群列表中的任何成员,当他们找到时,他们将加入集群。此时提示出错,访问4567端口超时 timed out。

使用telnet 192.168.1.101 4567却提示成功。

bash 复制代码
root@: systemctl start mariadb
root@: /var/log/mysql/error.log
2023-03-24 14:13:40 0 [Note] WSREP: (01000ffc, 'tcp://0.0.0.0:4567') connection to peer ba874568 with addr tcp://192.168.1.101:4567 timed out, no messages seen in PT3S
root@: 

http://www.manongjc.com/detail/51-wuuvpeghvirjjrp.html

https://zhuanlan.zhihu.com/p/46675331

MariaDB Galera集群部署 - 凡是过往皆为序章 - 博客园

MariaDB Galera集群入门教程-腾讯云开发者社区-腾讯云

相关推荐
Linux运维老纪4 分钟前
K8s —基础指南(K8s - Basic Guide)
运维·服务器·云原生·容器·kubernetes·运维开发
s_little_monster22 分钟前
【Linux】进程地址空间
linux·运维·服务器·经验分享·笔记·学习·学习方法
dxt_snow24 分钟前
Centos7系统安装redis
数据库·redis·缓存
NLstudy331 小时前
declare和less
linux·运维·服务器
Merlin-Ice1 小时前
Unity Shader Feature
服务器·前端·unity
forestqq1 小时前
全网首个详细案例:zabbix7.2 对比老版本API认证方法更新适配实战说明
运维·docker·zabbix
狂笑韦恩2 小时前
Ubuntu 作为 FTP 服务器,Windows 作为 FTP 客户端
linux·服务器·ubuntu
0wioiw02 小时前
Python基础(SQLAlchemy)
java·开发语言·数据库
风雨飘逸2 小时前
【shell&bash进阶系列】(四)SHELL脚本--变量(基础)
linux·运维·服务器·开发语言·经验分享·bash
CodeJourney.2 小时前
DeepSeek 关联 Word 使用教程:解锁办公新效率
数据库·人工智能·算法