Linux下mysql主従レプリケーション+keepalived高可用性

39202 ワード

Linux下mysql主従レプリケーション+keepalived高可用性
  • 文章はCentOS 7を用いる.4バージョン、CentOS 6.Xは若干異なる
  • 公式ダウンロードアドレス:https://dev.mysql.com/downloads/mysql/
  • 公式インストールドキュメント:https://dev.mysql.com/doc/refman/5.6/en/binary-installation.html
  • 一、汎用インストールmysql 5.6バージョン
  • 1. mysqlインストールおよび準備
  • 2.クライアント設定
  • 二、RPMインストールmysql 5.6バージョン
  • 1.mysqlがインストールされているかどうかを確認します
  • 2.mysqlサーバのインストール
  • 3.mysqlクライアントのインストール
  • 4.ホストログインなし
  • 三、mysql主従複製
  • 1.Masterデータベース構成
  • 2.Slaverデータベース構成
  • 3.マスタコピーテスト
  • 四.keepalivedインストールおよび構成
  • 1. keepalivedインストール
  • 2. keepalived.conf構成
  • 3.検査する.conf構成
  • 4.keepalived高可用性テスト
  • 五.プロセス中に遭遇したピット
  • 1.ping不通外網
  • 2.SELINUXクローズによりスクリプトが呼び出されない
  • 3.keepalived.confファイルのvirtual_router_id競合
  • 文章はCentOS 7を使っています.4バージョン、CentOS 6.Xは少し違う
    公式ダウンロードアドレス:https://dev.mysql.com/downloads/mysql/
    公式インストールドキュメント:https://dev.mysql.com/doc/refman/5.6/en/binary-installation.html
    一、汎用インストールmysql 5.バージョン6
    1.mysqlインストールおよび準備
  • mysqlがインストールされているかどうかを確認
  • [root@hadoop101 /]rpm -qa|grep mysql
    [root@hadoop101 /]rpm -e --nodeps mysql****
    

    useradd-r(システムアカウントの確立)-g(ユーザが属するグループ)mysql(ユーザグループ)mysql(ユーザ)
    2.mysqlを解凍する
    [root@hadoop101 /]cd /usr/local
    [root@hadoop101 local]tar -zxvf mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz 
    

    3.変更/etc/profile環境変数
    [root@hadoop101 local]vim /etc/profile
          :export PATH=$PATH:/usr/local/mysql/bin
    [root@hadoop101 local]source /etc/profile     
    

    /etc/profile環境変数を変更すると、毎回/usr/local/mysql/bin/mysqlにアクセスしてクライアントを起動する必要はありません.
    4.ソフトリンクの作成
    [root@hadoop101 local]ln -s mysql-5.6.46-linux-glibc2.12-x86_64 mysql
    

    ln-s(ソースファイルにシンボル接続を確立する)ソースファイルターゲットファイルLinuxは、1つのファイルに複数の名前を付ける機能を有し、リンクと呼ばれる.リンクされたファイルは同じディレクトリに保存できますが、ハードディスク(HDD)上で同じデータを重複バックアップすることなく、異なるファイル名が必要です.率直に言って、ファイルに新しい名前を付け直し、新しい名前にアクセスするのは古い名前と同じ効果があります.
    5.mysqlユーザーとグループの変更の作成
    [root@hadoop101 local]cd mysql
    [root@hadoop101 mysql]groupadd mysql 
    [root@hadoop101 mysql]useradd -r -g mysql mysql
    [root@hadoop101 mysql]chown -R mysql:mysql ./ 
    

    6.mysql_の実行install_dbスクリプト
    [root@hadoop101 mysql]scripts/mysql_install_db --user=mysql  
    

    mysqlのdataディレクトリを初期化し、システムテーブルを作成します(5.7.*以上:bin/mysqld--user=mysql--basedir=/usr/local/mysql--datadir=/usr/local/mysql/data--initialize).mysqlのインストールディレクトリが/usr/local/mysqlでない場合は、basedir(mysqlインストールディレクトリ)とdatadir(dataが存在するパス)のディレクトリパラメータも指定する必要があります.
    7.コピーmy.cnfプロファイル、mysqldスクリプト
    [root@hadoop101 mysql]cp support-files/my-default.cnf /etc/my.cnf  
    [root@hadoop101 mysql]cp support-files/mysql.server /etc/init.d/mysqld
    

    時々/etcディレクトリの下にmyがないことがあります.cnfファイルです.デフォルトのプロファイルを/etcディレクトリに手動で移動する必要があります./etc/init.d/ディレクトリの下にシステムの起動、閉じるスクリプトがあり、mysql.serverファイルを移動してmysqldと名前を変更してディレクトリの下に置くと、service mysqld start/stop/status/restartを使用してmysqlを起動/停止/ステータス/再起動できます.
    2.クライアント設定
    1.mysqlサービスを開始する
    [root@hadoop101 mysql]service mysqld start
    [root@hadoop101 mysql]ps -ef|grep mysql      
    

    2.パスワードの変更
    [root@hadoop101 mysql]mysql 
    mysql> set password=password('123456');
    mysql> quit;    
    

    3.ホストレスログインの設定
    [root@hadoop101 mysql]mysql -uroot -p123456
    mysql> use mysql;
    mysql> update user set host='%' where host='localhost';    
    mysql> flush privileges;
    

    host='%'は、すべてのホストがmysqlクライアントにログインできることを意味し、ホストのみができるわけではありません.flush privilegesは変更を有効にします.
    二、RPMインストールmysql 5.バージョン6
    1.mysqlがインストールされているかどうかを確認する
    [root@hadoop102 /]rpm -qa|grep mysql
    [root@hadoop102 /]rpm -e --nodeps mysql****
    

    2.mysqlサーバのインストール
    1.  mysql   
    [root@hadoop102 /]# rpm -ivh MySQL-server-5.6.24-1.el6.x86_64.rpm
    2.         
    [root@hadoop102 /]# cat /root/.mysql_secret
    3.  mysql  
    [root@hadoop102 /]# service mysql status
    4.  mysql
    [root@hadoop102 /]# service mysql start
    

    3.mysqlクライアントのインストール
    1.  mysql   
    [root@hadoop102 /]# rpm -ivh MySQL-client-5.6.24-1.el6.x86_64.rpm
    2.  mysql
    [root@hadoop102 /]# mysql -uroot -p
    3.    
    mysql> set password=password('123456');
    4.  mysql
    mysql> quit;
    

    4.ホストログインなし
    1.  user , Host      %
    mysql> use mysql;
    mysql> update user set host='%' where host='localhost';
    2.    
    mysql> flush privileges;
    

    三、mysql主従レプリケーション
    1.Masterデータベース構成
    1.      /etc/my.cnf,      :
    #       
    log-bin=mysql-bin
    
    #    id
    server-id =1
    
    #       ,     
    binlog-ignore-db=information_schema
    binlog-ignore-db=performance_schema
    binlog-ignore-db=mysql
    binlog-ignore-db=test
    
    #          ( slave      ),      
    binlog-do-db=metastore
    binlog-do-db=rdd
    
    2.        Master   :
    [root@hadoop103 /]service mysql restart
    3.  mysql   ,       ,File Position         :
    ------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000001 |      120 |              |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    
    [root@hadoop103 /]mysql -uroot -p
    mysql> show master status;
    4.          Slave    :
    mysql> grant replication slave on *.* to 'slave'@'%' identified by '123456';
    

    2.Slaverデータベース構成
    1.      /etc/my.cnf,      :
    #       
    log-bin=mysql-bin
    
    #    id
    server-id =2
    
    #       ,     
    binlog-ignore-db=information_schema
    binlog-ignore-db=performance_schema
    binlog-ignore-db=mysql
    binlog-ignore-db=test
    
    #          ( slave      ),      
    binlog-do-db=metastore
    binlog-do-db=rdd
    2.        Slave   :
    [root@hadoop104 /]service mysql restart
    3.    SQL  :
    [root@hadoop104 /]mysql -uroot -p123456
    mysql> change master to master_host='  IP',master_user='slave',master_password='123456',master_port=3306,master_log_file='file  ',master_log_pos=position  ;
    4.  SQL           :
    mysql> start slave;
    mysq> show slave status\G
    

    Slave_IO_Running、Slave_SQL_Runningの値はすべてYESで、構成が成功したことを示し、いずれかがYESでなければ同期に失敗したことを示します.
    3.主従複製テスト
    1.        test001   。
    mysql> create database test001;
    2.          test001,          。
    mysql> show databases;
    

    特に注意:Slave_SQL_Runningの値はすべてNoで、解決策:show slave statusGを利用してslave上の具体的なエラー情報を表示して、基本的に表が存在しないことを表示して、あるいは表が大文字の類のエラーで、具体的な問題は具体的に分析します.
    大文字と小文字を区別する場合はmysql構成:vim/etc/mysql/my.cnfファイルの下でlower_を設定case_table_names=1(0は大文字と小文字を区別、1は大文字と小文字を区別せず)、mysqlの再起動を設定します
    1.slaveで同期を停止する:stop slave;2.fileとpositionの値show master statusをmasterで再表示します.3.slaveで2ステップ目の2つの値をコピー:change master to master_host=‘ホストIP’,master_user=‘slave’,master_password=‘123456’,master_port=3306,master_log_file='fileの値',master_log_pos=positionの値;4.slaveで同期をオンにする:start slave;5.slaveで同期を開始し、Slave_IO_Running、Slave_SQL_Runningの値がYESの場合、成功:show slave statusG
    四.keepalivedのインストールと構成
    プライマリスレーブipおよび仮想ip:
    master
    slave
    vip
    ip
    192.168.1.50
    192.168.1.51
    192.168.1.100
    1.keepalivedインストール
    yum  :                yum install -y keepalived
      .  .  .  :      systemctl start/stop/status/restart keepalived.service
            :         systemctl enable keepalived.service  
            :         systemctl disable keepalived.service 
    

    2. keepalived.conf構成
    マスター構成
    #master
    global_defs {
       smtp_server 192.168.1.50 #    
       smtp_connect_timeout 30
       router_id MYSQL-HA #    keepalived        
    }
    
    vrrp_script check_mysql {
        script "/usr/local/bin/check_mysql.sh"
        interval 22
        weight 2
    }
    
    vrrp_instance VI_1 {
        state BACKUP #        BACKUP,  BACKUP           
        interface eth0 #     
        virtual_router_id 66 #      ,         (  0-255  )   slave  ,             ,      。
        priority 100 #    master ,(  0-255  ),  slave    90
        advert_int 1 #      master  (             )
        nopreempt #   ,     priority        master
        authentication {
            auth_type PASS #    
            auth_pass 1111
        }
        track_script {
            check_mysql #       ,check_mysql       
        }
        virtual_ipaddress {
            192.168.1.100 #  ip,  master  ,  ip      slave 
        }
    }
    

    slave構成
    #slave
    global_defs {
       smtp_server 192.168.1.51 #    
       smtp_connect_timeout 30
       router_id MYSQL-HA #    keepalived        
    }
    
    vrrp_script check_mysql {
        script "/usr/local/bin/check_mysql.sh"
        interval 22
        weight 2
    }
    
    vrrp_instance VI_1 {
        state BACKUP #        BACKUP,  BACKUP           
        interface eth0 #     
        virtual_router_id 66 #      ,         (  0-255  )   master  ,             ,      。
        priority 90 #    master ,(  0-255  ),  master    100
        advert_int 1 #      master  (             )
        nopreempt #   ,     priority        master
        authentication {
            auth_type PASS #    
            auth_pass 1111
        }
        track_script {
            check_mysql #       ,check_mysql       
        }
        virtual_ipaddress {
            192.168.1.100 #  ip
        }
    }
    

    check_mysql.shスクリプト
    #!/bin/bash
    if [ $(ps -C mysqld --no-header | wc -l) -eq 0 ]; then
         service mysqld restart
    fi
    sleep 2
    if [ $(ps -C mysqld --no-header | wc -l) -eq 0 ]; then
       systemctl stop keepalived.service
    fi
    

    3.検査keepalived.conf構成
      keepalived:	          systemctl start keepalived.service
            :           systemctl enable keepalived.service  
      keepalived  :        ps -ef|grep keepalived
      masterip    :       ip addr
    

    maserでkeepalivedを起動すると、仮想ipはipを1つしかバインドできません.masterかslaveかです.ip addrが次の内容を表示すると、バインドに成功します.
       eth0: ,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
        link/ether 28:6e:d4:88:c6:5e brd ff:ff:ff:ff:ff:ff
        inet 192.168.1.51/24 brd 172.16.4.255 scope global eth0
           valid_lft forever preferred_lft forever
        inet 192.168.1.100/32 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::9cf2:98b1:9790:e3da/64 scope link 
           valid_lft forever preferred_lft forever
    

    4.keepalived高可用性テスト
    1.masterノードが切断された後、mysqlサービスが再起動するかどうかをテストします.
    master:
    
    service mysqld stop
    
    ps -ef|grep mysql
    root      22868   2250  0 15:06 pts/0    00:00:00 grep mysql
    
    vip:
    
    mysql> show variables like 'server_id';
    ERROR 2006 (HY000): MySQL server has gone away
    No connection. Trying to reconnect...
    Connection id:    8
    Current database: *** NONE ***
    
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | server_id     | 1     |
    +---------------+-------+
    1 row in set (0.03 sec)
    
    ps -ef|grep mysql
    root      29127  23269  0 15:01 pts/1    00:00:00 grep --color=auto mysql
    root      97486  93113  0 11:43 pts/0    00:00:00 mysql -uroot -px xxxxxxxxxxx
    root     120328      1  0 12:42 ?        00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/localhost.localdomain.pid
    mysql    120687 120328  0 12:42 ?        00:00:44 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/usr/local/mysql/data/localhost.localdomain.err --pid-file=/usr/local/mysql/data/localhost.localdomain.pid --socket=/var/lib/mysql/mysql.sock --port=3306
    
    

    マスターがmysqlサービスを閉じたことに気づいたら、すぐにmysqlを呼び出します.check.shスクリプト、mysqlサービスを再起動します.
    2.masterノードが切断された後、vipが自動的にslaveに切り替わるかどうかをテストします.
    master:
    
    systemctl stop keepalived.service
    
    ps -ef|grep keepalived
    root      22891   2250  0 15:11 pts/0    00:00:00 grep keepalived
    
    service mysqld stop
    
    ps -ef|grep mysql
    root      22868   2250  0 15:06 pts/0    00:00:00 grep mysql
    
    vip:
    mysql> show variables like 'server_id';
    ERROR 2006 (HY000): MySQL server has gone away
    No connection. Trying to reconnect...
    Connection id:    8
    Current database: *** NONE ***
    
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | server_id     | 2     |
    +---------------+-------+
    1 row in set (0.03 sec)
    
    slave:
    
    ip addr
      eth0: ,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
        link/ether 28:6e:d4:88:c6:5e brd ff:ff:ff:ff:ff:ff
        inet 192.168.1.52/24 brd 172.16.4.255 scope global eth0
           valid_lft forever preferred_lft forever
        inet 192.168.1.100/32 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::9cf2:98b1:9790:e3da/64 scope link 
           valid_lft forever preferred_lft forever
    

    マスターがmysqlとkeepalivedサービスを閉じたことを発見したら、すぐにslaveのmysqlを呼び出します.check.shスクリプト、ipは自動的にslaveにドリフトします.
    五.過程で出会った穴
    1.pingは外部ネットワークが通じない
    vi /etc/resolv.conf
    	          (ipconfig/all  dns),     ,     Google   DNS  ,          
    	      :
    	nameserver 8.8.8.8
    	nameserver 8.8.4.4
    

    2.SELINUXクローズによりスクリプトが呼び出されない
           SELINUX
    
    1.[root@localhost ~]# getenforce
    Enforcing
    [root@localhost ~]# setenforce 0
    [root@localhost ~]# getenforce
    Permissive
    
    2.[root@localhost ~]# vim /etc/sysconfig/selinux
    SELINUX=enforcing    SELINUX=disabled
          reboot
    

    3.keepalived.confファイルのvirtual_router_id競合
      keepalived  :     tail -f /var/log/message
          virtual_router_id  ,      ,    keepalived