一,服务器基础配置
准备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
整个过程坑还是比较多的,有遇到其他问题的同学可以留言一起讨论