一、环境
四台centos7虚拟机,mysql版本:Mysql5.7
192.168.7.80 (mysql1)
192.168.7.81 (mysql2)
192.168.7.82 (haproxy+keepalived)
192.168.7.83 (haproxy+keepalived)
192.168.7.78 (vip)
二、设置
1、关闭防火墙和SELINUX(4台虚拟机)
关闭防火墙:systemctl stop firewalld
禁止开机启动:systemctl disable firewalld
查看防火墙状态:firewall-cmd --state或systemctl status firewalld
查看SELinux的状态:getenforce
临时关闭:setenforce 0
永久关闭:vi /etc/selinux/config
将SELINUX=enforcing改为SELINUX=disabled 重启生效
2、设置yum源(4台虚拟机)
进入yum的文件夹:cd /etc/yum.repos.d/
删除yum文件夹所有yum源:rm -rf /etc/yum.repos.d/*.repo
利用wget下载阿里云repo文件:wget http://mirrors.aliyun.com/repo/Centos-7.repo
执行yum源更新命令:
yum clean all
yum makecache
yum仓库有多少包:yum repolist
三、安装mysql
1、安装mysql(7.80、7.81)
方法一:(慢,不建议使用)
下载MySQL源安装包
sudo wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
安装MySQL源
sudo yum localinstall mysql57-community-release-el7-8.noarch.r
检查MySQL源是否安装成功
sudo yum repolist enabled | grep "mysql.*-community.*"
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
注意:这一步很重要,不然下面安装mysql-community-common会失败,提示公钥尚未安装,失败的安装
安装MySQL
sudo yum install mysql-community-server
方法二:(快速,建议使用)
参考:https://blog.csdn.net/weixin_39530437/article/details/113334579
官网下载四个安装包:
mysql-community-common-5.7.38-1.el7.x86_64.rpm
mysql-community-libs-5.7.38-1.el7.x86_64.rpm
mysql-community-client-5.7.38-1.el7.x86_64.rpm
mysql-community-server-5.7.38-1.el7.x86_64.rpm
将安装包上传到/root/目录下,运行下列命令
rpm -ivh mysql-community-common-5.7.38-1.el7.x86_64.rpm --force --nodeps
rpm -ivh mysql-community-libs-5.7.38-1.el7.x86_64.rpm --force --nodeps
rpm -ivh mysql-community-client-5.7.38-1.el7.x86_64.rpm --nodeps
rpm -ivh mysql-community-server-5.7.38-1.el7.x86_64.rpm --force --nodeps
2、启动MySQL服务
sudo systemctl start mysqld
查看MySQL的启动状态
sudo systemctl status mysqld或者sudo ps -le | grep mysqld
开机启动mysql
sudo systemctl enable mysqld
sudo systemctl daemon-reload(重新加载某个服务的配置文件,如果新安装了一个服务,归属于 systemctl 管理,要使新服务的服务程序配置文件生效,需重新加载)
3、修改 MySQL 中 root 本地登录密码
mysql安装完成之后,在/var/log/mysqld.log文件中给root生成了一个默认密码。通过以下命令找到密码:sudo grep 'temporary password' /var/log/mysqld.log
登录MySQL
mysql -u root -p
修改root用户密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Lr12345!';
或set password for 'root'@'localhost'=password('Lr12345!');
4、允许远程登录
开启root用户远程连接(任意IP都可以访问)
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Lr12345!' WITH GRANT OPTION;
刷新MySQL的系统权限相关表
flush privileges;
5、Mysql主主复制
(1)修改mysql配置文件
在7.80和7.81的MySQL配置文件/etc/my.cnf分别增加下面这一段。
7.80
server-id=80 #任意自然数n,只要保证两台MySQL主机不重复就可以了。
log-bin=mysql-bin #开启二进制日志
auto_increment_increment=2 #步进值auto_imcrement。一般有n台主MySQL就填n
auto_increment_offset=1 #起始值。一般填第n台主MySQL。此时为第一台主MySQL
replicate-do-db=aa #要同步的数据库,默认所有库
7.81
server-id=81
log-bin=mysql-bin
auto_increment_increment=2
auto_increment_offset=2
replicate-do-db=aa
保存后,重启mysql服务
sudo systemctl restart mysqld
或sudo service mysqld restart
(2)配置192.168.7.80主从复制,7.80为主,7.81为从
查看主mysql(7.80)二进制日志
mysql> show master status;
在从mysql(7.81)告知二进制文件名与位置
mysql> change master to
-> master_host='192.168.7.80',
-> master_user='root',
->master_password='Lr12345!',
->master_log_file='mysql-bin.000001',
-> master_log_pos=154;
查看结果
mysql> start slave;
mysql> show slave status\G;
验证主从同步
192.168.7.80主MySQL操作:
mysql>create database aa;
mysql>use aa;
mysql>create table tab1(id int auto_increment,name varchar(10),primary key(id));
mysql>show databases;
mysql>show tables;
(3)反过来,配置192.168.7.81主从复制,即7.81为主,7.82为从
与小节2配置192.168.7.80主从复制类似
四、安装haproxy(7.82、7.83)
1、安装haproxy
sudo yum install -y haproxy
2、配置haproxy.cfg
sudo vi /etc/haproxy/haproxy.cfg
内容如下:
global
log 127.0.0.1 local2 #日志定义级别
chroot /var/lib/haproxy #当前工作目录
pidfile /var/run/haproxy.pid #进程id
maxconn 4000 #最大连接数
user haproxy #运行改程序的用户
group haproxy
daemon #后台形式运行
stats socket /var/lib/haproxy/stats
defaults
mode tcp #haproxy运行模式(http | tcp | health)
log global
option dontlognull
option redispatch #serverId对应的服务器挂掉后,强制定向到其他健康的服务器
retries 3 #三次连接失败则服务器不用
timeout http-request 10s
timeout queue 1m
timeout connect 10s #连接超时
timeout client 1m #客户端超时
timeout server 1m #服务器超时
timeout http-keep-alive 10s
timeout check 10s #心跳检测
maxconn 600 #最大连接数
listen stats #配置haproxy状态页(用来查看的页面)
mode http
bind :5000
stats enable
stats hide-version #隐藏haproxy版本号
stats uri /haproxy #一会用于打开状态页的uri
stats realm Haproxy\ Statistics #输入账户密码时的提示文字
stats auth admin:admin #用户名:密码
frontend main
bind 0.0.0.0:3306
default_backend mysql
backend mysql
balance leastconn #使用最少连接方式调度
server mysql1 192.168.7.80:3306 check port 3306 maxconn 300
server mysql2 192.168.7.81:3306 check port 3306 maxconn 300
3、启动haproxy
启动haproxy服务
sudo service haproxy start
开机启动haproxy
sudo chkconfig haproxy on
4、配置启动日志
sudo vi /etc/rsyslog.conf
去掉注释
$ModLoad imtcp
$InputTCPServerRun 514
增加这一行
local2.* /var/log/haproxy.log
重启rsyslog
sudo service rsyslog restart
5、测试haproxy
http://192.168.7.82:5000/haproxy
http://192.168.7.83:5000/haproxy
五、安装keepalived
1、安装keepalived
sudo yum install -y keepalived
2、配置keepalived
sudo vi /etc/keepalived/keepalived.conf
7.82内容如下:
! Configuration File for keepalived
#简单的头部,这里主要可以做邮件通知报警等的设置,此处就暂不配置了;
global_defs {
notificationd LVS_DEVEL
}
#预先定义一个脚本,方便后面调用,也可以定义多个,方便选择;
vrrp_script chk_haproxy {
script “/etc/keepalived/chk.sh” #具体脚本路径
interval 2 #脚本循环运行间隔
}
#VRRP虚拟路由冗余协议配置
vrrp_instance VI_1 { #VI_1 是自定义的名称;
state BACKUP
#MASTER表示是一台主设备,BACKUP表示为备用设备【我们这里因为设置为开启不抢占,所以都设置为备用】
nopreempt #开启不抢占
interface eth0 #指定VIP需要绑定的物理网卡
virtual_router_id 11
#VRID虚拟路由标识,也叫做分组名称,该组内的设备需要相同
priority 130 #定义这台设备的优先级1-254;开启了不抢占,所以此处优先级必须高于另一台
advert_int 1 #生存检测时的组播信息发送间隔,组内一致
authentication { #设置验证信息,组内一致
auth_type PASS #有PASS 和 AH 两种,常用 PASS
auth_pass asd #密码
}
virtual_ipaddress {
192.168.7.78 #指定VIP地址,组内一致,可以设置多个IP
}
track_script { #使用在这个域中使用预先定义的脚本,上面定义的
chk_haproxy
}
notify_backup “/etc/init.d/haproxy restart”
#表示当切换到backup状态时,要执行的脚本
notify_fault “/etc/init.d/haproxy stop” #故障时执行的脚本
}
7.83内容如下:
! Configuration File for keepalived
#简单的头部,这里主要可以做邮件通知报警等的设置,此处就暂不配置了;
global_defs {
notificationd LVS_DEVEL
}
#预先定义一个脚本,方便后面调用,也可以定义多个,方便选择;
vrrp_script chk_haproxy {
script “/etc/keepalived/chk.sh” #具体脚本路径
interval 2 #脚本循环运行间隔
}
#VRRP虚拟路由冗余协议配置
vrrp_instance VI_1 { #VI_1 是自定义的名称;
state BACKUP
#MASTER表示是一台主设备,BACKUP表示为备用设备【我们这里因为设置为开启不抢占,所以都设置为备用】
nopreempt #开启不抢占
interface eth0 #指定VIP需要绑定的物理网卡
virtual_router_id 11
#VRID虚拟路由标识,也叫做分组名称,该组内的设备需要相同
priority 120 #定义这台设备的优先级
1-254;开启了不抢占,所以此处优先级必须小于另一台
advert_int 1 #生存检测时的组播信息发送间隔,组内一致
authentication { #设置验证信息,组内一致
auth_type PASS #有PASS 和 AH 两种,常用 PASS
auth_pass asd #密码
}
virtual_ipaddress {
192.168.7.78 #指定VIP地址,组内一致,可以设置多个IP
}
track_script { #使用在这个域中使用预先定义的脚本,上面定义的
chk_haproxy
}
notify_backup “/etc/init.d/haproxy restart”
#表示当切换到backup状态时,要执行的脚本
notify_fault “/etc/init.d/haproxy stop” #故障时执行的脚本
}
3、创建chk.sh(7.82、7.83)
sudo vi /etc/keepalived/chk.sh
内容如下:
#!/bin/bash
if [ $(ps -C mysqld --no-header | wc -l) -eq 0 ]; then
service mysqld start
sleep 3
if [ $(ps -C mysqld --no-header | wc -l) -eq 0 ]; then
service keepalived stop
fi
fi
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
service haproxy start
sleep 3
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
service keepalived stop
fi
fi
给chk.sh授权
sudo chmod +x /etc/keepalived/chk.sh
4、启动keepalived
启动服务keepalived
sudo service keepalived start
开机启动keepalived
sudo chkconfig keepalived on
六、整个环境测试
1、测试同步
找一台192.168.7.*的客户端,用虚拟IP 192.168.7.78 root Lr12345!去连接数据库。并在数据库aa上去创建表和添加数据。然后在分别连接192.168.7.80和192.168.7.81的数据库查看是否同步。
2、在haproxy后台监控
http://192.168.7.78:5000/haproxy
3、测试高可用
(1)7.80、7.81任意一台断网,测试mysql高可用。
(2)7.82、7.83任意一台断网,测试haproxy、keepalived的高可用。
查看haproxy后台监控:haproxy的PID的变化,以及mysql的状态
查看7.78的MAC地址变化arp -a 192.168.7.78