• Mysql 高可用(MHA)-读写分离(Atlas)


    Mysql 高可用(MHA)-读写分离(Atlas)

    1. 搭建主从复制(一主两从)

    1.1 准备环境

    1 主库:10.0.0.51/db01
    2 从库:10.0.0.52/db02,10.0.0.53/db03

    1.2 清理环境

     1 systemctl stop  mysqld
     2 rm -rf /data/mysql_3306/*
     3 rm -rf /binlog/
     4 mkdir /binlog/
     5 
     6 创建相关目录与授权
     7 主库操作:开启binlog 和GTID
     8 mkdir -p /binlog/
     9 mkdir -p /var/log/mysql/
    10 touch /var/log/mysql/mysql.err
    11 chown -R mysql.mysql /var/log/mysql/
    12 chown -R mysql.mysql /binlog/
    13 
    14 从库操作:从库不需要开启binlog
    15 mkdir -p /var/log/mysql/
    16 touch /var/log/mysql/mysql.err
    17 chown -R mysql.mysql /var/log/mysql/

    1.3 准备配置⽂件

     1 a. 主库  (开启binlog和GTID)
     2 cat > /etc/my.cnf <<EOF
     3 [mysqld]
     4 user=mysql
     5 datadir=/data/mysql_3306
     6 basedir=/opt/mysql/
     7 socket=/tmp/mysql.sock
     8 port=3306
     9 log_error=/var/log/mysql/mysql.err
    10 server_id=51
    11 log_bin=/binlog/mysql-bin
    12 autocommit=0
    13 binlog_format=row
    14 gtid-mode=on
    15 enforce-gtid-consistency=true
    16 log-slave-updates=1
    17 [mysql]
    18 socket=/tmp/mysql.sock
    19 [client]
    20 socket=/tmp/mysql.sock
    21 EOF
    22 
    23 b.从库 (开启GTID,不用开启binlog)
    24 cat > /etc/my.cnf <<EOF
    25 [mysqld]
    26 user=mysql
    27 datadir=/data/mysql_3306
    28 basedir=/opt/mysql/
    29 socket=/tmp/mysql.sock
    30 port=3306
    31 log_error=/var/log/mysql/mysql.err
    32 server_id=52
    33 autocommit=0
    34 gtid-mode=on
    35 enforce-gtid-consistency=true
    36 log-slave-updates=1
    37 [mysql]
    38 socket=/tmp/mysql.sock
    39 [client]
    40 socket=/tmp/mysql.sock
    41 EOF
    42 
    43 c.从库 (开启GTID,不用开启binlog)
    44 cat > /etc/my.cnf <<EOF
    45 [mysqld]
    46 user=mysql
    47 datadir=/data/mysql_3306
    48 basedir=/opt/mysql/
    49 socket=/tmp/mysql.sock
    50 port=3306
    51 log_error=/var/log/mysql/mysql.err
    52 server_id=53
    53 autocommit=0
    54 gtid-mode=on
    55 enforce-gtid-consistency=true
    56 log-slave-updates=1
    57 [mysql]
    58 socket=/tmp/mysql.sock
    59 [client]
    60 socket=/tmp/mysql.sock
    61 EOF

    1.4 初始化数据

    1 mysqld --initialize-insecure --user=mysql --basedir=/opt/mysql --datadir=/data/mysql_3306/

    1.5 启动数据库

     1 systemctl start mysql
     2 查看是否启动
     3 netstat -lntup |grep 3306
     4 
     5 如果是刚装的mysql,启动mysql需要以下方法才可以启动
     6 方法一:cp /opt/mysql/support-files/mysql.server  /etc/init.d/mysqld    
     7       chkconfig --add mysqld
     8       systemctl start mysqld
     9       
    10 方法二: /etc/init.d/mysqld start

    1.6 设置数据库密码

    1 mysqladmin password

    1.7 创建远程复制⽤户 (db01操作)

     1 mysql> grant replication slave on *.* to repl@'10.0.0.%' identified by '123456abcd';
     2 Query OK, 0 rows affected, 1 warning (0.01 sec)
     3 
     4 mysql> select user,host from mysql.user;
     5 +---------------+-----------+
     6 | user          | host      |
     7 +---------------+-----------+
     8 | repl          | 10.0.0.%  |
     9 | mysql.session | localhost |
    10 | mysql.sys     | localhost |
    11 | root          | localhost |
    12 +---------------+-----------+
    13 4 rows in set (0.00 sec)

    1.8 构建主从

     1 查看主库GTID 位置
     2 mysql> show master status;
     3 +------------------+----------+--------------+------------------+------------------------------------------+
     4 | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
     5 +------------------+----------+--------------+------------------+------------------------------------------+
     6 | mysql-bin.000004 |      704 |              |                  | 86ef6764-6e12-11eb-ac19-000c29ee4d81:1-2 |
     7 +------------------+----------+--------------+------------------+------------------------------------------+
     8 1 row in set (0.00 sec)
     9 
    10 从库执行以下命令:
    11 change master to
    12 master_host='10.0.0.52',
    13 master_user='repl',
    14 master_password='123456abcd',
    15 MASTER_AUTO_POSITION=1;
    16 
    17 开启主从复制
    18 start slave;
    19 
    20 确认启动是否OK
    21 mysql> start slave;
    22 Query OK, 0 rows affected (0.00 sec)
    23 
    24 mysql> show slave statusG
    25 *************************** 1. row ***************************
    26                Slave_IO_State: Waiting for master to send event
    27                   Master_Host: 10.0.0.51
    28                   Master_User: repl
    29                   Master_Port: 3306
    30                 Connect_Retry: 60
    31               Master_Log_File: mysql-bin.000004
    32           Read_Master_Log_Pos: 704
    33                Relay_Log_File: db02-relay-bin.000002
    34                 Relay_Log_Pos: 917
    35         Relay_Master_Log_File: mysql-bin.000004
    36              Slave_IO_Running: Yes
    37             Slave_SQL_Running: Yes
    38               Replicate_Do_DB: 
    39           Replicate_Ignore_DB: 
    40            Replicate_Do_Table: 
    41        Replicate_Ignore_Table: 
    42       Replicate_Wild_Do_Table: 
    43   Replicate_Wild_Ignore_Table: 
    44                    Last_Errno: 0
    45                    Last_Error: 
    46                  Skip_Counter: 0
    47           Exec_Master_Log_Pos: 704
    48               Relay_Log_Space: 1123
    49               Until_Condition: None
    50                Until_Log_File: 
    51                 Until_Log_Pos: 0
    52            Master_SSL_Allowed: No
    53            Master_SSL_CA_File: 
    54            Master_SSL_CA_Path: 
    55               Master_SSL_Cert: 
    56             Master_SSL_Cipher: 
    57                Master_SSL_Key: 
    58         Seconds_Behind_Master: 0
    59 Master_SSL_Verify_Server_Cert: No
    60                 Last_IO_Errno: 0
    61                 Last_IO_Error: 
    62                Last_SQL_Errno: 0
    63                Last_SQL_Error: 
    64   Replicate_Ignore_Server_Ids: 
    65              Master_Server_Id: 51
    66                   Master_UUID: 86ef6764-6e12-11eb-ac19-000c29ee4d81
    67              Master_Info_File: /data/mysql_3306/master.info
    68                     SQL_Delay: 0
    69           SQL_Remaining_Delay: NULL
    70       Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
    71            Master_Retry_Count: 86400
    72                   Master_Bind: 
    73       Last_IO_Error_Timestamp: 
    74      Last_SQL_Error_Timestamp: 
    75                Master_SSL_Crl: 
    76            Master_SSL_Crlpath: 
    77            Retrieved_Gtid_Set: 86ef6764-6e12-11eb-ac19-000c29ee4d81:1-2
    78             Executed_Gtid_Set: 86ef6764-6e12-11eb-ac19-000c29ee4d81:1-2
    79                 Auto_Position: 1
    80          Replicate_Rewrite_DB: 
    81                  Channel_Name: 
    82            Master_TLS_Version: 
    83 1 row in set (0.00 sec)

    1.9 解除从库

    1 stop slave;
    2 reset slave all;

    2.MHA环境准备

    主库:10.0.0.51
    从库:10.0.0.52,10.0.0.53

    2.0  MHA 介绍

     1 1.Master HA,对主节点进行监控,可实现自动故障转 移至其它从节点;通过提升某一从节点为新的主节点,基于主从复制实现,还需要客户端配合实现,目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有 三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库,如果财大气粗,也可以用一台专门的服务器来当MHA监控管理服务器
     2 
     3 2.MHA工作原理
     4     1 从宕机崩溃的master保存二进制日志事件(binlog events) 
     5     2 识别含有最新更新的slave 
     6     3 应用差异的中继日志(relay log)到其他的slave 
     7     4 应用从master保存的二进制日志事件(binlog events) 
     8     5 提升一个slave为新的master 
     9     6 使其他的slave连接新的master进行复制 
    10     
    11     注意:MHA需要基于ssh,key验证登入方法    
    12     
    13     
    14 3.MHA软件由两部分组成,Manager工具包和Node工具包,具体的说明如下。
    15  1).Manager工具包主要包括以下几个工具:
    16     masterha_check_ssh              检查MHA的SSH配置状况
    17     masterha_check_repl             检查MySQL复制状况
    18     masterha_manger                 启动MHA
    19     masterha_check_status           检测当前MHA运行状态
    20     masterha_master_monitor         检测master是否宕机
    21     masterha_master_switch          控制故障转移(自动或者手动)
    22     masterha_conf_host              添加或删除配置的server信息
    23     
    24  2).Node工具包(这些工具通常由MHA Manager的脚本触发,无需人为操作)主要包括以下几个工具:
    25     save_binary_logs                保存和复制master的二进制日志
    26     apply_diff_relay_logs           识别差异的中继日志事件并将其差异的事件应用于其他的slave
    27     filter_mysqlbinlog              去除不必要的ROLLBACK事件(MHA已不再使用这个工具)
    28     purge_relay_logs                清除中继日志(不会阻塞SQL线程)
    29     
    30    自定义扩展:
    31     secondary_check_script:通过多条网络路由检测master的可用性;
    32     master_ip_failover_script:更新application使用的masterip;
    33    report_script:发送报告;
    34    init_conf_load_script:加载初始配置参数;
    35    master_ip_online_change_script;更新master节点ip地址。

    2.1 搭建关键的软链接(51,52,53都需要设置)

    1 ln -s /opt/mysql-5.7.28/bin/mysqlbinlog /usr/bin/mysqlbinlog
    2 ln -s /opt/mysql-5.7.28/bin/mysql /usr/bin/mysql

    2.2 配置互信(不用秘钥可以登录ssh)

     1 db01:
     2   rm -rf /root/.ssh
     3   ssh-keygen
     4   cd /root/.ssh
     5   mv id_rsa.pub authorized_keys
     6   scp -r /root/.ssh 10.0.0.52:/root
     7   scp -r /root/.ssh 10.0.0.53:/root
     8   
     9 各节点验证:(ssh无秘钥登录)
    10 db01:
    11 ssh 10.0.0.51 date           登录并查看时间
    12 ssh 10.0.0.52 date
    13 ssh 10.0.0.53 date
    14 db02:
    15 ssh 10.0.0.51 date
    16 ssh 10.0.0.52 date
    17 ssh 10.0.0.53 date
    18 db03:
    19 ssh 10.0.0.51 date
    20 ssh 10.0.0.52 date
    21 ssh 10.0.0.53 date

    2.3 各节点安装 node软件和依赖包

    1 yum install perl-DBD-MySQL -y
    2 rpm -ivh  mha4mysql-node-0.56-0.el6.noarch.rpm
    3 
    4 [root@db01 ~00:50:55]# rpm -ivh  mha4mysql-node-0.56-0.el6.noarch.rpm
    5 Preparing...                          ################################# [100%]
    6 Updating / installing...
    7    1:mha4mysql-node-0.56-0.el6        ################################# [100%]

    2.4 在主库db01中创建mha需要的用户

    1 grant all privileges on *.* to mha@'10.0.0.%' identified by '123456abcd';
    2 
    3 select user,host from mysql.user;

    2.5 Manager软件安装(db03)

    1 yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
    2 rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm
    3 
    4 [root@db03 ~00:53:36]# rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm
    5 Preparing...                          ################################# [100%]
    6 Updating / installing...
    7    1:mha4mysql-manager-0.56-0.el6     ################################# [100%]

    2.6 配置文件准备(db03)

     1 # 创建配置文件目录
     2 mkdir -p /etc/mha
     3 # 创建日志目录
     4 mkdir -p /var/log/mha/app1
     5 # 编辑mha配置文件
     6 cat > /etc/mha/app1.cnf <<EOF
     7 [server default]
     8 manager_log=/var/log/mha/app1/manager 
     9 manager_workdir=/var/log/mha/app1 
    10 master_binlog_dir=/binlog                                  #主库binlog位置
    11 user=mha                                                   #mha用户
    12 password=123456abcd 
    13 ping_interval=2                                            #每隔2秒扫描一次
    14 repl_password=123456abcd
    15 repl_user=repl                                             #主从复制用户
    16 ssh_user=root                                              #无秘钥使用用户
    17 [server1] 
    18 hostname=10.0.0.51
    19 port=3306 
    20 [server2] 
    21 hostname=10.0.0.52
    22 port=3306
    23 [server3]
    24 hostname=10.0.0.53
    25 port=3306
    26 EOF

    2.7 状态检查(db03)

      1 1. masterha_check_ssh --conf=/etc/mha/app1.cnf
      2 
      3 [root@db03 ~00:59:38]# masterha_check_ssh --conf=/etc/mha/app1.cnf
      4 Sun Feb 14 00:59:41 2021 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
      5 Sun Feb 14 00:59:41 2021 - [info] Reading application default configuration from /etc/mha/app1.cnf..
      6 Sun Feb 14 00:59:41 2021 - [info] Reading server configuration from /etc/mha/app1.cnf..
      7 Sun Feb 14 00:59:41 2021 - [info] Starting SSH connection tests..
      8 Sun Feb 14 00:59:42 2021 - [debug] 
      9 Sun Feb 14 00:59:41 2021 - [debug]  Connecting via SSH from root@10.0.0.51(10.0.0.51:22) to root@10.0.0.52(10.0.0.52:22)..
     10 Sun Feb 14 00:59:41 2021 - [debug]   ok.
     11 Sun Feb 14 00:59:41 2021 - [debug]  Connecting via SSH from root@10.0.0.51(10.0.0.51:22) to root@10.0.0.53(10.0.0.53:22)..
     12 Sun Feb 14 00:59:41 2021 - [debug]   ok.
     13 Sun Feb 14 00:59:42 2021 - [debug] 
     14 Sun Feb 14 00:59:41 2021 - [debug]  Connecting via SSH from root@10.0.0.52(10.0.0.52:22) to root@10.0.0.51(10.0.0.51:22)..
     15 Sun Feb 14 00:59:41 2021 - [debug]   ok.
     16 Sun Feb 14 00:59:41 2021 - [debug]  Connecting via SSH from root@10.0.0.52(10.0.0.52:22) to root@10.0.0.53(10.0.0.53:22)..
     17 Sun Feb 14 00:59:42 2021 - [debug]   ok.
     18 Sun Feb 14 00:59:43 2021 - [debug] 
     19 Sun Feb 14 00:59:42 2021 - [debug]  Connecting via SSH from root@10.0.0.53(10.0.0.53:22) to root@10.0.0.51(10.0.0.51:22)..
     20 Sun Feb 14 00:59:42 2021 - [debug]   ok.
     21 Sun Feb 14 00:59:42 2021 - [debug]  Connecting via SSH from root@10.0.0.53(10.0.0.53:22) to root@10.0.0.52(10.0.0.52:22)..
     22 Sun Feb 14 00:59:42 2021 - [debug]   ok.
     23 Sun Feb 14 00:59:43 2021 - [info] All SSH connection tests passed successfully.
     24 
     25 
     26 2. masterha_check_repl --conf=/etc/mha/app1.cnf
     27 Sun Feb 14 14:16:52 2021 - [info] Checking replication health on 10.0.0.52..
     28 Sun Feb 14 14:16:52 2021 - [info]  ok.
     29 Sun Feb 14 14:16:52 2021 - [info] Checking replication health on 10.0.0.53..
     30 Sun Feb 14 14:16:52 2021 - [info]  ok.
     31 Sun Feb 14 14:16:52 2021 - [warning] master_ip_failover_script is not defined.
     32 Sun Feb 14 14:16:52 2021 - [warning] shutdown_script is not defined.
     33 Sun Feb 14 14:16:52 2021 - [info] Got exit code 0 (Not master dead).
     34 MySQL Replication Health is OK.
     35 
     36 
     37 报错:
     38 [root@db03 ~00:59:43]# masterha_check_repl --conf=/etc/mha/app1.cnf
     39 Sun Feb 14 01:00:24 2021 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
     40 Sun Feb 14 01:00:24 2021 - [info] Reading application default configuration from /etc/mha/app1.cnf..
     41 Sun Feb 14 01:00:24 2021 - [info] Reading server configuration from /etc/mha/app1.cnf..
     42 Sun Feb 14 01:00:24 2021 - [info] MHA::MasterMonitor version 0.56.
     43 Sun Feb 14 01:00:25 2021 - [info] GTID failover mode = 1
     44 Sun Feb 14 01:00:25 2021 - [info] Dead Servers:
     45 Sun Feb 14 01:00:25 2021 - [info] Alive Servers:
     46 Sun Feb 14 01:00:25 2021 - [info]   10.0.0.51(10.0.0.51:3306)
     47 Sun Feb 14 01:00:25 2021 - [info]   10.0.0.52(10.0.0.52:3306)
     48 Sun Feb 14 01:00:25 2021 - [info]   10.0.0.53(10.0.0.53:3306)
     49 Sun Feb 14 01:00:25 2021 - [info] Alive Slaves:
     50 Sun Feb 14 01:00:25 2021 - [info]   10.0.0.52(10.0.0.52:3306)  Version=5.7.28 (oldest major version between slaves) log-bin:disabled
     51 Sun Feb 14 01:00:25 2021 - [info]     GTID ON
     52 Sun Feb 14 01:00:25 2021 - [info]     Replicating from 10.0.0.51(10.0.0.51:3306)
     53 Sun Feb 14 01:00:25 2021 - [info]   10.0.0.53(10.0.0.53:3306)  Version=5.7.28 (oldest major version between slaves) log-bin:disabled
     54 Sun Feb 14 01:00:25 2021 - [info]     GTID ON
     55 Sun Feb 14 01:00:25 2021 - [info]     Replicating from 10.0.0.51(10.0.0.51:3306)
     56 Sun Feb 14 01:00:25 2021 - [info] Current Alive Master: 10.0.0.51(10.0.0.51:3306)
     57 Sun Feb 14 01:00:25 2021 - [info] Checking slave configurations..
     58 Sun Feb 14 01:00:25 2021 - [info]  read_only=1 is not set on slave 10.0.0.52(10.0.0.52:3306).
     59 Sun Feb 14 01:00:25 2021 - [warning]  log-bin is not set on slave 10.0.0.52(10.0.0.52:3306). This host cannot be a master.
     60 Sun Feb 14 01:00:25 2021 - [info]  read_only=1 is not set on slave 10.0.0.53(10.0.0.53:3306).
     61 Sun Feb 14 01:00:25 2021 - [warning]  log-bin is not set on slave 10.0.0.53(10.0.0.53:3306). This host cannot be a master.
     62 Sun Feb 14 01:00:25 2021 - [info] Checking replication filtering settings..
     63 Sun Feb 14 01:00:25 2021 - [info]  binlog_do_db= , binlog_ignore_db= 
     64 Sun Feb 14 01:00:25 2021 - [info]  Replication filtering check ok.
     65 Sun Feb 14 01:00:25 2021 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln361] None of slaves can be master. Check failover configuration file or log-bin settings in my.cnf
     66 Sun Feb 14 01:00:25 2021 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln424] Error happened on checking configurations.  at /usr/bin/masterha_check_repl line 48.
     67 Sun Feb 14 01:00:25 2021 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln523] Error happened on monitoring servers.
     68 Sun Feb 14 01:00:25 2021 - [info] Got exit code 1 (Not master dead).
     69 
     70   SQL Replication Health is NOT OK!
     71   
     72   
     73 解决问题:
     74         [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln361] None of slaves can be master. Check failover configuration file or log-bin settings in my.cnf
     75         Sun Feb 14 01:00:25 2021 - [info]   10.0.0.52(10.0.0.52:3306)  Version=5.7.28 (oldest major version between slaves) log-bin:disabled
     76         Sun Feb 14 01:00:25 2021 - [info]   10.0.0.53(10.0.0.53:3306)  Version=5.7.28 (oldest major version between slaves) log-bin:disabled
     77         
     78    以上说明log-bin处于关闭的状态,同时show variables like 'log_bin';可以看到log_bin处于OFF
     79    mysql> show variables like 'log_bin';
     80 +---------------+-------+
     81 | Variable_name | Value |
     82 +---------------+-------+
     83 | log_bin       | OFF   |
     84 +---------------+-------+
     85 1 row in set (0.00 sec)
     86      
     87 解决方法:
     88        在db02,db03的mysql 配置档中写入log_bin=master-bin,必须写在server-id=[] 后面.
     89        [root@db03 ~14:16:52]# cat /etc/my.cnf
     90         [mysqld]
     91         user=mysql
     92         datadir=/data/mysql_3306
     93         basedir=/opt/mysql/
     94         socket=/tmp/mysql.sock
     95         port=3306
     96         log_error=/var/log/mysql/mysql.err
     97         server_id=53
     98         log_bin=master-bin
     99         autocommit=0
    100         gti--mode=on
    101         enforce-gtid-consistency=true
    102         log-slave-updates=1
    103         [mysql]
    104         socket=/tmp/mysql.sock
    105         [client]
    106         socket=/tmp/mysql.sock
    107  重新再测试下,问题已解决
    108          [root@db03 ~14:16:52]# cat /etc/my.cnf
    109         [mysqld]
    110         user=mysql
    111         datadir=/data/mysql_3306
    112         basedir=/opt/mysql/
    113         socket=/tmp/mysql.sock
    114         port=3306
    115         log_error=/var/log/mysql/mysql.err
    116         server_id=53
    117         log_bin=master-bin
    118         autocommit=0
    119         gti--mode=on
    120         enforce-gtid-consistency=true
    121         log-slave-updates=1
    122         [mysql]
    123         socket=/tmp/mysql.sock
    124         [client]
    125         socket=/tmp/mysql.sock

    2.8 开启MHA(db03)

    1 nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null> /var/log/mha/app1/manager.log 2>&1 &

    2.9 查看MHA状态(db03)

    1 masterha_check_status --conf=/etc/mha/app1.cnf
    2 
    3 [root@db03 ~14:30:54]# masterha_check_status --conf=/etc/mha/app1.cnf
    4 app1 (pid:7808) is running(0:PING_OK), master:10.0.0.51

    3.MHA 故障测试(主库宕机会自动选出新主库)

     1 MHA Failover 过程原理:
     2    高可用最擅长的是为我们解决物理损坏,就是说主库坏了可以很快从备份从库中筛选出新的主库,使数据正常运行.
     3 1.启动Manager 
     4   调用masterha_manager脚本启动Manager程序
     5   
     6 2.监控:
     7   通过:masterha_master_monitor心跳检测脚本,数据库节点,主要监控主库.默认探测4次,每隔(ping_interval=2)秒,如果主库还没有心跳,认为主库宕机,进入failover过程.
     8   
     9 3. 选主:
    10   [server2]
    11   hostname=172.25.83.2
    12   port=3306
    13   candidate_master=1      #设置为候选master,如果设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个主库不是集群中事件最新的slave
    14   check_repl_delay=0      #默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间,通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master
    15   a. 优先级(主观),如果在节点配置时,加入了candidate_master=1 参数.如果备选主,日志量落后mater太多(后master 100M 的ralay_1ogs的话,也不会被选择成为新主master),也可以通过check_repl_delay=0,不检查日志落后的情景.
    16   b. 日志量最接近主库
    17   c. 日志量一样,按配置文件顺序来选择主库master.
    18   
    19 4. 日志补偿:
    20   a. ssh 能连接上,通过save_binary_logs立即保存缺失部分日志到从库(/var/tmp目录下)并恢复
    21   b. ssh 连接不了,两个从库进行relay_log日志diff(apply_diff_relay_logs)差异补偿.
    22   
    23 5. 主从身份切换,所有从库取消和原有主库的复制关系(stop slave;reset slave all),新主库与剩下从库构建主从复制.
    24 
    25 6. 故障库自动被剔除集群(通过master_conf_host 从配置信息中去掉)
    26 
    27 7. MHA是一次性的高可用,Failover 后,Manager 自动退出(需要手动再次加入集群)
    28 以上是MHA的基础环境所有具备的功能.
    29 不足的地方:
    30 1.应该透明(IP地址自动切换)
    31 2.数据补偿(数据不能丢失)
    32 3.自动提醒
    33 4.自愈功能(待开发)
    34   思路:MHA + K8S +Operator 官方  ,   8.0 MGR + Mysqlsh

    4.MHA应用透明VIP功能

    1 说明:只能同机房使用,无法跨机房跨网络
    2 如果想用跨机房跨网络 可以用keepalived,需要用candidate_master=1和check_repl_delay=0来配合,防止VIP和主库不在一个节点上.

    4.1配置参数(db03)

     1 将master_ip_failover_script= /usr/local/bin/master_ip_failover写入到mha配置档中
     2 
     3 [root@db03 ~00:27:23]# cat /etc/mha/app1.cnf 
     4 [server default]
     5 master_ip_failover_script= /usr/local/bin/master_ip_failover
     6 manager_log=/var/log/mha/app1/manager
     7 manager_workdir=/var/log/mha/app1
     8 master_binlog_dir=/binlog
     9 password=123456abcd
    10 ping_interval=2
    11 repl_password=123456abcd
    12 repl_user=repl
    13 ssh_user=root
    14 user=mha
    15 
    16 [server1]
    17 hostname=10.0.0.51
    18 port=3306
    19 
    20 [server2]
    21 hostname=10.0.0.52
    22 port=3306
    23 
    24 [server3]
    25 hostname=10.0.0.53
    26 port=3306

    4.2 修改脚本

     1 vim /usr/local/bin/master_ip_failover
     2 my $vip = '10.0.0.55/24';  
     3 my $key = "1";
     4 my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
     5 my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
     6 
     7 a. 需要转换下中文字符
     8 dos2unix /usr/local/bin/master_ip_failover
     9 
    10 [root@db03 ~00:51:52]# dos2unix /usr/local/bin/master_ip_failover
    11 dos2unix: converting file /usr/local/bin/master_ip_failover to Unix format ...
    12 b. 赋予x权限
    13  chmod +x /usr/local/bin/master_ip_failover

    4.3 手动在主库master 中新建一个VIP.网卡名称一定要与配置文档中的一样

     1 db01:10.0.0.51 操作
     2 ifconfig eth0:1 10.0.0.55/24
     3 
     4 [root@db01 ~01:02:14]# ifconfig eth0:1 10.0.0.55/24
     5 [root@db01 ~01:02:38]# ip a
     6 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
     7     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
     8     inet 127.0.0.1/8 scope host lo
     9        valid_lft forever preferred_lft forever
    10     inet6 ::1/128 scope host 
    11        valid_lft forever preferred_lft forever
    12 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    13     link/ether 00:0c:29:ee:4d:81 brd ff:ff:ff:ff:ff:ff
    14     inet 10.0.0.51/24 brd 10.0.0.255 scope global noprefixroute eth0
    15        valid_lft forever preferred_lft forever
    16     inet 10.0.0.55/24 brd 10.0.0.255 scope global secondary eth0:1
    17        valid_lft forever preferred_lft forever
    18     inet6 fe80::f2eb:f691:47ea:8c4e/64 scope link tentative noprefixroute dadfailed 
    19        valid_lft forever preferred_lft forever
    20     inet6 fe80::967b:20ed:e702:f7c2/64 scope link tentative noprefixroute dadfailed 
    21        valid_lft forever preferred_lft forever
    22     inet6 fe80::fda8:a693:1736:211/64 scope link noprefixroute 
    23        valid_lft forever preferred_lft forever

    4.4 重启MHA(db03操作)

    a. 先停止
    masterha_stop --conf=/etc/mha/app1.cnf   
    
    b. 再启动
    nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null> /var/log/mha/app1/manager.log 2>&1 &
    
    c.查看下VIP是否还是在主库51上或者查看master是否为51
    [root@db03 ~14:30:54]# masterha_check_status --conf=/etc/mha/app1.cnf
    app1 (pid:7808) is running(0:PING_OK), master:10.0.0.51

    4.5 测试VIP漂移

     1 1.将主库master mysql 停掉
     2   systemctl stop mysqld
     3   
     4 2.查看mha 日志
     5   tail -f /var/log/mha/app1/manager 
     6 
     7 3.查看VIP IP已经漂移到52,说明已经将52做为新主库master.
     8 
     9 4.主库51上查看主从复制,VIP 都已要没有了,同时53库上的/etc/mha/app1.cnf [server 1] 配置已经清除.
    10 
    11 5.将51库的Mysql启动来,再做主从复制,主库为52.同时/etc/mha/app1.cnf  [server 1] 增加进去.
    12     change master to
    13     master_host='10.0.0.52',
    14     master_user='repl',
    15     master_password='123456abcd',
    16     MASTER_AUTO_POSITION=1; 
    17     再开启start slave;
    18     查看show slave statusG
    19     
    20 6.在主库52中执行show slave hosts;可以查看到有几台从库
    21   mysql> show slave hosts;
    22     +-----------+------+------+-----------+--------------------------------------+
    23     | Server_id | Host | Port | Master_id | Slave_UUID                           |
    24     +-----------+------+------+-----------+--------------------------------------+
    25     |        53 |      | 3306 |        51 | b03f4593-6e18-11eb-a543-000c291a88d9 |
    26     |        52 |      | 3306 |        51 | 6a0cfd41-6e18-11eb-a1b0-000c29d2d3c1 |
    27     +-----------+------+------+-----------+--------------------------------------+
    28     2 rows in set (0.00 sec)

    master_ip_failover(perl)脚本

     1 cat /usr/local/bin/master_ip_failover
     2 #!/usr/bin/env perl
     3 use strict;
     4 use warnings FATAL =>'all';
     5 
     6 use Getopt::Long;
     7 
     8 my (
     9 $command,          $ssh_user,        $orig_master_host, $orig_master_ip,
    10 $orig_master_port, $new_master_host, $new_master_ip,    $new_master_port
    11 );
    12 
    13 my $vip = '10.0.0.55/24';  # Virtual IP
    14 my $key = "1";
    15 my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
    16 my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
    17 my $exit_code = 0;
    18 
    19 GetOptions(
    20 'command=s'          => $command,
    21 'ssh_user=s'         => $ssh_user,
    22 'orig_master_host=s' => $orig_master_host,
    23 'orig_master_ip=s'   => $orig_master_ip,
    24 'orig_master_port=i' => $orig_master_port,
    25 'new_master_host=s'  => $new_master_host,
    26 'new_master_ip=s'    => $new_master_ip,
    27 'new_master_port=i'  => $new_master_port,
    28 );
    29 
    30 exit &main();
    31 
    32 sub main {
    33 
    34 #print "
    
    IN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===
    
    ";
    35 
    36 if ( $command eq "stop" || $command eq "stopssh" ) {
    37 
    38         # $orig_master_host, $orig_master_ip, $orig_master_port are passed.
    39         # If you manage master ip address at global catalog database,
    40         # invalidate orig_master_ip here.
    41         my $exit_code = 1;
    42         eval {
    43             print "
    
    
    ***************************************************************
    ";
    44             print "Disabling the VIP - $vip on old master: $orig_master_host
    ";
    45             print "***************************************************************
    
    
    
    ";
    46 &stop_vip();
    47             $exit_code = 0;
    48         };
    49         if ($@) {
    50             warn "Got Error: $@
    ";
    51             exit $exit_code;
    52         }
    53         exit $exit_code;
    54 }
    55 elsif ( $command eq "start" ) {
    56 
    57         # all arguments are passed.
    58         # If you manage master ip address at global catalog database,
    59         # activate new_master_ip here.
    60         # You can also grant write access (create user, set read_only=0, etc) here.
    61 my $exit_code = 10;
    62         eval {
    63             print "
    
    
    ***************************************************************
    ";
    64             print "Enabling the VIP - $vip on new master: $new_master_host 
    ";
    65             print "***************************************************************
    
    
    
    ";
    66 &start_vip();
    67             $exit_code = 0;
    68         };
    69         if ($@) {
    70             warn $@;
    71             exit $exit_code;
    72         }
    73         exit $exit_code;
    74 }
    75 elsif ( $command eq "status" ) {
    76         print "Checking the Status of the script.. OK 
    ";
    77         `ssh $ssh_user@$orig_master_host " $ssh_start_vip "`;
    78         exit 0;
    79 }
    80 else {
    81 &usage();
    82         exit 1;
    83 }
    84 }
    85 
    86 # A simple system call that enable the VIP on the new master
    87 sub start_vip() {
    88 `ssh $ssh_user@$new_master_host " $ssh_start_vip "`;
    89 }
    90 # A simple system call that disable the VIP on the old_master
    91 sub stop_vip() {
    92 `ssh $ssh_user@$orig_master_host " $ssh_stop_vip "`;
    93 }
    94 
    95 sub usage {
    96 print
    97 "Usage: master_ip_failover –command=start|stop|stopssh|status –orig_master_host=host –orig_master_ip=ip –orig_master_port=po
    98 rt –new_master_host=host –new_master_ip=ip –new_master_port=port
    ";
    99 }

    5.binlog server (数据补偿)

    1 db03 主机操作
    2 数据补偿,尽可能不丢失数据
    3 有专门一台binlog server时时拉取Master 的Mysql-binlog,如果主master 宕机了,从库直接从binlog server读取数据.
    4 缺点:可能会拉低master 性能,所以尽能将binlog server装在ssd上.

    5.1 参数设置

    1 vim /etc/mha/app1.cnf
    2 [binlog1]
    3 no_master=1            #不参与选主
    4 hostname=10.0.0.53     #binlog server 主机Ip
    5 master_binlog_dir=/data/mysql/binlog   #这个目录需要与master_binlog_dir=/binlog 目录不一样.

    5.2 创建对应目录

    1 mkdir -p /data/mysql/binlog
    2 chown -R mysql.mysql /data/*

    5.3 拉取主库日志

     1 必须先进入到binlog目录中
     2 cd /data/mysql/binlog
     3 mysqlbinlog -R --host=10.0.0.51 --user=mha --password=123456abcd --raw --stop-never mysql-bin.000001 &
     4 mysql-bin.000001:
     5     这个日志是为了测试用,如果生产环境中,因为有很多日志也有可能没有这个日志,所以需要用show master status;来查看下当前日志,或者flush logs;重新刷新一个新的日志起点.
     6 mysql> show master status;
     7 +------------------+----------+--------------+------------------+------------------------------------------+
     8 | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
     9 +------------------+----------+--------------+------------------+------------------------------------------+
    10 | mysql-bin.000006 |      194 |              |                  | 86ef6764-6e12-11eb-ac19-000c29ee4d81:1-9 |
    11 +------------------+----------+--------------+------------------+------------------------------------------+
    12 1 row in set (0.00 sec)
    13 
    14 [root@db03 /data/mysql/binlog00:26:46]# ps -ef |grep mysqlbinlog
    15 root      13131   7587  0 00:24 pts/0    00:00:00 mysqlbinlog -R --host=10.0.0.51 --user=mha --password=x xxxxxxxx --raw --stop-never mysql-bin.000001
    16 root      13318   7587  0 00:29 pts/0    00:00:00 grep --color=auto mysqlbinlog
    17 
    18 [root@db03 /data/mysql/binlog00:20:15]# ll
    19 total 24
    20 -rw-r----- 1 root root  177 Feb 16 00:19 mysql-bin.000001
    21 -rw-r----- 1 root root  177 Feb 16 00:19 mysql-bin.000002
    22 -rw-r----- 1 root root  177 Feb 16 00:19 mysql-bin.000003
    23 -rw-r----- 1 root root 1940 Feb 16 00:19 mysql-bin.000004
    24 -rw-r----- 1 root root  217 Feb 16 00:19 mysql-bin.000005
    25 -rw-r----- 1 root root  194 Feb 16 00:19 mysql-bin.000006
    26 
    27 [root@db01 /binlog00:20:39]# ll
    28 total 28
    29 -rw-r----- 1 mysql mysql  177 Feb 13 23:41 mysql-bin.000001
    30 -rw-r----- 1 mysql mysql  177 Feb 13 23:45 mysql-bin.000002
    31 -rw-r----- 1 mysql mysql  177 Feb 13 23:46 mysql-bin.000003
    32 -rw-r----- 1 mysql mysql 1940 Feb 14 01:41 mysql-bin.000004
    33 -rw-r----- 1 mysql mysql  217 Feb 14 14:13 mysql-bin.000005
    34 -rw-r----- 1 mysql mysql  194 Feb 15 21:47 mysql-bin.000006
    35 -rw-r----- 1 mysql mysql  150 Feb 15 21:47 mysql-bin.index
    36 
    37 在主库中先查看日志
    38 show master status;
    39 再刷新下log
    40 flush logs;
    41 查看从库53就会有一个新的binlog日志

    5.4 重启MHA

    1 a. 先停止
    2 masterha_stop --conf=/etc/mha/app1.cnf   
    3 
    4 b. 再启动
    5 nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null> /var/log/mha/app1/manager.log 2>&1 &
    6 
    7 c.查看下VIP是否还是在主库51上或者查看master是否为51
    8 [root@db03 ~14:30:54]# masterha_check_status --conf=/etc/mha/app1.cnf
    9 app1 (pid:7808) is running(0:PING_OK), master:10.0.0.51

    6.发送邮件提醒

    6.1 参数设置(db03)

     1 report_script=/usr/local/bin/sendEmail-v1.56/sendemail.sh
     2 写入配置文档中db03
     3 [root@db03 ~20:54:53]# cat /etc/mha/app1.cnf 
     4 [server default]
     5 manager_log=/var/log/mha/app1/manager
     6 manager_workdir=/var/log/mha/app1
     7 master_binlog_dir=/binlog
     8 master_ip_failover_script=/usr/local/bin/master_ip_failover
     9 report_script=/usr/local/bin/sendEmail-v1.56/sendemail.sh
    10 password=123456abcd
    11 ping_interval=2
    12 repl_password=123456abcd
    13 repl_user=repl
    14 ssh_user=root
    15 user=mha
    16 
    17 [server1]
    18 hostname=10.0.0.51
    19 port=3306
    20 
    21 [server2]
    22 hostname=10.0.0.52
    23 port=3306
    24 
    25 [server3]
    26 hostname=10.0.0.53
    27 port=3306
    28 
    29 [binlog1]
    30 no_master=1
    31 hostname=10.0.0.53     
    32 master_binlog_dir=/data/mysql/binlog

    6.2 解压sendEmail 软件

     1 解压软件到指定位置
     2 tar xf sendEmail-v1.56.tar.gz -C /usr/local/bin/
     3 
     4 [root@db03 /usr/local/bin/sendEmail-v1.5621:30:31]# ll
     5 -rw-r--r-- 1 root root 13329 Sep 30  2009 CHANGELOG
     6 -rw-r--r-- 1 root root  7949 Sep 30  2009 README
     7 -rw-r--r-- 1 root root  4701 Sep 30  2009 README-BR.txt
     8 -rwxr-xr-x 1 root root 80213 Sep 30  2009 sendEmail
     9 lrwxrwxrwx 1 root root     9 Sep 30  2009 sendEmail.pl -> sendEmail
    10 -rwxr-xr-x 1 root root   280 Feb 26 19:38 sendemail.sh
    11 -rw-r--r-- 1 root root  1229 Sep 30  2009 TODO
    12 
    13 report_script=/usr/local/bin/sendEmail-v1.56/sendemail.sh
    14 解释:MHA 最后会读取report_script里的脚本,其实就是调用sendemail.sh脚本,而sendemail.sh 脚本又是调用sendEmail 命令来发送邮件.

    6.3 发邮件脚本测试

     1 #1.下载一个sendEmail-v1.56.tar.gz
     2 
     3 #2. 编写一个测试脚本./sendemail.sh 看看测试邮件是否可以发出.确认没有问题.
     4 vim sendemail.sh
     5 #!/bin/bash
     6 /usr/local/bin/sendEmail-v1.56/sendEmail -f "friend_lss@163.com" -t "282474670@qq.com" -s "smtp.163.com" -u "myTest" -o tls=no -o message-content-type=html -o message-charset=utf-8 -xu "friend_lss@163.com" -xp "OTUWLQOUFMHVKFRL" -m "MHA 出现问题,请及时处理"
     7 
     8 #3. 直接用命令方式
     9 sendEmail -f "friend_lss@163.com" -t "282474670@qq.com" -s "smtp.163.com" -u "myTest" -o tls=no -o message-content-type=html -o message-charset=utf-8 -xu "friend_lss@163.com" -xp "OTUWLQOUFMHVKFRL" -m "MHA 出现问题,请及时处理"  
    10 
    11 #4. sendEmail 参数解释
    12 -f linuxyw@163.com是发件邮箱,必须是真实的,要不发不出去的,与sendmail不一样
    13 -t 63780668@qq.com linuxyw@163.com 这二个邮件是接收邮件的邮箱地址,可以是一个,也可以是多个,用空格隔开就行,实现邮件群发
    14 -s smtp.163.com 这是163邮箱的smtp地址,如果用其它企业邮箱,必须指定smtp地址,要不发不出邮件
    15 -u hello  hello是邮件主题
    16 -xu linuxyw 发件邮件的登陆用户名,必须是真实的,否则系统登陆不上去,发送不了邮件
    17 -xp 123456pass 发件邮箱的登陆用户密码,必须是真实的,否则系统登陆不上去,发送不了邮件
    18 -m www.linuxyw.com  这里的[www.linuxyw.com](http://www.linuxyw.com/)是邮件的内容,你可以输入你所要写的邮件内容
    19 
    20 #5. 运行脚本报错处理
    21 ==================================================================================
    22 运行脚本报错:
    23 [root@db03 /usr/local/bin/sendEmail-v1.5623:20:19]# ./sendemail.sh 
    24 
    25 *******************************************************************
    26 
    27  Using the default of SSL_verify_mode of SSL_VERIFY_NONE for client
    28  is deprecated! Please set SSL_verify_mode to SSL_VERIFY_PEER
    29  possibly with SSL_ca_file|SSL_ca_path for verification.
    30  If you really don't want to verify the certificate and keep the
    31  connection open to Man-In-The-Middle attacks please set
    32  SSL_verify_mode explicitly to SSL_VERIFY_NONE in your application.
    33 
    34 *******************************************************************
    35 
    36   at /usr/local/bin/sendEmail-v1.56/sendEmail line 1906.
    37 invalid SSL_version specified at /usr/share/perl5/vendor_perl/IO/Socket/SSL.pm line 444.
    38 ================================================================================================
    39 #处理方法:
    40 在centos7中,perl版本是5.16,要降级到5.10.但是降级这个perl,依赖关系很多。经过反复搜索,发现有如下解决办法:
    41 a、卸载现有的perl版本,安装老版本(不推荐)
    42 b、增加参数-o tls=no 选项
    43 [root@zabbix02 sendEmail-v1.56]# sendEmail -f  username@163.com -t username@qq.com -s smtp.163.com -u "I am zabbix" -o tls=no -o message-content-type=html -o message-charset=utf8 -xu  username@163.com -xp password -m "hello zabbix"
    44 Feb 16 15:43:04 zabbix02 sendEmail[18761]: Email was sent successfully!

    6.4 测试邮件是否OK

     1 a. 主库Master 执行systemctl stop mysql, 使主库宕机
     2 
     3 b. 查看是否有邮件提醒
     4    或者看邮件日志
     5    
     6 c. 查看VIP 是否转移
     7 
     8 ==============================================================
     9 ----- Failover Report -----
    10 
    11 app1: MySQL Master failover 10.0.0.51(10.0.0.51:3306) to 10.0.0.52(10.0.0.52:3306) succeeded
    12 
    13 Master 10.0.0.51(10.0.0.51:3306) is down!
    14 
    15 Check MHA Manager logs at db03:/var/log/mha/app1/manager for details.
    16 
    17 Started automated(non-interactive) failover.
    18 Invalidated master IP address on 10.0.0.51(10.0.0.51:3306)
    19 Selected 10.0.0.52(10.0.0.52:3306) as a new master.
    20 10.0.0.52(10.0.0.52:3306): OK: Applying all logs succeeded.
    21 10.0.0.52(10.0.0.52:3306): OK: Activated master IP address.
    22 10.0.0.53(10.0.0.53:3306): OK: Slave started, replicating from 10.0.0.52(10.0.0.52:3306)
    23 10.0.0.52(10.0.0.52:3306): Resetting slave info succeeded.
    24 Master failover to 10.0.0.52(10.0.0.52:3306) completed successfully.
    25 Fri Feb 26 19:49:45 2021 - [info] Sending mail..
    26 Feb 26 19:49:47 db03 sendEmail[7962]: Email was sent successfully!

    7. MHA故障排除思路

     1 如果主库宕机了,思路如下
     2 1. 查看进程
     3    ps -ef |grep manager
     4    masterha_check_status --conf=/etc/mha/app1.cnf
     5    
     6 2. 检查配置文档节点
     7    vim /etc/mha/app1.conf
     8    如果节点已经被移除了,说明切换过程已经大部分成功
     9    如果世点还在,说明切换过程卡在中间
    10 
    11 3. 看日志
    12    tail -f /var/log/mha/app1/manager
    13    
    14 4. 修复故障库,把节点修复好
    15    systemctl start mysqld
    16    /etc/init.d/mysqld start 
    17 5. 修复主从
    18    将故障库修好后手工加入已有的主从中,做为从库
    19    change master to
    20    master_host='10.0.0.52',
    21    master_user='repl',
    22    master_password='123456abcd',
    23    MASTER_AUTO_POSITION=1;
    24    start slave;
    25    
    26 6. 修复配置文档(配置文档如果还在,则省略)
    27    将被移除节点配置重新写入配置中
    28     [server1]
    29     hostname=10.0.0.51
    30     port=3306
    31     
    32 7. 检查SSH 互信和Repl 主从关系
    33    masterha_check_ssh --conf=/etc/mha/app1.cnf
    34    masterha_check_repl --conf=/etc/mha/app1.cnf
    35    如有报错,解决报错后再检查
    36    
    37 8. 修复binlogserver (主库宕机了,binlogserver 也会停掉)
    38     [root@db03 ~14:24:23]# cd /data/mysql/binlog/
    39     [root@db03 /data/mysql/binlog14:24:31]# rm -rf ./*    #删除已有的binlog日志
    40     拉取新主库binlog信息 (新主库IP地址写正确)
    41     cd /data/mysql/binlog
    42     mysqlbinlog -R --host=10.0.0.52 --user=mha --password=123456abcd --raw --stop-never mysql-bin.000001 &
    43    
    44 9. 检查节点VIP 的状态
    45    如果不在,再的手工生成
    46    
    47 10. 启动MHA
    48     nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null> /var/log/mha/app1/manager.log 2>&1 &
    49     
    50 11. 查看MHA 状态
    51     [root@db03 ~14:30:54]# masterha_check_status --conf=/etc/mha/app1.cnf
    52     app1 (pid:7808) is running(0:PING_OK), master:10.0.0.52

    8. 读写分离 Atlas

    8.1 Atlas 安装(db03)

    1 rpm -ivh Atlas-2.2.1.el6.x86_64.rpm

    8.2 配置Atlas

     1 cd  /usr/local/mysql-proxy/conf 
     2  同有一个test.cnf 配置文档,先做个备份一份
     3  [root@db03 /usr/local/mysql-proxy/conf20:59:31]# cat test.cnf
     4 [mysql-proxy]
     5 #带#号的为非必需的配置项目
     6 #管理接口的用户名
     7 admin-username = user
     8 #管理接口的密码
     9 admin-password = pwd
    10 #Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔
    11 proxy-backend-addresses =10.0.0.55:3306
    12 #Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔
    13 proxy-read-only-backend-addresses = 10.0.0.52:3306,10.0.0.53:3306
    14 #用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的user1和user2为示例,将其替换为你的MySQL的用户名和加密密码!
    15 #[root@db03 /usr/local/mysql-proxy/bin22:25:52]# ./encrypt repl:123456abcd
    16 #rdCkrCmLhbFMY6YuvYplDg==
    17 #[root@db03 /usr/local/mysql-proxy/bin22:26:06]# ./encrypt 123456abcd
    18 #tyElBOCykN3FCr2uMcG5AQ==
    19 #[root@db03 /usr/local/mysql-proxy/bin22:26:28]# ./encrypt mha
    20 #O2jBXONX098=
    21 pwds = repl:tyElBOCykN3FCr2uMcG5AQ==, mha:tyElBOCykN3FCr2uMcG5AQ==
    22 #设置Atlas的运行方式,设为true时为守护进程方式,设为false时为前台方式,一般开发调试时设为false,线上运行时设为true,true后面不能有空格。
    23 daemon = true
    24 #设置Atlas的运行方式,设为true时Atlas会启动两个进程,一个为monitor,一个为worker,monitor在worker意外退出后会自动将其重启,设为false时只有worker,没有monitor,一般开发调试时设为false,线上运行时设为true,true后面不能有空格。
    25 keepalive = true
    26 #工作线程数,对Atlas的性能有很大影响,可根据情况适当设置
    27 event-threads = 8
    28 #日志级别,分为message、warning、critical、error、debug五个级别
    29 log-level = message
    30 #日志存放的路径
    31 log-path = /usr/local/mysql-proxy/log
    32 #SQL日志的开关,可设置为OFF、ON、REALTIME,OFF代表不记录SQL日志,ON代表记录SQL日志,REALTIME代表记录SQL日志且实时写入磁盘,默认为OFF
    33 sql-log = ON
    34 #Atlas监听的工作接口IP和端口
    35 proxy-address = 0.0.0.0:33060
    36 #Atlas监听的管理接口IP和端口
    37 admin-address = 0.0.0.0:2345
    38 #默认字符集,设置该项后客户端不再需要执行SET NAMES语句
    39 charset = utf8

    8.3. 启动Atlas

     1 启动:
     2 /usr/local/mysql-proxy/bin/mysql-proxyd test start
     3 重起:
     4 /usr/local/mysql-proxy/bin/mysql-proxyd test restart
     5 [root@db03 /usr/local/mysql-proxy/conf21:44:42]# /usr/local/mysql-proxy/bin/mysql-proxyd test restart
     6 OK: MySQL-Proxy of test is stopped
     7 OK: MySQL-Proxy of test is started
     8 
     9 [root@db03 /usr/local/mysql-proxy/conf21:03:27]# /usr/local/mysql-proxy/bin/mysql-proxyd test start
    10 OK: MySQL-Proxy of test is started
    11 
    12 确认是否启动
    13 ps -ef | grep proxy
    14 
    15 [root@db03 /usr/local/mysql-proxy/conf21:05:02]# ps -ef | grep proxy
    16 root       6281      1  0 12:54 ?        00:00:00 /usr/sbin/gssproxy -D
    17 root      20514      1  0 21:05 ?        00:00:00 /usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/test.cnf
    18 root      20515  20514  0 21:05 ?        00:00:00 /usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/test.cnf
    19 root      20560   7774  0 21:06 pts/1    00:00:00 grep --color=auto proxy
    20 
    21 查看端口
    22 [root@db03 /usr/local/mysql-proxy/conf21:45:03]# netstat -lntup |grep proxy
    23 tcp        0      0 0.0.0.0:2345            0.0.0.0:*               LISTEN      21790/mysql-proxy   
    24 tcp        0      0 0.0.0.0:33060           0.0.0.0:*               LISTEN      21790/mysql-proxy 

    8.4 Atlas 配置说明

      1 Atlas运行需要依赖一个配置文件(test.cnf)。在运行Atlas之前,需要对该文件进行配置。Atlas的安装目录是/usr/local/mysql-proxy,进入安装目录下的conf目录,可以看到已经有一个名为test.cnf的默认配置文件,我们只需要修改里面的某些配置项,不需要从头写一个配置文件。
      2 
      3 配置范例及说明如下:
      4 [mysql-proxy]
      5 
      6 (必备,默认值即可)管理接口的用户名
      7 
      8 admin-username = user
      9 
     10 (必备,默认值即可)管理接口的密码
     11 
     12 admin-password = pwd
     13 
     14 (必备,根据实际情况配置)主库的IP和端口
     15 
     16 proxy-backend-addresses = 192.168.0.12:3306
     17 
     18 (非必备,根据实际情况配置)从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔。如果想让主库也能分担读请求的话,只需要将主库信息加入到下面的配置项中。
     19 
     20 proxy-read-only-backend-addresses = 192.168.0.13:3306,192.168.0.14:3306
     21 
     22 (必备,根据实际情况配置)用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,用户名与密码之间用冒号分隔。主从数据库上需要先创建该用户并设置密码(用户名和密码在主从数据库上要一致)。比如用户名为myuser,密码为mypwd,执行./encrypt mypwd结果为HJBoxfRsjeI=。如果有多个用户用逗号分隔即可。则设置如下行所示:
     23 
     24 pwds = repl: HJBoxfRsjeI=,mha:HJBoxfRsjeI=
     25 
     26 (必备,默认值即可)Atlas的运行方式,设为true时为守护进程方式,设为false时为前台方式,一般开发调试时设为false,线上运行时设为true
     27 
     28 daemon = true
     29 
     30 (必备,默认值即可)设置Atlas的运行方式,设为true时Atlas会启动两个进程,一个为monitor,一个为worker,monitor在worker意外退出后会自动将其重启,设为false时只有worker,没有monitor,一般开发调试时设为false,线上运行时设为true
     31 
     32 keepalive = true
     33 
     34 (必备,根据实际情况配置)工作线程数,推荐设置成系统的CPU核数的2至4倍
     35 
     36 event-threads = 4
     37 
     38 (必备,默认值即可)日志级别,分为message、warning、critical、error、debug五个级别
     39 
     40 log-level = message
     41 
     42 (必备,默认值即可)日志存放的路径
     43 
     44 log-path = /usr/local/mysql-proxy/log
     45 
     46 (必备,根据实际情况配置)SQL日志的开关,可设置为OFF、ON、REALTIME,OFF代表不记录SQL日志,ON代表记录SQL日志,该模式下日志刷新是基于缓冲区的,当日志填满缓冲区后,才将日志信息刷到磁盘。REALTIME用于调试,代表记录SQL日志且实时写入磁盘,默认为OFF
     47 
     48 sql-log = OFF
     49 
     50 (可选项,可不设置)慢日志输出设置。当设置了该参数时,则日志只输出执行时间超过sql-log-slow(单位:ms)的日志记录。不设置该参数则输出全部日志。
     51 
     52 sql-log-slow = 10
     53 
     54 (可选项,可不设置)关闭不活跃的客户端连接设置。当设置了该参数时,Atlas会主动关闭经过'wait-timeout'时间后一直未活跃的连接。单位:秒
     55 
     56 wait-timeout = 10
     57 
     58 (必备,默认值即可)Atlas监听的工作接口IP和端口
     59 
     60 proxy-address = 0.0.0.0:1234
     61 
     62 (必备,默认值即可)Atlas监听的管理接口IP和端口 admin-address = 0.0.0.0:2345
     63 
     64 (可选项,可不设置)分表设置,此例中person为库名,mt为表名,id为分表字段,3为子表数量,可设置多项,以逗号分隔,若不分表则不需要设置该项,子表需要事先建好,子表名称为表名_数字,数字范围为[0,子表数-1],如本例里,子表名称为mt_0、mt_1、mt_2
     65 
     66 tables = person.mt.id.3
     67 
     68 (可选项,可不设置)默认字符集,若不设置该项,则默认字符集为latin1
     69 
     70 charset = utf8
     71 
     72 (可选项,可不设置)允许连接Atlas的客户端的IP,可以是精确IP,也可以是IP段,以逗号分隔,若不设置该项则允许所有IP连接,否则只允许列表中的IP连接
     73 
     74 client-ips = 127.0.0.1, 192.168.1
     75 
     76 (可选项,极少需要)Atlas前面挂接的LVS的物理网卡的IP(注意不是虚IP),若有LVS且设置了client-ips则此项必须设置,否则可以不设置
     77 
     78 lvs-ips = 192.168.1.1
     79 
     80 2.    重要配置说明
     81 以下几项配置参数对性能和正常运行起到重要作用,需要正确设置。
     82 
     83 (1)线程数
     84 
     85 event-threads项设置,过小无法充分发挥多核CPU的性能,过大造成不必要的线程切换开销,推荐设置为CPU的核数。
     86 
     87 (2)最小空闲连接数(2.x以上版本不需要该项,1.x版本需要)
     88 
     89 min-idle-connections项设置,过小则在高并发下会有报错,过大虽然不报错但在测试时不容易看出读写分离效果,推荐设置为比客户端的并发峰值稍大,详见《配置参数详解》。上面的配置范例是针对Atlas 2.X版本,没有该选项。对于Atlas 1.X版本的配置文件,需要加入该配置选项。
     90 
     91 3. 可选配置说明
     92 以下几项可以设置,也可以使用默认值,区别不大。
     93 
     94 (1)Atlas的工作端口
     95 
     96 proxy-address项配置,例如proxy-address = 0.0.0.0:1234代表客户端应该使用1234这个端口连接Atlas来发送SQL请求。
     97 
     98 (2)Atlas的管理端口
     99 
    100 admin-address项配置,例如admin-address = 0.0.0.0:2345代表DBA应该使用2345这个端口连接Atlas来执行运维管理操作。
    101 
    102 (3)管理接口的用户名和密码
    103 
    104 admin-username项和admin-password项设置,这两项是用来进入Atlas的管理界面的,与后端连接的MySQL没有关系,所以可以任意设置,不需要MySQL在配置上做任何改动。
    105 
    106 (4)日志级别
    107 
    108 以log-level项配置,分为message、warning、critical、error、debug五个级别。
    109 
    110 (5)日志路径
    111 
    112 以log-path项配置,如log-path = /usr/local/mysql-proxy/log。
    113 
    114 [mysql-proxy]
    115 
    116 管理接口的用户名
    117 admin-username = user
    118 管理接口的密码
    119 admin-password = pwd
    120 Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔
    121 proxy-backend-addresses = 192.168.1.1:3306
    122 从库
    123 proxy-read-only-backend-addresses = 192.168.1.2:3306@1
    124 用户名和密码配置项,需要和主从复制配置的用户名和密码配置一样
    125 r1:+jKsgB3YAG8=, user2:GS+tr4TPgqc=
    126 后台运行
    127 daemon = true keepalive = false
    128 工作线程数,对Atlas的性能有很大影响,可根据情况适当设置
    129 event-threads = 4
    130 日志级别,分为message、warning、critical、error、debug五个级别
    131 log-level = error
    132 日志存放的路径
    133 log-path = ./log
    134 SQL日志的开关,可设置为OFF、ON、REALTIME,OFF代表不记录SQL日志,ON代表记录SQL日志,REALTIME代表记录SQL日>志且实时写入磁盘,默认为OFF
    135 sql-log = OFF
    136 慢日志输出设置。当设置了该参数时,则日志只输出执行时间超过sql-log-slow(单位:ms)的日志>记录。不设置该参数则输出全部日志。
    137 sql-log-slow = 1000
    138 实例名称,用于同一台机器上多个Atlas实例间的区分
    139 instance = web
    140 Atlas监听的工作接口IP和端口
    141 proxy-address = 0.0.0.0:13470
    142 Atlas监听的管理接口IP和端口
    143 admin-address = 0.0.0.0:23470
    144 分表设置,此例中person为库名,mt为表名,id为分表字段,3为子表数量,可设置多项,以逗号分>隔,若不分表则不需要设置该项
    145 tables = person.mt.id.3
    146 默认字符集,设置该项后客户端不再需要执行SET NAMES语句
    147 charset = utf8
    148 允许连接Atlas的客户端的IP,可以是精确IP,也可以是IP段,以逗号分隔,若不设置该项则允许所>有IP连接,否则只允许列表中的IP连接
    149 client-ips = 127.0.0.1, 192.168.1
    150 Atlas前面挂接的LVS的物理网卡的IP(注意不是虚IP),若有LVS且设置了client-ips则此项必须设置>,否则可以不设置
    151 lvs-ips = 192.168.1.1

    8.5 测试 读写分离功能(那台机器装了Atlas就用哪台)

     1 db03 操作:用mha 用户登录
     2 
     3 1. mysql -umha -p123456abcd -h 10.0.0.53 -P33060
     4 
     5 [root@db03 /usr/local/mysql-proxy/conf22:42:49]# mysql -umha -p123456abcd -h 10.0.0.53 -P33060
     6 mysql: [Warning] Using a password on the command line interface can be insecure.
     7 Welcome to the MySQL monitor.  Commands end with ; or g.
     8 Your MySQL connection id is 1
     9 Server version: 5.0.81-log MySQL Community Server (GPL)
    10 
    11 Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
    12 
    13 Oracle is a registered trademark of Oracle Corporation and/or its
    14 affiliates. Other names may be trademarks of their respective
    15 owners.
    16 
    17 Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    18 
    19 报错:
    20    登录密码有问题
    21 
    22 解决问题:
    23     Atlas 配置文档中的  pwds = repl:tyElBOCykN3FCr2uMcG5AQ==, mha:tyElBOCykN3FCr2uMcG5AQ==,这个密码必须是加密过的,要不然是无法识别.加密方式为/usr/local/mysql-proxy/bin/下的encrypt 文件加密
    24  #用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的user1和user2为示例,将其替换为你的MySQL的用户名和加密密码!
    25 #[root@db03 /usr/local/mysql-proxy/bin22:26:06]# ./encrypt 123456abcd
    26 #tyElBOCykN3FCr2uMcG5AQ==
    27 #[root@db03 /usr/local/mysql-proxy/bin22:26:28]# ./encrypt mha
    28 #O2jBXONX098=
    29 pwds = repl:tyElBOCykN3FCr2uMcG5AQ==, mha:tyElBOCykN3FCr2uMcG5AQ==
    30 
    31 2. 登录后测试读写分离:设置51,53为从库,52为主库
    32   读操作:
    33      select @@server_id; 可以看到51,53一直轮循.
    34    mysql> select @@server_id;
    35 +-------------+
    36 | @@server_id |
    37 +-------------+
    38 |          53 |
    39 +-------------+
    40 1 row in set (0.00 sec)
    41 
    42 mysql> select @@server_id;
    43 +-------------+
    44 | @@server_id |
    45 +-------------+
    46 |          51 |
    47 +-------------+
    48 1 row in set (0.00 sec)
    49 
    50 mysql> select @@server_id;
    51 +-------------+
    52 | @@server_id |
    53 +-------------+
    54 |          53 |
    55 +-------------+
    56 1 row in set (0.00 sec)
    57 
    58 mysql> select @@server_id;
    59 +-------------+
    60 | @@server_id |
    61 +-------------+
    62 |          51 |
    63 +-------------+
    64 1 row in set (0.00 sec)
    65 
    66 写操作: 只会写在db02 
    67   begin;select @@server_id;commit;
    68   
    69 mysql>  begin;select @@server_id;commit;
    70 Query OK, 0 rows affected (0.01 sec)
    71 
    72 +-------------+
    73 | @@server_id |
    74 +-------------+
    75 |          52 |
    76 +-------------+
    77 1 row in set (0.00 sec)
    78 
    79 Query OK, 0 rows affected (0.00 sec)
    80 
    81 mysql>  begin;select @@server_id;commit;
    82 Query OK, 0 rows affected (0.00 sec)
    83 
    84 +-------------+
    85 | @@server_id |
    86 +-------------+
    87 |          52 |
    88 +-------------+
    89 1 row in set (0.00 sec)
    90 
    91 Query OK, 0 rows affected (0.01 sec)   

    8.6 Atlas 管理(db03)

    a. 登录Atlas
    登录Atlas 界面,用户名: user 密码:pwd   端口号:2345
      mysql -uuser -ppwd -h 10.0.0.53 -P2345
    
    [root@db03 /usr/local/mysql-proxy/conf23:01:54]# mysql -uuser -ppwd -h 10.0.0.53 -P2345
    mysql: [Warning] Using a password on the command line interface can be insecure.
    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, 2019, 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.
    
    b. 查看Atlas 所有管理命令
    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", ...                        |
    | SELECT * FROM clients      | lists the clients                                       |
    | ADD CLIENT $client         | example: "add client 192.168.1.2", ...                  |
    | REMOVE CLIENT $client      | example: "remove client 192.168.1.2", ...               |
    | SELECT * FROM pwds         | lists the pwds                                          |
    | ADD PWD $pwd               | example: "add pwd user:raw_password", ...               |
    | ADD ENPWD $pwd             | example: "add enpwd user:encrypted_password", ...       |
    | REMOVE PWD $pwd            | example: "remove pwd user", ...                         |
    | SAVE CONFIG                | save the backends to config file                        |
    | SELECT VERSION             | display the version of Atlas                            |
    +----------------------------+---------------------------------------------------------+
    
    c. 管理命令
        查看所有帮助
        SELECT * FROM help 
      
        查看后端节点状态
        SELECT * FROM backends
    
        查看数据库节点状态
    SELECT * FROM backends
      
      mysql> SELECT * FROM backends;
    +-------------+----------------+-------+------+
    | backend_ndx | address        | state | type |
    +-------------+----------------+-------+------+
    |           1 | 10.0.0.55:3306 | up    | rw   |
    |           2 | 10.0.0.51:3306 | up    | ro   |
    |           3 | 10.0.0.53:3306 | up    | ro   |
    +-------------+----------------+-------+------+
    3 rows in set (0.00 sec)
    
        上线或下线节点(对某节点需要做升级或者数据分析等操作时)
    SET OFFLINE $backend_id    
    SET ONLINE $backend_id
    
    mysql> SET OFFLINE 2;
    +-------------+----------------+---------+------+
    | backend_ndx | address        | state   | type |
    +-------------+----------------+---------+------+
    |           2 | 10.0.0.51:3306 | offline | ro   |
    +-------------+----------------+---------+------+
    1 row in set (0.00 sec)
    
    mysql> SET ONLINE 2;
    +-------------+----------------+---------+------+
    | backend_ndx | address        | state   | type |
    +-------------+----------------+---------+------+
    |           2 | 10.0.0.51:3306 | unknown | ro   |
    +-------------+----------------+---------+------+
    1 row in set (0.00 sec)
    
    mysql> SELECT * FROM backends;
    +-------------+----------------+-------+------+
    | backend_ndx | address        | state | type |
    +-------------+----------------+-------+------+
    |           1 | 10.0.0.55:3306 | up    | rw   |
    |           2 | 10.0.0.51:3306 | up    | ro   |
    |           3 | 10.0.0.53:3306 | up    | ro   |
    +-------------+----------------+-------+------+
    3 rows in set (0.00 sec)
    
    
      添加或移除节点
      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 
      
    mysql> REMOVE BACKEND 2;
    Empty set (0.00 sec)
    
    mysql> SELECT * FROM backends;
    +-------------+----------------+-------+------+
    | backend_ndx | address        | state | type |
    +-------------+----------------+-------+------+
    |           1 | 10.0.0.55:3306 | up    | rw   |
    |           2 | 10.0.0.53:3306 | up    | ro   |
    +-------------+----------------+-------+------+
    2 rows in set (0.00 sec)
    
    mysql> ADD SLAVE 10.0.0.51:3306;
    Empty set (0.00 sec)
    
    mysql> SELECT * FROM backends;
    +-------------+----------------+-------+------+
    | backend_ndx | address        | state | type |
    +-------------+----------------+-------+------+
    |           1 | 10.0.0.55:3306 | up    | rw   |
    |           2 | 10.0.0.53:3306 | up    | ro   |
    |           3 | 10.0.0.51:3306 | up    | ro   |
    +-------------+----------------+-------+------+
    3 rows in set (0.00 sec)
     1 | SELECT * FROM pwds         | lists the pwds                                          |
     2 | ADD PWD $pwd               | example: "add pwd user:raw_password", ...               |
     3 | ADD ENPWD $pwd             | example: "add enpwd user:encrypted_password", ...       |
     4 | REMOVE PWD $pwd 
     5 
     6 mysql>  SELECT * FROM pwds;
     7 +----------+--------------------------+
     8 | username | password                 |
     9 +----------+--------------------------+
    10 | repl     | tyElBOCykN3FCr2uMcG5AQ== |
    11 | mha      | tyElBOCykN3FCr2uMcG5AQ== |
    12 +----------+--------------------------+
    13 2 rows in set (0.00 sec)
    14 
    15 
    16 企业应用案列:
    17 开发人员申请一个应用用户 app(  select  update  insert)  密码123456abcd,要通过10网段登录
    18 1. 在主库中,创建用户
    19 grant select ,update,insert on *.* to app@'10.0.0.%' identified by '123456abcd';
    20 2. 在atlas中添加生产用户
    21  方法一:  明文
    22     ADD PWD $pwd     ---需要添加的用户名称,例如:ADD PWD app:123456abcd; 会自动加,并加密
    23  
    24  方法二:  密文
    25     /usr/local/mysql-proxy/bin/encrypt  123456abcd 
    26     ADD ENPWD $pwd      例: ADD ENPWD app:tyElBOCykN3FCr2uMcG5AQ== 
    27  方法三:
    28   /usr/local/mysql-proxy/bin/encrypt  123456abcd      ---->制作加密密码
    29   vim test.cnf
    30   pwds = repl:3yb5jEku5h4=,mha:O2jBXONX098=,app:/iZxz+0GRoA=
    31   /usr/local/mysql-proxy/bin/mysql-proxyd test restart
    32   [root@db03 conf]# mysql -uapp -p123456abcd  -h 10.0.0.53 -P 33060

    8.7  配置永久生效(以上改的任何配置机器重启都会丢掉,相当于暂存在内存里)

    SAVE CONFIG;
    Do everything well
  • 相关阅读:
    django大全
    centos 下安装python3.6.2
    爬虫基础知识与简单爬虫实现
    HDU5950 Recursive sequence (矩阵快速幂加速递推) (2016ACM/ICPC亚洲赛区沈阳站 Problem C)
    ZOJ5833 Tournament(递归打表)
    ZOJ4067 Books(贪心)
    ZOJ4062 Plants vs. Zombies(二分+贪心)
    ZOJ4060 Flippy Sequence(思维题)
    洛谷P2568 GCD(线性筛法)
    2018.11.6刷题记录
  • 原文地址:https://www.cnblogs.com/linuxmysql/p/14454224.html
Copyright © 2020-2023  润新知