首页 > 数据库 >高可用的半同步主从复制MySQL集群

高可用的半同步主从复制MySQL集群

时间:2024-04-10 18:58:38浏览次数:23  
标签:主从复制 MySQL 192.168 ansible 集群 mysql master root mysqld

目录

项目信息

项目结构

在这里插入图片描述

项目描述

构建一个高可用、读写分离的MySQL服务器集群,提高业务数据的稳定性,能够监控、批量部署和维护整个集群

项目环境

8台虚拟机,centos7.9,MySQL-5.7.37,mysql-router-8.0.21,keepalived,Prometheus,ansible等

项目步骤

IP规划

master 			192.168.121.131
slave1 			192.168.121.132
slave2 			192.168.121.133
slave3 			192.168.121.134
ansible 		192.168.121.135
mysqlrouter1 	192.168.121.136
mysqlrouter2 	192.168.121.137
sysbench 		192.168.121.138
prometheus		192.168.121.139

部署一台ansible服务器,搭建好免密通道并定义主机清单,在四台机器上批量安装MySQL,配置好相关环境

搭建ssh免密通道

[root@ansible ~]# yum install epel-release -y 
[root@ansible ~]# yum install ansible -y
[root@ansible ~]# ssh-keygen 
[root@ansible ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.121.131
[root@ansible ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.121.132
[root@ansible ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.121.133
[root@ansible ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.121.134

[root@ansible ~]# cd /etc/ansible/
[root@ansible ansible]# ls
ansible.cfg  hosts  roles
[root@ansible ansible]# vim hosts 
[mysql]
192.168.121.131 #master
192.168.121.132 #slave1
192.168.121.133 #slave2
192.168.121.134 #slave3

使用ansible批量安装MySQL

[root@ansible ~]# ls
anaconda-ks.cfg                             mysql-router-community-8.0.21-1.el7.x86_64.rpm
mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz  onekey_install_mysql_binary.sh

[root@ansible ~]# vim onekey_install_mysql_binary.sh
#!/bin/bash

# 解决软件的依赖关系并且安装需要工具
yum install net-tools ncurses-devel gcc gcc-c++ vim libaio lsof cmake bzip2 openssl-devel ncurses-compat-libs -y
 
# 解压二进制安装包
tar xf mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz
 
# 移动解压后的文件
mv mysql-5.7.37-linux-glibc2.12-x86_64 /usr/local/mysql
 
# 新建用户和组mysql
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
 
# 关闭防火墙服务,设置开机不启动
service firewalld stop
systemctl  disable  firewalld
 
# 临时关闭selinux
setenforce 0
# 永久关闭selinux
sed -i '/^SELINUX=/ s/enforcing/disabled/'  /etc/selinux/config
 
# 新建目录用来存放数据
mkdir  /data/mysql -p

# 修改目录的权限,mysql用户启动的mysql进程可以对该目录文件进行读写
chown mysql:mysql /data/mysql/
# 只允许mysql用户和mysql组访问
chmod 750 /data/mysql/

# 进入目录
cd /usr/local/mysql/bin/
 
# 初始化
./mysqld  --initialize --user=mysql --basedir=/usr/local/mysql/  --datadir=/data/mysql  &>passwd.txt
 
# 让mysql支持ssl方式登录的设置
./mysql_ssl_rsa_setup --datadir=/data/mysql/
 
# 获取临时密码
tem_passwd=$(cat passwd.txt |grep "temporary"|awk '{print $NF}')
 
# 临时修改PATH变量的值
export PATH=/usr/local/mysql/bin/:$PATH
# 永久修改
echo  'PATH=/usr/local/mysql/bin:$PATH' >>/root/.bashrc

# 复制support-files/mysql.server到/etc/init.d/mysqld
cp  ../support-files/mysql.server   /etc/init.d/mysqld
 
# 修改/etc/init.d/mysqld datadir目录的值
sed  -i '70c  datadir=/data/mysql'  /etc/init.d/mysqld
 
# /etc/my.cnf 配置文件
cat  >/etc/my.cnf  <<EOF
[mysqld_safe]
 
[client]
socket=/data/mysql/mysql.sock
 
[mysqld]
socket=/data/mysql/mysql.sock
port = 3306
open_files_limit = 8192
innodb_buffer_pool_size = 512M
character-set-server=utf8
 
[mysql]
auto-rehash
prompt=\\u@\\d \\R:\\m  mysql>
EOF
 
# 修改内核open file数量
ulimit -n 1000000
# 设置开机生效配置
echo "ulimit -n 1000000" >>/etc/rc.local
chmod +x /etc/rc.d/rc.local
 
# 将mysqld添加到linux系统服务管理名单
/sbin/chkconfig --add mysqld
# 设置mysqld服务开机启动
/sbin/chkconfig mysqld on
 
 
# 启动mysqld服务
service mysqld start

# 修改密码,初次修改需要--connect-expired-password 选项
mysql -uroot -p$tem_passwd --connect-expired-password   -e  "set password='mysql123';"
 
# 检验密码是否修改成功,能看到mysql的数据库,说明成功
mysql -uroot -p'mysql123' -e "show databases;"

# 编写yaml文件
[root@ansible ansible]# vim software_install.yaml
- hosts: mysql
  remote_user: root
  tasks:
  - name: copy file
    copy: src=/root/mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz  dest=/root/
  - name: install mysql
    script: /root/onekey_install_mysql_binary_v3.sh
  - name: change path
    shell: export PATH=/usr/local/mysql/bin/:$PATH

[root@ansible ansible]# ansible-playbook --syntax-check /etc/ansible/software_install.yaml
[root@ansible ansible]# ansible-playbook  /etc/ansible/software_install.yaml

规划 MySQL 集群,一台做 master,三台做 slave

配置/etc/my.cnf

在master机器上

[mysqld_safe]
 
[client]
socket=/data/mysql/mysql.sock
 
[mysqld]
socket=/data/mysql/mysql.sock
port = 3306
open_files_limit = 8192
innodb_buffer_pool_size = 512M
character-set-server=utf8
#skip-grant-tables
#log-error = a.err
general_log
slow_query_log = 1
long_query_time = 0.001
log_bin
server_id = 1
expire_logs_days = 15
rpl_semi_sync_slave_enabled=1
log_slave_updates=ON
#gtid-mode=ON
#enforce-gtid-consistency=ON
 
[mysql]
auto-rehash
prompt=\u@\d \R:\m  mysql>

在slave机器上
其他配置相同,server_id按顺序加一

# 刷新服务
service mysqld restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS!

使用 mysqldump 导出master的基础数据并传到 ansible 上,ansible 下发到所有的 slave 上。

# 在master上新建一个授权用户,用来给slave来复制二进制日志
mysql> grant replication slave on *.* to 'agent'@'%' identified by '123456';

# 导出master上的基础数据
[root@master ~]# mysqldump -uroot -p'mysql123' --all-databases  --triggers  --routines --events >all_db.sql

# 把基础数据传到ansible服务器上
[root@master ~]# scp  all_db.sql   [email protected]:/root/all_db.sql

# 在ansible服务器上把基础数据传到slave上
ansible mysql -m copy -a "src=/root/all_db.sql dest=/root"

# slave导入数据
mysql -uroot -p'Sanchuang123#' <all_db.sql

# 
reset master;
stop slave;
reset slave all;

master 和 slave 上开启 GTID 功能,实现数据库的主从复制,对 slave3 配置延迟备份作为 backup ,从 slave1 上获取二进制日志

master和slave上安装半同步插件

mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_slave.so';

mysql>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

# 检查插件是否安装成功
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';"

修改master和slave配置

master上的配置
[root@master ~]# vim /etc/my.cnf
[mysqld_safe]
 
[client]
socket=/data/mysql/mysql.sock
 
[mysqld]
socket=/data/mysql/mysql.sock
port = 3306
open_files_limit = 8192
innodb_buffer_pool_size = 512M
character-set-server=utf8
 
#开启二进制日志
log_bin
server_id = 1
 
#开启半同步功能
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
 
#开启GTID功能
gtid-mode=ON
enforce-gtid-consistency=ON
 
[mysql]
auto-rehash
prompt=\u@\d \R:\m  mysql>

# 刷新服务
[root@master ~]# service mysqld restart

# 查看进程
[root@master ~]# ps aux|grep mysqld

# 在master上建一个授权用户,用来给slave复制二进制日志
mysql>grant replication slave on *.* to 'slave'@'192.168.121.%' identified by 'mysql123';
 
# 刷新权限
mysql>flush privileges;
Query OK, 0 rows affected (0.01 sec)
 
# 清空二进制日志
mysql>reset master;
Query OK, 0 rows affected (0.01 sec)
slave1、2上的配置
# 注意在slave1上的操作,slave1是slave3的master
mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

[root@slave1 ~]# vim /etc/my.cnf
[mysqld_safe]
 
[client]
socket=/data/mysql/mysql.sock
 
[mysqld]
socket=/data/mysql/mysql.sock
port = 3306
open_files_limit = 8192
innodb_buffer_pool_size = 512M
character-set-server=utf8
 
# 开启二进制日志
log_bin
# slave1、slave2的id分别是2、3
server_id = 2
 
# 开启半同步功能
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
 
rpl_semi_sync_slave_enabled=1
log_slave_updates=ON
 
# 开启GTID功能
gtid-mode=ON
enforce-gtid-consistency=ON
 
[mysql]
auto-rehash
prompt=\u@\d \R:\m  mysql>

# 重启服务
[root@slave1 ~]# service mysqld restart

# 登录MySQL
[root@slave1 ~]# mysql -uroot -p"mysql123"

# 在 salve1 上新建一个授权用户,给 slave3 来复制二进制日志(slave2,slave3略过此步骤)
grant replication slave on *.* to 'slave'@'192.168.121.%' identified by 'mysql123';
 
# 清空二进制日志
reset slave all;
 
# 配置master信息
change master to master_host='192.168.121.131', 
master_user='slave',
master_password='mysql123',
master_port=3306,
master_auto_position=1;
 
# 开启slave
mysql>start slave;
Query OK, 0 rows affected (0.00 sec)
mysql>show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
slave3(backup)上的配置
[root@slave3 ~]# vim /etc/my.cnf
[mysqld_safe]
 
[client]
socket=/data/mysql/mysql.sock
 
[mysqld]
socket=/data/mysql/mysql.sock
port = 3306
open_files_limit = 8192
innodb_buffer_pool_size = 512M
character-set-server=utf8

server_id = 4
 
#开启半同步功能
rpl_semi_sync_slave_enabled=1
log_slave_updates=ON
 
#开启GTID功能
gtid-mode=ON
enforce-gtid-consistency=ON
 
[mysql]
auto-rehash
prompt=\u@\d \R:\m  mysql>

[root@slave3 ~]# service mysqld restart

Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS! 

# 注意下面的master_host地址填slave1的
mysql> change master to master_host='192.168.121.132', 
master_user='slave',
master_password='mysql123',
master_port=3306,
master_auto_position=1;
 
mysql>change master to master_delay = 600;
 
mysql>start slave;

测试

# 在master上建表建库
mysql>create database db1;
mysql>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db1                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

# slave上查看
mysql>show databases;
+--------------------+
| Database           |
+--------------------+
| db1                |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

backup 和 ansible 服务器之间建立双向免密通道,把 ansible 作为一台异地备份机

[root@slave3 ~]# ssh-keygen -t rsa
[root@slave3 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub  [email protected]

[root@slave3 ~]# vim db_backup.sh
#!/bin/bash

# 新建文件夹
mkdir /backup
# 把当前MySQL的数据导出,添加时间前缀
mysqldump -uroot -p'123456' --all-databases --triggers --routines --events >/backup/$(date +%Y%m%d%H%M%S)all_db.sql
# 使用scp把备份数据送到ansible服务器的/backup上
scp /backup/$(date +%Y%m%d%H%M%S)all_db.sql 192.168.121.135:/backup

# 编写计划任务,每两小时执行一次
[root@slave3 ~]# crontab -e
0 */2 * * * bash /backup/db_backup.sh

master 和 slave 上部署MHA,ansible作为管理节点,实现自动的故障切换,确保 master 宕机时,自动提升一台 slave 为新的 master。

安装MHA

[root@ansible ~]# mkdir /masterha
[root@ansible ~]# cd /masterha
[root@ansible masterha]# ls
mha4mysql-node-0.56-0.el6.noarch.rpm
mha4mysql-manager-0.56-0.el6.noarch.rpm

# 先下载依赖包
[root@ansible masterha]# yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager -y
# 安装rpm包
[root@ansible masterha]# rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm

# MySQL集群里的机器都要安装mha-4mysql-node
# ansible把软件包分布到MySQL集群里
[root@ansible ~]# ansible mysql -m copy -a "src=/masterha/mha4mysql-node-0.56-0.el6.noarch.rpm dest=/root"
[root@ansible ~]# ansible mysql -m yum -a "name=perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager  state=present"
[root@ansible ~]# ansible mysql -m shell -a "rpm -ivh /root/mha4mysql-node-0.56-0.el6.noarch.rpm"

# ansible安装mha4mysql-manager
[root@ansible ~]# rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm

# 建立免密通道,MySQL集群里的所有机器之间要能免密登录
ssh-keygen -t rsa
ssh-copy-id -i id_rsa.pub [email protected].%

# MySQL集群里的机器创建监控用户
grant all privileges on *.* to 'monitor'@'192.168.121.%' identified by 'mysql123';

# 刷新权限
flush privileges;

配置MHA

# 创建目录
[root@ansible ~]# mkdir /etc/masterha
[root@ansible ~]# mkdir -p /var/log/masterha/app

# 编写脚本
[root@ansible ~]# cd /usr/local/bin
[root@ansible bin]# vim master_failover
#!/usr/bin/env perl
 
use strict;
use warnings FATAL =>'all';
use Getopt::Long;
my (
$command,          $ssh_user,        $orig_master_host, $orig_master_ip,
$orig_master_port, $new_master_host, $new_master_ip,    $new_master_port
);

# 改成漂移的VIP
my $vip = '192.168.0.200/24';
my $key = "1";
my $ssh_start_vip = "/sbin/ip a add $vip dev ens33:$key";
 
my $ssh_stop_vip = "/sbin/ip a del $vip dev ens33:$key";
 
my $exit_code = 0;
GetOptions(
    'command=s'          => \$command,
    'ssh_user=s'         => \$ssh_user,
    'orig_master_host=s' => \$orig_master_host,
    'orig_master_ip=s'   => \$orig_master_ip,
    'orig_master_port=i' => \$orig_master_port,
    'new_master_host=s'  => \$new_master_host,
    'new_master_ip=s'    => \$new_master_ip,
    'new_master_port=i'  => \$new_master_port,
);
 
exit &main();
 
sub main {
    if ( $command eq "stop" || $command eq "stopssh" ) {
        my $exit_code = 1;
        eval {
            print "\n\n\n***************************************************************\n";
            print "Disabling the VIP - $vip on old master: $orig_master_host\n";
            print "***************************************************************\n\n\n\n";
            &stop_vip();
            $exit_code = 0;
        };
        if ($@) {
            warn "Got Error: $@\n";
            exit $exit_code;
        }
        exit $exit_code;
    }
    elsif ( $command eq "start" ) {
        my $exit_code = 10;
        eval {
            print "\n\n\n***************************************************************\n";
            print "Enabling the VIP - $vip on new master: $new_master_host \n";
            print "***************************************************************\n\n\n\n";
            &start_vip();
            $exit_code = 0;
        };
        if ($@) {
            warn $@;
            exit $exit_code;
        }
        exit $exit_code;
    }
    elsif ( $command eq "status" ) {
        print "Checking the Status of the script.. OK \n";
        `ssh $ssh_user\@$orig_master_host \" $ssh_start_vip \"`;
        exit 0;
    }
    else {
        &usage();
        exit 1;
    }
}
  
# A simple system call that enable the VIP on the new master
sub start_vip() {
    `ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
 
# A simple system call that disable the VIP on the old_master
sub stop_vip() {
    `ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}
 
sub usage { 
    print "Usage: master_ip_failover –command=start|stop|stopssh|status –orig_master_host=host –orig_master_ip=ip –orig_master_port=port –new_master_host=host –new_master_ip=ip –new_master_port=port\n";
}

# 赋予可执行权限
chmod 777 /usr/local/bin/master_failover
创建配置文件/etc/mha/app.cnf
[root@ansible ~]# vim /etc/masterha/app.cnf
[server default]
# manager工作目录
manager_workdir=/var/log/masterha/app
# manager日志目录
manager_log=/var/log/masterha/app/manager.log
# MySQL的数据目录
master_binlog_dir=/data/mysql/
# 脚本(需要自己编写)
master_ip_failover_script=/usr/local/bin/master_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
# MySQL管理帐号和密码
user=monitor
password=mysql123
# 监控间隔(秒)
ping_interval=1
remote_workdir=/tmp
# 复制帐号和密码
repl_user=replication
repl_password=mysql123
report_script=/usr/local/send_report
# 故障发生后关闭主机的脚本,不是必须的,但是你要设置为空
shutdown_script=""
ssh_user=root
 
# master
[server1]
hostname=192.168.121.131
port=3306
 
# salve
[server2]
hostname=192.168.121.132
port=3306
#设置为候选master,发生主从切换优先将此库选举为master
candidate_master=1
check_repl_delay=0
 
[server3]
hostname=192.168.121.133
port=3306

查看状态
# 检查管理节点到节点的ssh状态
[root@ansible .ssh]# masterha_check_ssh --conf=/etc/mha/app.cnf
# 检查复制环境
[root@ansible .ssh]# masterha_check_repl --conf=/etc/mha/app.cnf
# 检查管理节点的状态
[root@ansible .ssh]# masterha_check_status --conf=/etc/mha/app.cnf
# 启动和关闭管理节点的监控
[root@ansible .ssh]# nohup masterha_manager --conf=/etc/mha/app.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app/manager.log 2>&1 &
[root@ansible .ssh]# masterha_stop --conf=/etc/mha/app.cnf

测试,关闭master的mysqld

# 关闭服务
[root@master ~]# service mysqld stop
 
# 查看管理节点上的/etc/masterha/app.cnf
[root@ansible ~]# cat /etc/masterha/app.cnf

***
master_ip_failover_script=/usr/local/bin/master_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
user=monitor #user被删除了
password=mysql123
ping_interval=1
remote_workdir=/tmp
***

# server1被删除了
[server1]
hostname=192.168.121.131
port=3306

部署两台 mysqlrouter 中间件机器,实现读写分离。

部署mysqlrouter

# 安装软件包
[root@mysqlrouter1 ~]# rpm -ivh mysql-router-community-8.0.21-1.el7.x86_64.rpm

# 编辑配置文件
[root@mysqlrouter1 ~]# cd /etc/mysqlrouter/
[root@mysqlrouter1 mysqlrouter]# ls
mysqlrouter.conf
[root@mysqlrouter1 mysqlrouter]# vim mysqlrouter.conf 

#read-only
[routing:slaves]
# mysqlrouter的ip
bind_address = 192.168.121.136:7001
 
# slave1,slave2的ip
destinations = 192.168.121.132:3306,192.168.121.133:3306
mode = read-only
connect_timeout = 1
 
#write and read
[routing:masters]
# mysqlrouter的ip
bind_address = 192.168.121.136:7002
 
#master
destinations = 192.168.121.131:3306
mode = read-write
connect_timeout = 1

# 关闭防火墙,设置开机不启动
service firewalld stop
systemctl  disable  firewalld

# 关闭selinux
setenforce 0
sed -i '/^SELINUX=/ s/enforcing/disabled/'  /etc/selinux/config

# 启动mysqlrouter服务
[root@mysqlrouter1 mysqlrouter]# service mysqlrouter start
Redirecting to /bin/systemctl start mysqlrouter.service

监听7001和7002端口
[root@mysqlrouter1 mysqlrouter]# netstat -anplut|grep mysql
tcp        0      0 192.168.121.136:7001    0.0.0.0:*               LISTEN      2261/mysqlrouter    
tcp        0      0 192.168.121.136:7002    0.0.0.0:*               LISTEN      2261/mysqlrouter    

测试读写分离

在master上新建2个账号
一个可读可写
mysql>grant all on *.*  to 'write'@'%' identified by 'mysql123';

一个只读
mysql>grant select on *.*  to 'read'@'%' identified by 'mysql123';

# 使用只读的用户登录mysql
mysql -h 192.168.121.136 -P 7001 -uread -p'myqsl123'

mysql>show databases;
+--------------------+
| Database           |
+--------------------+
| db1                |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)
 
mysql>create database db2;
Access denied for user 'read'@'%' to database 'db2'\
# 在执行<写操作>时被拒绝

mysqlrouter 机器上安装 keepalived ,配置 2 个 vrrp 实例,实现双 vip 的高可用功能。

# 两台mysqlrouter上都要安装
[root@mysqlrouter1 ~]# yum install keepalived -y
[root@mysqlrouter1 ~]# cd /etc/keepalived/
[root@mysqlrouter1 keepalived]# ls
keepalived.conf
[root@mysqlrouter1 keepalived]# vim keepalived.conf
! Configuration File for keepalived
:
global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.121.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
  #vrrp_strict 注意这行打注释
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
 
vrrp_instance VI_1 {
    state MASTER
    interface ens33  
    virtual_router_id 80 #要和其他保持一样
    priority 200         #数字大=优先级大
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.121.31
    }   
}
vrrp_instance VI_2 {
    state BACKUP
    interface ens33
    virtual_router_id 100
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.121.32
    }
}
[root@mysqlrouter1 keepalived]# service keepalived start

# 同理,编辑mysqlrouter2上的keepalived配置文件
[root@mysqlrouter2 ~]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived
 
global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.121.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
  #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
 
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 80
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.121.31
    }
}
vrrp_instance VI_2 {
    state MASTER
    interface ens33
    virtual_router_id 100
    priority 200
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.121.32
    }
}

[root@mysqlrouter2 ~]# service keepalived start

# 验证vip的漂移
[root@mysqlrouter1 keepalived]# service keepalived stop
Redirecting to /bin/systemctl stop keepalived.service
 
[root@mysqlrouter2 keepalived]# ip a
发现mysqlrouter1的vip漂移到mysqlrouter2上了

部署监控机,安装prometheus和grafana监控集群性能

被监控的机器安装mysqld_exporter

# 在所有被监控的MySQL服务器上建立一个授权用户
# 这里以slave1为例
mysql>grant all on *.* to 'mysqld_exporter'@'%' identified by 'mysql123';

# 关闭防火墙,开机不启动
[root@slave1 ~]# service firewalld stop
[root@slave1 ~]# systemctl disable firewalld

# 关闭selinux
[root@slave1 ~]# setenforce 0
[root@slave1 ~]# sed -i '/^SELINUX=/ s/enforcing/disabled/'  /etc/selinux/config

# 所有被监控的MySQL上安装mysqld_exporter
[root@slave1 ~]# tar xf mysqld_exporter-0.12.1.linux-amd64.tar.gz
[root@slave1 ~]# mv mysqld_exporter-0.12.1.linux-amd64 /usr/local/mysqld_exporter
[root@slave1 ~]# cd /usr/local/mysqld_exporter/
# 编辑my.cnf配置文件
[root@slave1 mysqld_exporter]# vim my.cnf
[client]
user=mysqld_exporter 
password=123456

# 修改环境变量
[root@slave1 mysqld_exporter]# PATH=/usr/local/mysqld_exporter/:$PATH
[root@slave1 mysqld_exporter]# echo "PATH=/usr/local/mysqld_exporter/:$PATH" >>/root/.bashrc

# 后台启动
[root@slave1 mysqld_exporter]# nohup mysqld_exporter --config.my-cnf=/usr/local/mysqld_exporter/my.cnf &

# 查看进程、端口
[root@slave1 ~]# ps aux|grep exporter
[root@slave1 ~]# netstat -anplut|grep exporter

部署Prometheus

[root@prometheus ~]# ls
anaconda-ks.cfg prometheus-2.43.0.linux-amd64.tar.gz

[root@prometheus ~]# tar xf prometheus-2.43.0.linux-amd64.tar.gz
[root@prometheus ~]# mv prometheus-2.43.0.linux-amd64 /prometheus

[root@prometheus prometheus]# PATH=/prom/prometheus:$PATH
[root@prometheus prometheus]# echo "PATH=/prom/prometheus:$PATH" >>/etc/profile

[root@prometheus prometheus]# service firewalld stop
[root@prometheus prometheus]# systemctl disable firewalld

[root@prometheus prometheus]# setenforce 0
[root@prometheus prometheus]# sed -i '/^SELINUX=/ s/enforcing/disabled/'  /e

# 配置Prometheus服务
[root@prometheus ~]# vim /usr/lib/systemd/system/prometheus.service
[Unit]
Description=prometheus
[Service]
ExecStart=/prom/prometheus/prometheus --config.file=/prom/promethe
us/prometheus.yml
ExecReload=/bin/kill -HUP $MAINPID
killMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target

# 编辑Prometheus的yaml文件
[root@prometheus ~]# cd /prometheus
[root@prometheus prometheus]# vim prometheus.yml 
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]
  - job_name: "mysqlrouter1"
    static_configs:
      - targets: ["192.168.121.136:9106"]
  - job_name: "mysqlrouter2"
    static_configs:
      - targets: ["192.168.121.137:9106"]
  - job_name: "master"
    static_configs:
      - targets: ["192.168.121.131:9106"]
  - job_name: "slave1"
    static_configs:
      - targets: ["192.168.121.132:9106"]
  - job_name: "slave2"
    static_configs:
      - targets: ["192.168.121.133:9106"]

[root@prometheus ~]# service prometheus restart
Redirecting to /bin/systemctl start prometheus.service

安装grafana

[root@prometheus ~]# yum install grafana-enterprise-9.1.2-1.x86_64.rpm  -y

[root@prometheus ~]# service grafana-server start
Starting grafana-server (via systemctl):                   [  确定  ]

# 浏览器访问 ip:3000
默认用户名:admin
默认密码:admin

Configuration --> Add data source -> 选择Prometheus
填 http://192.168.121.139:9090
dashboard -> import -> 导入14057模板 -> 选择Prometheus数据源

部署压力测试机,使用 sysbench 软件测试集群的性能。

# 安装sysbench
[root@test ~]# curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
[root@test ~]# sudo yum install sysbench-1.0.15-1.el7.centos.x86_64

# 测试连接中间件服务器,一定要去连接写的端口7002,不然会导致写数据到从服务器上,因为有2个从服务器,会轮询调度到不同的机器,会出现找不到数据库。使用写的账号连接,不然会没有权限去写入数据
[root@test ~]# sysbench --mysql-host=192.168.121.136  --mysql-port=7002 --mysql-user=write  --mysql-password='mysql123' /usr/share/sysbench/oltp_common.lua  --tables=10  --table_size=10000 prepare
[root@test ~]# sysbench --threads=4 --time=20 --report-interval=5  --mysql-host=192.168.121.136 --mysql-port=7002 --mysql-user=write  --mysql-password='mysql123'  /usr/share/sysbench/oltp_read_write.lua  --tables=10  --table_size=100000  run

项目心得

1.对集群架构的规划能力得到了提升
2.对MySQL集群有了更深入的理解
3.对ansible自动化运维有了新的认识
4.对keepalived,MHA等高可用组件有了更多的理解

标签:主从复制,MySQL,192.168,ansible,集群,mysql,master,root,mysqld
From: https://blog.csdn.net/TyreBurst/article/details/137522666

相关文章

  • mysql函数练习题
    ......
  • MySQL多表联合查询&聚合函数应用实例
     DDL——学生表——成绩表CREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`createDate`datetimeDEFAULTNULL,`userName`varchar(20)DEFAULTNULL,`pwd`varchar(36)DEFAULTNULL,`phone`varchar(11)DEFAULTNULL,`......
  • python收到MQTT消息后写入mySQL
    python收MQTT消息和写mySQL的代码在前面的文章都有介绍,这里直接上完整的功能代码mqtt2mysql.py#python3.6importloggingimportrandomimporttimeimportmysql.connector#frompaho.mqttimportclientasmqtt_clientimportpaho.mqtt.clientasmqttBROKER......
  • 基于istio实现单集群地域故障转移
    本文分享自华为云社区《基于istio实现单集群地域故障转移》,作者:可以交个朋友。一背景随着应用程序的增长并变得更加复杂,微服务的数量也会增加,失败的可能性也会增加。微服务的故障可能多种原因造成,例如硬件问题、网络延迟、软件错误,甚至人为错误。故障转移Failover是系统韧性设......
  • MySQL Ruler mysql 日常开发规范
    拓展阅读MySQLViewMySQLtruncatetable与delete清空表的区别和坑MySQLRulermysql日常开发规范MySQLdatetimetimestamp以及如何自动更新,如何实现范围查询MySQL06mysql如何实现类似oracle的mergeintoMySQL05MySQL入门教程(MySQLtutorialbook)MySQL04-E......
  • TACC 集群使用笔记
    1注册账号先在网页上注册账号,之后需要联系导师或者管理员把你添加到对应的集群里去,例如我加入的是Lonestar6集群。之后需要跟着这个教程绑定MFA软件(可以是DUO或者1password)之后登录账号,系统会要求先后输入你的账户密码和MFA的6位数tokenlocal@username$sshuse......
  • 想要建立一个 Raspberry Pi 5 集群吗?
    NurgaliyevShakhizat用三台RaspberryPi5创建了一个神奇的Ceph集群。这是一个色彩缤纷的高级项目,适合技术特别精通的人,他花了大约六个小时才完成。RaspberryPi通过1Gbit交换机连接在专用网络中,由三个256GBSSD驱动器提供存储空间。Ceph是一种开源软件定义存储......
  • MySQL分组查询以及having筛选
    DDLCREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`createDate`datetimeDEFAULTNULL,`userName`varchar(20)DEFAULTNULL,`pwd`varchar(36)DEFAULTNULL,`phone`varchar(11)DEFAULTNULL,`age`tinyint(......
  • prometheus 监控mysql
      启动脚本vim/usr/lib/systemd/system/mysqld_exporter.service[Unit]Description=PrometheusMySQLExporterAfter=network.target[Service]Type=simpleUser=exporterGroup=exporterRestart=alwaysExecStart=/opt/mysqld_exporter-0.15.1/mysqld_exporter\--......
  • Windows环境下删除MySQL
    目录一、关闭MySQL服务1、win+R打开运行,输入services.msc回车2、服务里找到MySQL并停止二、卸载MySQL软件1、打开控制模板--卸载程序--卸载MySQL相关的所有组件三、删除MySQL在物理硬盘上的所有文件1、删除MySQL的安装目录(默认在C盘下的ProgramFiles文件夹)2、删除MySQL数据目录数......