提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
真实项目中可能会遇到数据库服务器宕机,所以负载均衡的集群部署十分重要,采用Mysql的主主模式+Haproxy+keepalived的方式采用 Haproxy 和 Keepalived 组合实现,使 用 MySQL 的主主模式确保两边数据的一致性,保证一台数据库服务器宕机后,另一台能继续使用。
提示:以下是本篇文章正文内容
一、配置部署 MySQL 主主模式
由于条件受限,部署均在虚拟机上实现,系统是CentOS7,不同系统对于命令的支持也不尽相同,本人也是部署后才发现的,如果安装过程中出现不可控的问题,还是应该自己搜索解决。
1.在Linux上安装Myslq
1.1 Mysql下载与解压
下载Linux版本Mysql压缩包“mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz”,放置在“/usr/local”目录下。
1.进入目录并解压文件:
cd /usr/local
tar -zxvf mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz
2.解压放入你想安装的目录,然后移动并改名
mkdir /usr/local/mysql
mv -v mysql-5.7.26-linux-glibc2.12-x86_64/* /usr/local/mysql
1.2数据库创建与配置
1.创建用户和用户组
groupadd mysql
useradd -r -g mysql mysql
2.将安装目录所有者及所属组改为mysql
chown -R mysql.mysql /usr/local/mysql
3.在mysql目录下创建data文件夹
mkdir /usr/local//data
4.初始化数据库
/usr/local/mysql/bin/mysql_install_db --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data
有警告没有关系,忽略即可。
5.完成初始化后编辑配置文件: vi /etc/my.cnf,将原文件全部删除,替换为下面的新文件内容。(“i”进行编辑,ESC+“:wq”保存后退出)
[mysqld]
lower_case_table_names=1
datadir=/usr/local/mysql/data
basedir=/usr/local/mysql
socket=/tmp/mysql.sock
user=mysql
port=3306
character-set-server=utf8
#跳过密码验证,忘记密码 可以设置,然后修改密码,再关闭
skip-grant-tables
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
# include all files from the config directory
!includedir /etc/my.cnf.d
6.将mysql加入到服务
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
开机启动
chkconfig mysql on
启动mysql
service mysql start
显示启动Mysql成功
7.配置环境变量
export PATH=$PATH:/usr/local/mysql/bin
mysql -u root -p
8.设置mysql密码(因为在配置文件取消了密码验证,可以直接回车键)
use mysql;
update user set authentication_string=password('你的密码') where user='root';
9.退出后将 /etc/my.cnf 中skip-grant-tables删除或注释掉 然后重启Mysql
flush privileges;
exit
vi /etc/my.cnf
重启mysql
service mysql restart
1.3数据库远程连接设置
1.设置可以远程连接
mysql -u root -p
输入密码
use mysql;
如果进行操作出现下面的提示:
You must reset your password using ALTER USER statement before executing this statement
退出;(exit)
就重新设置一遍密码(原密码一样):
mysql -u root -p
mysql> alter user 'root'@'localhost' identified by'你的密码';
exit;
2.再次设置远程连接(mysql库中user表的root用户修改为‘%’即任意主机可以访问)
mysql -u root -p
use mysql;
update user set host='%' where user = 'root';
flush privileges;
exit;
3.关闭防火墙
查看状态: systemctl status firewalld
启动: systemctl start firewalld
关闭: systemctl stop firewalld(运行这个)
开机禁用 : systemctl disable firewalld(运行这个)
开机启用 : systemctl enable firewalld
4.测试数据库连接
2. Mysql主主模式部署
两台服务器分别是:192.168.50.103和192.168.50.151,互为主服务器,所以每个数据库服务器都要部署对应的Haproxy和keepalived,且Haproxy+keepalived应该要部署在另一台服务器上,不过条件有限只能在一台虚拟机上一起部署,实际操作中是先部署好一台,然后用克隆的方式克隆出另一台,修改相关配置即可。
2.1 修改配置
先修改192.168.50.103上的数据库配置
修改配置文件vi /etc/my.cnf,在节点【mysqld】下添加配置:
[mysqld]
server-id=1 #任意自然数 n,只要保证两台 MySQL 主机不重复就可以了,【另一台服务器修改为2】
log-bin=mysql-bin #开启二进制日志
auto_increment_increment=2 #步进值 auto_increment,一般有 n 台主 MySQL 就填 n
auto_increment_offset=1 #起始值,一般填第 n 台主机 MySQL,此时为第一台主 MySQL【另一台服务器修改为2】
replicate-do-db=newstaixing #要同步的数据库,默认所有库
lower_case_table_names=1
datadir=/usr/local/mysql/data
basedir=/usr/local/mysql
socket=/tmp/mysql.sock
user=mysql
port=3306
character-set-server=utf8
#跳过密码验证,忘记密码 可以设置,然后修改密码,再关闭
#skip-grant-tables
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
# include all files from the config directory
!includedir /etc/my.cnf.d
记录遇到的一个坑:
修改配置后提示我数据库无法启动:The server quit without updating PID file
参考了这个得以解决:https://blog.csdn.net/chenrui310/article/details/100977849
去mysql的数据目录/data看看,如果存在mysql-bin.index
2.2 数据库创建用户
需要在两个数据库中各自创建一个可以登录的用户,我这边偷了个懒,直接用的root用户。
mysql>GRANT REPLICATION SLAVE ON *.* TO 'root'@'192.168.50.103' IDENTIFIED BY '123456'
mysql>FLUSH PRIVILEGES;
(另一个服务器也要执行)
查看 192.168.50.103 的 MySQL 服务器二进制文件名与位置:
mysql>SHOW MASTER STATUS;
在另一台服务器上192.168.50.151告知二进制文件名与位置:
CHANGE MASTER TO MASTER_HOST='192.168.50.103',MASTER_USER='root',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-
bin.000008',MASTER_LOG_POS=157301033;
(同理另一台也一样)
配置完成后在192.168.50.103中输入:
mysql>slave start;
mysql>show slave status;
(我这边有个致命错误,但貌似不影响使用,有网友知道啥问题的话欢迎评论区讨论,自己怀疑可能是用了root的原因)
3.配置部署 Haproxy
感谢参考:
https://www.cnblogs.com/sgh1023/p/11215328.html
安装HAProxy
1.下载
由于到官网下载需要FQ,这里提供百度云链接。
链接: https://pan.baidu.com/s/1uaSJa3NHFiE1E6dk7iHMwQ 提取码: irz6
2.将haproxy-1.7.8.tar.gz拷贝至/opt目录下,解压缩:
tar zxvf haproxy-1.7.8.tar.gz
3. 进入目录,编译成可执行文件。
将源代码解压之后,需要运行make来将HAProxy编译成为可执行文件。如果是在Linux2.6系统上面进行编译的话,需要设置TARGET=linux26以开启epoll支持,这也是为什么网上许多博客里面都是这么写的。对于其他的UNIX系统来说,直接采用TARGET=generic方式,本文进行安装的系统为CentOS7 ,内核3.10版本。
cd haproxy-1.7.8
make TARGET=generic
4. 配置环境变量
为方便使用,可以进行环境变量的配置。在/etc/profile中加入haproxy的路径:
export PATH=$PATH:/opt/haproxy-1.7.8/haproxy
5.最后执行让此环境变量生效。
source /etc/profile
配置HAProxy
HAProxy配置文件说明
HAProxy配置文件通常分为三个部分,即global、defaults和listen。global为全局配置,defaults为默认配置,listen为应用组件配置。
global为全局配置部分,属于进程级别的配置,通常和使用的操作系统配置相关。
defaults配置项配置默认参数,会被应用组件继承,如果在应用组件中没有特别声明,将使用默认配置参数。
以配置Mysql集群的负载均衡为例,在安装目录下面新建一个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
option dontlognull
option redispatch
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
mode http
bind :8888
stats enable
stats hide-version
stats uri /haproxyadmin?stats
stats realm Haproxy\ Statistics
stats auth admin:admin
frontend main
bind 0.0.0.0:3307 #虚拟出来的数据库端口3307
default_backend mysql
backend mysql
balance roundrobin
server root 192.168.50.103:3306 check port 3306 maxconn 300 #之前建的数据库用户
server root 192.168.50.151:3306 check port 3306 maxconn 300 #之前建的数据库用户
6启动
启动命令
/opt/haproxy-1.7.8/haproxy -f /opt/haproxy-1.7.8/haproxy.cfg
验证是否启动成功:
[root@localhost haproxy-1.7.8]# lsof -i:8888
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
haproxy 45031 root 3u IPv4 228341 0t0 TCP localhost.localdomain:ddi-tcp-1 (LISTEN)
在浏览器*问http://192.168.50.103:8888/haproxyadmin?stats,输入配置的用户名(admin)和密码(admin)登录以后,可以看到如下画面:
4.Keepalived部署
1.下载到/root文件夹下
链接:https://pan.baidu.com/s/189AZKDTuI-Szoln1YtXJVg
提取码:g7lm
2.解压
tar -zxvf keepalived-1.2.19.tar.gz
cd keepalived-1.2.19
3.安装编译
yum install curl gcc openssl-devel libnl3-devel net-snmp-devel libnfnetlink-devel -y
4.启动安装
./configure --prefix=/usr/local/keepalived --sbindir=/usr/sbin/ --sysconfdir=/etc/ --
mandir=/usr/local/share/man/ --with-kernel-dir=/usr/src/kernels/3.10.0-957.el7.x86_64/
make && make install
注意:1、安装时./configure 中的—prefix 后的几个选择可选可不选,选了就
可以采用 service 直接启动了。建议最好都加上;2、–with-kernel-dir 这个选项
根据自己的 linux 版本进行填写(在 linux 中使用命令 cat /proc/version 可以查
到)。
5.创建配置文件:
cd /etc/keepalived
mv keepalived.conf keepalived.conf.back
vim keepalived.conf
自行根据注释修配置,注意: 实际配置要把注释内容去掉,否则会产生某些功
能失效,配置文件如下:
! Configuration File for keepalived #简单的头部,这里主要可以做邮件通知报警等的设置,此处就暂不配置
global_defs {
notificationd LVS_DEVEL #每个 keepalived 取个不同名称
}
vrrp_script chk_haproxy { #预先定义一个脚本,方便后面调用,也可以定义多个,方便选择;
script "/etc/keepalived/chk.sh" #具体脚本路径
interval 2 #脚本循环运行间隔
}
#VRRP 虚拟路由冗余协议配置
vrrp_instance VI_1 { #VI_1 是自定义的名称;
state MASTER #MASTER 表示是一台主设备,BACKUP 表示为备用设备【我们这里因为设置为开启不抢占,所以都设置为备用】
interface ens33 #ens33是需要绑定的物理网卡,可以通过ifconfig查看
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.50.250 #指定 VIP 地址,组内一致,可以设置多个 IP(虚拟出的数据库连接地址)
}
track_script { #使用在这个域中使用预先定义的脚本,上面定义的
chk_haproxy
}
notify_backup "/etc/init.d/haproxy restart" #表示当切换到 backup 状态时,要执行的脚本
notify_fault "/etc/init.d/haproxy stop" #故障时执行的脚本
}
6.创建监控文件,监控 Haproxy 运行情况:
vim chk.sh
代码如下:
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
/etc/init.d/keepalived stop
fi
7.赋权限:
chmod +x /etc/keepalived/chk.sh
8.启动
service keepalived start
可以连接到虚拟的数据库连接
5.另一台服务器
由于我用的是虚拟机可以克隆,以上操作部署完成后打一个快照,然后直接克隆即可,需修改相关涉及服务器ip的配置(Mysql配置、Haproxy配置、keepalived网卡配置)