mysql5.7配置主從複製

主機情況

主機名 ip 用途
k8smaster01 192.168.23.100 mysql主
k8smaster02 192.168.23.101 mysql從

 

主從複製的原理

第一步:在每個更新數據的事物完成之前,主服務器都會把數據更改記錄到二進制日誌中。即使事物在執行期間是交錯的,mysql也會串行地把事物寫入到二進制日誌中,寫入完成之後,主服務器告訴存儲引擎提交事物。
第二步:從服務器把主服務器的二進制日誌拷貝到自己的硬盤,即"中繼日誌"中。首先,它啓動一個工作線程,叫I/O從線程。這個I/O線程開啓一個普通的客戶端連接,然後啓動一個特殊的二進制日誌存儲進程(binlog dump)進程。這個轉儲進程從主服務器的二進制日誌中讀取事件,它不會對事物進行輪詢。如果它跟上了主服務器,就會進入休眠狀態,並等待有新的事件發生時主服務器發出的信號,I/O線程把事件寫入到從服務器的中繼日誌中。
第三步:SQL從線程讀取中繼日誌,並且重放其中的事件,然後更新從服務器的數據。由於這個進程能跟上I/O線程,中繼日誌通常都在操作系統的緩存中,所有中繼日誌的開銷很低。SQL從線程執行的事件也可以被寫入從服務器自己的二進制日誌中或是不寫。

 

導出數據備份【鎖表後備份防止數據再更新】

[zhaiky@k8smaster01 bin]$ ./mysqldump -R -E -h192.168.23.100 -uprd -p -P3306 -S /tmp/mysql.sock --databases prd >prd.sql
Enter password: 
[zhaiky@k8smaster01 bin]$

 

my.cnf配置

主服務my.cnf配置
[zhaiky@k8smaster01 config]$ more my.cnf 
[mysqld] 
basedir=/data/mysql/mysql 
datadir=/data/mysql/mysql/data 
socket= /var/lib/mysql/mysql.sock 
user=zhaiky
port=3306 
event_scheduler=1  #開啓計劃任務
sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 
# Disabling symbolic-links is recommended to prevent assorted security risks 
symbolic-links=0 
max_connections=2000 
character_set_server=utf8 
slow_query_log=1 
slow_query_log_file=/data/mysql/mysql/mysql_slow.log 
innodb_buffer_pool_size=200M 
max_connect_errors=100 
log-bin=mysql-bin 
binlog_format=mixed 
skip-host-cache 
skip-name-resolve 
explicit_defaults_for_timestamp 
lower_case_table_names=1 

server_id=100
auto-increment-offset=1   #主從配置不同點

auto-increment-increment=2
#mysql中有自增長字段,在做數據庫的主主同步時需要設置自增長的兩個相關配置:auto_increment_offset和auto_increment_increment。
#auto_increment_offset表示自增長字段從那個數開始,他的取值範圍是1 .. 65535
#auto_increment_increment表示自增長字段每次遞增的量,其默認值是1,取值範圍是1 .. 65535
#在主主同步配置時,需要將兩臺服務器的auto_increment_increment增長量都配置爲2,而要把auto_increment_offset分別配置爲1和2,可以避免兩臺服務器同時做更新時自增長字段的值之間發生衝突。

replicate-ignore-db=information_schema 
relay-log=mysqld-relay-bin 
  
[mysqld_safe] 
log-error=/data/mysql/mysql/mysqld.log 
pid-file=/data/mysql/mysql/mysqld.pid
[zhaiky@k8smaster01 config]$

從服務my.cnf配置
[zhaiky@k8smaster02 config]$ more my.cnf 
[mysqld] 
basedir=/data/mysql/mysql 
datadir=/data/mysql/mysql/data 
socket= /var/lib/mysql/mysql.sock 
user=zhaiky
port=3306 
event_scheduler=1
sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 
# Disabling symbolic-links is recommended to prevent assorted security risks 
symbolic-links=0 
max_connections=2000 
character_set_server=utf8 
slow_query_log=1 
slow_query_log_file=/data/mysql/mysql/mysql_slow.log 
innodb_buffer_pool_size=200M 
max_connect_errors=100 
log-bin=mysql-bin 
binlog_format=mixed 
skip-host-cache 
skip-name-resolve 
explicit_defaults_for_timestamp 
lower_case_table_names=1 

server_id=101
auto-increment-offset=2

auto-increment-increment=2
replicate-ignore-db=information_schema 
relay-log=mysqld-relay-bin 
  
[mysqld_safe] 
log-error=/data/mysql/mysql/mysqld.log 
pid-file=/data/mysql/mysql/mysqld.pid 
[zhaiky@k8smaster02 config]$

主從複製配置

1)開啓log-bin日誌
mysql> show variables like 'log_bin'; #如果value的值爲off,在my.cnf的[mysqld]的配置中添加log-bin=mysql-bin
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | OFF   |
+---------------+-------+
1 row in set (0.01 sec)

2)更改mysql服務器的server id,且server id要唯一,修改需要重啓
3)建立僅限slave主機使用的專門用於進行復制數據的用戶
在主服務操作
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> CREATE USER 'prd'@'%' IDENTIFIED BY '123456'; #創建prd同步用戶
Query OK, 0 rows affected (0.00 sec)
mysql> grant all privileges on *.* to 'prd'@'%' identified by '123456' with grant option; #爲同步用戶設置權限
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> flush privileges; #權限生效
Query OK, 0 rows affected (0.00 sec)
mysql> select user,authentication_string,host from user;  #查看創建的用戶
+---------------+-------------------------------------------+-----------+
| user          | authentication_string                     | host      |
+---------------+-------------------------------------------+-----------+
| root          | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | %         |
| mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | localhost |
| mysql.sys     | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | localhost |
| zhaiky        | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | %         |
| prd           | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | %         |
+---------------+-------------------------------------------+-----------+
5 rows in set (0.00 sec)
mysql> flush tables with read lock; #設置讀鎖,以防數據更新
Query OK, 0 rows affected (0.00 sec)
mysql> show master status; #查看主狀態
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      869 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql>

從節點配置
mysql> change master to master_host='192.168.23.100',master_user='prd',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=869;
master_host:主的mysql地址,我們這裏是發佈主機
master_user:驗證用戶
master_password:驗證密碼

master_log_file:show master status中File
master_log_pos:show master status中Position
Query OK, 0 rows affected, 2 warnings (0.02 sec)
mysql> start slave; #從數據庫啓用
Query OK, 0 rows affected (0.01 sec)
mysql> show slave status\G  #從數據庫查看slave狀態
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.23.100
                  Master_User: prd
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 869
               Relay_Log_File: mysqld-relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes  #表示配置成功

              Replicate_Do_DB: 
          Replicate_Ignore_DB: information_schema
           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: 869
              Relay_Log_Space: 528
              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: 100
                  Master_UUID: 93c20797-5c4e-11ea-9b82-000c291c4997
             Master_Info_File: /data/mysql/mysql/data/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)
mysql> 

4)主服務創建數據庫,驗證是否同步從
主服務器創建數據和插入數據
mysql> unlock tables; #解鎖
Query OK, 0 rows affected (0.00 sec)
mysql> create database if not exists prd default charset utf8 collate utf8_general_ci; #創建數據庫
Query OK, 1 row affected (0.00 sec)
mysql> use prd; #切換數據庫到prd
Database changed
mysql> create table test(
    -> id int not null auto_increment,
    -> username varchar(100) not null,
    -> createdate date,
    -> primary key (id));  #創建表

Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO `prd`.`test` (`username`, `createdate`) VALUES ('zhaiky', '2020-03-05'); #插入數據
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO `prd`.`test` (`username`, `createdate`) VALUES ('zhaiky', '2020-03-05');#插入數據
Query OK, 1 row affected (0.00 sec)
mysql> 

從服務查看prd數據庫是否同步
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| prd                |
| sys                |
+--------------------+
5 rows in set (0.00 sec)
mysql> use prd; #切換數據庫
Database changed
mysql> select * from test;#查詢數據
+----+----------+------------+
| id | username | createdate |
+----+----------+------------+
|  1 | zhaiky   | 2020-03-05 |
|  3 | zhaiky   | 2020-03-05 |
+----+----------+------------+
2 rows in set (0.00 sec)
mysql> 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章