文章目录
项目介绍
本项目旨在构建一个高度可靠、自动化且高性能的MySQL数据库集群系统,通过集成Keepalived的高可用功能和MySQL的半同步复制技术,以及GTID(全局事务标识符)来保证数据的一致性和服务的连续性。该系统不仅支持读写分离以优化性能,还具备自动故障切换能力,确保在任何单点故障发生时都能迅速恢复服务。
项目架构
项目环境
8台服务器(2G,2核),centos7.8,mysql5.7.30,mysqlrouter8.0.21,keepalived2.0.10,prometheus,ansible,rsync,sersync,sysbench
项目步骤
环境准备
主机 | IP地址 | 描述 |
---|---|---|
ansible | 192.168.163.61 | 中台服务器,管理和监控mysql集群 |
master | 192.168.163.62 | mysql集群主服务器 |
slave-1 | 192.168.163.63 | mysql集群从服务器 |
slave-2 | 192.168.163.64 | mysql集群从服务器 |
slave-3 | 192.168.163.65 | mysql集群延迟备份服务器 |
mysqlrouter-1 | 192.168.163.66 | 实现mysql集群读写分离 |
mysqlrouter-2 | 192.168.163.67 | mysql集群读写分离的备用服务器 |
test-client | 192.168.163.68 | sysbench压力测试mysql集群 |
首先准备上述八台服务器,关闭防火墙和SELinux,仅需开启对外服务器。
Ansible服务器部署
1、安装Ansible
// 安装ansible软件,需要先安装epel源
[root@ansible ~] yum install epel-release -y
[root@ansible ~] yum install ansible -y
2、配置免密登录
// 生成RSA密钥
[root@ansible ~] ssh-keygen
// 上传公钥到需要管理的服务器上
[root@ansible ~] ssh-copy-id -i .ssh/id_rsa.pub root@192.168.163.62
// 验证免密通道是否建立成功
[root@ansible ~] ssh 'root@192.168.163.62'
将ansible服务器与每台服务器都配置免密登录。
3、修改Ansible的主机清单
在ansible的host文件(/etc/ansible/hosts
)中添加需要管理的服务器IP地址,没有配置免密登录的服务器则需要指明用户名和密码。需要注意的是,使用密码登录的服务器在使用ansible控制之前要先使用ssh登录一次。
[root@ansible ~] vim /etc/ansible/hosts
# 密码登录示例
# [web]
# 192.168.163.63 ansible_ssh_user='root' ansible_ssh_pass='123456'
# 密钥登录
[db]
192.168.163.62
192.168.163.63
192.168.163.64
192.168.163.65
[slaves]
192.168.163.63
192.168.163.64
192.168.163.65
[mysqlrouter]
192.168.163.66
192.168.163.67
Prometheus部署
Prometheus 是一个开源的监控软件,监控某台主机的cpu、内存、磁盘、网络流量等信息。
1、下载软件包
Prometheus官网下载地址:https://prometheus.io/download/
下载如下软件包到服务器root用户家目录下:
node_exporter
:安装到被监控服务器上,用于采集通用性能指标。mysql_exporter
:安装到被监控服务器上,用于采集mysql的性能指标。prometheus
:服务端软件,用于接收exporter
采集到的数据
// 将下载好的软件包使用ansible分发到其他服务器上
[root@ansible ~] ansible db -m copy -a "src=/root/node_exporter-1.4.0-rc.0.linux-amd64.tar.gz dest=/root/node_exporter-1.4.0-rc.0.linux-amd64.tar.gz"
[root@ansible ~] ansible mysqlrouter -m copy -a "src=/root/mysqld_exporter-0.15.1.linux-amd64.tar.gz dest=/root/mysqld_exporter-0.15.1.linux-amd64.tar.gz"
2、二进制安装Prometheus Server
// 解压prometheus server
[root@ansible ~] mkdir /prome
[root@ansible ~] cp prometheus-2.43.0.linux-amd64.tar.gz /prome/
[root@ansible ~] cd /prome
[root@ansible prome] tar xf prometheus-2.43.0.linux-amd64.tar.gz
[root@ansible prome] mv prometheus-2.43.0.linux-amd64 prometheus
[root@ansible prometheus] cd prometheus
// 永久修改PATH变量
[root@ansible prometheus] vim /root/.bashrc
末尾追加:PATH=/prome/prometheus:$PATH
// 后台启动prometheus server
[root@ansible prometheus] nohup prometheus --config.file=/prome/prometheus/prometheus.yml &
3、通过服务管理Prometheus
因为systemctl
方式默认不会去管理我们源码二进制安装的程序,因此这里将Prometheus做成一个服务来进行管理,方便之后的操作。
[root@ansible prometheus] vim /usr/lib/systemd/system/prometheus.service
# 添加下面内容
[Unit]
Description=prometheus
[Service]
ExecStart=/prome/prometheus/prometheus --config.file=/prome/prometheus/prometheus.yml
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
// 重新加载systemd相关的服务
[root@ansible prometheus] systemctl daemon-reload
// 设置开机启动
[root@ansible prometheus] systemctl enable prometheus
浏览器访问192.168.163.61:9090
出现界面,即安装运行成功。
4、安装node_exporter
由于被监控服务器均需要安装node_exporter,通过编写脚本install_node_exporter.sh
来实现node_exporter的安装
#!/bin/bash
# 解压,永久修改环境变量
tar xf /root/node_exporter-1.4.0-rc.0.linux-amd64.tar.gz -C /
cd /
mv node_exporter-1.4.0-rc.0.linux-amd64/ node_exporter
cd /node_exporter/
echo 'PATH=/node_exporter/:$PATH' >>/etc/profile
#生成nodeexporter.service文件
cat >/usr/lib/systemd/system/node_exporter.service <<EOF
[Unit]
Description=node_exporter
[Service]
ExecStart=/node_exporter/node_exporter --web.listen-address 0.0.0.0:9090
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
#让systemd进程识别node_exporter服务
systemctl daemon-reload
#设置开机启动
systemctl enable node_exporter
#启动node_exporter
systemctl start node_exporter
通过Ansible将安装脚本分发给被监控服务器。
// 传输脚本
[root@ansible prometheus] ansible db -m copy -a "src=install_node_exporter.sh dest=/root"
[root@ansible prometheus] ansible mysqlrouter -m copy -a "src=install_node_exporter.sh dest=/root"
// 执行脚本
[root@ansible prometheus] ansible db -m shell -a "bash /root/install_node_exporter.sh"
[root@ansible prometheus] ansible mysqlrouter -m shell -a "bash /root/install_node_exporter.sh"
5、安装mysqld_exporter
首先在master服务器
上mysql程序中创建新的mysql用户
// 在mysql服务器上进行操作
root@(none) mysql> create user 'exporter'@'%' identified by '123456' with MAX_USER_CONNECTIONS 3;
root@(none) mysql> grant process,replication client,select on *.* to 'exporter'@'%';
通过编写脚本install_mysqld_exporter.sh
来实现mysqld_exporter的安装:
#!/bin/bash
#解压
tar xf mysqld_exporter-0.15.1.linux-amd64.tar.gz -C /usr/local
cd /usr/local/
mv mysqld_exporter-0.15.1.linux-amd64 mysqld_exporter
cd mysqld_exporter/
#配置mysqld_exporter
cat >.my.cnf <<EOF
[client]
user=exporter
password=123456
EOF
#生成nodeexporter.service文件
cat >/usr/lib/systemd/system/node_exporter.service <<EOF
[Unit]
Description=mysqld_exporter
[Service]
Environment=DATA_SOURCE_NAME=exporter:123456@(localhost:3306)/
ExecStart=/usr/local/mysqld_exporter/mysqld_exporter --config.my-cnf=/usr/local/mysqld_exporter/.my.cnf --web.listen-address=:9104
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
#让systemd进程识别node_exporter服务
systemctl daemon-reload
#设置开机启动
systemctl enable mysqld_exporter
#启动node_exporter
systemctl start mysqld_exporter
通过Ansible将安装脚本分发给被监控服务器。
// 传输脚本
[root@ansible prometheus] ansible db -m copy -a "src=install_mysqld_exporter.sh dest=/root"
// 执行脚本
[root@ansible prometheus] ansible db -m shell -a "bash /root/install_mysqld_exporter.sh"
6、添加被监控的服务器
[root@ansible prometheus] vim prometheus.yml
# 找到最后一段,修改成下面这样,注意yml格式缩进
scrape_configs:
- job_name: "prome