使用Atlas实现读写分离

 Atlas实现读写分离

环境介绍:

试验机器4台:

192.168.0.41   Atlas

192.168.0.42   Master

192.168.0.43   Slave-1

192.168.0.44   Slave-2

4台机器均为RHEL 6.4 x86_64系统

[[email protected] ~]# uname -a

Linux Nginx 2.6.32-358.el6.x86_64 #1 SMP Tue Jan 29 11:47:41 EST 2013 x86_64 x86_64 x86_64 GNU/Linux

MySQL版本为5.5.21

防火墙及SElinux全部关闭;无VIP;

试验机的主从已搭建完毕,数据一致;

安装情况:

安装包使用的是RPM包

Atlas-2.2.el6.x86_64.rpm

使用RPM -hiv Atlas-2.2.el6.x86_64.rpm

安装成功

配置文件:

[mysql-proxy]

#带#号的为非必需的配置项目

#管理接口的用户名

admin-username=admin

#管理接口的密码

admin-password=123

#Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔

proxy-backend-addresses=192.168.0.42:3306

#Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔

proxy-read-only-backend-addresses=192.168.0.43:3306,192.168.0.44:3306

#用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的user1和user2为示例,将其替换为你的MySQL的用户名和加密密码!

pwds=atlas:3yb5jEku5h4=

#设置Atlas的运行方式,设为true时为守护进程方式,设为false时为前台方式,一般开发调试时设为false,线上运行时设为true,true后面不能有空格。

daemon=true

#设置Atlas的运行方式,设为true时Atlas会启动两个进程,一个为monitor,一个为worker,monitor在worker意外退出后会自动将其重启,设为false时只有worker,没有monitor,一般开发调试时设为false,线上运

行时设为true,true后面不能有空格。

keepalive=true

#工作线程数,对Atlas的性能有很大影响,可根据情况适当设置

event-threads=4

#日志级别,分为message、warning、critical、error、debug五个级别

log-level=message

#日志存放的路径

log-path=/usr/local/mysql-proxy/log

#SQL日志的开关,可设置为OFF、ON、REALTIME,OFF代表不记录SQL日志,ON代表记录SQL日志,REALTIME代表记录SQL日志且实时写入磁盘,默认为OFF

sql-log=ON

#慢日志输出设置。当设置了该参数时,则日志只输出执行时间超过sql-log-slow(单位:ms)的日志记录。不设置该参数则输出全部日志。

#sql-log-slow = 10

#实例名称,用于同一台机器上多个Atlas实例间的区分

instance=test

#Atlas监听的工作接口IP和端口

proxy-address=0.0.0.0:1234

#Atlas监听的管理接口IP和端口

admin-address=0.0.0.0:2345

#分表设置,此例中person为库名,mt为表名,id为分表字段,3为子表数量,可设置多项,以逗号分隔,若不分表则不需要设置该项

#tables = person.mt.id.3

#默认字符集,设置该项后客户端不再需要执行SET NAMES语句

charset = utf8

#允许连接Atlas的客户端的IP,可以是精确IP,也可以是IP段,以逗号分隔,若不设置该项则允许所有IP连接,否则只允许列表中的IP连接

client-ips=127.0.0.1,0.192.168.0

#Atlas前面挂接的LVS的物理网卡的IP(注意不是虚IP),若有LVS且设置了client-ips则此项必须设置,否则可以不设置

#lvs-ips = 192.168.1.1

========================华丽的分割线============================

根据上面的配置文件,得到账户信息如下:

Atlas管理账号 :admin

Atlas管理账号密码:123

Atlas管理账号端口:2345

Atlas工作账号:atlas

Atlas工作账号密码:atlas:3yb5jEku5h4=           (123,用encrypt编译过的)

Atlas工作账号端口:1234

在主库及从库机器进行账号授权:

mysql>GRANT all privileges ON *.* TO ‘atlas‘@‘192.168.0.%‘ IDENTIFIED BY ‘123‘;

3台机器全部如此授权,在Atlas服务器上远程登陆3台机器成功.

在Atlas服务器验证Atlas管理账号及工作账号:

[[email protected] bin]# /usr/local/mysql-proxy/bin/mysql-proxyd test start

OK: MySQL-Proxy of test is started

[[email protected] bin]# ps -ef | grep mysql | grep -v grep

root      6638  5610  0 02:00 pts/2    00:00:00 mysql -h127.0.0.1 -P1234 -uatlas -px x

root      6667  1919  0 02:01 pts/1    00:00:00 mysql -h127.0.0.1 -P2345 -uadmin -px x

root      6695     1  0 02:06 ?        00:00:00 /usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/test.cnf

root      6696  6695  0 02:06 ?        00:00:00 /usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/test.cnf

[[email protected] ~]# mysql -h127.0.0.1 -P2345 -uadmin -p123

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 1

Server version: 5.0.99-agent-admin

Copyright (c) 2000, 2011, 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.

mysql> select * from help;

+-------------------+---------------------------------------+

| command                  | description                                             |

+-------------------+---------------------------------------+

| SELECT * FROM help         | shows this help                                      |

| SELECT * FROM backends     | lists the backends and their state                      |

| SET OFFLINE $backend_id   | offline backend server, $backend_id is backend_ndx‘s id |

| SET ONLINE $backend_id     | online backend server, ...                              |

| ADD MASTER $backend        | example: "add master 127.0.0.1:3306", ...               |

| ADD SLAVE $backend         | example: "add slave 127.0.0.1:3306", ...                |

| REMOVE BACKEND $backend_id | example: "remove backend 1", ...                        |

| ADD CLIENT $client         | example: "add client 192.168.1.2", ...                  |

| REMOVE CLIENT $client      | example: "remove client 192.168.1.2", ...               |

| SAVE CONFIG                | save the backends to config file                       |

+-------------------+---------------------------------------+

10 rows in set (0.00 sec)

mysql> select * from backends;

+-------------+-------------------+-------+------+

| backend_ndx       |           address        | state    |  type   |

+-------------+-------------------+-------+------+

|           1      | 192.168.0.42:3306         | down     | rw      |

|           2      | 192.168.0.44:3306         | down     | ro      |

|           3      | 192.168.0.43:3306         | down     | ro      |

+-------------+-------------------+-------+------+

3 rows in set (0.00 sec)

噩梦就此开始

登陆atlas工作账号:

[[email protected] ~]# mysql -h127.0.0.1 -P1234 -uatlas -p123

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 1

Server version: 5.0.81-log

Copyright (c) 2000, 2011, 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.

mysql> show databases;

ERROR 2006 (HY000): MySQL server has gone away

No connection. Trying to reconnect...

Connection id:    2

Current database: *** NONE ***

ERROR 2013 (HY000): Lost connection to MySQL server during query

mysql>

无法连接到服务器

在管理账号中,将所有机器上线

mysql> SET ONLINE 1;

+-------------+-------------------+---------+------+

| backend_ndx       | address                  | state       | type    |

+-------------+-------------------+---------+------+

|           1       | 192.168.0.42:3306        | unknown     | rw      |

+-------------+-------------------+---------+------+

1 row in set (0.00 sec)

再查看backends状态:

mysql> select * from backends;

+-------------+-------------------+-------+------+

| backend_ndx       |           address        | state    |  type   |

+-------------+-------------------+-------+------+

|           1      | 192.168.0.42:3306         | down     | rw      |

|           2      | 192.168.0.44:3306         | down     | ro      |

|           3      | 192.168.0.43:3306         | down     | ro      |

+-------------+-------------------+-------+------+

3 rows in set (0.00 sec)

依然如此

参照网上的方法,在3台主从机上的my.cnf中加入以下参数:

max_connect_errors=100000

max_allowed_packet=16777216  (16M)

依然不行

mysql> select * from backends;

+-------------+-------------------+-------+------+

| backend_ndx       |           address        | state    |  type   |

+-------------+-------------------+-------+------+

|           1      | 192.168.0.42:3306         | down     | rw      |

|           2      | 192.168.0.44:3306         | down     | ro      |

|           3      | 192.168.0.43:3306         | down     | ro      |

+-------------+-------------------+-------+------+

3 rows in set (0.00 sec)

咨询开发人员,得知:

client-ips=127.0.0.1,0.192.168.0

此选项,如非必须,不要打开

故障排除后,进行读写分离测试

在atlas客户端,创建数据库

mysql> create database atlas;

Query OK, 1 row affected (10.02 sec)

mysql> create table atlas1

-> (

-> name varchar(15) not null,

-> sex enum(‘M‘,‘F‘) not null,

-> age int(2) not null,

-> primary key(‘name‘)

-> );

mysql> desc atlas.atlas1;

+-------+---------------+------+-----+---------+-------+

| Field     | Type                | Null    | Key    | Default     | Extra    |

+-------+---------------+------+-----+---------+-------+

| name      | varchar(15)         | NO      | PRI    | NULL        |          |

| sex       | enum(‘M‘,‘F‘)          | NO      |        | NULL        |          |

| age       | int(2)              | NO      |        | NULL        |          |

+-------+---------------+------+-----+---------+-------+

3 rows in set (0.01 sec)

插入数据:

mysql> insert into atlas.atlas1

-> VALUES

-> (‘Zhangxuan‘,‘M‘,‘30‘),

-> (‘Yangyanjie‘,‘M‘,‘28‘),

-> (‘Liuchang‘,‘F‘,‘22‘);

Query OK, 3 rows affected (0.01 sec)

Records: 3  Duplicates: 0  Warnings: 0

在主库上进行一致性检查:

[[email protected] ~]# pt-table-checksum --user=root --host=192.168.0.42 --nocheck-replication-filters --nocheck-binlog-format

TS ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME TABLE

10-28T04:36:06      0      0        3       1       0   0.028 atlas.atlas1

10-28T04:36:06      0      0       51       1       0   0.027 mhatest.mha

10-28T04:36:06      0      0     3012       1       0   0.282 mhatest.num1

10-28T04:36:06      0      0        5       1       0   0.029 mhatest.test

成功,然后在从库1(192.168.0.43)和从库2(192.168.0.43)上各增加一条数据

从库1(192.168.0.43):

mysql> INSERT INTO atlas.atlas1 VALUES (‘Yangzhenyu‘,‘M‘,‘30‘);

Query OK, 1 row affected (0.01 sec)

mysql> select * from atlas1;

+--------+---+--+

| name       | sex | age |

+--------+---+--+

| Liuchang   | F   |  22 |

| Yangyanjie | M   |  28 |

| Yangzhenyu | M   |  30 |

| Zhangxuan  | M   |  30 |

+--------+---+---+

4 rows in set (0.00 sec)

从库2(192.168.0.44)

mysql> INSERT INTO atlas.atlas1 VALUES (‘Chenfei‘,‘M‘,‘14‘);

mysql> select * from atlas.atlas1;

+--------+---+--+

| name       | sex | age |

+--------+---+---+

| Chenfei    | M   |  14 |

| Liuchang   | F   |  22 |

| Yangyanjie | M   |  28 |

| Zhangxuan  | M   |  30 |

+--------+---+---+

4 rows in set (0.00 sec)

此时,主库(192.168.0.42)上:

mysql> select * from atlas.atlas1;

+--------+---+---+

| name       | sex | age |

+--------+---+---+

| Liuchang   | F   |  22 |

| Yangyanjie | M   |  28 |

| Zhangxuan  | M   |  30 |

+--------+---+---+

3 rows in set (0.00 sec)

开始验证读写分离:

在atlas服务器上执行:

mysql> select * from atlas.atlas1 where name=‘Yangzhenyu‘;

Empty set (0.00 sec)    /*第一次执行居然无返回值*/

mysql> select * from atlas.atlas1 where name=‘Yangzhenyu‘;

+------------+-----+-----+

| name       | sex | age |

+------------+-----+-----+

| Yangzhenyu | M   |  30 |

+------------+-----+-----+

1 row in set (0.00 sec)  /*第二次正确返回*/

查询日志:

[10/28/2014 03:10:07] C:127.0.0.1:39798 S:192.168.0.43:3306 OK 0.719 "select * from atlas.atlas1 where name=‘Yangzhenyu‘"

[10/28/2014 03:10:10] C:127.0.0.1:39798 S:192.168.0.44:3306 OK 0.921 "select * from atlas.atlas1 where name=‘Yangzhenyu‘"

第一次无返回值原因:两个read-only库数据不一致导致,将两个从库数据一致后,查询

返回值正常:

mysql> select * from atlas.atlas1 where name=‘Yangzhenyu‘;

+--------+---+---+

| name       | sex | age |

+--------+---+---+

| Yangzhenyu | M   |  30 |

+--------+---+---+

1 row in set (0.00 sec)   /*第一次查询*/

mysql> select * from atlas.atlas1 where name=‘Yangzhenyu‘;

+--------+---+---+

| name       | sex | age |

+--------+---+---+

| Yangzhenyu | M   |  30 |

+--------+---+---+

1 row in set (0.00 sec)  /*第二次查询*/

读写分离成功

时间有限,下一步准备用sysbench进行压力测试

时间: 2024-10-11 03:57:05

使用Atlas实现读写分离的相关文章

生产环境实践Mysql5.7主从+Atlas实现读写分离

Mysql主从搭建 主从复制可以使MySQL数据库主服务器的主数据库,复制到一个或多个MySQL从服务器从数据库,默认情况下,复制异步; 根据配置,可以复制数据库中的所有数据库,选定的数据库或甚至选定的表.MySQL的工作方式是单进程多线程的方式,那么线程的多寡则会极大的影响到MySQL的效率,而在早期MySQL的主从都是由单线程进行的,使得主从复制除了相关的客观因素外还受到自身的影响:为此在MySQL的5.7版本中对多线程主从复制来进一步的改善,在MySQL 5.7中是按照逻辑时钟(类似CPU

实验2 安装Atlas实现读写分离

系统版本:        windows7x64 虚拟机:          centos 6.5x64 ip规划:          主数据库服务器:192.168.0.44 从数据库服务器:192.168.0.54 proxy服务器:192.168.0.29 ssh连接工具:    ssh secure shell client vpn工具:        ssl vpn-plus client 实验内容:        1.为proxy服务器下载安装Atlas 2.配置Atlas 3.运行

mysql利用atlas进行读写分离时,一直走主库的问题

项目中,利用atlas对mysql数据库进行了读写分离. 当时配置了去从库读数据. 当用数据库工具连接代理测试时,一切正常. 当在项目中使用框架mybatis连数据库时,却都直接去主库读写数据了. 自己写个main方法 用jdbc连接也是正常的.一用mybatis框架就不正常了,难道atlas对mybatis不支持吗? 于是各种百度,谷歌... 最后发现原因:如果有事务存在的话,atlas就强制走主库.而这个方法类上偏偏添加了事务@Transactional 解决办法在方法上加上@Transac

采用Atlas mysql 读写分离工具

前阵子测试了360开源出来的Atlas,总的来说挺好的,这里先标记下,备用.听说amoeba也不错,大牛还给我推荐了一篇文章,也先留着. 测试了下atlas的性能,挺给力的. 在并发2000时,atlas会提示I have no server backend,closing connection.判断应为mysql不能及时提供空闲连接导致,但atlas并未出现任何瓶颈.但是,atlas自身没有断开mysql连接的设置,完全依赖于mysql自身的超时时间. 其读写分离策略是除了完全的读请求,其余的

Atlas实现读写分离

该Atlas方案的实现需要基于MHA架构(而MHA架构需要 实现mysql主从复制且开启GTID特性) 常见方案介绍: Mysql-proxy(oracle)Mysql-router(oracle)Atlas (Qihoo 360)Atlas-sharding (Qihoo 360)Cobar(是阿里巴巴(B2B)部门开发)Mycat(基于阿里开源的Cobar产品而研发)TDDL Smart Client的方式(淘宝)DRDS 阿里云的产品Oceanus(58同城数据库中间件)OneProxy(

mysql的MHA之Atlas 配置, 读写分离实现

1.安装 Atlas #在主库安装,进入安装包目录 [[email protected]-db01 ~]# cd /home/oldboy/tools/ #下载Atlas [[email protected]-db01 tools]# wget httpss://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm #安装 [[email protected]-db01 tools]# rpm -

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

第十一章 读写分离及分布式架构

atlas 实现读写分离 Atlas是由 Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目. atlas 说明 Atlas是一个位于应用程序与MySQL之间中间件.在后端DB看来,Atlas相当于连接它的客户端,在前端应用看来,Atlas相当于一个DB.Atlas作为服务端与应用程序通讯,它实现了MySQL的客户端和服务端协议,同时作为客户端与MySQL通讯.它对应用程序屏蔽了DB的细节,同时为了降低MySQL负担,它还维护了连接池. atlas 部

MySQL-高可用MHA+Atlas读写分离

公司最近为新的MySQL架构进行调整,要求给出方案,我这边提出使用MHA+Atlas做高可用集群读写分离架构,就多方讨论最终确认方案,进行实施: 一.简单说下MHA的工作原理 1个管理节点可以管理多套mysql架构,可以不装在mysql主机上 通过管理节点,来对其它数据节点上的mysql做监控,会每隔几秒做心跳检测 二.MHA的简单架构图 三.部署MHA 1,环境准备(依赖包.软件包.创建存放目录等)所有节点进行 #安装依赖包 [[email protected] ~]#yum install