Proxysql,MariaDB 主从复制和读写分离

准备:

4台vm (centos 7.3):

   192.168.1.120   proxysql
   192.168.1.121   node1   master
   192.168.1.122   node2   slave
   192.168.1.123   node3   slave

一. 在node1,node2,node3安装mariadb, mariadb-server

(以root用户安装)

1. yum安装

 # yum install mariadb mariadb-server -y

2. 启动服务

 # systemctl start mariadb.service

开机启动

 # systemctl enable mariadb.service 

3. 配置管理员密码

 # mysql_secure_installation

4. 配置远程访问 (mysql提示符以 mysql>表示)

 mysql> use mysql;
 mysql> grant all privileges on *.* to ‘root‘@‘ip‘ identified by ‘123456‘;   这个只允许指定ip访问
 mysql> grant all privileges on *.* to ‘root‘@‘%‘  identified by ‘123456‘;   这个允许任意的ip访问
 mysql> flush privileges;  

二.配置主从复制
   
   node1:  /etc/my.cnf.d/server.cnf

[mysqld]
skip_name_resolve=ON
innodb_file_per_table=ON
server_id=1
log_bin=master-bin

重启服务

# systemctl restart mariadb.service

创建用户mauser(用户名任意,这里是mauser):   node2和node3通过用户mauser复制数据

mysql> grant replication slave, replication client on *.* to ‘mauser‘@‘192.168.1.%‘ identified by ‘123456‘;
mysql> flush privileges;

然后:

mysql> show master status;

上面的数字一会要用到。

node2:  /etc/my.cnf.d/server.cnf

   和node1不一样的是多了read_only这一行,有了这一行,在proxysql的mysql_servers表中就会只有一行hostgroup_id=1,如果去掉这一行,mysql_servers表中每个server会有两行:

hostgroup_id=0, hostgroup_id=1

[mysqld]
skip_name_resolve=ON
innodb_file_per_table=ON
server_id=2
relay_log=relay-log
read_only=ON

重启服务

# systemctl restart mariadb.service

设置成数据库, master_log_pos要设置上面图片里那个数(756)

mysql> change master to master_host=‘192.168.1.121‘, master_user=‘mauser‘, master_password=‘123456‘, master_log_file=‘master-bin.000001‘,master_log_pos=756;
mysql> start slave;mysql> show slave status\G;
    ...      Slave_IO_Running: Yes         这两行必须是Yes
    Slave_SQL_Running: Yes    ...

node3:  /etc/my.cnf.d/server.cnf

[mysqld]
skip_name_resolve=ON
innodb_file_per_table=ON
server_id=3
relay_log=relay-log
read_only=ON

重启服务

# systemctl restart mariadb.service

设置成数据库

mysql> change master to master_host=‘192.168.1.121‘, master_user=‘mauser‘, master_password=‘123456‘, master_log_file=‘master-bin.000001‘,master_log_pos=756;
mysql> start slave;

回到node1,  建库,建表,插入数据:

mysql> create database mybatisdb;mysql> create table person(id int not null primary key, name varchar(20), age int);mysql> insert into person values(1,‘tom‘,20),(2,‘mary‘,30)

再回到node2, node3查看

mysql>  use mybatisdb;
mysql>  select * from person;

可以看到person表数据。

主从复制完成。

三.  读写分离

下载proxysql:   http://www.proxysql.com/ 这里下载的是1.4.7

在192.168.1.120 vm上

# yum install mariadb -y# yum install proxysql-1.4.7-1-centos7.x86_64.rpm

安装完成后,修改 /etc/proxysql.cnf

datadir="/var/lib/proxysql"
admin_variables=
{
    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:3306;/tmp/mysql.sock"
    default_schema="information_schema"
    stacksize=1048576
    server_version="5.5.56"
    connect_timeout_server=3000
    monitor_history=600000
    monitor_connect_interval=60000
    monitor_ping_interval=10000
    monitor_read_only_interval=1500
    monitor_read_only_timeout=500
    ping_interval_server=120000
    ping_timeout_server=500
    commands_stats=true
    sessions_sort=true
    connect_retries_on_failure=10
}
mysql_servers =
(
    {
        address = "192.168.1.121"
        port = 3306
        hostgroup = 0
        max_connections=100
    },
    {
        address = "192.168.1.122"
        port = 3306
        hostgroup = 1
        max_connections=100
    },
    {
        address = "192.168.1.123"
        port = 3306
        hostgroup = 1
        max_connections=100    })mysql_users:(    {        username = "root"        password = "123456"        default_hostgroup = 0        max_connections=1000        default_schema="mysql"        active = 1    })mysql_query_rules:(    {        rule_id=1        active=1        match_pattern="^SELECT .* FOR UPDATE$"        destination_hostgroup=0        apply=1    },    {        rule_id=2        active=1        match_pattern="^SELECT"        destination_hostgroup=1        apply=1    })mysql_replication_hostgroups=(        {                writer_hostgroup=0                reader_hostgroup=1       })

启动proxysql前:要在主数据库(node1)添加monitor用户,并给usage和replcation client权限,proxysql使用这个用户连接node1,node2,node3.

当然也可修改这个monitor,改成别的用户名和密码,这里不介绍。

proxysql默认的配置monitor的密码也是monitor (在main数据库的global_variables表中)

mysql> grant usage, replication client on *.* to ‘monitor‘@‘192.168.1.120‘ identified by ‘monitor‘;
mysql> flush privileges;

就是允许proxysql使用monitor/monitor访问, 这个赋权也会同步到node2,node3,所以另外两个vm不用再这样处理了。

启动proxysql:

# systemctl start proxysql

连接proxysql:

# mysql -h127.0.0.1 -uadmin -padmin -P 6032

四.测试

在其它vm上(不在proxysql那台vm上就好, 比如node1), 连接proxysql

# mysql -h 192.168.1.120 -uroot -p123456...mysql> use mybatisdb;mysql> insert into person values(3,‘mike‘, 50), (4,‘jack‘, 39)

将 node1主数据库服务停掉:

systemctl stop mariadb.service

再连接proxysql, 此时仍可执行select, 但insert插入报错:

ERROR 9001 (HY000): Max connect timeout reached while reaching hostgroup 0 after 10000ms

说明,因为主数据库挂掉,insert已经不能执行。 但select仍可正常操作,说明读写分离已工作。

五. 重要的东西

上面是从头开始实现,实际上,一般情况下是先有一个数据库,由于性能问题,要实现读写分离和主从复制。

这种情况,要先将原有数据要进行一个完全的备份(mysqldump),导入后加的服务器,再把原数据库的show master status那个pos,写进后加的服务器(change master, start slave),

从而实现主从复制。

主数据库备份:# mysqldump --all-databases --master-data=2 --routine --trigger  --event --lock-all-tables > x.sql

在新加数据库导入:# mysql -u ... -p ... < x.sq

将新加数据库改成从数据库,并启动mysql> change master ...;mysql> start slave;

原文地址:https://www.cnblogs.com/bear129/p/8620214.html

时间: 2024-11-13 05:05:57

Proxysql,MariaDB 主从复制和读写分离的相关文章

MySQL主从复制、读写分离、高可用集群搭建

MySQL主从复制.读写分离.高可用集群搭建  一.服务介绍   1.1 Keepalived     Keepalived,见名知意,即保持存活,其目的是解决单点故障,当一台服务器宕机或者故障时自动切换到其他的服务器中.Keepalived是基于VRRP协议实现的.VRRP协议是用于实现路由器冗余的协议,VRRP协议将两台或多台路由器设备虚拟成虚拟设备,可以对外提供虚拟路由器IP(一个或多个),即漂移IP(VIP). 1.2 ProxySQL ProxySQL是一个高性能,高可用性的MySQL

MySQL 复制过滤器、监控维护及主从复制的读写分离

MySQL 复制过滤器.监控维护及基于SSL的主从复制 =============================================================================== 概述: 本章将主要介绍MySQL复制中如何过滤,监控维护,以及基于SSL的主从复制,具体内容如下: MySQL 复制过滤器 ·从服务器库级别过滤 MySQL 清理日志:PURGE 复制监控 ·Master ·Slave 如何确定主从节点的数据是否一致 MySQL基于SSL的主从复制(

搭建mysql的主从复制和读写分离

搭建mysql的主从复制和读写分离   +--------+                          (write)        +--------+                    | client |                 +---------------------+| master |     +--------+|                   |                        +--------+|           |      

ProxySQL+Mysql实现数据库读写分离实战

ProxySQL介绍 ProxySQL是一个高性能的MySQL中间件,拥有强大的规则引擎.具有以下特性:http://www.proxysql.com/ 1.连接池,而且是multiplexing 2.主机和用户的最大连接数限制 3.自动下线后端DB延迟超过阀值ping 延迟超过阀值网络不通或宕机 4.强大的规则路由引擎实现读写分离查询重写sql流量镜像 5.支持prepared statement 6.支持Query Cache 7.支持负载均衡,与gelera结合自动failover 整体环

mysql+amoeba 主从复制,读写分离,负载均衡

Amoeba是什么?Amoeba(变形虫)项目,该开源框架于2008年 开始发布一款 Amoeba for Mysql软件.这个软件致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当SQL路由功能,专注于分布式数据库代理层(Database Proxy)开发,它位于与Client.DBServer(s)之间,对客户端透明.具有 负载均衡.高可用性.SQL过滤.读写分离.可路由相关的到目标数据库.可并发请求多台数据库合并结果 . 通过Amoeba你能够完成多数据源的高

mysql主从复制与读写分离

MySQL主从复制与读写分离 MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践 Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过.但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面. 因此,一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力 这样的方案来进行部

MySQL之主从复制和读写分离(Amoeba)

案例环境: Master:192.168.154.164 Slave01:192.168.154.176 Slave02:192.168.154.156 Amoeba:192.168.154.177 应用服务器:192.168.154.155 集群拓朴: 部署实施: 一 操作系统和应用程序安装(略) 二 搭建MySQL主从复制环境 1 架构前端有硬件防火墙,因此所有服务器的iptables处于关闭状态(如果没有,请开放相应的端口) [[email protected] ~]#service ip

基于Mysql-Proxy实现Mysql的主从复制以及读写分离(上)

基于Mysql-Proxy实现Mysql的主从复制以及读写分离(上) 上周BOSS给分配任务让实现一下Mysql数据库的主从复制以及读写分离,然后花了一盏茶的功夫进行了调研,发现主从复制数据库进行一番配置直接可以实现,而读写分离则需要一些软件的支持,基本上读写分离的实现有两种: Amoeba(变形虫):是由前阿里员工实现的一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy.但是由于没人维护了,而且据说作者也不再回答开发者的问题,所以不予考虑. Mysql-Proxy:是一

mysql主从复制以及读写分离

mysql的主从复制以及读写分离 前言:我们前面搭建过LAMP和LNMP,做过了web服务器群集和热备,web服务器坏了我们是不怕了,但是我们要知道,网站的数据有很多是存储在数据库里面的,例如注册的会员,发的文章,购物的订单等信息.当然我们可以给数据库做备份,但是如果每天00:00做一次备份,那么如果在23:59数据丢失了,那么就会丢失一天的数据,有没有一种方法能实现实时备份,就是说有数据产生就立即备份,答案当然是有,也就是今天我们要学习的mysql主从复制.有点类似于前面我们学习过的rsync