mysql的複製集羣,及讀寫分離

    爲何要設置mysql集羣?mysql

            爲了減輕,mysql服務器的IO壓力,設置多個其餘mysql服務器幫他分擔讀寫操做
sql

    1.mysql複製集羣的類型
數據庫

        主從架構(從服務器只讀,不可寫)後端

          一主一從,bash

          一主多重服務器

      主主架構架構

    2.複製原理併發

            1)若主服務器上的數據集較大,則須要咱們將主服務器數據庫全部內容作備份,而後發送給從服務器,隨後獲取二進制日誌的文件,及其座標用於後續的數據同步ide

            2)所謂同步,是主服務器上的二進制日誌中的SQL語句,發送到從服務器上的中繼日誌文件中,而後把這些SQL語句重放實現同步測試

    3.與主從複製相關的線程

            從服務器上:IO線程:用來鏈接主服務器的,監控二進制日誌的變化,並接受的

                                SQL線程:監控,讀取,而且重放中繼日誌中的SQL語句,並把數據寫入服務器數據庫中;

            主服務器上:DUMP線程:將slave請求的二進制日誌發送過去


    4.主從複製的過程:

            1.主服務器數據發生修改,寫入數據庫中,而且記錄二進制日誌文件中

            2.slave的IO線程複製發生變化的二進制日誌,而且記錄到本身的中繼日誌中

            3.slave的SQL線程,將複製過來的中繼日誌作重放,保持和master上數據的一致;

    5.主從複製注意內容:

            1.保證每一個服務器的server_id設置不一樣,(後面讀寫分離作測試方便)

            2.主服務器上開啓二進制日誌文件

            3.從服務器關閉二進制日誌文件,開啓中繼日誌文件,而且設置read_only=ON

            4.主服務器設置參數sync_binlog=1(每發生一次數據變化,就將變化內容寫入二進制日誌中)

                innodb_flush_log_at_trx_commit=1(沒提交一個事務,就將事務日誌保存到磁盤中)

            5.記得記錄二進制日誌的文件名和座標

            6.在主服務器上受權一個能夠用於主從複製的用戶

    6.主從複製實例

        主服務器文件配置

    innodb_file_per_table=ON  //開啓innodb的單獨表空間
    skip_name_resolve=ON    //跳過主機名解析
    log_bin=binlog
    server_id=123
    sync_binlog=1
    innodb_flush_log_at_trx_commit=1

     從服務器文件配置

    innodb_file_per_table=ON
    skip_name_resolve=ON
    relay_log=slavelog
    server_id=7
    read_only=ON

    主服務器作數據備份併發給從服務器

    MariaDB [(none)]> show master status;  //記錄此時二進制日誌文件及座標
    +---------------+----------+--------------+------------------+
    | File          | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +---------------+----------+--------------+------------------+
    | binlog.000015 |      617 |              |                  |
    +---------------+----------+--------------+------------------+
    1 row in set (0.00 sec)
    MariaDB [(none)]> grant replication slave on *.* to 'vuser'@'%' identified by '111111';  //受權一個用於主從複製的用戶
    Query OK, 0 rows affected (0.02 sec)
    
    
    [root@bogon ~]# mysqldump --all-databases --lock-all-tables > gg.sql  //複製當前數據庫併發給從服務器
    [root@bogon ~]# scp gg.sql root@172.16.0.155:/root

    從服務器上操做

    MariaDB [zz]> \. /root/gg.sql   //使用發送過來的數據庫文件,初始化數據庫
    創建主從鏈接:
    MariaDB [zz]> change master to master_host='172.16.0.156',master_user='vuser',master_password='111111',master_port=3306,master_log_file='binlog.000015',master_log_pos=617;
    
    MariaDB [zz]> start slave;  開啓從服務器
    
    MariaDB [zz]> show slave status\G; 查看主從狀態
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event   //若顯示此行則配置成功
                      Master_Host: 172.16.0.156
                      Master_User: vuser
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: binlog.000015
              Read_Master_Log_Pos: 831
                   Relay_Log_File: slavelog.000002
                    Relay_Log_Pos: 740
            Relay_Master_Log_File: binlog.000015
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
                  Replicate_Do_DB: 
              Replicate_Ignore_DB: 
               Replicate_Do_Table: 
           Replicate_Ignore_Table: 
          Replicate_Wild_Do_Table: 
      Replicate_Wild_Ignore_Table: 
                       Last_Errno: 0
                       Last_Error: 
                     Skip_Counter: 0
              Exec_Master_Log_Pos: 831
                  Relay_Log_Space: 1027
                  Until_Condition: None
                   Until_Log_File: 
                    Until_Log_Pos: 0
               Master_SSL_Allowed: No
               Master_SSL_CA_File: 
               Master_SSL_CA_Path: 
                  Master_SSL_Cert: 
                Master_SSL_Cipher: 
                   Master_SSL_Key: 
            Seconds_Behind_Master: 0
    Master_SSL_Verify_Server_Cert: No
                    Last_IO_Errno: 0
                    Last_IO_Error: 
                   Last_SQL_Errno: 0
                   Last_SQL_Error: 
      Replicate_Ignore_Server_Ids: 
                 Master_Server_Id: 123
    1 row in set (0.00 sec)

    若想關閉主從配置,須要在從服務器使用命令stop slave便可



    二.雙主複製

        兩個服務器,同時開啓二進制日誌文件和中繼日誌文件;並相互作change master to操做便可


    三.讀寫分離(前提:主從複製)

    mysqlrouter

      原理

    圖片.png

    經過調用倆個不一樣的接口,將mysql語句分別調用

    安裝:mysqlrouter,配置配置文件/etc/mysqlrouter/mysqlrouter.conf

    [routing:master]   添加倆個配置段//master 接口
    bind_address = 172.16.0.155:40001   //綁定的ip地址和端口號
    destinations = 172.16.0.156:3306   //後端的mysql服務
    mode = read-write            //模式(是否容許寫)
    connect_time = 3        //鏈接時間
    [routing:slave]
    bind_address = 172.16.0.155:40002
    destinations = 172.16.0.155:3306
    mode = read-only
    connect_time = 1

    配置完成能夠啓動服務

    [root@bogon ~]# ss -tnl
    State       Recv-Q Send-Q                     Local Address:Port                                    Peer Address:Port              
    LISTEN      0      50                                     *:3306                                               *:*                  
    LISTEN      0      128                                    *:111                                                *:*                  
    LISTEN      0      5                          192.168.122.1:53                                                 *:*                  
    LISTEN      0      128                                    *:22                                                 *:*                  
    LISTEN      0      128                            127.0.0.1:631                                                *:*                  
    LISTEN      0      100                            127.0.0.1:25                                                 *:*                  
    LISTEN      0      128                         172.16.0.155:40001                                              *:*                  
    LISTEN      0      128                         172.16.0.155:40002 


    mysqlrouter 測試實例:(由於mysqlrouter是調度到後端的,因此須要咱們在master受權用戶)

    MariaDB [(none)]> grant all on *.* to 'cccc'@'172.16.0.%' identified by '111111';
    Query OK, 0 rows affected (0.01 sec)
    
    [root@bogon ~]# mysql -ucccc -h172.16.0.151 -P40002 -p111111 -e 'select @@server_id;'
    +-------------+
    | @@server_id |
    +-------------+
    |           7 |
    +-------------+
    
    [root@bogon ~]# mysql -ucccc -h172.16.0.151 -P40001 -p111111 -e 'select @@server_id;'
    +-------------+
    | @@server_id |
    +-------------+
    |         123 |
    +-------------+

    四:proxysql實現讀寫分離

       1.安裝proxysql

       2.啓動ProxySQL服務

       3.進入proxysql的管理界面

    [root@bogon ~]# mysql -uadmin -padmin -h127.0.0.1 -P6032  //系統本身設定的用戶密碼,及端口號
    
    使用main數據庫
    給mysql_servers表添加監控點:
    insert into mysql_servers(hostgroup_id,username,port) values(10,'172.16.0.156',3306),(10,'172.16.0.150',3306),(10,'172.16.0.151',3306),(10,'172.16.0.152',3306);
    
    在master服務器上建立監控用戶
     MariaDB [(none)]> grant replication client,replication slave on *.* to 'proxyuser'@'172.16.0.%' identified by '111111';
     
     在proxysql上修改變量參數,設置相應的監控用戶
     MySQL [main]> set mysql-monitor_username='proxyuser';  //實質上是修改了main數據中的global_variables表
     MySQL [main]> set mysql-monitor_password='111111';
    
     在proxysql服務器上修改mysql_replication_hostgroups,爲表添加更明細的分組
     MySQL [main]> insert into mysql_replication_hostgroups (writer_hostgroup,reader_hostgroup) values (10,20);
     這裏必須有一個ID和以前mysql_servers表中設置的相同,至於主從,會到後端服務器配置文件中讀取read_only參數
     
     在master服務器設置管理用戶
     MariaDB [(none)]> grant all on *.* to 'root'@'172.16.0.%' identified by  '111111';
    MariaDB [(none)]> grant all on *.* to 'sql'@'172.16.0.%' identified by  '111111';
    
    在proxysql也添加各個管理用戶
     MySQL [main]> insert into mysql_users (username,password,default_hostgroup) values ('root','111111',10),('sql','111111',20);
    這樣當使用root用戶訪問時,會訪問主服務器,使用sql時,會訪問從服務器
    
    在proxysql上同步剛剛配置的信息,同步到運行時環境,而且同步到磁盤上
        load mysql servers to runtime
        save mysql servers to disk
        load mysql variables to runtime
        save mysql variables to disk
        load mysql users to runtime
        save mysql users to disk
    
    
    最後使用調度端口訪問mysql
    [root@bogon ~]# mysql -uroot -h172.16.0.154 -p111111 -P6033 -e "select @@server_id;"
    +-------------+
    | @@server_id |
    +-------------+
    |         123 |
    +-------------+
    [root@bogon ~]# mysql -usql -h172.16.0.154 -p111111 -P6033 -e "select @@server_id;"
    +-------------+
    | @@server_id |
    +-------------+
    |           2 |
    +-------------+
    [root@bogon ~]# mysql -usql -h172.16.0.154 -p111111 -P6033 -e "select @@server_id;"
    +-------------+
    | @@server_id |
    +-------------+
    |           3 |
    +-------------+
    [root@bogon ~]# mysql -usql -h172.16.0.154 -p111111 -P6033 -e "select @@server_id;"
    +-------------+
    | @@server_id |
    +-------------+
    |           6 |
    +-------------+

      注意:若主從鏈接不成功,嘗試更改防火牆策略或用戶受權

相關文章
相關標籤/搜索