天工造物局 Zabbix DB 读写分离实施方案

Zabbix DB 读写分离实施方案

一、背景

Zabbix监控随着监控项的增多,数据读写遇到瓶颈,web页面加载慢。

二、解决方案

  • 思路
    • 通过proxySQL 实现读写分离。
  • 基础环境
角色IPserver-id备注
mysql master172.16.80.206206
mysql slave172.16.80.190190
proxysql172.16.80.206
  • 架构
    • 改造前Zabbix DB 读写分离实施方案_proxysql

    • 改造后Zabbix DB 读写分离实施方案_proxysql_02

三、配置实现

1. 配置主从复制
2. 读写分离配置
2.1 安装ProxySQL
wget https://github.com/sysown/proxysql/releases/download/v2.7.2/proxysql-2.7.2-1-centos7.x86_64.rpm
[root@ ~]# rpm -ivh proxysql-2.7.2-1-centos7.x86_64.rpm
systemctl start proxysql
systemctl status proxysql
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 默认配置文件内容
#配置文件详解
[root@~]# egrep -v "^#|^$" /etc/proxysql.cnf
datadir="/var/lib/proxysql"                                   #数据目录
admin_variables=
{
        admin_credentials="admin:admin"                       #连接管理端的用户名与密码
        mysql_ifaces="0.0.0.0:6032"                           #管理端口,用来连接proxysql的管理数据库
}
mysql_variables=
{
        threads=4                                             #指定转发端口开启的线程数量
        max_connections=2048
        default_query_delay=0
        default_query_timeout=36000000
        have_compress=true
        poll_timeout=2000
        interfaces="0.0.0.0:6033"                             #指定转发端口,用于连接后端mysql数据库的,相当于代理作用
        default_schema="information_schema"
        stacksize=1048576
        server_version="5.5.68"                               #指定后端mysql的版本
        connect_timeout_server=3000
        monitor_username="monitor"
        monitor_password="monitor"
        monitor_history=600000
        monitor_connect_interval=60000
        monitor_ping_interval=10000
        monitor_read_only_interval=1500
        monitor_read_only_timeout=500
        ping_interval_server_msec=120000
        ping_timeout_server=500
        commands_stats=true
        sessions_sort=true
        connect_retries_on_failure=10
}
mysql_servers =
(
)
mysql_users:
(
)
mysql_query_rules:
(
)
scheduler=
(
)
mysql_replication_hostgroups=
(
)
 
# 在部署过程中,最好使用官方推荐的方式来配置proxy sql
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 启动proxysql服务,查看状态
systemctl start proxysql
#登录数据库
mysql -uadmin -padmin -h127.0.0.1 -P6032
  • 1.
  • 2.
  • 3.
  • 4.

Zabbix DB 读写分离实施方案_proxysql_03

  • 在mysql-master 数据库节点执行:(在主节点执行)
#创建主用户,用来暴露自己的api给proxySql
GRANT ALL PRIVILEGES ON *.* TO 'proxyAdmin'@'%' identified by 'proxysql'  WITH GRANT OPTION;

#创建监控用户,该用户可以查看本机mysql服务的只读属性
create user proxyMonitor@'%' identified by 'monitor';
grant replication client on *.* to proxyMonitor@'%';
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
2.2配置proxysql
  • 查看内置库
MySQL [(none)]> show databases;
+-----+---------------+-------------------------------------+
| seq | name          | file                                |
+-----+---------------+-------------------------------------+
| 0   | main          |                                     |
| 2   | disk          | /var/lib/proxysql/proxysql.db       |
| 3   | stats         |                                     |
| 4   | monitor       |                                     |
| 5   | stats_history | /var/lib/proxysql/proxysql_stats.db |
+-----+---------------+-------------------------------------+
5 rows in set (0.00 sec)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • mysql_servers 表配置读写组,对应的后端mysql server:
insert into mysql_servers(hostgroup_id,hostname,port,weight,comment) values(10,'172.16.80.206','3306',1,'Write Group');
insert into mysql_servers(hostgroup_id,hostname,port,weight,comment) values(20,'172.16.80.206','3306',1,'Read Group');
insert into mysql_servers(hostgroup_id,hostname,port,weight,comment) values(20,'172.16.80.190','3306',100000,'Read Group');  

load mysql servers to runtime;
save mysql servers to disk;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

Zabbix DB 读写分离实施方案_proxysql_04

  • 配置mysql_replication_hostgroups 表
insert into mysql_replication_hostgroups(writer_hostgroup,reader_hostgroup,check_type) values(10,20,'read_only');
load mysql servers to runtime; 
save mysql servers to disk;
  • 1.
  • 2.
  • 3.
  • 4.

Zabbix DB 读写分离实施方案_proxysql_05

  • mysql_users表定义了在连接到MySQL服务器时使用的用户名和密码,以及该用户在ProxySQL中的权限和其他属性。
INSERT INTO mysql_users(username,password,default_hostgroup) VALUES ('proxyAdmin','proxysql',10);
select * from mysql_users;
load mysql users to runtime;
save mysql users to disk;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

Zabbix DB 读写分离实施方案_proxysql_06

  • proxysql 节点上增加监控用户
set mysql-monitor_username='proxyMonitor';
set mysql-monitor_password='monitor';

load mysql variables to runtime;
save mysql variables to disk;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

Zabbix DB 读写分离实施方案_proxysql_07

  • 配置读写分离规则
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup, apply)VALUES (1, 1, '^SELECT.*FOR UPDATE', 10, 1),(10, 1, '^SELECT.*', 20, 0),(15, 1, '^(INSERT|REPLACE|UPDATE|DELETE|CREATE|ALTER|DROP|TRUNCATE|FLUSH|RENAME)', 10, 1),(600,1,'housekeeper',10,1);

load mysql query rules to runtime;
save mysql query rules to disk;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

Zabbix DB 读写分离实施方案_proxysql_08

Zabbix DB 读写分离实施方案_proxysql_09

  • 更新配置到RunTime
MySQL [(none)]> load mysql users to runtime; 
MySQL [(none)]> load mysql servers to runtime; 
MySQL [(none)]> load mysql query rules to runtime;
MySQL [(none)]> load mysql variables to runtime; 
MySQL [(none)]> load admin variables to runtime;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 将配置保存到磁盘,即/var/lib/proxysql/proxysql.db 文件中。
MySQL [(none)]> save mysql users to disk;
MySQL [(none)]> save mysql servers to disk;
MySQL [(none)]> save mysql query rules to disk;
MySQL [(none)]> save mysql variables to disk;
MySQL [(none)]> save admin variables to disk;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
3.读写分离验证
3.1 创建测试数据库
  • 两台数据库分别创建测试数据库test 、 测试表person_info;【test库不同步】
create database test;
CREATE TABLE person_info (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    age INT,
    gender ENUM('男', '女', '其他') DEFAULT '其他'
);
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 可写mysql中插入如下记录:
insert into person_info values('1','zhangsan','30','男');
 insert into person_info values('2','lisi','32','男');
 
 select * from person_info;
+----+----------+------+--------+
| id | name     | age  | gender |
+----+----------+------+--------+
|  1 | zhangsan |   30 | 男     |
|  2 | lisi     |   32 | 男     |
+----+----------+------+--------+
2 rows in set (0.00 sec)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 只读mysql插入如下记录:
insert into person_info values('10','wangwu','20','男');

select * from person_info;
+----+--------+------+--------+
| id | name   | age  | gender |
+----+--------+------+--------+
| 10 | wangwu |   20 | ?      |
+----+--------+------+--------+
1 row in set (0.00 sec)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
3.2 测试读写分离
  • 启动proxysql 数据端口
mysql -uproxyAdmin -pproxysql.168 -h 127.0.0.1 -P6033
  • 1.
  • 2.
  • 只读测试
    查询2次,只能查询到只读库上的1条数据,id为10. (主库2条数据id为1和2)

Zabbix DB 读写分离实施方案_proxysql_10

  • 写入测试
mysql -uproxyAdmin -pproxysql -h 127.0.0.1 -P6033

insert into person_info values('3','hhhhh','28','女');
  • 1.
  • 2.
  • 3.
  • 4.

为了验证已经写入到可写库里,需要退出proxysql。 在可写库服务器上mysql查询。如图示。
完成顺利写入。Zabbix DB 读写分离实施方案_proxysql_11

主库写入、从库只读实现了读写分离。

proxysql 管理端口: mysql -uadmin -padmin -h 127.0.0.1 -P6032
proxysql业务端口: mysql -uproxyAdmin -pproxysql -h 127.0.0.1 -P6033

4. zabbix server 配置
4.1 备份相关文件
  • 备份/etc/zabbix/zabbix_server.conf
cp /etc/zabbix/zabbix_server.conf  /etc/zabbix/zabbix_server_$(date +%Y%m%d).conf.bak
  • 1.
  • 2.
  • 备份配置文件 : /etc/zabbix/web/zabbix.conf.php
cp /etc/zabbix/web/zabbix.conf.php /etc/zabbix/web/zabbix.conf_$(date +%Y%m%d).php.bak
  • 1.
  • 2.
  • 3.
4.2 修改配置文件
  • 配置zabbix_server.conf
    /etc/zabbix/zabbix_server.conf
#修改以下参数
DBHost = 172.16.80.206      #proxysql和mariadb主在同一台机器,ip保持不变即可。
DBUser=proxyAdmin       #注释掉原来配置,不要删除  
DBPassword=proxysql    #注释掉原来密码,不要删除
DBPort=6033
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • zabbix web配置
    /etc/zabbix/web/zabbix.conf.php
$DB['SERVER'] = '172.16.80.206'; #保持不变
$DB['PORT']  = '6033';
$DB['USER']  = 'proxyAdmin';
$DB['PASSWORD'] = 'proxysql';
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 重启zabbix相关服务
systemctl  restart  httpd zabbix-server zabbix-agent
  • 1.
  • 2.
  • 检查zabbix web端状态, db写入情况。
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐

  • 浏览量 465
  • 收藏 0
  • 0

所有评论(0)

查看更多评论 
已为社区贡献7条内容