zoukankan      html  css  js  c++  java
  • atlas读写分离

    aVv11g.md.jpg

    四、Atlas 读写分离

    1.Atals介绍

    1)简介

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

    2)主要功能

    1.'读写分离'
    2.从库负载均衡
    3.IP过滤
    4.自动分表
    5.DBA可平滑上下线DB
    6.'自动'摘除宕机的DB
    
    #atals实际上也是数据库,代理后端的主库(rw)和从库(r)
    
    mysql> SELECT * FROM backends;
    +-------------+------------------+-------+------+
    | backend_ndx | address          | state | type |
    +-------------+------------------+-------+------+
    |           1 | 172.16.1.55:3306 | up    | rw   |
    |           2 | 172.16.1.55:3307 | down  | rw   |  #
    |           3 | 172.16.1.52:3306 | up    | ro   |
    |           4 | 172.16.1.53:3306 | up    | ro   |
    +-------------+------------------+-------+------+
    mysql> SELECT * FROM backends;
    +-------------+------------------+---------+------+
    | backend_ndx | address          | state   | type |
    +-------------+------------------+---------+------+
    |           1 | 172.16.1.55:3306 | up      | rw   |
    |           2 | 172.16.1.55:3307 | offline | rw   |  #
    |           3 | 172.16.1.52:3306 | up      | ro   |
    |           4 | 172.16.1.53:3306 | up      | ro   |
    +-------------+------------------+---------+------+
    

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

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

    2.安装Atlas

    1)上传或下载包

    [root@db03 ~]# rz
    
    #安装包可以选择去github去下载(https://github.com/)(wiki --> download)
    

    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]
    #管理接口的用户名(登录atlas的用户)(不用创建)
    admin-username = user
    
    #管理接口的密码(登录atlas的密码)
    admin-password = pwd
    
    #Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔(最好用虚拟ip)
    proxy-backend-addresses = 172.16.1.55:3306
    
    #Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔(视情况而定)
    proxy-read-only-backend-addresses = 172.16.1.53:3306@1,172.16.1.54:3306@1
    
    #用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的user1和user2为示例,将其替换为你的MySQL的用户名和加密密码!
    #pwds = user1:+jKsgB3YAG8=, user2:GS+tr4TPgqc=
    pwds= rep:3yb5jEku5h4=,mha: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 = 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实例间的区分(与test.cnf对应)
    instance = test
    
    #Atlas监听的工作接口IP和端口(工作)(对所有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
    #, 192.168.1
    
    #Atlas前面挂接的LVS的物理网卡的IP(注意不是虚IP),若有LVS且设置了client-ips则此项必须设置,否则可以不设置
    #lvs-ips = 192.168.1.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   
    
    #根据配置文件中实例的名字,来选择atlas的启动的不同的实例
    instance = test,new_test
    

    3.Atlas使用

    1.连接数据库
    [root@db03 ~]# mysql -uuser -ppwd -P2345 -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     | 查看后端数据库主机'列表,状态,权限'	(up down offline unknown)	                |
    
    | SET OFFLINE $backend_id    | DBA可平滑'下线DB'(状态,不是真正的坏掉) 									    |
    | SET ONLINE $backend_id     | DBA可平滑'上线DB '    			                          |
    | ADD MASTER $backend        | '添加'主库(权限)								                 |
    | ADD SLAVE $backend         | '添加'从库								                 |
    | REMOVE BACKEND $backend_id | '移除'后端数据库	
    
    
    |
    | SELECT * FROM clients      | 客户端列表 (ip和端口)                                            |
    | ADD CLIENT $client         | 临时添加客户端						                   |
    | REMOVE CLIENT $client      | 临时移除客户端   
    
    
    |
    | SELECT * FROM pwds         | 客户端'用户名和密码'                                      |
    | ADD PWD $pwd               | 添加客户端用户名和密码					                 |
    | ADD ENPWD $pwd             | 添加客户端用户名和'加密后'的密码	
    
    | REMOVE PWD $pwd            | 移除客户端用户		
    
    
    |
    | SAVE CONFIG                | '保存'配置到配置文件               				           |
    | SELECT VERSION             | 查看Atlas版本			                               |
    +----------------------------+-------------------------------------
    
    #以上add remove等命令临时添加或移除,可以使用SAVE CONFIG;把修改保存到配置文件
    #web端需要知道atlas的主机ip(VIP),端口,登录用户和密码
    

    五、Atlas结合MHA故障恢复

    1.思路

    1.找到新的主库
    2.将新的主库从Atlas中配置下线
    3.保存到配置文件
    

    2.写脚本

    #该脚本执行的条件
    1.主从复制中,配置mha服务(binlog VIP),atlas服务,
    2.一台主机down掉
    3.主从复制集群中,所有机器配置atlas
    4.主从复制集群中,所有机器都配置该脚本
    5.看主从复制现有的主从关系,修改配置文件中主从的指定(atlas的配置文件在所有主机相同)
    脚本放在哪台机器执行都行,不同的是代码量
    脚本可以与zabbix一起使用,zabbix可以监控massage的日志
    atlas可以不用VIP,但是MHA一定要用VIP的方式
    #执行的结果
    1.使down的主库以从库的身份加入主从复制
    2.manage所在主机mha恢复运行
    3.拉取down掉主机的binlog到manage指定目录
    4.atlas恢复读写分离
    
    
    mysql> SELECT * FROM backends;
    +-------------+------------------+-------+------+
    | backend_ndx | address          | state | type |
    +-------------+------------------+-------+------+
    |           1 | 172.16.1.55:3306 | up    | rw   |
    |           2 | 172.16.1.52:3306 | up    | ro   |
    |           3 | 172.16.1.54:3306 | up    | ro   |
    +-------------+------------------+-------+------+
    
    
    [root@db03 ~]# vim switch_Atlas.sh 
    #/bin/bash
    #1.获取新的主库IP(该ip被VIP占用)
    new_master=`ssh 172.16.1.54 "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" | grep $new_master | awk '{print $1}'`
    #3.移除提升为主库的从库
    mysql -uuser -ppwd -h127.0.0.1 -P 2345 -e "REMOVE BACKEND $new_master_id" &> /dev/null
    
    
    #4.恢复主从复制,MHA
    sh /root/start_mha.sh
    
    
    #6.获取挂掉的主机的IP加端口(该ip将以从库的身份加入主从)
    down_server_port=`ssh 172.16.1.54 "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 slave $down_server_port" &> /dev/null
    #8.保存配置
    mysql -uuser -ppwd -h127.0.0.1 -P 2345 -e "save config" &> /dev/null
    
    #该脚本执行的条件
    1.主从复制中,配置mha服务(binlog VIP)
    2.一台主机down掉
    #执行的结果(哪台主机down掉在哪执行)
    1.使down的主库以从库的身份加入主从复制
    2.mha恢复运行
    3.拉取down掉主机的binlog到manage指定目录
    
    
    [root@db04 ~]# cat start_mha.sh 
    #判断数据库是否挂掉
    mysql_pid=`ps -ef | grep [m]ysqld | wc -l`
    
    #如果挂掉则重启,如果没挂则杀掉重启
    if [ $mysql_pid -eq 0 ];then
        systemctl start mysqld
    else
        pkill mysqld
        systemctl start mysqld
    fi
    
    sleep 3
    
    
    #获取change master to语句
    change=`ssh 172.16.1.54 "grep 'CHANGE MASTER TO' /service/mha/manager | tail -1 | sed 's#xxx#123#g'" | awk -F: '{print $4}'`
    #重启的数据库后,执行change master to
    mysql -uroot -p123 -e "${change};start slave" &>/dev/null
    
    
    #修复MHA配置文件
    ssh 172.16.1.54 "cp /service/mha/app1.cnf.bak /service/mha/app1.cnf"
    #过滤出坏掉主机的ip
    down_ip=`grep 'is down!' /service/mha/manager|tail -1|awk -F'[ ,(]' '{print $2}'`
    #启动保存binlog
    ssh 172.16.1.54 'cd /root/binlog/ && nohup mysqlbinlog -R --host="$down_ip" --user=mha --password=mha --raw --stop-never mysql-bin.000001 &>/dev/null &'
    #启动MHA
    ssh 172.16.1.54 'nohup masterha_manager --conf=/service/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /service/mha/manager.log 2>&1 &'
    
    

    六、Atlas分表

    aVv11g.md.jpg

    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)测试

    拆表

    项目开发中,我们的数据库'数据越来越大',随之而来的是单个表中数据太多。以至于查询书读变慢,而且由于'表的锁机制'导致应用操作也搜到严重影响,出现了数据库性能瓶颈。
    
    当出现这种情况时,我们可以考虑分表,即将单个数据库表进行拆分,拆分成多个数据表,然后'用户访问的时候,根据一定的算法',让用户访问不同的表,这样数据分散到多个数据表中,减少了单个数据表的访问压力。提升了数据库访问性能。
    
    #1.模拟原始的大表
    create table member(
    id bigint auto_increment primary key,
    name varchar(20),
    sex tinyint not null default '0'
    )engine=myisam default charset=utf8 auto_increment=1;
    
    插入数据,第二条语句多执行几次就有了很多数据
    insert into member(id,name,sex) values (1,'jacson','0');
    insert into member(name,sex) select name,sex from member;
    
    #2.分成两个表tb_member1,tb_member2
    DROP table IF EXISTS tb_member1;
    create table tb_member1(
        id bigint primary key auto_increment ,
        name varchar(20),
        sex tinyint not null default '0'
    )ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 
    DROP table IF EXISTS tb_member2;
    create table tb_member2(
        id bigint primary key auto_increment ,
        name varchar(20),
        sex tinyint not null default '0'
    )ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 
    //创建tb_member2也可以用下面的语句  create table tb_member2 like tb_member1;
    
    #3.创建主表
    DROP table IF EXISTS tb_member;
    create table tb_member(
    id bigint primary key auto_increment ,
    name varchar(20),
    sex tinyint not null default '0'
    )ENGINE=MERGE UNION=(tb_member1,tb_member2) INSERT_METHOD=LAST CHARSET=utf8 AUTO_INCREMENT=1 ;
    
    #4.把主表中的数据分到两个分表中去:(id%2 对id的数值取余数),总表只是一个外壳,存取数据发生在一个一个的分表里面。
    insert tb_member1(id,name,sex) select id,name,sex from member where id%2=0;
    insert tb_member2(id,name,sex) select id,name,sex from member where id%2=1;
    
    #总结:
         其实上面我们介绍的是'水平分表'的实施方法,还存在另一种方法叫做:'垂直分表'
    垂直分表:
          举例说明,在一个博客系统中,文章标题,作者,分类,创建时间等,是'变化频率慢,查询次数多',而且最好有很好的实时性的数据,我们把它叫做'冷数据'。
        而博客的浏览量,回复数等,类似的统计信息,或者别的变化频率比较高的数据,我们把它叫做'活跃数据'。
        
    #主从复制,mha,读写分离,存储引擎
          1,存储引擎的使用不同,冷数据使用MyIsam 可以有更好的查询数据。活跃数据,可以使用Innodb ,可以有更好的更新速度。
          2,对冷数据进行更多的从库配置,因为更多的操作是查询,这样来加快查询速度。对热数据,可以相对有更多的主库的横向分表处理。
          3,对于一些特殊的活跃数据,也可以考虑使用memcache ,redis之类的缓存,等累计到一定量再去更新数据库.
    
  • 相关阅读:
    欧拉公式
    isap的一些想法
    错误合集
    Hello World
    PAT (Advanced Level) Practice 1068 Find More Coins
    PAT (Advanced Level) 1087 All Roads Lead to Rome
    PAT (Advanced Level) 1075 PAT Judge
    PAT (Advanced Level) 1067 Sort with Swap(0, i)
    PAT (Advanced Level) 1017 Queueing at Bank
    PAT (Advanced Level) 1025 PAT Ranking
  • 原文地址:https://www.cnblogs.com/syy1757528181/p/13405374.html
Copyright © 2011-2022 走看看