mysql主从复制读写分离之——proxysql应用

一、说明
ProxySQL是一个开源的MySQL代理服务器,这意味着它充当MySQL服务器和访问其数据库的应用程序之间的中介。ProxySQL可以通过在多个数据库服务器池之间分配流量来提高性能,并且如果一个或多个数据库服务器发生故障,还可以通过自动故障切换到备用数据库来提高可用性。

系统环境:master1:ubuntu16.04 mysql5.6 192.168.1.10 3307
master2:ubuntu16.04 mysql5.6 192.168.1.20 3307
slave1: ubuntu16.04 mysql5.6 192.168.1.10 3308
slave2: ubuntu16.04 mysql5.6 192.168.1.10 3309
slave3: ubuntu16.04 mysql5.6 192.168.1.20 3308
slave4: ubuntu16.04 mysql5.6 192.168.1.20 3309
【proxysql】:ubuntu16.04 mysql 192.168.1.30 3306

master1与master2为双主双从模式。
主从复制前边文章和网上文章都特别详细。这里不做介绍。请参考http://blog.51cto.com/13120271/2140400。
第一步 - 安装ProxySQL
ProxySQL的开发人员在他们的GitHub版本页面上为所有ProxySQL版本提供官方Ubuntu软件包,因此我们将从那里下载最新的软件包版本并进行安装。

您可以在发布列表中找到最新的软件包。命名约定是proxysql_version-distribution.deb,其中version类似于版本1.4.4的1.4.4字符串,并且distribution是一个类似于64位Ubuntu 16.04的ubuntu16_amd64字符串。

将最新的官方软件包(编写本文时为1.4.4)下载到/tmp目录中。

cd /tmp
curl -OL https://github.com/sysown/proxysql/releases/download/v1.4.4/proxysql_1.4.4-ubuntu16_amd64.deb

用dpkg安装包,用于管理.deb软件包。-i标志表示我们要从指定的文件安装。

sudo dpkg -i proxysql_*

此时,您不再需要.deb文件,因此您可以将其删除。

rm proxysql_*
接下来,我们需要一个MySQL客户端应用程序来连接到ProxySQL实例。这是因为ProxySQL内部使用一个MySQL兼容的接口来执行管理任务。我们将使用mysql命令行工具,它是mysql-client Ubuntu存储库中可用包的一部分。

更新软件包存储库以确保获得最新的预捆绑版本,然后安装mysql-client软件包。

sudo apt-get update
sudo apt-get install mysql-client

您现在满足运行ProxySQL的所有要求,但该服务在安装后不会自动启动,因此请立即手动启动。

sudo systemctl start proxysql

现在,ProxySQL应该以其默认配置运行。你可以使用systemctl查看。

systemctl status proxysql

输出看起来像这样:

● proxysql.service - LSB: High Performance Advanced Proxy for MySQL
Loaded: loaded (/etc/init.d/proxysql; bad; vendor preset: enabled)
Active: active (running) since Thu 2017-12-21 19:19:20 UTC; 5s ago
Docs: man:systemd-sysv-generator(8)
Process: 12350 ExecStart=/etc/init.d/proxysql start (code=exited, status=0/SUCCESS)
Tasks: 23
Memory: 30.9M
CPU: 86ms
CGroup: /system.slice/proxysql.service
├─12355 proxysql -c /etc/proxysql.cnf -D /var/lib/proxysql
└─12356 proxysql -c /etc/proxysql.cnf -D /var/lib/proxysql

Active (running)行表示ProxySQL已安装并正在运行。

接下来,我们将通过设置用于访问ProxySQL管理界面的密码来提高安全性。
第二步 - 设置ProxySQL管理员密码
第一次启动新的ProxySQL安装时,它使用程序包提供的配置文件来初始化其所有配置变量的默认值。初始化后,ProxySQL将其配置存储在数据库中,您可以通过命令行进行管理和修改。

要在ProxySQL中设置管理员密码,我们将连接到该配置数据库并更新相应的变量。

首先,访问管理界面。系统将提示您输入密码,在默认安装时,密码为admin。

mysql -u admin -p -h 127.0.0.1 -P 6032 --prompt=‘ProxySQLAdmin> ‘

  • -u指定我们要连接的用户,这里是admin,管理任务的默认用户,例如更改配置设置。
  • -h 127.0.0.1告诉mysql连接到本地ProxySQL实例。我们需要明确定义它,因为ProxySQL不会监听默认情况下mysql假定的socket文件。
  • -P指定要连接的端口。ProxySQL的管理界面监听6032。
  • --prompt是一个可选标志,用于更改默认提示,通常是mysql>。在这里,我们将其更改为ProxySQLAdmin>显示我们已连接到ProxySQL管理界面。这将有助于避免以后在我们也将连接到复制数据库服务器上的MySQL接口时出现混淆。*
    连接后,您将看到ProxySQLAdmin>提示:

Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.30 (ProxySQL Admin Module)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

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.

ProxySQLAdmin>

通过更新(UPDATE)global_variables数据库中的admin-admin_credentials配置变量来更改管理帐户密码。请住将以下命令的password更改为您选择的强密码。

UPDATE global_variables SET variable_value=‘admin:password‘ WHERE variable_name=‘admin-admin_credentials‘;
Query OK, 1 row affected (0.00 sec)

由于ProxySQL的配置系统的工作方式,此更改不会立即生效。它由三个独立的层组成:

内存,在从命令行界面进行修改时会被更改。
运行时,ProxySQL使用它作为有效配置。
磁盘,用于使配置在重新启动时保持不变。
现在,你所做的改变是在内存中。要使更改生效,您必须将内存设置复制到运行时领域,然后将它们保存到磁盘以使其保持不变。

ProxySQLAdmin> LOAD ADMIN VARIABLES TO RUNTIME;
ProxySQLAdmin> SAVE ADMIN VARIABLES TO DISK;

第三步-修改配置文件

egrep -v ‘(^$|^#)‘ /etc/proxysql.cnf

admin_credentials="admin:admin"
mysql_ifaces="127.0.0.1:6032;/tmp/proxysql_admin.sock"
}
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;/tmp/proxysql.sock"
default_schema="information_schema"
stacksize=1048576
server_version="5.5.30"
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 =
(
{
address = "192.168.1.20" # no default, required . If port is 0 , address is interpred as a Unix Socket Domain
port = 3307 # no default, required . If port is 0 , address is interpred as a Unix Socket Domain
hostgroup = 1 # no default, required
status = "ONLINE" # default: ONLINE
weight = 1 # default: 1
compression = 0 # default: 0
max_connections = 200
},
{
address = "192.168.1.10" # no default, required . If port is 0 , address is interpred as a Unix Socket Domain
port = 3307 # no default, required . If port is 0 , address is interpred as a Unix Socket Domain
hostgroup = 1 # no default, required
status = "ONLINE" # default: ONLINE
weight = 1 # default: 1
compression = 0 # default: 0
max_connections = 200
},
{
address = "192.168.1.20" # no default, required . If port is 0 , address is interpred as a Unix Socket Domain
port = 3308 # no default, required . If port is 0 , address is interpred as a Unix Socket Domain
hostgroup = 2 # no default, required
status = "ONLINE" # default: ONLINE
weight = 1 # default: 1
compression = 0 # default: 0
max_connections = 1000
},
{
address = "192.168.1.20" # no default, required . If port is 0 , address is interpred as a Unix Socket Domain
port = 3309 # no default, required . If port is 0 , address is interpred as a Unix Socket Domain
hostgroup = 2 # no default, required
status = "ONLINE" # default: ONLINE
weight = 1 # default: 1
compression = 0 # default: 0
max_connections = 1000
},
{
address = "192.168.1.10" # no default, required . If port is 0 , address is interpred as a Unix Socket Domain
port = 3308 # no default, required . If port is 0 , address is interpred as a Unix Socket Domain
hostgroup = 2 # no default, required
status = "ONLINE" # default: ONLINE
weight = 1 # default: 1
compression = 0 # default: 0
max_connections = 1000
},
{
address = "192.168.1.10" # no default, required . If port is 0 , address is interpred as a Unix Socket Domain
port = 3309 # no default, required . If port is 0 , address is interpred as a Unix Socket Domain
hostgroup = 2 # no default, required
status = "ONLINE" # default: ONLINE
weight = 1 # default: 1
compression = 0 # default: 0
max_connections = 1000
}
)
mysql_users:
(
{
username = "admin" # no default , required
password = "password" # default: ‘‘
default_hostgroup = 1 # default: 0
max_connections=1000
default_schema="test"
active = 1 # default: 1
}
)
mysql_query_rules:
(
)
scheduler=
(
)
mysql_replication_hostgroups=
(
{
writer_hostgroup=1
reader_hostgroup=2
comment="test repl 1"
}
)

从新启动proxysql。

sudo systemctl restart proxysql
然后我们登录上去验证一下。
mysql -u admin -p -h 127.0.0.1 -P 6032 --prompt=‘ProxySQLAdmin> ‘
mysql > show databases;
mysql> show databases;
+--------------------+| Database |
+--------------------+| information_schema || mysql || performance_schema || study || sys |

以上stats,monitor,main都从配置文件中获取的数据库;可以通过类似mysql运行时修改;而不需要重启;更多命令行的配置请参考github;
至此我们基于proxysql主从复制读写分离架构已经完成;
双主或多主模型是无须实现读写分离,仅需要负载均衡:haproxy, nginx, lvs等;
proxysql并没有解决,当主数据岩机时的问题;此时就需要量MHA来解决 ;后续再介绍;

原文地址:http://blog.51cto.com/13120271/2313106

时间: 11-03

mysql主从复制读写分离之——proxysql应用的相关文章

mysql主从复制读写分离-Altas

mysql主从复制读写分离 本文读写分离使用的软件是Altas,altas是奇虎360公司开发的开源数据库代理软件.它是基于mysql-proxy开发而成的 它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行.基于此可以实现负载均衡.读写分离.高可用性等需求. mysql读写分离原理: 数据库层在高并发的情况下,i/o会产生瓶颈.而实际上用户读的请求要远远大于写的请求. 使用代理服务作为数据库前端,将不同的请求根据规则分配到不同的后端数据上面去,比如将写的请求分

【实战】Amoeba 代理 MySQL 主从复制 + 读写分离 【提供源码包】

目录简介: 1· Amoeba 的介绍2· MySQL 主从复制原理3· MySQL 读写分离原理4· 实战案例5· 总结归纳 Amoeba 的介绍 1)Amoeba 是什么: 1·Amoeba 的中文名是:变形虫.它是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy.它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行.基于此可以实现负载均衡.读写分离.高可用性等需求. 2·Amoeba相当于一个SQL请求的路由器,目的是为负载均衡.读

mysql主从复制-读写分离-原理

Mysql主从复制和读写分离 在实际的生产环境中,如果对mysql数据库的读和写都在一台数据库服务器中操作,无论是在安全性.高可用性,还是高并发等各个方面都是不能满足实际需求的.因此,一般通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力. Mysql主从复制和读写分离 l 主从复制: Mysql的主从复制和mysql的读写分离两者有紧密的联系,首先要部署主从复制,只有主从复制完成了,才能再此基础上进行数据的读写分离. Mysql支持的复制类型: 1. 基于语句的复制:在主服

利用amoeba实现mysql主从复制读写分离

一般大型网站为了缓解大量的并发访问,会在web端实现负载均衡,但是这是远远不够的.到了数据存储层.数据访问层,如果还是传统的架构,或者只是依靠一台服务器,大量的数据库连接操作,会导致数据库面临崩溃的危险.进而造成数据丢失,后果不堪设想.所以我们会考虑如何减少数据库的连接,一方面进行代码的优化,采用优秀的数据缓存技术如memcached,如果资金丰厚的话,必然会想到假设服务器群,来分担主数据库的压力.今天我们就利用MySQL主从配置,实现读写分离,分散数据库的压力.这种方式,很多网站都有应用,今天

数据库---mysql主从复制读写分离

http://m.open-open.com/m/lib/view/1413274853450.html 原理及架构分析 部署前准备 下载好源码包存放位置要与脚本中对应 mysql-5.5.22.tar.gz,cmake-2.8.6.tar.gz,amoeba-mysql-binary-2.2.0.tar.gz,jdk-6u14-linux-x64.bin selinux和iptables不做设置,关闭 系统光盘镜像为本地yum源,配置好yum文件 环境介绍: 主服务器(master):192.

mysql主从复制+读写分离 菜鸟入门

MYsql主从复制 1.mysql主从复制原理: Master将数据变化记录到二进制日志中[binary log] Slave将master的二进制日志[binary log]拷贝到自己的中继日志[relay log]中. Slave将中继入日志[relay log]事件在做一次,将数据变化,反应到自身数据库. 简述:mysql主从复制其实就是完全备份,和二进制日志备份还原的过程.二进制日志的还原基本上是实时进行的.注意不是完全实时,而是异步实时,主从直接的执行有延迟.如果master压力过大,

mysql主从复制读写分离

一.环境 1.主服务器操作系统:Mac OS MySQL版本:5.1.6 2.从服务器操作系统:Centos 6.5 MySQL版本:5.1.6 二.实战 2.1MySQL主从复制,读写分离示意图 MySQL 复制的工作方式很简单,一台服务器作为主机,一台或多台服务器作为从机.主机会把数据库的变化记录到日志.一旦这些变化被记录到日志,就会立刻(或者以设定的时间间隔)被送到从机. 2.2 主服务器IP:172.16.151.1 从服务器IP:172.16.151.130 在两台服务器分别安装好My

mysql 主从复制读写分离

目标:实现主从复制,读写分离 环境:mysql-proxy:192.168.1.21      version:5.0.77mysql-master:192.168.1.24     version:5.0.95mysql-slave:192.168.1.7       version:5.0.95 一.主从配置过程:登陆mysql-master:授权给从数据库服务器192.168.1.7mysql> GRANT REPLICATION SLAVE ON *.* to 'rep1'@'192.1

mysql主从复制-读写分离

mysql5.6版本: mysql的主从复制环境构建故障恢复 基于GTID的mysql中从复制 使用atlas实现读写分离 文章下载包地址: 链接:https://pan.baidu.com/s/1ht1y9HnqcfrDdWuPHUq_gg 提取码:cxql 原文地址:https://www.cnblogs.com/myself-technology-summary/p/10859878.html