mysql高可用方案(galera+haproxy+keepalived)

一,服务器基础配置

准备3台主机,系统centos7

node1 192.168.59.132
node2 192.168.59.133
node3 192.168.59.134

1,新建系统用户

①,新建用户prefma

adduser prefma
passwd prefma
chmod -v u+w /etc/sudoers #赋予读写权限
vim /etc/sudoers

②,修改sudoers文件

vim /etc/sudoers
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
prefma ALL=(ALL) ALL #这个是新用户

③,收回文件权限

chmod -v u-w /etc/sudoers

1,配置centos7国内源(阿里源)

yum instal -y wget
yum repolist
cd /etc/yum.repos.d
sudo mv CentOS-Base.repo CentOS-Base.repo.bak
sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache
yum repolist
yum -y update 

分别在三台服务器执行以下操作:

2,关闭防火墙

systemctl disable firewalld 
systemctl stop firewalld
sed -ri '/SELINUX=/cSELINUX=disabled' /etc/selinux/config
setenforce 0

3,配置yum源

cat >>/etc/yum.repos.d/galera.repo<<EOF
[galera1]
name=galera1
baseurl=http://releases.galeracluster.com/mysql-wsrep-5.7/centos/7/x86_64/
gpgcheck=0
[galera2]
name=galera2
baseurl=http://releases.galeracluster.com/galera-3/centos/7/x86_64/
gpgcheck=0
EOF

二,安装mysql和galera插件

分别在三台服务器执行以下:1,2,3

1,安装mysql

yum repolist
yum list | egrep "wsrep|galera"
yum -y install mysql-wsrep-server-5.7.x86_64  rsync galera-3.x86_64 -y

2,启动mysqld

启动mysql,设置开机自启,设置root密码为Df@1211!

systemctl start mysqld
systemctl enable mysqld
oldpass=$(grep "temporary password" /var/log/mysqld.log | awk '{print $NF}')
mysqladmin -uroot -p"$oldpass" password 'Df@1211!'

3,创建用于数据同步的用户

mysql -u root -p  -e "grant all on *.* to 'copy'@'192.168.59.%' identified by 'Df@1211#'"
mysql -u root -p  -e "flush privileges;"

4,非必须操作,更换mysql数据存储路经

①移动数据存储路经并授权

mv /var/lib/mysql /home
chown -R mysql:mysql /home/mysql

②修改mysql配置文件

vim /etc/my.cnf

修改如下两行配置

datadir=/home/mysql
socket=/home/data/mysql/mysql.sock

末尾添加,

[mysql]
socket=/home/mysql/mysql.sock

以下操作三台服务器分开执行

5,安装galera插件,修改配置文件

① node1 192.168.59.132 主机执行

注意:node定义刚开始定义集群是wsrep_cluster_address=“gcomm://”,等三台服务器全部配置好之后,
这个地址需要修改wsrep_cluster_address=“gcomm://192.168.59.132,192.168.59.133,192.168.59.134”,然后重启Mysql服务,

注意:以下内容追加到/etc/my.cnf文件中 [mysqld]下面,千万别加到[mysql]下面,否则会报错

#vim /etc/my.cnf
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
wsrep_on=ON
wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so
wsrep_cluster_address="gcomm://"
wsrep_cluster_name="test"
wsrep_node_address="192.168.59.132"
wsrep_node_name="node1"
wsrep_sst_auth=copy:Df@1211#
wsrep_sst_method=rsync

重启mysqld服务器:

systemctl restart mysqld

验证端口状态:

ss -anltup | egrep "3306|4567"
② node2 192.168.59.133 主机执行
#vim /etc/my.cnf
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
wsrep_on=ON
wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.59.132,192.168.59.133"
wsrep_cluster_name="test"
wsrep_node_address="192.168.59.133"
wsrep_node_name="node2"
wsrep_sst_auth=copy:Df@1211#
wsrep_sst_method=rsync

重启mysqld服务器:

systemctl restart mysqld

验证端口状态:

ss -anltup | egrep "3306|4567"
③ node3 192.168.59.134 主机执行
#vim /etc/my.cnf
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
wsrep_on=ON
wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.59.132,192.168.59.133,192.168.59.134"
wsrep_cluster_name="test"
wsrep_node_address="192.168.59.134"
wsrep_node_name="node3"
wsrep_sst_auth=copy:Df@1211#
wsrep_sst_method=rsync

重启mysqld服务器:

systemctl restart mysqld

验证端口状态:

ss -anltup | egrep "3306|4567"

三台主机配置完成后,查看集群状态
登录mysql

mysql -u root -p

查看集群状态

show status like 'wsrep%';

在这里插入图片描述
测试链接
先授权用户允许远程登录权限,登录mysql ,执行

grant all privileges on *.* to root@'%' identified by 'Dd@1211#'

用数据库连接工具本地连接测试
地址:192.168.59.132 端口:3306 账号:root 密码:Dd@1211#
地址:192.168.59.133 端口:3306 账号:root 密码:Dd@1211#
地址:192.168.59.134 端口:3306 账号:root 密码:Dd@1211#

5,万一集群全部挂掉,需要重启集群(一般生产环境很少遇到,贴在此处以备不时之需):

1,停止所有节点的mysql服务

systemctl stop mysqld

2,找一台节点作为master重新启动mysql

启动之前修改文件

vim /var/lib/mysql/grastate.dat 

中间的seqno: -1 改成 seqno: 1

safe_to_bootstrap: 0 改成 safe_to_bootstrap: 1

保存退出

随之启动mysql服务:

mysqld --user=root --wsrep-new-cluster --wsrep-cluster-address='gcomm://' &

注意:这里为了让其他节点复活,临时启动了mysql服务,待会记得其他节点启动好之后重启mysql服务!重启之前记得把临时启动的进程杀掉哦。

3,其他节点执行

systemctl start mysqld

三,安装Haproxy代理

三台节点同时进行以下操作

1,安装haproxy并设置开机自启

yum -y install haproxy
systemctl enable haproxy

2,修改haproxy的配置文件

vim /etc/haproxy/haproxy.cfg

替换为以下内容

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.59.100:3380
    mode tcp
    log global
    default_backend mysqls
 
backend mysqls
    mode tcp
    balance     roundrobin
    option      tcp-check
    server      galera1   192.168.59.132:3306 check
    server      galera2   192.168.59.133:3306 check
    server      galera3   192.168.59.134: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  #认证用户名和密码

检查配置文件的正确性

haproxy -f /etc/haproxy/haproxy.cfg -c 

允许haproxy 监听本地不存在IP,防止因配置文件绑定VIP而haproxy无法监听非本地IP而导致的错误,例如:‘cannot bind socket’

[root@galera1 galera]# vim /etc/sysctl.conf  
net.ipv4.ip_nonlocal_bind=1
[root@galera1 galera]# sysctl -p   #立即生效
net.ipv4.ip_nonlocal_bind = 1

配置日志
三个节点同时进行以下操作

[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

3,启动服务

#三台节点同时进行以下操作

[root@galera1 galera]# systemctl restart haproxy;systemctl restart rsyslog
[root@galera1 galera]# systemctl status haproxy

在这里插入图片描述

4,登录haproxy页面查看状态

地址:http://192.168.59.133:81/admin
账号:admin 密码:admin

四,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/check_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 ~]# vim check_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 check_haproxy.sh  

3,启动keepalived服务并测试

###所有节点配置完成后,启动keepalived服务

[root@galera1 ~]# systemctl start keepalived
[root@galera1 ~]# systemctl status keepalived
[root@galera1 ~]# ip a   

虚拟ip已出现
在这里插入图片描述


如果没有出现虚拟ip,检查keepalived配置文件中的 interface 是否是当前网卡,查看网卡ip add
我机器网卡是ens192,所以需要将配置中的interface 值改为ens192
如果是其他原因,具体定位需要看日志,keepalived日志路径:/var/log/messages

192.168.191.100 这个虚拟ip就是我们最终要链接的地址,端口配置是3380

整个过程坑还是比较多的,有遇到其他问题的同学可以留言一起讨论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值