mysql主從之配置基本環境


實驗環境

master  192.168.132.121 主庫

slave     192.168.132.122 從庫

一 mysql的使用介紹

1.1 mysql單台服務器特點   

缺點

單台服務器如果磁盤出現問題的話,數據庫數據就會丟失

單台服務器的備份,如果把數據文件備份到本地的話,難以自動定期備份

單台服務器無法應對高並發的讀,只有單台的話,讀寫都在同一台,數據壓力大

 優點

數據不會出現不一致的現象

維護簡單

1.2 mysql單台服務器推薦方法

如果確實只有單台服務器的話,可考慮采用單台服務器 + 雲快照或者雲存儲

1.3 mysql多台服務器實現主從復制特點

主從復制優點

多台服務器實現正常的主從復制后,多台服務器的mysql數據一致,數據丟失可能性小

高並發的讀壓力可以分配到多台服務器上

主從復制缺點

復制出問題或者寫量比較大的時候,數據可能會不一致

主從復制維護比較麻煩

1.4 主從復制原理

mysql主從復制原理 binlog

mysql主從復制依賴於mysql二進制日志文件,主mysql服務器會生成二進制日志文件,傳遞給從服務器執行

mysql從庫同步有兩個進程,一個io進程用來同步binlog,一個sql進程用來執行relaylog(中繼日志)里的數據

目前mysql主從架構還是比較常見的,數據的重要性

1.5 復制步驟

整體上來說,復制有3 個步驟:
(1)master 將改變記錄到二進制日志(binary log)中(這些記錄叫做二進制日志事件,binary log events);

(2)slave 將master 的binary log events 拷貝到它的中繼日志(relay log);

(3)slave 重放中繼日志中的事件,將改變反映它自己的數據。

1.6 復制架構

 Datagaurd 主讀寫,備讀不能寫

1.從服務器作為主服務器的實時數據備份

2.主從服務器實時讀寫分離,從服務器實現負載均衡

3.把多個從服務器根據業務重要性進行拆分訪問

1.7 MySQL 主從復制企業應用場景:

1. 從服務器作為主服務器的實時數據備份

當主服務器出現問題時,我們可以人工或設置自動切換到從服務器繼續提供服務,此時從服務器的數據和宕機時的主數據庫幾乎是一致的。

對於人為地執行drop、delete 等語句刪除數據的情況,從庫的備份功能就沒有用了,因為從服務器也會執行刪除的語句。

2. 主從服務器實時讀寫分離,從服務器實現負載均衡

主從服務器架構可通過程序(Javaweb 等)或代理軟件(mysql‐proxy、mycat 等)實現對用戶(客戶端)的請求讀寫分離,即讓從服務器僅僅處理用戶的select 查詢請求,降低用戶查詢響應時間及讀寫同時在主服務器上帶來的訪問壓力。對於更新的數據(例如update、insert、delete 語句)仍然交給主服務器處理,確保主服務器和從服務器保持實時同步。

3. 把多個從服務器根據業務重要性進行拆分訪問可以把幾個不同的從服務器,根據公司的業務進行拆分。

 

二 mysql主庫的配置

2.1 先對數據初始化,生成密碼

[root@master ~]# mysqld --initialize --user=mysql

[root@master ~]# grep "password" /var/log/mysqld.log

2019-07-03T15:37:29.068299Z 1 [Note] A temporary password is generated for root@localhost: 0JlLA_qy1V:=

2.2 啟動MySQL

[root@master ~]# systemctl start mysqld

[root@master ~]# netstat -ntlp

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1053/sshd           
tcp6       0      0 :::22                   :::*                    LISTEN      1053/sshd           
tcp6       0      0 :::3306                 :::*                    LISTEN      8263/mysqld

2.3 修改配置

需要新增二進制日志binlog配置

[root@master ~]# vim /etc/my.cnf

[mysqld]
bind-address=0.0.0.0
port=3306
datadir=/data/mysql
socket=/data/mysql/mysql.sock
user=mysql
skip-name-resolve
slow_query_log=on
long_query_time=1
slow_query_log_file=/data/mysql/mysql-slow.log
innodb-file-per-table=1
innodb_flush_log_at_trx_commit = 2
log_warnings = 1
connect_timeout = 60
net_read_timeout = 120
performance_schema_max_table_instances = 400
server-id = 1
log-bin=master-bin                 #開啟二進制日之
log-bin-index = master-bin.index   #二進制日志的索引目錄

[mysqld_safe]
log-error=/data/mysql/mysqld.log
pid-file=/data/mysql/mysqld.pid

server-id #binlog配置需要給mysql服務器設置id用來標識mysql服務器,每個mysql服務器都有不一樣的id。從1開始標識

log-bin #開啟binlog,mysql主服務器都需要開啟

log-bin-index #binlog存放到文件里面,index里面存放着binlog的文件名

2.4 創建數據目錄

[root@master ~]# mkdir -pv /data/mysql

[root@master ~]# chown mysql:mysql /data/mysql/

2.5 重啟服務,並驗證

[root@master ~]# systemctl start mysqld

報錯機排錯,查看日志,錯誤日志如下

2019-07-03T15:08:32.203843Z 0 [ERROR] InnoDB: Operating system error number 13 in a file operation.
2019-07-03T15:08:32.203862Z 0 [ERROR] InnoDB: The error means mysqld does not have the access rights to the directory.
2019-07-03T15:08:32.203871Z 0 [ERROR] InnoDB: os_file_get_status() failed on './ibdata1'. Can't determine file permissions
2019-07-03T15:08:32.203886Z 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
2019-07-03T15:08:32.808009Z 0 [ERROR] Plugin 'InnoDB' init function returned error.
2019-07-03T15:08:32.808138Z 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2019-07-03T15:08:32.808162Z 0 [ERROR] Failed to initialize builtin plugins.
2019-07-03T15:08:32.808172Z 0 [ERROR] Aborting

顯示是沒有權限,但是已經開啟了/data/mysql的權限

關掉selinux,在啟動,成功,是selinux的問題

[root@master ~]# getenforce 
Enforcing
[root@master ~]# setenforce 0
[root@master ~]# getenforce 
Permissive
[root@master ~]# systemctl start mysqld

驗證啟動

[root@master ~]# netstat -ntlp|grep mysql
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      10165/mysqld

使用密碼不能登陸

[root@master src]# mysql -uroot -h localhost -p0JlLA_qy1V:= 
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)     #這個socket不在
[root@master src]# ll /data/mysql/
total 122936
-rw-r-----. 1 mysql mysql       56 Jul  3 11:37 auto.cnf
-rw-r-----. 1 mysql mysql      419 Jul  3 11:37 ib_buffer_pool
-rw-r-----. 1 mysql mysql 12582912 Jul  3 11:37 ibdata1
-rw-r-----. 1 mysql mysql 50331648 Jul  3 11:37 ib_logfile0
-rw-r-----. 1 mysql mysql 50331648 Jul  3 11:37 ib_logfile1
-rw-r-----. 1 mysql mysql 12582912 Jul  3 11:37 ibtmp1
-rw-r-----. 1 mysql mysql      177 Jul  3 11:37 master-bin.000001
-rw-r-----. 1 mysql mysql      154 Jul  3 11:37 master-bin.000002
-rw-r-----. 1 mysql mysql       40 Jul  3 11:37 master-bin.index
drwxr-x---. 2 mysql mysql     4096 Jul  3 11:37 mysql
-rw-r-----. 1 mysql mysql      350 Jul  3 11:37 mysql-slow.log
srwxrwxrwx. 1 mysql mysql        0 Jul  3 11:37 mysql.sock                       #查看在這里
-rw-------. 1 mysql mysql        6 Jul  3 11:37 mysql.sock.lock
drwxr-x---. 2 mysql mysql     8192 Jul  3 11:37 performance_schema
drwxr-x---. 2 mysql mysql     8192 Jul  3 11:37 sys
[root@master src]# ln -s /data/mysql/mysql.sock                                  #做一個軟連接,成功
mysql.sock       mysql.sock.lock  
[root@master src]# ln -s /data/mysql/mysql.sock  /var/lib/mysql/mysql.sock
[root@master src]# mysql -uroot -h localhost -p0JlLA_qy1V:= 

查看數據庫,提示必須改密碼

mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

修改密碼

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)

驗證成功

三 啟動從庫

方式相同

3.1 mysql從庫新增中繼日志relaylog配置

[mysqld]
bind-address=0.0.0.0
port=3306
datadir=/data/mysql
socket=/data/mysql/mysql.sock
user=mysql
skip-name-resolve
slow_query_log=on
long_query_time=1
slow_query_log_file=/data/mysql/mysql-slow.log
innodb-file-per-table=1
innodb_flush_log_at_trx_commit = 2
log_warnings = 1
connect_timeout = 60
net_read_timeout = 120
performance_schema_max_table_instances = 400
server-id = 2
relay-log = relay-log
relay-log-index = relay-log.index

[mysqld_safe]
log-error=/data/mysql/mysqld.log
pid-file=/data/mysql/mysqld.pid

配置說明

server-id #每台mysql服務器的標識需要不一樣

relay-log #從庫需要開啟relay-log,中繼日志

relay-log-index #relaylog也放到文件里面,index里存放着relaylog的文件名

3.2 啟動mysql從庫

[root@slave ~]# mkdir -pv /data/mysql
mkdir: created directory ‘/data’
mkdir: created directory ‘/data/mysql’
[root@slave ~]# chown mysql:mysql /data/mysql
[root@slave ~]# getenforce 
Enforcing
[root@slave ~]# setenforce 0
[root@slave ~]# getenforce 
Permissive
[root@slave ~]# mysqld --initialize --user=mysql
2019-07-03T15:56:10.701329Z 0 [Warning] The syntax '--log_warnings/-W' is deprecated and will be removed in a future release. Please use '--log_error_verbosity' instead.
2019-07-03T15:56:10.701519Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2019-07-03T15:56:11.241974Z 0 [Warning] InnoDB: New log files created, LSN=45790
2019-07-03T15:56:11.327038Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2019-07-03T15:56:11.398579Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 141defd2-9dab-11e9-8fe3-000c2963fd11.
2019-07-03T15:56:11.401121Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2019-07-03T15:56:11.426433Z 1 [Note] A temporary password is generated for root@localhost: xJ,RO+8krdGB
[root@slave ~]# systemctl start mysqld
[root@slave ~]# mysql -u root -pxJ,RO+8krdGB
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
[root@slave ~]# ln -s /data/mysql/mysql.sock  /var/lib/mysql/mysql.sock
[root@slave ~]# mysql -u root -pxJ,RO+8krdGB
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
......
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)
mysql> exit

從庫配置完成

兩台數據庫獨立的,但binlog文件已經有,由於主從還沒有搭建,所以還沒有relaylog

3.3 二進制日志

查看日志狀態

show variables like '%log_bin%';

mysql> show variables like '%log_bin%';
+---------------------------------+------------------------------+
| Variable_name                   | Value                        |
+---------------------------------+------------------------------+
| log_bin                         | ON                           |    #開啟狀態
| log_bin_basename                | /data/mysql/master-bin       |
| log_bin_index                   | /data/mysql/master-bin.index |
| log_bin_trust_function_creators | OFF                          |
| log_bin_use_v1_row_events       | OFF                          |
| sql_log_bin                     | ON                           |
+---------------------------------+------------------------------+

[root@master ~]# ll /data/mysql/

master-bin.index記錄的日志名字

[root@master ~]# cat /data/mysql/master-bin.index 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM