双vip的MySQL高可用集群
目录
一、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高可用集群相关推荐
- 企业主流MySQL高可用集群
选型 10款常见MySQL高可用方案选型解读 MYSQL(高可用方案) 目前最流行的是:主从复制.基于Galera的方案 企业主流MySQL高可用集群 了解 MySQL 集群之前,先看看单节点数据库的 ...
- keepalived vip mysql_mysql+keepalived高可用集群
mysql+keepalived高可用集群 我们了解在LVS集群当中,LVS是整个机群的唯一入口!如果LVS出现故障的话,那么整个集群都将无法访问!像这种重要的服务器只有一台服务器在工作的情况,如果出 ...
- heartbeat+DRBD+mysql高可用集群实战
heartbeat+DRBD+mysql高可用集群实战 四台主机 主机名 IP地址 用途 dbm128 ...
- mysql1.7(mysql优化,mysql-mmm软件介绍,mysql高可用集群。)
一,mysql优化. 1. 1mysql服务工作过程 mysql服务由8个功能组件组成: 1,管理工具 把软件包安装后,提供的命令. #mv /etc/my.cnf /etc/my.cnf.ba ...
- 企业中MySQL高可用集群架构三部曲之MM+keepalived
各位老铁们,老张与大家又见面了.看到各位在博客里面给我的留言和访问量的情况,我很是欣慰,也谢谢大家对我的认可.我写这些博客,就是想把自己对于MySQL数据库的一些看法和自己平时的实战经验分享出来,我们 ...
- MYSQL高可用集群架构——MHA架构
MHA高可用集群 文章目录 一.MHA 简介: 二.部署 MHA: 第一步:三台主从服务器安装 mysql 第二步:修改 mysql 的主配置文件:/etc/my.cnf ,注意三台服务器的 serv ...
- nfs mysql_heatbeat-gui实现基于nfs的mysql高可用集群
一.简述HA高可用集群 高可用集群就是当集群中的一个节点发生各种软硬件及人为故障时,集群中的其他节点能够自动接管故障节点的资源并向外提供服务.以实现减少业务中断时间,为用户提供更可靠,更高效的服务. ...
- gelera mysql_基于Galera的MySQL高可用集群
MySQL的高可用方案 我们在考虑MySQL数据库的高可用的架构时,主要要考虑如下几方面: 如果数据库发生了宕机或者意外中断等故障,能尽快恢复数据库的可用性,尽可能的减少停机时间,保证业务不会因为数据 ...
- mysql高可用集群MHA,PXC
MHA+MYSQL主从同步结构 MHA由日本dena公司youshimaton开发 是一套优秀的实现mysql高可用的解决方案 数据库的自动故障切换操作能做到在0-30秒内完成 MHA能确保在故障切换 ...
最新文章
- 有这一篇机器学习全够了
- Linq to Entities in Ado.net EF的事务
- 【Hadoop】伪分布式安装---MapReduce程序运行到YARN上,编写MapReduce程序---HDFS yarn
- 【转】Qt中的QString,QByteArray,Qchar, char*
- 为什么民营银行,农村商业银行存款,定期存款利率比五大行还高?
- Machine Learning--决策树(一)
- python库numpy的reshape的终极解释
- 传输线理论 1/4波长阻抗变换器的分析匹配
- java语言编程之FileWriter
- 爸爸去哪儿第三季之刘诺一8.1第四期
- Linux安全审计之audit安装与使用
- yolov5不能检测长宽比超过20的目标的解决方法
- HP LaserJet 1020打印机显示脱机,脱机使用打印机的勾去不掉
- 快速可靠网络传输协议 KCP
- Vue项目中的静态资源引入
- 云虚拟主机数据库连接和url重写
- 五千年中国富豪排行榜(组图)
- 解决-笔记本安装CentOS 7 后无法连接Wi-Fi
- 【Android】Android加密和解密方式
- 关于蜂产品保健的一些介绍
热门文章
- MySQL数据库快速入门
- Pascal voc2007安装和pytorch使用
- Excel函数不生效的一种情况
- python基于pingouin包进行统计分析:使用partial_corr函数执行两个变量之间的偏相关性检验、covar参数指定对应的协变量(多个)、method参数指定相关性分析方法
- 移动硬盘加装ubuntu系统(双系统)
- 树莓派使用FlashFxp SSH 连接
- 最简单安全有效的防盗技术和防脱机外挂技术。研发部门可以借鉴使用。
- 建设智慧水利,水库水利在线监控系统解决方案
- mciSendString()函数播放音乐没声音及解决
- 人工智能从1.0时代到4.0时代