MySQL 负载均衡集群部署

提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

真实项目中可能会遇到数据库服务器宕机,所以负载均衡的集群部署十分重要,采用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”目录下。
MySQL 负载均衡集群部署

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

MySQL 负载均衡集群部署

有警告没有关系,忽略即可。
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成功
MySQL 负载均衡集群部署

7.配置环境变量

export PATH=$PATH:/usr/local/mysql/bin
mysql -u root -p

MySQL 负载均衡集群部署

8.设置mysql密码(因为在配置文件取消了密码验证,可以直接回车键)

use mysql;
update user set authentication_string=password('你的密码') where user='root';

MySQL 负载均衡集群部署

9.退出后将 /etc/my.cnf 中skip-grant-tables删除或注释掉 然后重启Mysql

flush privileges;
exit
vi  /etc/my.cnf 

MySQL 负载均衡集群部署

重启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.测试数据库连接
MySQL 负载均衡集群部署

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;

MySQL 负载均衡集群部署
在另一台服务器上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的原因)
MySQL 负载均衡集群部署

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)登录以后,可以看到如下画面:

MySQL 负载均衡集群部署

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

可以连接到虚拟的数据库连接
MySQL 负载均衡集群部署

5.另一台服务器

由于我用的是虚拟机可以克隆,以上操作部署完成后打一个快照,然后直接克隆即可,需修改相关涉及服务器ip的配置(Mysql配置、Haproxy配置、keepalived网卡配置)

上一篇:Haproxy配合Nginx搭建Web集群部署


下一篇:玩转Linux之Haproxy搭建群集