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之类的缓存,等累计到一定量再去更新数据库.
    
  • 相关阅读:
    C#处理JPEG头信息
    利用WebSocket传输数组或者Blob的方案
    System.Collections命名空间下的所有接口及结构图
    C#生成影像金字塔
    C# DEM数据转换为JPEG
    C# 数值型数据转换为字节数组
    c语言实现bitmap的基本操作
    大数据spark 视频的免费连接
    Android开源应用【转】
    linux c程序中获取shell脚本输出 [转]
  • 原文地址:https://www.cnblogs.com/syy1757528181/p/13405374.html
Copyright © 2011-2022 走看看