目录

一、mysql集群的搭建

IP地址规划:

使用ansible给从服务器安装mysql

1、使用master与所有从服务器建立SSH免密通道,然后添加到mysqld组到hosts文件里面

2、使用ansible给从服务器部署mysql(5.7.34)

在master和slave集群配置异步复制

1、先将master的数据库全备导出,然后在slave导入,达到两边数据库的基础数据一致

2、在master上创建一个由备份权限的授权用户,然后在slave上添加授权用户的信息

给mysql集群部署基于gtid的主从复制

1、关闭所有从服务器上的slave服务

2、编辑master和从服务器的配置文件,添加gtid功能

3、重启master和从服务器的mysql服务

给backup_server配置延迟备份

1、首先停止 backup_server的salve功能

2、在backup_server上设置延迟时间,然后开启slave

3、测试延迟备份的效果

部署基于gtid的半同步复制

1、首先在master上面安装插件

2、设置master全局变量和超时时间

3、在slave上面安装插件,设置全局变量

4、停止slave上面的I/O线程,然后重启I/O线程

mysqlrouter读写分离部署实现

1、准备两台全新的linux服务器,安装好mysqlrouter软件

2、创建授权用户验证读写分离

3、验证读写分离操作效果

搭建双vip高可用集群

1、安装部署keepalived软件 ,并修改配置文件

2、使用客户机访问配置好的master

prometheus监控的部署

1、在监控服务器安装部署prometheus软件

2、在要监控的服务器上安装mysqld_exporter软件

3、将mysqld_exporter接入prometheus里

4、部署grafana可视化监控指标展示工具

一、mysql集群的搭建

准备四台装好centos7系统的服务器

IP地址规划:

master:192.168.44.170    --> 主slave1:192.168.44.160    --> 从1slave2:192.168.44.140   --> 从2backup_server:192.168.44.203  --> 延迟备份服务器

#################################################################################### 

使用ansible给从服务器安装mysql

1、使用master与所有从服务器建立SSH免密通道,然后添加到mysqld组到hosts文件里面

示例:将从服务器IP地址添加到/etc/ansible/hosts文件里面的mysqlserver组

[root@master ansible]# cat hosts
[mysqlserver]
192.168.44.140
192.168.44.160
192.168.44.203

测试ansible是否与三台从服务器建立连接

[root@master ansible]# ansible all -m shell -a "mkdir /root/mysql_test.txt"192.168.44.160 | CHANGED | rc=0 >>192.168.44.140 | CHANGED | rc=0 >>192.168.44.203 | CHANGED | rc=0 >>

效果:三台机器上都成功新建一个mysql_test.txt文件

[root@slave1 ~]# ls
mysql_test.txt
[root@slave2 ~]# ls
mysql_test.txt
[root@backup_server ~]# ls
mysql_test.txt

#################################################################################### 

2、使用ansible给从服务器部署mysql(5.7.34)

使用ansible将mysql软件压缩包copy到从服务器上面,这里因为slave1上面已经安装mysql,所以没有传

[root@master ~]# ansible all -m copy -a "src=/root/mysql-5.7.34-linux-glibc2.12-x86_64.tar.gz dest=/root/"
192.168.44.203 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": true, "checksum": "c401420251b9eae3b95c21753a925675bc731df3", "dest": "/root/mysql-5.7.34-linux-glibc2.12-x86_64.tar.gz", "gid": 0, "group": "root", "md5sum": "cdf3bec90f7dd576397b23d1ddb399c5", "mode": "0644", "owner": "root", "secontext": "system_u:object_r:admin_home_t:s0", "size": 665389778, "src": "/root/.ansible/tmp/ansible-tmp-1663061649.05-19487-87578574739390/source", "state": "file", "uid": 0
}
192.168.44.140 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": true, "checksum": "c401420251b9eae3b95c21753a925675bc731df3", "dest": "/root/mysql-5.7.34-linux-glibc2.12-x86_64.tar.gz", "gid": 0, "group": "root", "md5sum": "cdf3bec90f7dd576397b23d1ddb399c5", "mode": "0644", "owner": "root", "secontext": "system_u:object_r:admin_home_t:s0", "size": 665389778, "src": "/root/.ansible/tmp/ansible-tmp-1663061649.08-19486-277324168009261/source", "state": "file", "uid": 0
}
[root@master ~]#

使用ansible将一键二进制安装脚本copy给从服务器

[root@master ~]# ansible all -m copy -a "src=/root/onekey_install_mysql_binary_v3.sh  dest=/root/"
192.168.44.203 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": true, "checksum": "0747136284b8c9d2d605e6a62358e4b3382d956f", "dest": "/root/onekey_install_mysql_binary_v3.sh", "gid": 0, "group": "root", "md5sum": "1d46566cecdd2bef46e6815ad978b1c8", "mode": "0644", "owner": "root", "secontext": "system_u:object_r:admin_home_t:s0", "size": 3086, "src": "/root/.ansible/tmp/ansible-tmp-1663067531.62-19593-204811003943206/source", "state": "file", "uid": 0
}
192.168.44.140 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": true, "checksum": "0747136284b8c9d2d605e6a62358e4b3382d956f", "dest": "/root/onekey_install_mysql_binary_v3.sh", "gid": 0, "group": "root", "md5sum": "1d46566cecdd2bef46e6815ad978b1c8", "mode": "0644", "owner": "root", "secontext": "system_u:object_r:admin_home_t:s0", "size": 3086, "src": "/root/.ansible/tmp/ansible-tmp-1663067531.68-19591-45378666974808/source", "state": "file", "uid": 0
}

使用ansible给所有从服务器执行一键安装脚本

[root@master ~]# ansible all -m shell -a "bash /root/onekey_install_mysql_binary_v3.sh"

安装成功效果:

#################################################################################### 

在master和slave集群配置异步复制

1、先将master的数据库全备导出,然后在slave导入,达到两边数据库的基础数据一致

使用mysqldump 将数据库全备导出

[root@master backup]# mysqldump -uroot -p'Sanchuang123#' --all-databases >/backup/all_db.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don't want to restore GTIDs, pass --set-gtid-purged=OFF. To make a complete dump, pass --all-databases --triggers --routines --events.
[root@master backup]# ls
all_db.sql

 master和slave配置里面要开启二进制日志以及server_id 

master配置:

# binary log
log_bin
server_id = 1

slave1配置

# 二进制日志
log-bin
server_id = 2

slave2配置

# 开启二进制日志
log_bin
server_id = 3

backup_server配置

# 开启二进制日志
log_bin
server_id = 4

将master导出的全备份sql文件使用ansible传到slave机器上,然后导入

[root@master backup]# ansible all -m copy -a "src=/backup/all_db.sql dest=/root/backup"
192.168.44.160 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": true, "checksum": "10ec634ad8d698aa0a05f00f3526ee80008cac98", "dest": "/root/backup/all_db.sql", "gid": 0, "group": "root", "md5sum": "227bf971bfba9df5da84ca696b2e3a55", "mode": "0644", "owner": "root", "size": 899886, "src": "/root/.ansible/tmp/ansible-tmp-1663122288.81-19992-243949179800744/source", "state": "file", "uid": 0
}
192.168.44.203 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": true, "checksum": "10ec634ad8d698aa0a05f00f3526ee80008cac98", "dest": "/root/backup/all_db.sql", "gid": 0, "group": "root", "md5sum": "227bf971bfba9df5da84ca696b2e3a55", "mode": "0644", "owner": "root", "secontext": "system_u:object_r:admin_home_t:s0", "size": 899886, "src": "/root/.ansible/tmp/ansible-tmp-1663122289.14-19993-173407275816877/source", "state": "file", "uid": 0
}
192.168.44.140 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": true, "checksum": "10ec634ad8d698aa0a05f00f3526ee80008cac98", "dest": "/root/backup/all_db.sql", "gid": 0, "group": "root", "md5sum": "227bf971bfba9df5da84ca696b2e3a55", "mode": "0644", "owner": "root", "secontext": "system_u:object_r:admin_home_t:s0", "size": 899886, "src": "/root/.ansible/tmp/ansible-tmp-1663122289.17-19991-31806854150922/source", "state": "file", "uid": 0
}
[root@master backup]#

在slave和延迟备份服务器backup_server上面导入master的全备份

[root@slave1 backup]# mysql -uroot -p'Sanchuang123#' < all_db.sql
mysql: [Warning] Using a password on the command line interface can be insecure.[root@slave2 backup]# mysql -uroot -p'Sanchuang123#' <all_db.sql
mysql: [Warning] Using a password on the command line interface can be insecure.[root@backup_server backup]# mysql -uroot -p'Sanchuang123#' <all_db.sql
mysql: [Warning] Using a password on the command line interface can be insecure.

查看数据现在是否达到一致,可以看到每个数据库的数据已经一致

#################################################################################### 

2、在master上创建一个由备份权限的授权用户,然后在slave上添加授权用户的信息

root@mysql 10:31  mysql>create user 'chen'@'%' identified by '123456';
Query OK, 0 rows affected (1.01 sec)root@mysql 10:40  mysql>grant replication slave on *.* to 'chen'@'%';
Query OK, 0 rows affected (0.00 sec)

查看master相关信息

root@(none) 16:03  mysql>show master status;
+-------------------+----------+--------------+------------------+-------------------------------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                         |
+-------------------+----------+--------------+------------------+-------------------------------------------+
| master-bin.000002 |      194 |              |                  | 0294c53c-06a2-11ed-98a8-000c29f3aa67:1-29 |
+-------------------+----------+--------------+------------------+-------------------------------------------+
1 row in set (0.00 sec)

在slave1和slave2以及backup_server 上面添加授权用户信息

root@(none) 16:07  mysql>CHANGE MASTER TO MASTER_HOST='192.168.44.170' ,-> MASTER_USER='chen',-> MASTER_PASSWORD='123456',-> MASTER_PORT=3306,-> MASTER_LOG_FILE='master-bin.000002',-> MASTER_LOG_POS=194;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

查看slave状态:可以看到IO线程和SQL线程并没有开启,这是因为我们还没有开启slave角色导致的

root@(none) 10:52  mysql>show slave status\G;
*************************** 1. row ***************************Slave_IO_State: Master_Host: 192.168.44.170Master_User: chenMaster_Port: 3306Connect_Retry: 60Master_Log_File: master-bin.000001Read_Master_Log_Pos: 605Relay_Log_File: slave1-relay-bin.000001Relay_Log_Pos: 4Relay_Master_Log_File: master-bin.000001Slave_IO_Running: NoSlave_SQL_Running: No

start slave :在slave1和slave2以及backup_server上开启slave角色,然后就可以看到IO线程和SQL线程都已经开启

root@(none) 10:53  mysql>start slave;
Query OK, 0 rows affected (0.08 sec)root@(none) 10:55  mysql>show slave status\G;
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.44.170Master_User: chenMaster_Port: 3306Connect_Retry: 60Master_Log_File: master-bin.000001Read_Master_Log_Pos: 605Relay_Log_File: slave1-relay-bin.000002Relay_Log_Pos: 321Relay_Master_Log_File: master-bin.000001Slave_IO_Running: YesSlave_SQL_Running: Yes

所有从服务器都开启slave后,测试数据的一致性

在master上面删除zhaojunjie数据库,发现从服务上面的zhaojunjie数据库也被删除了

root@(none) 16:13  mysql>drop database zhaojunjie;
Query OK, 1 row affected (0.01 sec)
root@(none) 16:12  mysql>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| flask_ht           |
| gtid_test          |
| kafka_data         |
| mysql              |
| performance_schema |
| sanchuang          |
| student            |
| sys                |
| test               |
| ucar_cloud         |
| wangsh             |
| wenlaoshi          |
| zhaojunjie         |
+--------------------+
14 rows in set (0.00 sec)root@(none) 16:13  mysql>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| flask_ht           |
| gtid_test          |
| kafka_data         |
| mysql              |
| performance_schema |
| sanchuang          |
| student            |
| sys                |
| test               |
| ucar_cloud         |
| wangsh             |
| wenlaoshi          |
+--------------------+
13 rows in set (0.00 sec)root@(none) 16:17  mysql>

此时我们的mysql集群就完成了异步复制

#################################################################################### 

给mysql集群部署基于gtid的主从复制

1、关闭所有从服务器上的slave服务

root@(none) 16:13  mysql>stop slave;
Query OK, 0 rows affected (0.01 sec)

2、编辑master和从服务器的配置文件,添加gtid功能

gtid-mode=on
enforce-gtid-consistency = on

3、重启master和从服务器的mysql服务

[root@backup_server ~]# service mysqld restart
Shutting down MySQL.. SUCCESS!
Starting MySQL.. SUCCESS!

重启服务后登陆mysql服务,发现IO线程和SQL线程都已经处于开启状态,至此,基于gtid的主从复制部署完成

#################################################################################### 

给backup_server配置延迟备份

1、首先停止 backup_server的salve功能

root@(none) 16:48  mysql>stop slave ;
Query OK, 0 rows affected (0.00 sec)

2、在backup_server上设置延迟时间,然后开启slave

为了后面测试延迟备份,设置延迟时间为10s,在生产环境应该把这个时间调大点,给灾备情况给出缓冲时间

root@(none) 16:49  mysql>CHANGE MASTER TO MASTER_DELAY = 10;
Query OK, 0 rows affected (0.00 sec)root@(none) 16:50  mysql>start slave;
Query OK, 0 rows affected (0.00 sec)

3、测试延迟备份的效果

在master上新建数据库delay_test,观察数据一致性情况

可以很清楚地看到,slave1和slave2上的数据很快同步,出现了delay_test数据库,但是backup_server延时备份服务器上30s后才同步,

root@(none) 16:54  mysql>create database delay_test;
Query OK, 1 row affected (0.00 sec
root@(none) 16:54  mysql>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| delay_test         |
| flask_ht           |
| gtid_test          |
| kafka_data         |
| mysql              |
| performance_schema |
| sanchuang          |
| student            |
| sys                |
| test               |
| ucar_cloud         |
| wangsh             |
| wenlaoshi          |
+--------------------+
14 rows in set (0.00 sec)

至此,基于gtid和延迟备份的mysql主从复制集群搭建完毕

#################################################################################### 

部署基于gtid的半同步复制

在master和所有slave服务器上做相同操作,部署半同步复制

1、首先在master上面安装插件

root@(none) 15:42  mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
Query OK, 0 rows affected (0.01 sec)

2、设置master全局变量和超时时间

root@(none) 15:46  mysql>SET GLOBAL rpl_semi_sync_master_enabled = 1;
Query OK, 0 rows affected (0.00 sec)root@(none) 15:47  mysql>

查看变量是否开启 

root@(none) 15:47  mysql>show variables like "%semi_sync%";
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | ON         |
| rpl_semi_sync_master_timeout              | 10000      |
| rpl_semi_sync_master_trace_level          | 32         |
| rpl_semi_sync_master_wait_for_slave_count | 1          |
| rpl_semi_sync_master_wait_no_slave        | ON         |
| rpl_semi_sync_master_wait_point           | AFTER_SYNC |
+-------------------------------------------+------------+
6 rows in set (0.01 sec)root@(none) 15:48  mysql>

3、在slave上面安装插件,设置全局变量

root@(none) 15:51  mysql>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (0.00 sec)root@(none) 15:51  mysql>
root@(none) 15:52  mysql>SET GLOBAL rpl_semi_sync_slave_enabled = 1;
Query OK, 0 rows affected (0.00 sec)

4、停止slave上面的I/O线程,然后重启I/O线程

root@(none) 15:53  mysql>STOP SLAVE IO_THREAD;
Query OK, 0 rows affected (0.00 sec)root@(none) 15:57  mysql>START SLAVE IO_THREAD;
Query OK, 0 rows affected (0.00 sec)root@(none) 15:58  mysql>

至此,gtid的半同步复制mysql集群就部署完成 

#################################################################################### 

mysqlrouter读写分离部署实现

 MySQL Router是MySQL官方提供的一个轻量级中间件,可以在应用程序与MySQL服务器之间提供透明的路由方式。主要用以解决MySQL主从库集群的高可用、负载均衡、易扩展等问题。

1、准备两台全新的linux服务器,安装好mysqlrouter软件

proxy-1 :192.168.44.132

proxy-2: 192.168.44.166 

修改mysqlrouter的配置文件

proxy-1配置文件修改:

# 名字可以自定义
[routing:read_write]
#是mysql-router服务器的ip地址
bind_address = 192.168.44.132
bind_port = 7001
#支持可读可写
mode = read-write
#mysql-master服务器的ip地址:mysql服务的端口号
destinations = 192.168.44.170:3306
max_connections = 65535
max_connect_errors = 100
client_connect_timeout = 9[routing:read_only]
#是mysql-router服务器的ip地址
bind_address = 192.168.44.132
bind_port = 7002
# 仅可读
mode = read-only
# mysql-slave服务器的ip地址:mysql服务的端口号
destinations = 192.168.44.170:3306,192.168.44.140:3306,192.168.44.160:3306
max_connections = 65535
max_connect_errors = 100
client_connect_timeout = 9

proxy-2配置文件修改: 

# 名字可以自定义
[routing:read_write]
#是mysql-router服务器的ip地址
bind_address = 192.168.44.166
bind_port = 7001
#支持可读可写
mode = read-write
#mysql-master服务器的ip地址:mysql服务的端口号
destinations = 192.168.44.170:3306
max_connections = 65535
max_connect_errors = 100
client_connect_timeout = 9[routing:read_only]
#是mysql-router服务器的ip地址
bind_address = 192.168.44.166
bind_port = 7002
# 仅可读
mode = read-only
# mysql-slave服务器的ip地址:mysql服务的端口号
destinations = 192.168.44.170:3306,192.168.44.140:3306,192.168.44.160:3306
max_connections = 65535
max_connect_errors = 100
client_connect_timeout = 9

重启mysqlrouter服务,可以看到mysqlrouter进程和7001,7002端口已经开启,说明mysqlrouter服务已经成功启动

[root@proxy-1 ~]# service mysqlrouter restart
Redirecting to /bin/systemctl restart mysqlrouter.service
[root@proxy-1 ~]# ps aux | grep mysqlrouter
mysqlro+   3455  0.3  0.9 515444  9892 ?        Ssl  22:18   0:00 /usr/bin/mysqlrouter
root       3464  0.0  0.0 112824   992 pts/0    R+   22:18   0:00 grep --color=auto mysqlrouter
[root@proxy-1 ~]# netstat -anplut |grep mysqlrouter
tcp        0      0 192.168.44.132:7001     0.0.0.0:*               LISTEN      3455/mysqlrouter
tcp        0      0 192.168.44.132:7002     0.0.0.0:*               LISTEN      3455/mysqlrouter  
[root@proxy-2 mysqlrouter]# service mysqlrouter restart
Redirecting to /bin/systemctl restart mysqlrouter.service
[root@proxy-2 mysqlrouter]# ps aux |grep mysql
mysqlro+   2813  0.5  0.9 515444  9924 ?        Ssl  22:20   0:00 /usr/bin/mysqlrouter
root       2822  0.0  0.0 112824   988 pts/1    R+   22:20   0:00 grep --color=auto mysql
[root@proxy-2 mysqlrouter]# netstat -anplut|grep mysqlrouter
tcp        0      0 192.168.44.166:7001     0.0.0.0:*               LISTEN      2813/mysqlrouter
tcp        0      0 192.168.44.166:7002     0.0.0.0:*               LISTEN      2813/mysqlrouter   

#################################################################################### 

2、创建授权用户验证读写分离

在mysql集群的master机器上创建两个用户

read-write  --->7001 ---> 192.168.44.170   写操作在master执行

read-only  -->7002 --> 192.168.44.170:3306,192.168.44.140:3306,192.168.44.160:3306   读操作在master和slave都可以执行

创建可读可写用户:

root@(none) 11:07  mysql>create user 'read-write'@'%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)root@(none) 11:10  mysql>grant all on *.* to 'read-write'@'%';
Query OK, 0 rows affected (0.01 sec)root@(none) 11:10  mysql>

创建仅可读用户:

root@(none) 11:10  mysql>create user 'read-only'@'%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)root@(none) 11:11  mysql>grant select on *.* to 'read-only'@'%';
Query OK, 0 rows affected (0.00 sec)root@(none) 11:12  mysql>

#################################################################################### 

3、验证读写分离操作效果

准备一台客户机,测试访问mysqlrouter中间件所在的服务器

验证效果:read-write用户可以 进行读写操作  指定端口7001

[root@client-server ~]# mysql -h 192.168.44.132 -P 7001 -u read-write -p'123456'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 14
Server version: 5.7.34-log MySQL Community Server (GPL)Copyright (c) 2000, 2021, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.read-write@(none) 11:23  mysql>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| delay_test         |
| flask_ht           |
| gtid_test          |
| kafka_data         |
| mysql              |
| performance_schema |
| sanchuang          |
| student            |
| sys                |
| test               |
| ucar_cloud         |
| wangsh             |
| wenlaoshi          |
+--------------------+
14 rows in set (0.01 sec)read-write@(none) 11:26  mysql>create database test1;
Query OK, 1 row affected (0.00 sec)read-write@(none) 11:28  mysql>select host,user from mysql.user;
+---------------+---------------+
| host          | user          |
+---------------+---------------+
| %             | chen          |
| %             | liming        |
| %             | read-only     |
| %             | read-write    |
| %             | shiyaling     |
| %             | wangsh        |
| %             | zhangj        |
| 192.168.0.124 | liuhongjie    |
| 192.168.44.%  | liu           |
| localhost     | mysql.session |
| localhost     | mysql.sys     |
| localhost     | root          |
+---------------+---------------+
12 rows in set (0.00 sec)read-write@(none) 11:28  mysql>

#################################################################################### 

验证效果:read-only用户只可以进行读操作,不能进行写操作  ,指定端口7002

[root@client-server ~]# mysql -h 192.168.44.132 -P 7002 -u read-only -p'123456'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 16
Server version: 5.7.34-log MySQL Community Server (GPL)Copyright (c) 2000, 2021, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.read-only@(none) 11:35  mysql>
read-only@(none) 11:35  mysql>select user,host from mysql.user;
+---------------+---------------+
| user          | host          |
+---------------+---------------+
| chen          | %             |
| liming        | %             |
| read-only     | %             |
| read-write    | %             |
| shiyaling     | %             |
| wangsh        | %             |
| zhangj        | %             |
| liuhongjie    | 192.168.0.124 |
| liu           | 192.168.44.%  |
| mysql.session | localhost     |
| mysql.sys     | localhost     |
| root          | localhost     |
+---------------+---------------+
12 rows in set (0.00 sec)read-only@(none) 11:35  mysql>

至此,基于gtid的半1复制的读写分离集群搭建完成

#################################################################################### 

搭建双vip高可用集群

在proxy-1和proxy-2集群上部署keepalived做高可用

proxy-1和proxy-2都要安装keepalived

1、安装部署keepalived软件 ,并修改配置文件

[root@proxy-1 ~]# yum install keepalived -y
[root@proxy-2 ~]# yum install keepalived -y
[root@proxy-2 ~]# keepalived -v
Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2Copyright(C) 2001-2017 Alexandre Cassen, <acassen@gmail.com>Build options:  PIPE2 LIBNL3 RTA_ENCAP RTA_EXPIRES RTA_PREF RTA_VIA FRA_OIFNAME FRA_SUPPRESS_PREFIXLEN FRA_TUN_ID RTAX_CC_ALGO RTAX_QUICKACK LIBIPTC LIBIPSET_DYNAMIC LVS LIBIPVS_NETLINK VRRP VRRP_AUTH VRRP_VMAC SOCK_NONBLOCK SOCK_CLOEXEC FIB_ROUTING INET6_ADDR_GEN_MODE SNMP_V3_FOR_V2 SNMP SNMP_KEEPALIVED SNMP_CHECKER SNMP_RFC SNMP_RFCV2 SNMP_RFCV3 SO_MARK
[root@proxy-2 ~]#

配置proxy-1:keepalived的配置文件

将proxy-1配置为master,将proxy-2作为backup

[root@proxy-1 keepalived]# cat keepalived.conf
! Configuration File for keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_id LVS_DEVELvrrp_skip_check_adv_addr# vrrp_strictvrrp_garp_interval 0vrrp_gna_interval 0
}vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 61priority 200advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.44.180}
}vrrp_instance VI_2 {state BACKUPinterface ens33virtual_router_id 62priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.44.181}
}

配置proxy-2 keepalived的配置文件

[root@proxy-2 keepalived]# cat keepalived.conf
! Configuration File for keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_id LVS_DEVELvrrp_skip_check_adv_addr# vrrp_strictvrrp_garp_interval 0vrrp_gna_interval 0
}vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 61priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.44.180}
}vrrp_instance VI_2 {state MASTERinterface ens33virtual_router_id 62priority 200advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.44.181}
}

编辑好配置文件以后,重启keepalived服务

[root@proxy-1 keepalived]# service keepalived start
Redirecting to /bin/systemctl start keepalived.service
[root@proxy-1 keepalived]# ps aux|grep keepalived
root       3892  0.0  0.1 123012  1404 ?        Ss   15:17   0:00 /usr/sbin/keepalived -D
root       3893  0.0  0.3 133980  3340 ?        S    15:17   0:00 /usr/sbin/keepalived -D
root       3894  0.0  0.2 133852  2672 ?        S    15:17   0:00 /usr/sbin/keepalived -D
root       3904  0.0  0.0 112824   992 pts/1    R+   15:17   0:00 grep --color=auto keepalived
[root@proxy-2 keepalived]# service keepalived start
Redirecting to /bin/systemctl start keepalived.service
[root@proxy-2 keepalived]# ps aux |grep keepalived
root       3369  0.0  0.1 123012  1396 ?        Ss   15:16   0:00 /usr/sbin/keepalived -D
root       3370  0.0  0.3 133984  3400 ?        S    15:16   0:00 /usr/sbin/keepalived -D
root       3371  0.0  0.2 133852  2664 ?        S    15:16   0:00 /usr/sbin/keepalived -D
root       3381  0.0  0.0 112824   988 pts/2    R+   15:16   0:00 grep --color=auto keepalived

实现效果:

[root@proxy-1 keepalived]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:92:35:e8 brd ff:ff:ff:ff:ff:ffinet 192.168.44.132/24 brd 192.168.44.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet 192.168.44.180/32 scope global ens33valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe92:35e8/64 scope link valid_lft forever preferred_lft forever
[root@proxy-2 keepalived]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:70:78:9f brd ff:ff:ff:ff:ff:ffinet 192.168.44.166/24 brd 192.168.44.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet 192.168.44.181/32 scope global ens33valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe70:789f/64 scope link valid_lft forever preferred_lft forever

#################################################################################### 

2、使用客户机访问配置好的master

注意:这个时候我们访问master是访问不了的,因为master上并没有开启7001,7002端口

[root@client-server ~]# mysql -h 192.168.44.180 -P 7001 -u read-write -p'123456'
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.44.180' (111)

所以我们要将mysqlrouter的配置文件修改一下,将mysqlroute绑定的IP地址改为0.0.0.0,本机任意ip地址都能访问,然后重启mysqlrouter服务

注意:proxy-1和proxy-2的mysqlrouter配置文件都要修改

# 名字可以自定义
[routing:read_write]
#是mysql-router服务器的ip地址
bind_address = 0.0.0.0
bind_port = 7001
#支持可读可写
mode = read-write
#mysql-master服务器的ip地址:mysql服务的端口号
destinations = 192.168.44.170:3306
max_connections = 65535
max_connect_errors = 100
client_connect_timeout = 9[routing:read_only]
#是mysql-router服务器的ip地址
bind_address = 0.0.0.0
bind_port = 7002
# 仅可读
mode = read-only
# mysql-slave服务器的ip地址:mysql服务的端口号
destinations = 192.168.44.170:3306,192.168.44.140:3306,192.168.44.160:3306
max_connections = 65535
max_connect_errors = 100
client_connect_timeout = 9
[root@proxy-1 mysqlrouter]# service mysqlrouter restart
Redirecting to /bin/systemctl restart mysqlrouter.service
[root@proxy-1 mysqlrouter]# ps aux |egrep "mysqlrouter|keepalived"
root       3892  0.0  0.1 123012  1404 ?        Rs   15:17   0:00 /usr/sbin/keepalived -D
root       3893  0.0  0.3 133980  3340 ?        S    15:17   0:00 /usr/sbin/keepalived -D
root       3894  0.0  0.2 133852  2672 ?        S    15:17   0:00 /usr/sbin/keepalived -D
mysqlro+   3940  0.4  0.7 515444  7856 ?        Ssl  15:50   0:00 /usr/bin/mysqlrouter
root       3949  0.0  0.1 112824   996 pts/1    R+   15:50   0:00 grep -E --color=auto mysqlrouter|keepalived
[root@proxy-2 mysqlrouter]# service mysqlrouter restart
Redirecting to /bin/systemctl restart mysqlrouter.service
[root@proxy-2 mysqlrouter]# ps aux |egrep "mysqlrouter|keepalived"
root       3369  0.0  0.1 123012  1396 ?        Ss   15:16   0:00 /usr/sbin/keepalived -D
root       3370  0.0  0.3 133984  3400 ?        S    15:16   0:00 /usr/sbin/keepalived -D
root       3371  0.0  0.2 133852  2664 ?        S    15:16   0:00 /usr/sbin/keepalived -D
mysqlro+   3417  0.0  0.9 515444  9924 ?        Ssl  15:49   0:00 /usr/bin/mysqlrouter
root       3431  0.0  0.1 112824  1000 pts/2    R+   15:52   0:00 grep -E --color=auto mysqlrouter|keepalived
[root@proxy-2 mysqlrouter]#

重启服务以后,再次使用客户机访问master,可以看到,read-write和read-only都可以成功访问

[root@client-server ~]# mysql -h 192.168.44.180 -P 7001 -u read-write -p'123456'
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.44.180' (113)
[root@client-server ~]# mysql -h 192.168.44.180 -P 7001 -u read-write -p'123456'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 18
Server version: 5.7.34-log MySQL Community Server (GPL)Copyright (c) 2000, 2021, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.read-write@(none) 16:18  mysql>
[root@client-server ~]# mysql -h 192.168.44.180 -P 7002 -u read-only -p'123456'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.34-log MySQL Community Server (GPL)Copyright (c) 2000, 2021, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.read-only@(none) 16:21  mysql>

至此,双vip的高可用mysql集群就搭建好了

#################################################################################### 

prometheus监控的部署

1、在监控服务器安装部署prometheus软件

准备一台prometheus监控服务器

prometheus:192.168.44.210

下载好prometheus源码包,然后新建prometheus文件夹,将源码包上传到prometheus服务器里

[root@prometheus prometheus]# ls
prometheus-2.34.0.linux-amd64.tar.gz
[root@prometheus prometheus]#
[root@prometheus prometheus]# tar xf prometheus-2.34.0.linux-amd64.tar.gz
[root@prometheus prometheus]# ls
prometheus-2.34.0.linux-amd64  prometheus-2.34.0.linux-amd64.tar.gz

修改PATH变量,将PATH变量写入.bashrc文件里

[root@prometheus ~]# cat .bashrc
PATH=/root/prometheus/prometheus:$PATH

将prometheus放到后台运行

[root@prometheus prometheus]# nohup prometheus &
[1] 2000
[root@prometheus prometheus]# nohup: 忽略输入并把输出追加到"nohup.out"

2、在要监控的服务器上安装mysqld_exporter软件

[root@master mysqld_exporter]# ls
mysqld_exporter-0.14.0.linux-amd64.tar.gz
[root@master mysqld_exporter]# tar xf mysqld_exporter-0.14.0.linux-amd64.tar.gz
[root@master mysqld_exporter]# ls
mysqld_exporter-0.14.0.linux-amd64  mysqld_exporter-0.14.0.linux-amd64.tar.gz
[root@master mysqld_exporter]# mv mysqld_exporter-0.14.0.linux-amd64 mysqld_exporter
[root@master mysqld_exporter]# ls
mysqld_exporter  mysqld_exporter-0.14.0.linux-amd64.tar.gz

创建授权用户,并授予权限

root@(none) 21:40  mysql>create user 'exporter'@'localhost' identified by '123123';
Query OK, 0 rows affected (0.00 sec)root@(none) 21:41  mysql>grant process,replication client,select on *.* to 'exporter'@'localhost';
Query OK, 0 rows affected (0.01 sec)

 创建一个配置文件my.cnf将刚才创建的用户信息添加到配置文件

[root@master mysqld_exporter]# cat my.cnf
[client]
user=exporter
password=123123
host=localhost
port=3306

测试连接,看能否监控mysql指标

--config.mycnf  :  指定mysqld_exporter配置文件

--web.listen-address   指定监听端口

--log.level    指定日志级别

[root@master mysqld_exporter]# nohup mysqld_exporter --config.my-cnf="/mysqld_exporter/mysqld_exporter/my.cnf" --web.listen-address='0.0.0.0':9088 --log.level=debug &
[1] 22075
[root@master mysqld_exporter]# nohup: 忽略输入并把输出追加到"nohup.out"

3、将mysqld_exporter接入prometheus里

 在prometheus配置文件prometheus.yml里面添加mysqld_exporter信息

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: "mysqld_exporter1"static_configs:- targets: ["192.168.44.170:9088"]

修改配置文件以后重新执行prometheus程序,

[root@prometheus prometheus]# nohup prometheus --config.file=prometheus.yml &
[1] 2260
[root@prometheus prometheus]# nohup: 忽略输入并把输出追加到"nohup.out"

4、部署grafana可视化监控指标展示工具

下载grafana压缩包,上传至prometheus监控服务器,然后使用yum install 安装

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

启动grafana服务,查看端口

[root@prometheus grafana]# service grafana-server  start
Starting grafana-server (via systemctl):                   [  确定  ]
[root@prometheus grafana]# ss -anplut|grep grafana
tcp    LISTEN     0      128    [::]:3000               [::]:*                   users:(("grafana-server",pid=2474,fd=8))

访问测试grafana服务

添加数据源

 添加新的面板,将想要监控的指标显示出来

#################################################################################### 

双vip的MySQL高可用集群相关推荐

  1. 企业主流MySQL高可用集群

    选型 10款常见MySQL高可用方案选型解读 MYSQL(高可用方案) 目前最流行的是:主从复制.基于Galera的方案 企业主流MySQL高可用集群 了解 MySQL 集群之前,先看看单节点数据库的 ...

  2. keepalived vip mysql_mysql+keepalived高可用集群

    mysql+keepalived高可用集群 我们了解在LVS集群当中,LVS是整个机群的唯一入口!如果LVS出现故障的话,那么整个集群都将无法访问!像这种重要的服务器只有一台服务器在工作的情况,如果出 ...

  3. heartbeat+DRBD+mysql高可用集群实战

      heartbeat+DRBD+mysql高可用集群实战 四台主机 主机名                 IP地址             用途 dbm128                    ...

  4. mysql1.7(mysql优化,mysql-mmm软件介绍,mysql高可用集群。)

    一,mysql优化. 1. 1mysql服务工作过程 mysql服务由8个功能组件组成: 1,管理工具  把软件包安装后,提供的命令. #mv /etc/my.cnf   /etc/my.cnf.ba ...

  5. 企业中MySQL高可用集群架构三部曲之MM+keepalived

    各位老铁们,老张与大家又见面了.看到各位在博客里面给我的留言和访问量的情况,我很是欣慰,也谢谢大家对我的认可.我写这些博客,就是想把自己对于MySQL数据库的一些看法和自己平时的实战经验分享出来,我们 ...

  6. MYSQL高可用集群架构——MHA架构

    MHA高可用集群 文章目录 一.MHA 简介: 二.部署 MHA: 第一步:三台主从服务器安装 mysql 第二步:修改 mysql 的主配置文件:/etc/my.cnf ,注意三台服务器的 serv ...

  7. nfs mysql_heatbeat-gui实现基于nfs的mysql高可用集群

    一.简述HA高可用集群 高可用集群就是当集群中的一个节点发生各种软硬件及人为故障时,集群中的其他节点能够自动接管故障节点的资源并向外提供服务.以实现减少业务中断时间,为用户提供更可靠,更高效的服务. ...

  8. gelera mysql_基于Galera的MySQL高可用集群

    MySQL的高可用方案 我们在考虑MySQL数据库的高可用的架构时,主要要考虑如下几方面: 如果数据库发生了宕机或者意外中断等故障,能尽快恢复数据库的可用性,尽可能的减少停机时间,保证业务不会因为数据 ...

  9. mysql高可用集群MHA,PXC

    MHA+MYSQL主从同步结构 MHA由日本dena公司youshimaton开发 是一套优秀的实现mysql高可用的解决方案 数据库的自动故障切换操作能做到在0-30秒内完成 MHA能确保在故障切换 ...

最新文章

  1. 有这一篇机器学习全够了
  2. Linq to Entities in Ado.net EF的事务
  3. 【Hadoop】伪分布式安装---MapReduce程序运行到YARN上,编写MapReduce程序---HDFS yarn
  4. 【转】Qt中的QString,QByteArray,Qchar, char*
  5. 为什么民营银行,农村商业银行存款,定期存款利率比五大行还高?
  6. Machine Learning--决策树(一)
  7. python库numpy的reshape的终极解释
  8. 传输线理论 1/4波长阻抗变换器的分析匹配
  9. java语言编程之FileWriter
  10. 爸爸去哪儿第三季之刘诺一8.1第四期
  11. Linux安全审计之audit安装与使用
  12. yolov5不能检测长宽比超过20的目标的解决方法
  13. HP LaserJet 1020打印机显示脱机,脱机使用打印机的勾去不掉
  14. 快速可靠网络传输协议 KCP
  15. Vue项目中的静态资源引入
  16. 云虚拟主机数据库连接和url重写
  17. 五千年中国富豪排行榜(组图)
  18. 解决-笔记本安装CentOS 7 后无法连接Wi-Fi
  19. 【Android】Android加密和解密方式
  20. 关于蜂产品保健的一些介绍

热门文章

  1. MySQL数据库快速入门
  2. Pascal voc2007安装和pytorch使用
  3. Excel函数不生效的一种情况
  4. python基于pingouin包进行统计分析:使用partial_corr函数执行两个变量之间的偏相关性检验、covar参数指定对应的协变量(多个)、method参数指定相关性分析方法
  5. 移动硬盘加装ubuntu系统(双系统)
  6. 树莓派使用FlashFxp SSH 连接
  7. 最简单安全有效的防盗技术和防脱机外挂技术。研发部门可以借鉴使用。
  8. 建设智慧水利,水库水利在线监控系统解决方案
  9. mciSendString()函数播放音乐没声音及解决
  10. 人工智能从1.0时代到4.0时代