目录
前言
先来了解下它的身世,Galera Cluster是Codership公司开发的一套免费开源的高可用方案,官网为http://galeracluster.com。Galera Cluster即为安装了Galera的Mariadb集群(本文只介绍Mariadb Garela集群)。其本身具有multi-master特性,支持多点写入。Galera Cluster的三个(或多个)节点是对等关系,每个节点均支持写入,集群内部会保证写入数据的一致性与完整性。下面是这个架构的一些特性:
• 真正的多主集群,Active-Active架构;
• 同步复制,没有复制延迟;
• 多线程复制;
• 没有主从切换操作,无需使用虚IP;
• 热备份,单个节点故障期间不会影响数据库业务;
• 支持节点自动加入,无需手动拷贝数据;
• 支持InnoDB存储引擎;
• 对应用程序透明,原生MySQL接口;
• 无需做读写分离;
• 部署使用简单。
安装部署
环境说明
系统:centos7.7 galera1:192.168.191.128 galera2:192.168.191.129 galera3:192.168.191.130
安装操作
1)上传带有galera补丁的数据库包,这里给大家搞好了 ~~ 点我点我
###三台节点同时进行以下操作
[root@galera1 ~]# yum -y install lrzsz vim #工具包
[root@galera1 ~]# mkdir galera
[root@galera1 ~]# cd galera
2)对了要把系统默认关于数据库的一切全部卸载
#三台节点同时进行以下操作
[root@galera1 galera]# rpm -qa | grep mariadb
mariadb-libs-5.5.56-2.el7.x86_64
[root@galera1 galera]# rpm -e mariadb-libs-5.5.56-2.el7.x86_64 --nodeps #强制卸载
3)关闭防火墙
##三台节点同时进行以下操作
[root@galera1 galera]# setenforce 0;systemctl stop firewalld
4)安装
##三台节点同时进行以下操作
[root@galera1 galera]# yum -y install mysql-wsrep-client-5.7-5.7.31-25.23.el7.x86_64.rpm mysql-wsrep-common-5.7-5.7.31-25.23.el7.x86_64.rpm mysql-wsrep-devel-5.7-5.7.31-25.23.el7.x86_64.rpm mysql-wsrep-libs-5.7-5.7.31-25.23.el7.x86_64.rpm mysql-wsrep-libs-compat-5.7-5.7.31-25.23.el7.x86_64.rpm mysql-wsrep-server-5.7-5.7.31-25.23.el7.x86_64.rpm mysql-wsrep-test-5.7-5.7.31-25.23.el7.x86_64.rpm #先安依赖
[root@galera1 galera]# yum -y install galera-3-25.3.31-1.el7.x86_64.rpm mysql-wsrep-5.7-5.7.31-25.23.el7.x86_64.rpm ##这是有galera补丁的数据库
5)先启动数据库,给节点三兄弟配个集群通信账号(重点哦~)
##三台节点同时进行以下操作
[root@galera1 galera]# systemctl start mysqld
[root@galera1 galera]# systemctl status mysqld #状态running启动成功
[root@galera1 galera]# new=`grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}'`;mysqladmin -p"$new" password "Hxb@6666" #设置数据库root的密码
[root@galera1 galera]# mysql -uroot -pHxb@6666 #登录数据库
mysql> grant all on *.* to hya@"%" identified by 'Hya@6666'; #授权创建数据库账户
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges; ##刷新权限
Query OK, 0 rows affected (0.00 sec)
6)修改数据库配置文件,创建galera集群(这个是重点很容易出错)
###第一台节点先配置
[root@galera1 galera]# vim /etc/my.cnf #最下面添加
server-id=1 #三个节点id不能一样
binlog_format=row
default_storage_engine=InnoDB
innodb_file_per_table=1
innodb_autoinc_lock_mode=2
wsrep_on=ON
wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so
wsrep_cluster_name='galera' #集群名称
wsrep_cluster_address='gcomm://' #第一个节点配置时暂时不加入ip,表示新创建集群的意思,一但加ip会报配置文件错误。需要在后续集群创建完成加入各个节点后在回来填写ip
wsrep_node_name='galera1' #集群中这个节点的名称不不能与其他节点重复
wsrep_node_address='192.168.191.128'
wsrep_sst_auth=hya:"Hya@6666"
wsrep_sst_method=rsync #注意没有rsync需要yum下载
[root@galera1 galera]# systemctl restart mysqld ##重启数据库
[root@galera1 galera]# mysql -uroot -pHxb@6666
mysql> show status like 'wsrep_incoming%'; #galera集群创建成功目前只有一个节点
+--------------------------+----------------------+
| Variable_name | Value |
+--------------------------+----------------------+
| wsrep_incoming_addresses | 192.168.191.128:3306 |
+--------------------------+----------------------+
1 row in set (0.01 sec)
###第二台节点配置如下
[root@galera2 galera]# vim /etc/my.cnf
server-id=2
binlog_format=row
default_storage_engine=InnoDB
innodb_file_per_table=1
innodb_autoinc_lock_mode=2
wsrep_on=ON
wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so
wsrep_cluster_name='galera'
wsrep_cluster_address='gcomm://192.168.191.128,192.168.191.130' ##这里的ip要写第一台节点的ip,作用用于引导此节点加入galera集群。如果空着不写表示新创建集群
wsrep_node_name='galera2'
wsrep_node_address='192.168.191.129'
wsrep_sst_auth=hya:"Hya@6666"
wsrep_sst_method=rsync
[root@galera2 galera]# systemctl restart mysqld
[root@galera2 galera]# mysql -uroot -pHxb@6666
mysql> show status like 'wsrep_incoming%'; ##此时galera集群中已加入此节点
+--------------------------+-------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------+
| wsrep_incoming_addresses | 192.168.191.129:3306,192.168.191.128:3306 |
+--------------------------+-------------------------------------------+
1 row in set (0.01 sec)
###第三台节点配置如下
[root@galera3 galera]# vim /etc/my.cnf
server-id=3
binlog_format=row
default_storage_engine=InnoDB
innodb_file_per_table=1
innodb_autoinc_lock_mode=2
wsrep_on=ON
wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so
wsrep_cluster_name='galera'
wsrep_cluster_address='gcomm://192.168.191.128,192.168.191.129' ##引导地址写前两个节点的ip
wsrep_node_name='galera3'
wsrep_node_address='192.168.191.130'
wsrep_sst_auth=hya:"Hya@6666"
wsrep_sst_method=rsync
[root@galera3 galera]# systemctl restart mysqld
[root@galera3 galera]# mysql -uroot -pHxb@6666
mysql> show status like 'wsrep_incoming%'; ##此时三台节点已加入
+--------------------------+----------------------------------------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------------------------------------+
| wsrep_incoming_addresses | 192.168.191.129:3306,192.168.191.128:3306,192.168.191.130:3306 |
+--------------------------+----------------------------------------------------------------+
1 row in set (0.00 sec)
########最后我们在把三个节点的引导地址配置完全
只改一行,三台节点依次修改,改一台节点需重启一次数据库服务,不能等全部改完一起重启,切记!
[root@galera1 galera]# vim /etc/my.cnf
wsrep_cluster_address='gcomm://192.168.191.129,192.168.191.130,192.168.191.128'
[root@galera1 galera]# systemctl restart mysqld
mysql> show status like 'wsrep_incoming%'; #仍然为三节点
+--------------------------+----------------------------------------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------------------------------------+
| wsrep_incoming_addresses | 192.168.191.129:3306,192.168.191.128:3306,192.168.191.130:3306 |
+--------------------------+----------------------------------------------------------------+
1 row in set (0.35 sec)
7)测试集群
###这里我简单的测试下,实际情况我已测试过多边。此处只做演示
[root@galera1 galera]# mysql -uroot -pHxb@6666 #节点1
mysql> create database hya;
Query OK, 1 row affected (0.01 sec)
[root@galera2 galera]# mysql -uroot -pHxb@6666 #节点2
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hya |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
[root@galera3 galera]# mysql -uroot -pHxb@6666
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hya |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
Haproxy代理部分
环境
centos:7.7 三个数据库节点上全部安装haproxy
安装配置
1)安装haproxy修改配置文件
###三台节点同时进行以下操作
[root@galera1 galera]# yum -y install haproxy
[root@galera1 galera]# haproxy -v #查看haproxy版本
HA-Proxy version 1.5.18 2016/05/10
[root@galera1 galera]# systemctl enable haproxy #开机自启
[root@galera1 galera]# vim /etc/haproxy/haproxy.cfg #改haproxy的配置文件
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode tcp
log global
retries 3
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout check 10s
maxconn 3000
frontend mysql-cluster
bind 192.168.191.100:3380
mode tcp
log global
default_backend mysqls
backend mysqls
mode tcp
balance roundrobin
option tcp-check
server galera1 192.168.191.128:3306 check
server galera2 192.168.191.129:3306 check
server galera3 192.168.191.130:3306 check
listen admin_stats
stats enable
bind *:81 #监听的ip端口号
mode http #开关
stats refresh 10s #统计页面自动刷新时间
stats uri /admin #访问的uri ip:81/admin
stats auth admin:admin #认证用户名和密码
[root@galera1 galera]# haproxy -f /etc/haproxy/haproxy.cfg -c #检查配置文件的正确性
Configuration file is valid
[root@galera1 galera]# scp /etc/haproxy/haproxy.cfg 192.168.191.129:/etc/haproxy/haproxy.cfg #三台代理的配置文件一样这里我直接cp过去
[root@galera1 galera]# scp /etc/haproxy/haproxy.cfg 192.168.191.130:/etc/haproxy/haproxy.cfg
2)这个操作一定要有,不然无法启动haproxy
###三台节点都要进行以下操作
[root@galera1 galera]# vim /etc/sysctl.conf # 允许haproxy 监听本地不存在IP,防止因配置文件绑定VIP而haproxy无法监听非本地IP而导致的错误,例如:'cannot bind socket'
net.ipv4.ip_nonlocal_bind=1
[root@galera1 galera]# sysctl -p #立即生效
net.ipv4.ip_nonlocal_bind = 1
3)配置日志
###三个节点同时进行以下操作
[root@galera1 galera]# vim /etc/rsyslog.conf
# 开启UDP监听模式,即去掉下面两行前面的注释
$ModLoad imudp
$UDPServerRun 514
local2.* /var/log/haproxy.log #此行在最下面操作
[root@galera1 galera]# vim /etc/sysconfig/rsyslog
SYSLOGD_OPTIONS="-r -m 2 -c 2"
[root@galera1 galera]# touch /var/log/haproxy.log
4)启动服务
###三台节点同时进行以下操作
[root@galera1 galera]# systemctl restart haproxy;systemctl restart rsyslog
[root@galera1 galera]# systemctl status haproxy
Keepalived高可靠部分
环境
当然了环境还是原来的环境,在三台节点上安装keepalived就可以了!!这里keepaived的功能主要是检测haproxy是否正常在工作,如果未工作则自动关闭自己使得ip跳转到第二代理!
安装配置
1)下载keepalived
###三台节点同时进行以下操作
[root@galera1 galera]# yum -y install keepalived
[root@galera1 galera]# systemctl enable keepalived
2)配置keepalived
###三台节点同时进行操作
[root@galera1 galera]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
vrrp_script check_haproxy {
script "/root/chk_haproxy.sh"
interval 2
weight 2
}
vrrp_instance VI {
state MASTER ##另外两台应改为BACKUP
interface ens33
advert_int 1
nopreempt
virtual_router_id 100
priority 100 ###另外两台节点的权重要改小
virtual_ipaddress {
192.168.191.100
}
track_script {
check_haproxy
}
}
2.1)chk_haproxy.sh脚本
[root@galera1 ~]# cat chk_haproxy.sh
#!/bin/bash
A=`ps -C haproxy --no-header |wc -l`
if [ $A -eq 0 ];then
systemctl stop keepalived
fi
[root@galera1 ~]# chmod +x chk_haproxy.sh #给脚本一个执行权限
3)启动keepalived服务并测试
###所有节点配置完成后,启动keepalived服务
[root@galera1 ~]# systemctl start keepalived
[root@galera1 ~]# systemctl status keepalived
[root@galera1 ~]# ip a ##虚拟ip已出现
inet 192.168.191.100/32 scope global ens33
测试
1)连接测试,这里我使用工具通过虚拟ip来远程连接数据库来测试是否可行!
上图的报错,情况可能有以下几种:
1.ip,端口,账号,密码输入有误
2.此数据库账号没有允许远程登录
3.仅允许一个连接(我本地正在连接,其它渠道则无法连接)
##通过排查我发现出错的原因是第二条,以下操作可以解决问题
[root@galera1 ~]# mysql -pHxb@6666
mysql> grant all on *.* to root@'%' identified by 'Hxb@6666'; #允许root用户远程连接
Query OK, 0 rows affected, 1 warning (0.02 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
2)可视化观察
观察上图,通过haproxy的web页面观察,此时的数据库集群已经运行近30分钟,且负载无异常
总结
使用到现在暂时没有发现什么问题。后续如果有问题的话我会在更新。