安装mariadb+galera搭建数据库集群
记一次安装mariadb+galera搭建数据库集群过程。
背景:使用单机mariadb数据库提供服务,存在数据无实时备份,数据服务器无切换等问题,无法应对服务器故障停服,无法持续提供数据服务的情况。之前使用几种方法解决
-
mysqldump每天定时将数据打包备份,但库表数据量变大时,硬盘空间也成了问题。
-
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版本。本来是挺简单的事,卸载--查看版本--安装指定版。结果提示无法安装,提示部分包无法安装。
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
后来分析一下,应该是回退至低版本,相应的依赖包是高版本,无法回退至低版本。于是我做了如下的操作:
-
配置apt源,添加清华源pve依赖包
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
-
apt update和apt upgrade,一番系统更新之后,改用aptitude install -y mariadb-server=10.3.38
提示需安装100多个包。最后终于安装mariadb-server及相应的依赖应安装下去。
三、配置mariadb可远程访问
主要三步操作:
-
在/etc/mysql/mariadb.conf.d/50-server.cnf ,将127.0.0.1注释掉;
-
使用grant给root赋权;
grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
或者使用mysql_secure_installation 设置root权限和密码
3、查看root是否赋值成功
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为例,其他端口访照。
#仅放通端口访问
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、关闭数据库,新建配置文件:
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会失败,因为没有节点为第一个节点连接而运行。
root@: galera_new_cluster
#或者
root@: service mariadb start --wsrep-new-cluster
当此脚本成功时,该节点将注册为集群的一部分,我们可以使用以下命令查看它:
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却提示成功。
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集群入门教程-腾讯云开发者社区-腾讯云