Atlas读写分离、分库分表分片的设置


Atlas 读写分离

读写分离软件
- Proxy SQL
- Mycat
- Atlas
...

1.Atals介绍

1)简介

Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。
它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了很多功能特性。

2)主要功能

1.读写分离
2.从库负载均衡
3.IP过滤
4.自动分表
5.DBA可平滑上下线DB
6.自动摘除宕机的DB

3)Atlas相对于官方MySQL-Proxy的优势

1.将主流程中所有Lua代码用C重写,Lua仅用于管理接口
2.重写网络模型、线程模型
3.实现了真正意义上的连接池
4.优化了锁机制,性能提高数十倍

2.安装Atlas

1)上传或下载包

https://github.com/Qihoo360/Atlas   github官网下载360版
[root@db03 ~]# rz Atlas-2.2.1.el6.x86_64.tmp

2)安装

[root@db03 ~]# yum localinstall -y Atlas-2.2.1.el6.x86_64.rpm

3)确认文件

[root@db03 ~]# ll /usr/local/mysql-proxy/
total 0
drwxr-xr-x 2 root root  75 Jul 29 10:15 bin
drwxr-xr-x 2 root root  22 Jul 29 10:15 conf
drwxr-xr-x 3 root root 331 Jul 29 10:15 lib
drwxr-xr-x 2 root root   6 Dec 17  2014 log

4)配置

[root@db03 ~]# cat /usr/local/mysql-proxy/conf/test.cnf
[mysql-proxy]
#管理接口的用户名
admin-username = user
#管理接口的密码
admin-password = pwd
#Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔
proxy-backend-addresses = 172.16.1.50:3306
#Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔(默认只读的库)
proxy-read-only-backend-addresses = 172.16.1.52:3306@1,172.16.1.53:3306
#用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的user1和user2为示例,将其替换为你的MySQL的用户名和加密密码!
pwds = rep:3yb5jEku5h4=,mha:O2jBXONX098=
#设置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 = 8
#日志级别,分为message、warning、critical、error、debug五个级别
log-level = error
#日志存放的路径
log-path = /usr/local/mysql-proxy/log
#SQL日志的开关,可设置为OFF、ON、REALTIME,OFF代表不记录SQL日志,ON代表记录SQL日志,REALTIME代表记录SQL日志且实时写入磁盘,默认为OFF
sql-log = OFF
#慢日志输出设置。当设置了该参数时,则日志只输出执行时间超过sql-log-slow(单位:ms)的日志记录。不设置该参数则输出全部日志。
#sql-log-slow = 10
#实例名称,用于同一台机器上多个Atlas实例间的区分
instance = test
#============================================================#
# !!Atlas监听的工作接口IP和端口   (给前端web页用来连接数据库)
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

5)启动

[root@db03 ~]# /usr/local/mysql-proxy/bin/mysql-proxyd test start
OK: MySQL-Proxy of test is started

#检验启动
[root@db03 conf]# netstat -lntp
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:2345            0.0.0.0:*               LISTEN      31101/mysql-proxy     
tcp        0      0 0.0.0.0:1234            0.0.0.0:*               LISTEN      31101/mysql-proxy   

3.Atlas使用

1.连接数据库
[root@db03 ~]# mysql -uuser -ppwd -P 2345 -h127.0.0.1

2.执行命令
mysql> show databases;
ERROR 1105 (07000): use 'SELECT * FROM help' to see the supported commands

mysql> SELECT * FROM help;
+----------------------------+---------------------------------------------------------+
| command                    | description                                             |
+----------------------------+---------------------------------------------------------+
| SELECT * FROM help         | 查看帮助                                                |
| SELECT * FROM backends     | 查看后端数据库主机列表                                  |
| SET OFFLINE backend_id    | DBA可平滑下线DB                                       |
| SET ONLINEbackend_id     | DBA可平滑上线DB                                         |
| ADD MASTER backend        | 添加主库                                              |
| ADD SLAVEbackend         | 添加从库                                              |
| REMOVE BACKEND backend_id | 移除后端数据库                                          |
| SELECT * FROM clients      | 客户端列表                                               |
| ADD CLIENTclient         | 临时添加客户端                                         |
| REMOVE CLIENT client      | 临时移除客户端                                         |
| SELECT * FROM pwds         | 客户端用户名和密码                                        |
| ADD PWDpwd               | 添加客户端用户名和密码                                   |
| ADD ENPWD pwd             | 添加客户端用户名和加密后的密码                            |
| REMOVE PWDpwd            | 移除客户端用户                                          |
| SAVE CONFIG                | 保存配置到配置文件                                       |
| SELECT VERSION             | 查看Atlas版本                                           |
+----------------------------+---------------------------------------------------------+
16 rows in set (0.00 sec)

mysql> select * from backends;
+-------------+------------------+-------+------+
| backend_ndx | address          | state | type |
+-------------+------------------+-------+------+
|           1 | 172.16.1.50:3306 | up    | rw   |
|           2 | 172.16.1.52:3306 | up    | ro   |
|           3 | 172.16.1.53:3306 | up    | ro   |
+-------------+------------------+-------+------+

Atlas结合MHA故障恢复

1.思路

故障:一台主库挂了。
这时如果虚拟ip50绑定主库到了52上,又是rw 又是ro就会冲突。需要修改52
+-------------+------------------+-------+------+
| backend_ndx | address          | state | type |
+-------------+------------------+-------+------+
|           1 | 172.16.1.50:3306 | up    | rw   |
|           2 | 172.16.1.52:3306 | up    | ro   |
|           3 | 172.16.1.53:3306 | up    | ro   |
+-------------+------------------+-------+------+

如果有MHA,先修复down掉的数据库和MHA,再修复atlas
1.找到新的主库
2.将新的主库从Atlas中配置下线防止绑定虚拟ip后冲突。
3.修复,获取挂掉的主机的IP加端口
4.修复,添加down的主库为新的从库到Atlas
5.保存到配置文件 

2.写脚本

如果有MHA,先修复down掉的数据库和MHA,再修复atlas

[root@db03 ~]# vim switch_Atlas.sh 
#/bin/bash
#1.获取新的主库IP
new_master=`grep "as a new master" /service/mha/manager | tail -1 | awk -F '[ ,(]' '{print 2}'`
#2.获取新的主库在Atlas中的ID
new_master_id=`mysql -uuser -ppwd -h127.0.0.1 -P 2345 -e "SELECT * FROM backends" | grepnew_master | awk '{print 1}'`
#3.移除提升为主库的从库
mysql -uuser -ppwd -h127.0.0.1 -P 2345 -e "REMOVE BACKENDnew_master_id" &> /dev/null
#4.找到挂掉的主机
down_server=`grep "Master .* is down" /service/mha/manager | tail -1 | awk -F '[ ,(]' '{print 2}'`
#5.远程连接执行恢复脚本
sshdown_server "sh /root/start_mha.sh"
#6.获取挂掉的主机的IP加端口
down_server_port=`grep "Master .* is down" /service/mha/manager | tail -1 | awk -F '[ ,()]' '{print 3}'`
#7.添加down的主库为新的从库到Atlas
mysql -uuser -ppwd -h127.0.0.1 -P 2345 -e "add slavedown_server_port" &> /dev/null
#8.保存配置
mysql -uuser -ppwd -h127.0.0.1 -P 2345 -e "save config" &> /dev/null

Atlas分表

1.为什么要分表

1.数据过多,访问缓慢(800w)
2.创建索引时重新排序,创建缓慢,并且占用大量的磁盘空间

2.分表的方式

1.根据数据范围分表
2.根据取模的方式(取余数)

3.分表

1)思路

1.确定分表的库,表,字段
2.确定分表的数量
3.分表的名字,stu_0,stu_1,stu_2
4.配置文件配置分表的规则
5.测试

2)创建原表

mysql> create database school;
Query OK, 1 row affected (0.00 sec)

mysql> use school
Database changed
mysql> create table stu(id int,name varchar(10));
Query OK, 0 rows affected (0.13 sec)

3)创建分表

mysql> create table stu_0 like stu;
Query OK, 0 rows affected (0.08 sec)

mysql> create table stu_1 like stu;
Query OK, 0 rows affected (0.03 sec)

mysql> create table stu_2 like stu;
Query OK, 0 rows affected (0.03 sec)

4)配置Atlas

[root@db03 ~]# vim /usr/local/mysql-proxy/conf/test.cnf
#分表设置,此例中person为库名,mt为表名,id为分表字段,3为子表数量,可设置多项,以逗号分隔,若不分表则不需要设置该项
tables = school.stu.id.3

[root@db03 ~]# /usr/local/mysql-proxy/bin/mysql-proxyd test restart
OK: MySQL-Proxy of test is stopped
OK: MySQL-Proxy of test is started

5)测试

Copyright © 2009 - Now . XPBag.com . All rights Reserved.
夜心的小站 » Atlas读写分离、分库分表分片的设置

提供最优质的资源集合

立即查看 了解详情