什么?你們項目沒用過主從復制和讀寫分離?


溫馨提示:大概需要半小時到一小時安裝成功。

目錄

前言

一、主從復制搭建

1、Master庫搭建(主庫搭建和從庫搭建一毛一樣)

2、Slave庫搭建(參考主庫搭建 ↑)

3、綁定主從關系(這一步主要是修改一些配置文件)

4、測試主從復制效果

二、讀寫分離配置

1.初始化一個SpringBoot工程,並添加Sharding-jdbc依賴

2.測試讀寫分離效果


前言

提示:隨着項目數據量的增大,我們不得不開始考慮主從復制和讀寫分離。

一、主從復制搭建

1、Master庫搭建(主庫搭建和從庫搭建一毛一樣)

這里我只准備了一台服務器進行搭建測試,遂主庫和從庫均在一台服務器上,只不過是訪問端口不一樣而已

第一步:檢查用戶組

cat /etc/group | grep mysql
cat /etc/passwd |grep mysql
#沒有任何輸出,說明沒有則創建該用戶組
#若存在mysql用戶組,可以執行刪除指令
userdel mysql
#創建用戶組
groupadd mysql
useradd -r -g mysql mysql

 

第二步:下載mysql包

這邊提供了永久網盤資源,失效評論區找我,我會第一時間提供。
我們下面的安裝均使用該版本進行安裝。

鏈接:https://pan.baidu.com/s/1nlCjsIPmKH3PQhU8g9MVGw 
提取碼:3mcg 

使用xftp軟件上傳至服務器

#解壓
tar xzvf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz

第三步:創建存儲數據目錄並賦權

mkdir /usr/local/mysql/data
chown -R mysql:mysql /usr/local/mysql
chmod -R 755 /usr/local/mysql

目錄切換到/home/mysql下,所有解壓文件移動到usr/local/mysql下面

mv mysql-5.7.24-linux-glibc2.12-x86_64 /usr/local/mysql

第四步 編輯my.cnf,做一些簡單配置


basedir=/usr/local/mysql/mysql-5.7.24-linux-glibc2.12-x86_64
socket=/var/lib/mysql/mysql.sock

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
#跳過密碼驗證
skip-grant-tables
server-id=2
log-bin=mysql-bin

[mysqld]
datadir=/usr/local/mysql/data
port = 3306
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
symbolic-links=0
max_connections=400
innodb_file_per_table=1
#表名大小寫不明感,敏感為
lower_case_table_names=1

第五步啟動服務

/usr/local/mysql/mysql-5.7.24-linux-glibc2.12-x86_64/support-files/mysql.server start

#執行該命令,可能會報如下錯誤,大多是由於權限問題,找到mysql的文件進行賦權即可(不報錯直接命令行登錄測試,然后跳到第六步)

[root@VM-0-10-centos mysql]# /usr/local/mysql/mysql-5.7.24-linux-glibc2.12-x86_64/support-files/mysql.server start
Starting MySQL............ ERROR! The server quit without updating PID file (/var/run/mysqld/mysqld.pid).

 

這邊我們提供一個解決方案的鏈接:解決方案鏈接

 

還可能會出現:

#還可能會出現
Can 't connect to local MySQL server through socket '/tmp/mysql.sock '(2) ";

 

這邊提供另一個解決方案:解決方案鏈接

重啟服務:

[root@VM-0-10-centos bin]# /usr/local/mysql/mysql-5.7.24-linux-glibc2.12-x86_64/support-files/mysql.server start
Starting MySQL SUCCESS! 


#測試下命令行登錄
[root@VM-0-10-centos bin]# mysql -u root -p
Enter password:
#到這一步直接回車,不比輸入密碼,因為剛才已經跳過密碼驗證了

MySQL [(none)]> exit;
Bye
[root@VM-0-10-centos bin]# 

 

第五步添加軟連接,方便重啟

ln -s /usr/local/mysql/mysql-5.7.24-linux-glibc2.12-x86_64/bin/mysql /usr/bin/mysql
ln -s /usr/local/mysql/mysql-5.7.24-linux-glibc2.12-x86_64/bin/mysql /usr/bin/mysql


#添加完軟連接就可以在任意目錄下愉快地重啟了
[root@VM-0-10-centos bin]# service mysql restart
Shutting down MySQL.... SUCCESS! 
Starting MySQL.......... SUCCESS! 

 

第七步:登錄mysql,修改密碼

#編輯my.cnf
vim /etc/my.cnf
#注釋掉

  #skip-grant-tables

#重啟mysql
service mysql restart


mysql -u root -p
mysql> use mysql;#使用數據庫
mysql> set password for root@localhost = password('mysql123');#修改數據庫密碼為mysql123
mysql> update user set user.Host='%' where user.User='root';#開放遠程連接
mysql>flush privileges;

 

第七步:設置開機啟動

1、將服務文件拷貝到init.d下,並重命名為mysql
[root@localhost /]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
2、賦予可執行權限
[root@localhost /]# chmod +x /etc/init.d/mysqld
3、添加服務
[root@localhost /]# chkconfig --add mysqld

 

驗證navicat遠程連接

 

 

2、Slave庫搭建(參考主庫搭建

3、綁定主從關系(這一步主要是修改一些配置文件)

(1)開啟master的二進制日志

        ①配置my.cnf配置文件

vi /etc/my.cnf

        ②添加二進制日志配置,開啟二進制(mysql-bin只是二進制日志名稱,可以自行指定)

server-id=1             #id是一定要指定的,是唯一的標識(master數據庫要比slave數據庫的id優先級高才行)
log-bin=mysql-bin       #開啟二進制日志

       ③授權 :登錄數據庫,需要給slave數據庫配置一個用戶/密碼的權限

                       (允許某個ip地址的某個用戶以某個密碼對當前數據庫的所有庫和表進行復制操作配置之后需要刷新權限)

mysql> grant replication slave on *.* to 'root'@'slave數據庫ip' identified by '密碼';
mysql> flush privileges;

   

   ④修改完重啟服務,查詢master狀態

[root@VM_0_10_centos ~]# service mysqld restart

登錄數據庫,查詢master狀態,如下圖所示:

mysql> show master status;

file:是日志文件名稱

position:日志所在位置

 

(2) 開啟slave的二進制日志

    ①修改my.cnf

 vi /etc/my.cnf

  添加slave二進制日志配置,開啟二進制(mysql-bin只是二進制日志名稱,可以自行指定)

server-id=2
log-bin=mysql-bin

注意:每一台指定唯一的一個server-id標識

修改完配置服務需重啟服務

[root@VM_0_16_centos ~]# service mysqld restart

   ②配置slave指向master,登錄數據庫

mysql> change master to master_host='10.0.33.18',master_port=3306,master_user='root',master_password='mysql123',master_log_file='mysql-bin.000002',master_log_pos=154;

mysql>flush privileges;

mysql>start slave;

mysql> show slave status\G;

*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: 10.0.3x.xx
                  Master_User: root
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 154
               Relay_Log_File: localhost-relay-bin.000002
                Relay_Log_Pos: 4
        Relay_Master_Log_File: mysql-bin.000002
             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: 154
              Relay_Log_Space: 154
              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: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 2003
                Last_IO_Error: error connecting to master 'root@10.0.33.18:3306' - retry-time: 60  retries: 9
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 0
                  Master_UUID: 
             Master_Info_File: /usr/local/mysql/data/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: 
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 210419 15:17:11
     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)

主要看這倆進程是否YES:

OK,主從復制配置文件到此修改完成。

提示:若主從掛調,可以優先在這里查看報錯信息。

 

4、測試主從復制效果

 

 

二、讀寫分離配置

1.初始化一個SpringBoot工程,並添加Sharding-jdbc依賴

數據源配置代碼如下:

sharding.jdbc.datasource.names=master,slave

# 主數據源
sharding.jdbc.datasource.master.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.master.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.master.url=jdbc:mysql://10.0.33.18:3308/sharding?useUnicode=true&characterEncoding=utf-8&useSSL=false
sharding.jdbc.datasource.master.username=root
sharding.jdbc.datasource.master.password=mysql123

# 從數據源
sharding.jdbc.datasource.slave.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.slave.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.slave.url=jdbc:mysql://10.0.33.19:3306/sharding?useUnicode=true&characterEncoding=utf-8&useSSL=false
sharding.jdbc.datasource.slave.username=root
sharding.jdbc.datasource.slave.password=mysql123

# 讀寫分離配置
sharding.jdbc.config.masterslave.load-balance-algorithm-type=round_robin
sharding.jdbc.config.masterslave.name=dataSource
sharding.jdbc.config.masterslave.master-data-source-name=master
sharding.jdbc.config.masterslave.slave-data-source-names=slave

2.測試讀寫分離效果

如下,在mysql-master 容器中,查看sql日志,可以看到插入的sql在主數據庫執行:

如下,查看mysql-slave的sql日志,讀取列表數據在從數據庫執行,說明我們配置的讀寫分離是成功的。

 


免責聲明!

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



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