MariaDB Galera 集群安装配置

MariaDB Galera Cluster 介绍

MariaDB Galera Cluster 是开源的 MariaDB同步多主机集群。它仅支持XtraDB/ InnoDB存储引擎。MariaDB作为Mysql的一个分支,在开源项目中已经广泛使用,例如大热的openstack,所以,为了保证服务的高可用性,同时提高系统的负载能力,集群部署是必不可少的。

主要功能:

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

优势:

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

技术:

Galera集群的复制功能基于Galeralibrary实现,为了让MySQL与Galera library通讯,特别针对MySQL开发了wsrep API。

Galera插件保证集群同步数据,保持数据的一致性,靠的就是可认证的复制,工作原理如下图: 

当客户端发出一个commit的指令,在事务被提交之前,所有对数据库的更改都会被 write-set 收集起来,并且将write-set 纪录的内容发送给其他节点。

write-set 将在每个节点进行认证测试,测试结果决定着节点是否应用write-set更改数据。

如果认证测试失败,节点将丢弃 write-set ;如果认证测试成功,则事务提交。

1 安装环境准备

安装MariaDB集群至少需要3台服务器(如果只有两台的话需要特殊配置,请参照官方文档

操作系统版本:centos7

  • controller1:192.168.0.194
  • controller2:192.168.0.195
  • controller3:192.168.0.196

为了保证节点间相互通信,需要禁用防火墙设置

在三个节点分别执行命令:

echo  '关闭selinux、防火墙'
systemctl stop firewalld.service
systemctl disable firewalld.service
firewall-cmd --state
sed -i '/^SELINUX=.*/c SELINUX=disabled' /etc/selinux/config
sed -i 's/^SELINUXTYPE=.*/SELINUXTYPE=disabled/g' /etc/selinux/config
grep --color=auto '^SELINUX' /etc/selinux/config
setenforce 0

2 安装 MariaDB Galera Cluster

  配置yum源, 所有节点:

echo "#
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
#">/etc/yum.repos.d/mariadb.repo

  所有节点安装:

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

 配置时间同步,所有节点执行:

echo  '时间同步'
[[ -f /usr/sbin/ntpdate ]] || { echo "install ntp";yum install ntp ntpdate -y &> /dev/null; } #若没NTP则安装
/usr/sbin/ntpdate ntp6.aliyun.com 
echo "*/3 * * * * /usr/sbin/ntpdate ntp6.aliyun.com  &> /dev/null" > /tmp/crontab
crontab /tmp/crontab

3 配置 MariaDB Galera Cluster

初始化数据库服务,只在controller1进行:

#声明数据库的密码作为临时变量供下面调用
DBPass=123456


#mysql_secure_installation #初始化设置密码,自动交互
[[
-f /usr/bin/expect ]] || { yum install expect -y; } #若没expect则安装 /usr/bin/expect << EOF set timeout 30 spawn mysql_secure_installation expect { "enter for none" { send " "; exp_continue} "Y/n" { send "Y " ; exp_continue} "password:" { send "$DBPass "; exp_continue} "new password:" { send "$DBPass "; exp_continue} "Y/n" { send "Y " ; exp_continue} eof { exit } } EOF

关闭数据库,修改 /etc/my.cnf.d/galera.cnf

systemctl stop mariadb

#galera配置
/usr/bin/cp /etc/my.cnf.d/galera.cnf{,.bak}
egrep -v "#|^$" /etc/my.cnf.d/galera.cnf.bak >/etc/my.cnf.d/galera.cnf
#sed -i 's/wsrep_on=1/wsrep_on=ON/' /etc/my.cnf.d/galera.cnf
#sed -i 's/wsrep_sst_auth=root:/wsrep_sst_auth=root:'$DBPass'/' /etc/my.cnf.d/galera.cnf
 vi /etc/my.cnf.d/galera.cnf

[mysqld]
wsrep_provider = /usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address = "gcomm://controller1,controller2,controller3"
wsrep_node_name = controller1
wsrep_node_address=192.168.0.194
#wsrep_provider_options="socket.ssl_key=/etc/pki/galera/galera.key; socket.ssl_cert=/etc/pki/galera/galera.crt;"

    提示:如果不用ssl的方式认证的话,请把 wsrep_provider_options 注释掉。

    将此文件复制到controller2、controller3,注意要把 wsrep_node_name 和 wsrep_node_address 改成相应节点的hostname 和 ip

4 启动 MariaDB Galera Cluster 服务

    在controller1节点启动集群

/usr/libexec/mysqld --wsrep-new-cluster --user=root &

    观察日志:

tail -f /var/log/mariadb/mariadb.log

    出现“ ready for connections” 表示启动成功

    controller2节点启动

systemctl start mariadb

  controller3节点启动

systemctl start mariadb

可以查看 /var/log/mariadb/mariadb.log,在日志可以看到节点均加入了集群中。

警告⚠:--wsrep-new-cluster 这个参数只能在初始化集群使用,且只能在一个节点使用。

5 查看集群状态

mysql -u root -p123456 -e "show status like 'wsrep_cluster_size';"

+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 3 |
+--------------------+-------+

6 验证数据同步

controller1节点创建数据库

mysql  -uroot  -p123456  -e  "create database galera_test"

controlelr2 controller3节点查看

mysql  -uroot  -proot  -e  "show databases"

如果都有刚才新建的数据库表示同步成功

MariaDB Galera Cluster 已经成功部署。

7 排错

# #排错
# #关闭selinux、防火墙
# tail /var/log/mariadb/mariadb.log
# rm -f /var/lib/mysql//galera.cache
# #关闭群集后,重启
# #在其中一台
# sed -i 's#seqno: -1#seqno: 1#' /var/lib/mysql/grastate.dat
# galera_new_cluster #启动第一个节点
# #其它节点
# systemctl start mariadb

#test
#/usr/libexec/mysqld --wsrep-new-cluster --user=root &
#systemctl start mariadb.service
#设置开机启动,设置为第一个节点
# systemctl disable mariadb.service
# echo '#作为第一个节点启动SQL
# /usr/bin/galera_new_cluster
# sleep 5
# ssh controller2 "systemctl start mariadb.service"
# ssh controller3 "systemctl start mariadb.service"
# sleep 3
# systemctl restart mariadb.service
# '>>/etc/rc.local
原文地址:https://www.cnblogs.com/fang888/p/8258807.html