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 "\r"; exp_continue} "Y/n" { send "Y\r" ; exp_continue} "password:" { send "$DBPass\r"; exp_continue} "new password:" { send "$DBPass\r"; exp_continue} "Y/n" { send "Y\r" ; 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
。