有哪些做網(wǎng)站的品牌天津百度推廣排名優(yōu)化
目錄
1 MySql主從復制簡介
1.1 主從復制的概念
1.2 主從復制的作用
2.? 搭建主從復制
2.1 pull mysql 鏡像
2.2 新建主服務(wù)器容器實例 3307
2.2.1 master創(chuàng)建 my.cnf
2.2.2 重啟master
2.2.3 進入mysql 容器,創(chuàng)建同步用戶
2.3? 新建從服務(wù)器容器實例 3308
2.3.1?slave創(chuàng)建 my.cnf
2.3.2 重啟slave 實例
2.3.3 在master中查看主從同步狀態(tài)
2.3.4 在從數(shù)據(jù)庫中配置主從復制
2.3.5 在從數(shù)據(jù)中開啟主從同步
?2.3.6 再次查看 slave status
3 主從復制測試
3.1主機添加數(shù)據(jù)
3.2 從機直接使用
1 MySql主從復制簡介
1.1 主從復制的概念
MySQL 主從復制是指數(shù)據(jù)可以從一個MySQL數(shù)據(jù)庫服務(wù)器主節(jié)點復制到一個或多個從節(jié)點。MySQL 默認采用異步復制方式,這樣從節(jié)點不用一直訪問主服務(wù)器來更新自己的數(shù)據(jù),數(shù)據(jù)的更新可以在遠程連接上進行,從節(jié)點可以復制主數(shù)據(jù)庫中的所有數(shù)據(jù)庫或者特定的數(shù)據(jù)庫,或者特定的表。
1.2 主從復制的作用
數(shù)據(jù)的熱備:作為后備數(shù)據(jù)庫,主數(shù)據(jù)庫服務(wù)器故障后,可切換到從數(shù)據(jù)庫繼續(xù)工作,避免數(shù)據(jù)丟失。
架構(gòu)的擴展:業(yè)務(wù)量越來越大,I/O訪問頻率過高,單機無法滿足,此時做多庫的存儲,降低磁盤I/O訪問的頻率,提高單個機器的I/O性能。
讀寫分離:使數(shù)據(jù)庫能支撐更大的并發(fā)。
(1)在從服務(wù)器可以執(zhí)行查詢工作(即我們常說的讀功能),降低主服務(wù)器壓力;(主庫寫,從庫讀,降壓)
(2)在從服務(wù)器進行備份,避免備份期間影響主服務(wù)器服務(wù);(確保數(shù)據(jù)安全)
高可用性:數(shù)據(jù)備份實際上是一種冗余的機制,通過這種冗余的方式可以換取數(shù)據(jù)庫的高可用性,也就是當服務(wù)器出現(xiàn)故障或宕機的情況下,可以切換到從服務(wù)器上,保證服務(wù)的正常運行。
2.? 搭建主從復制
2.1 pull mysql 鏡像
docker pull mysql
2.2 新建主服務(wù)器容器實例 3307
先創(chuàng)建文件夾:
mkdir -p /mydocker/mysql-master/log
mkdir -p /mydocker/mysql-master/data
mkdir -p /mydocker/mysql-master/confdocker run -p 3307:3306 --name=mysql-master -v /mydocker/mysql-master/log:/var/log/mysql -v /mydocker/mysql-master/data:/var/lib/mysql -v /mydocker/mysql-master/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql[root@192 mysql-master]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6a298c5defda mysql "docker-entrypoint.s…" 4 seconds ago Up 2 seconds 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp mysql-master
#創(chuàng)建容器時出現(xiàn) 找不著/var/lib/mysql-files 的錯誤
解決辦法:在my.cnf 配置文件中加入?secure_file_priv=/var/lib/mysql
2.2.1 master創(chuàng)建 my.cnf
在/mydocker/mysql-master/conf 目錄下 創(chuàng)建 my.cnf
[mysqld]
#指定此路徑限制數(shù)據(jù)導入導出,不然默認讀取/var/lib/mysql-files路徑,但是容器中此路徑?jīng)]有會報錯
secure_file_priv=/var/lib/mysql
#設(shè)置server_id,同一局域網(wǎng)中需要唯一
server_id=101
#指定不需要同步的數(shù)據(jù)庫名稱
binlog-ignore-db=mysql
#開啟二進制日志功能
log-bin=mall-mysql-bin
#設(shè)置二進制日志使用內(nèi)存大小(事務(wù))
binlog_cache_size=1M
#設(shè)置使用的二進制日志格式(mixed,statement,row)
binlog_format=mixed
#二進制日志過期清理時間,默認值為0,表示不自動清理
expire_logs_days=7
#跳過主從復制中遇到的所有錯誤或指定類型的錯誤,避免slae端復制終端
#如:1062錯誤是指一些主鍵重復,1032錯誤是因為主從數(shù)據(jù)庫不一致
slave_skip_errors=1062
2.2.2 重啟master
docker restart 6a298c5defda
2.2.3 進入mysql 容器,創(chuàng)建同步用戶
docker exec -it mysql-master /bin/bashmysql -uroot -pmysql> CREATE USER 'slave'@'%'IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.15 sec)mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON*.*TO'slave'@'%';
Query OK, 0 rows affected (0.01 sec)
#由于mysql8之后默認使用認證方式為caching_sha2_password,會使主從復制change命令后出現(xiàn)Slave_IO_Running: Connecting
解決辦法:
① :在my.cnf?配置文件中加入 default_authentication_plugin=mysql_native_password
② :在master mysql中執(zhí)行? ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
2.3? 新建從服務(wù)器容器實例 3308
[root@192 ~]# docker run -p 3308:3306 --name=mysql-slave -v /mydocker/mysql-slave/log:/var/log/mysql -v /mydocker/mysql-slave/data:/var/lib/mysql -v /mydocker/mysql-slave/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql[root@192 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d284702c6992 mysql "docker-entrypoint.s…" 3 seconds ago Up 2 seconds 33060/tcp, 0.0.0.0:3308->3306/tcp, :::3308->3306/tcp mysql-slave
7b510affe5f3 mysql "docker-entrypoint.s…" 12 minutes ago Up 12 minutes 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp mysql-master
[root@192 ~]#
#創(chuàng)建容器時出現(xiàn) 找不著/var/lib/mysql-files 的錯誤
解決辦法:在my.cnf 配置文件中加入?secure_file_priv=/var/lib/mysql
2.3.1?slave創(chuàng)建 my.cnf
[mysqld]
#指定此路徑限制數(shù)據(jù)導入導出,不然默認讀取/var/lib/mysql-files路徑,但是容器中此路徑?jīng)]有會報錯
secure_file_priv=/var/lib/mysql
#設(shè)置server_id,同一局域網(wǎng)中需要唯一
server_id=102
#指定不需要同步的數(shù)據(jù)庫名稱
binlog-ignore-db=mysql
#開始二進制日志功能,以備slave作為其他數(shù)據(jù)庫實例的Master時使用
log-bin=mall-mysql-slave1-bin
#設(shè)置二進制使用內(nèi)存大小 (事務(wù))
binlog_cache_size=1M
#設(shè)置使用二進制日期格式
binlog_format=mixed
#二進制日志過期清理時間。默認為0,表示不自動清理
expire_logs_days=7
#跳過主從復制中遇到的所有錯誤或指定類型的錯誤,避免slave端復制終端。
#如 1062錯誤是指一些主鍵重復,1032錯誤是因為主從數(shù)據(jù)庫不一致
slave_skip_errors=1062
#relay_log 配置中繼日志
relay_log=mall-mysql-relay-bin
#表示slave將復制事件寫進自己的二進制日志
log_slave_updates=1
#slave設(shè)置為只讀(具有super權(quán)限的用戶除外)
read_only=1
2.3.2 重啟slave 實例
docker restart mysql-slavedocker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d284702c6992 mysql "docker-entrypoint.s…" 12 hours ago Up 5 minutes 33060/tcp, 0.0.0.0:3308->3306/tcp, :::3308->3306/tcp mysql-slave
7b510affe5f3 mysql "docker-entrypoint.s…" 12 hours ago Up 7 seconds 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp mysql-master
2.3.3 在master中查看主從同步狀態(tài)
mysql> show master status;
+-----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------------+----------+--------------+------------------+-------------------+
| mall-mysql-bin.000006 | 156 | | mysql | |
+-----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.02 sec)
2.3.4 在從數(shù)據(jù)庫中配置主從復制
mysql> change master to master_host='192.168.217.145',master_user='slave',master_password='123456',master_port=3307,master_log_file='mall-mysql-bin.000005',master_log_pos=156,master_connect_retry=30;
Query OK, 0 rows affected, 10 warnings (0.18 sec)master_host: 主數(shù)據(jù)庫的ip地址
master_user: 在主數(shù)據(jù)庫創(chuàng)建的用于同步數(shù)據(jù)的用戶賬號
master_password: 在主數(shù)據(jù)庫創(chuàng)建的用于同步數(shù)據(jù)的用戶密碼
master_port: 主數(shù)據(jù)庫的運行端口
master_log_file: 指定從數(shù)據(jù)庫要復制數(shù)據(jù)的日志文件,通過查看主數(shù)據(jù)庫的狀態(tài),獲取File參數(shù)
master_log_pos:指定從數(shù)據(jù)庫從哪個位置開始復制數(shù)據(jù),通過查看主數(shù)據(jù)庫的狀態(tài),獲取Position
master_connect_retry: 連接失敗重試的時間間隔,單位為妙mysql> show slave status \G;
*************************** 1. row ***************************Slave_IO_State: Master_Host: 192.168.145.217Master_User: slaveMaster_Port: 3307Connect_Retry: 30Master_Log_File: mall-mysql-bin.000005Read_Master_Log_Pos: 156Relay_Log_File: mall-mysql-relay-bin.000001Relay_Log_Pos: 4Relay_Master_Log_File: mall-mysql-bin.000005Slave_IO_Running: NoSlave_SQL_Running: NoReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0Last_Error: Skip_Counter: 0Exec_Master_Log_Pos: 156Relay_Log_Space: 156Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 0Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 0Master_UUID: Master_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Master_Retry_Count: 86400Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0Network_Namespace:
1 row in set, 1 warning (0.03 sec)
2.3.5 在從數(shù)據(jù)中開啟主從同步
mysql> start slave;
?2.3.6 再次查看 slave status
mysql> show slave status \G;
*************************** 1. row ***************************Slave_IO_State: Waiting for source to send eventMaster_Host: 192.168.217.145Master_User: slaveMaster_Port: 3307Connect_Retry: 30Master_Log_File: mall-mysql-bin.000007Read_Master_Log_Pos: 156Relay_Log_File: mall-mysql-relay-bin.000002Relay_Log_Pos: 329Relay_Master_Log_File: mall-mysql-bin.000007Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0Last_Error: Skip_Counter: 0Exec_Master_Log_Pos: 156Relay_Log_Space: 543Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_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: NoLast_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 0Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 101Master_UUID: 4d815ecc-e845-11ee-aad4-0242ac110003Master_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Replica has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0Network_Namespace:
1 row in set, 1 warning (0.00 sec)
下面2項的狀態(tài)已經(jīng)由No 變成 Yes?
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
3 主從復制測試
3.1主機添加數(shù)據(jù)
mysql> create database db01;
Query OK, 1 row affected (0.11 sec)mysql> use db01;
Database changed
mysql> create table t1(id int,name varchar(20));
Query OK, 0 rows affected (1.94 sec)mysql> insert t1 values(1,'z3');
Query OK, 1 row affected (0.01 sec)
3.2 從機直接使用
mysql> use db01;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql> select * from t1;
+------+------+
| id | name |
+------+------+
| 1 | z3 |
+------+------+
1 row in set (0.00 sec)