zoukankan      html  css  js  c++  java
  • linux系统mysql数据库Atlas安装及分表操作

    #问题:
    1.去掉VIP飘逸的脚本后,MHA切换时仍然报错说要读取脚本
    	#报错:
    	master_ip_failover_script or purge_relay_log 在同一台机器运行
    	#解决:
    	重新写一个MHA配置文件
    

    一、VIP漂移

    1.配置MHA读取脚本

    [root@db03 ~]# vim /service/mha/app1.cnf
    #在[server default]标签下添加
    [server default]
    #使用MHA自带脚本
    master_ip_failover_script=/usr/local/bin/master_ip_failover
    

    2.编写脚本

    [root@db03 ~]# vim /service/mha/master_ip_failover 
    ......
    my $vip = '172.16.1.50/24';
    my $key = '1';
    my $ssh_start_vip = "/sbin/ifconfig eth1:$key $vip";
    my $ssh_stop_vip = "/sbin/ifconfig eth1:$key down";
    ......
    

    3.手动绑定VIP

    ifconfig eth1:1 172.16.1.50/24
    

    4.启动MHA

    二、binlog server

    1.配置

    [root@db03 ~]# vim /service/mha/app1.cnf
    [server default]
    manager_log=/service/mha/manager
    manager_workdir=/service/mha/app1
    master_binlog_dir=/usr/local/mysql/data
    password=mha
    ping_interval=2
    repl_password=123
    repl_user=rep
    ssh_user=root
    user=mha
    master_ip_failover_script=/service/mha/master_ip_failover
    
    [server1]
    hostname=172.16.1.51
    port=3306
    
    [server2]
    hostname=172.16.1.52
    port=3306
    
    #开启binlog server
    [server3]
    hostname=172.16.1.53
    port=3306
    no_master=1
    master_binlog_dir=/root/binlog/
    

    2.创建目录

    #创建备份binlog目录
    [root@db03 ~]# mkdir -p /root/binlog/
    

    3.手动备份

    #进入该目录
    [root@db03 ~]# cd /data/mysql/binlog/
    #备份binlog
    [root@db03 ~]# mysqlbinlog  -R --host=10.0.0.51 --user=mha --password=mha --raw  --stop-never mysql-bin.000001 &
    

    4.重启MHA

    #启动mha
    [root@db03 ~]# nohup masterha_manager --conf=/service/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /service/mha/manager.log 2>&1 &
    

    三、恢复MHA与binlog脚本

    1.node节点上的脚本

    [root@db02 ~]# vim start_mha.sh 
    
    #判断数据库是否挂掉
    mysql_pid=`ps -ef | grep [m]ysqld | wc -l`
    
    #如果挂掉则重启,如果没挂则杀掉重启
    if [ $mysql_pid -eq 0 ];then
        systemctl start mysqld
    else
        systemctl restart mysqld
    fi
    
    sleep 3
    
    #获取change master to语句
    change=`ssh 172.16.1.53 "grep 'CHANGE MASTER TO' /service/mha/manager | tail -1 | sed 's#xxx#123#g'" | awk -F: '{print $4}'` &&
    
    #重启的数据库执行change master to
    mysql -e "$change;start slave"
    
    #修复MHA配置文件
    ssh 172.16.1.53 "cp /service/mha/app1.cnf.bak /service/mha/app1.cnf" &&
    
    #远程启动MHA
    ssh 172.16.1.53 "/bin/bash /root/start_bin.sh"
    

    2.manager节点上的脚本

    [root@db03 ~]# vim start_bin.sh 
    
    #获取主机地址
    mha_master_host=`grep 'as a new master' /service/mha/manager | tail -1 | awk -F "[ ,(]" '{print $2}'`
    
    #启动保存binlog
    cd /root/binlog/
    
    nohup mysqlbinlog -R --host="$mha_master_host" --user=mha --password=mha --raw --stop-never mysql-bin.000001 >/dev/null &
    
    #启动MHA
    nohup masterha_manager --conf=/service/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /service/mha/manager.log 2>&1 &
    

    四、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
    

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

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

    2.安装Atlas

    1)上传或下载包

    [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.51:3306,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和端口
    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 ONLINE $backend_id     | DBA可平滑上线DB     			                          |
    | ADD MASTER $backend        | 添加主库								                 |
    | ADD SLAVE $backend         | 添加从库								                 |
    | REMOVE BACKEND $backend_id | 移除后端数据库				                            |
    | SELECT * FROM clients      | 客户端列表                                               |
    | ADD CLIENT $client         | 临时添加客户端						                   |
    | REMOVE CLIENT $client      | 临时移除客户端    							           |
    | SELECT * FROM pwds         | 客户端用户名和密码                                        |
    | ADD PWD $pwd               | 添加客户端用户名和密码					                 |
    | ADD ENPWD $pwd             | 添加客户端用户名和加密后的密码					          |
    | REMOVE PWD $pwd            | 移除客户端用户					                        |
    | SAVE CONFIG                | 保存配置到配置文件               				           |
    | SELECT VERSION             | 查看Atlas版本			                               |
    +----------------------------+---------------------------------------------------------+
    16 rows in set (0.00 sec)
    

    五、Atlas结合MHA故障恢复

    1.思路

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

    2.写脚本

    [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" | 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.找到挂掉的主机
    down_server=`grep "Master .* is down" /service/mha/manager | tail -1 | awk -F '[ ,(]' '{print $2}'`
    #5.远程连接执行恢复脚本
    ssh $down_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 slave $down_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)测试

    1.分表操作

    #连接Atlas负载数据库
    [root@db03 ~]# mysql -umha -pmha -h127.0.0.1 -P 1234
    mysql> show databases;
    
    #创建库
    mysql> create database school;
    Query OK, 1 row affected (0.04 sec)
    
    #切换库
    mysql> use school
    Database changed
    
    #创建原始表
    mysql> create table stu(id int,name varchar(10));
    Query OK, 0 rows affected (0.03 sec)
    
    #创建分表
    mysql> create table stu_0 like stu;
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> create table stu_1 like stu;
    Query OK, 0 rows affected (0.04 sec)
    
    mysql> create table stu_2 like stu;
    Query OK, 0 rows affected (0.03 sec)
    
    #插入数据
    mysql> insert into stu values(1,'lhd');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> insert into stu values(2,'lhd');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> insert into stu values(3,'lhd3');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> insert into stu values(11,'lhd3');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> insert into stu values(12,'lhd3');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> insert into stu values(13,'lhd3');
    Query OK, 1 row affected (0.02 sec)
    
    #查看数据
    mysql> select * from stu;
    Empty set (0.00 sec)
    
    mysql> select * from stu_0;
    +------+------+
    | id   | name |
    +------+------+
    |    3 | lhd3 |
    |   12 | lhd3 |
    +------+------+
    2 rows in set (0.03 sec)
    
    mysql> select * from stu_1;
    +------+------+
    | id   | name |
    +------+------+
    |    1 | lhd  |
    |   13 | lhd3 |
    +------+------+
    2 rows in set (0.00 sec)
    
    mysql> select * from stu_2;
    +------+------+
    | id   | name |
    +------+------+
    |    2 | lhd  |
    |   11 | lhd3 |
    +------+------+
    2 rows in set (0.00 sec)
    
    #如果想查看原表数据,需要加where条件
    mysql> select * from stu where id=1;
    +------+------+
    | id   | name |
    +------+------+
    |    1 | lhd  |
    +------+------+
    1 rows in set (0.00 sec)
    
  • 相关阅读:
    CF821E 【Okabe and El Psy Kongroo】
    BZOJ1231: [Usaco2008 Nov]mixup2 混乱的奶牛
    P1896 [SCOI2005]互不侵犯
    QBXT Day 2 记录
    CF467C George and Job
    【luogu P3373 线段树2】 模板
    【luogu P1306 斐波那契公约数】 题解
    【luogu T24743 [愚人节题目5]永世隔绝的理想乡】 题解
    【luogu P1903 [国家集训队]数颜色】 题解
    莫队算法~讲解
  • 原文地址:https://www.cnblogs.com/zabcd/p/13397229.html
Copyright © 2011-2022 走看看