1. 程式人生 > >mysql的復制集群,及讀寫分離

mysql的復制集群,及讀寫分離

replica 成功 http 一個 主機名 技術 端口號 變化 res

為什麽要設置mysql集群?

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

1.mysql復制集群的類型

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

    一主一從,

    一主多重

    主主架構

    2.復制原理

    1)若主服務器上的數據集較大,則需要我們將主服務器數據庫所有內容做備份,然後發送給從服務器,隨後獲取二進制日誌的文件,及其坐標用於後續的數據同步

    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 [email protected]:/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

    原理

    技術分享圖片

    通過調用倆個不同的接口,將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 |
    +-------------+

    註意:若主從連接不成功,嘗試更改防火墻策略或用戶授權

mysql的復制集群,及讀寫分離