什么?你们项目没用过主从复制和读写分离?

本文详细介绍了如何在Linux环境下搭建MySQL主从复制,包括主库和从库的搭建,以及配置文件的修改。同时讲解了读写分离的配置,通过SpringBoot工程集成Sharding-jdbc实现数据源的分离。文中提供了遇到问题的解决方案和配置过程中的关键步骤,适合数据库管理员和后端开发者参考。
摘要由CSDN通过智能技术生成

温馨提示:大概需要半小时到一小时安装成功。

目录

1、Master库搭建(主库搭建和从库搭建一毛一样)

2、Slave库搭建(参考主库搭建 ↑)

3、绑定主从关系(这一步主要是修改一些配置文件)

1.初始化一个SpringBoot工程,并添加Sharding-jdbc依赖

提示:随着项目数据量的增大,我们不得不开始考虑主从复制和读写分离。

一、主从复制搭建

1、Master库搭建(主库搭建和从库搭建一毛一样)

这里我只准备了一台服务器进行搭建测试,遂主库和从库均在一台服务器上,只不过是访问端口不一样而已

第一步:检查用户组

 
  1. cat /etc/group | grep mysql

  2. cat /etc/passwd |grep mysql

  3. #没有任何输出,说明没有则创建该用户组

  4. #若存在mysql用户组,可以执行删除指令

  5. userdel mysql

  6. #创建用户组

  7. groupadd mysql

  8. useradd -r -g mysql mysql

第二步:下载mysql包

 
  1. 这边提供了永久网盘资源,失效评论区找我,我会第一时间提供。

  2. 我们下面的安装均使用该版本进行安装。

  3. 链接:https://pan.baidu.com/s/1nlCjsIPmKH3PQhU8g9MVGw

  4. 提取码:3mcg

使用xftp软件上传至服务器

什么?你们项目没用过主从复制和读写分离?

 
  1. #解压

  2. tar xzvf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz

第三步:创建存储数据目录并赋权

 
  1. mkdir /usr/local/mysql/data

  2. chown -R mysql:mysql /usr/local/mysql

  3. 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,做一些简单配置

 
  1. basedir=/usr/local/mysql/mysql-5.7.24-linux-glibc2.12-x86_64

  2. socket=/var/lib/mysql/mysql.sock

  3. # Disabling symbolic-links is recommended to prevent assorted security risks

  4. symbolic-links=0

  5. log-error=/var/log/mysqld.log

  6. pid-file=/var/run/mysqld/mysqld.pid

  7. #跳过密码验证

  8. skip-grant-tables

  9. server-id=2

  10. log-bin=mysql-bin

  11. [mysqld]

  12. datadir=/usr/local/mysql/data

  13. port = 3306

  14. sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

  15. symbolic-links=0

  16. max_connections=400

  17. innodb_file_per_table=1

  18. #表名大小写不明感,敏感为

  19. lower_case_table_names=1

第五步启动服务

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

  2. #执行该命令,可能会报如下错误,大多是由于权限问题,找到mysql的文件进行赋权即可(不报错直接命令行登录测试,然后跳到第六步)

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

  4. Starting MySQL............ ERROR! The server quit without updating PID file (/var/run/mysqld/mysqld.pid).

这边我们提供一个解决方案的链接: 解決方案鏈接

还可能会出现:

 
  1. #还可能会出现

  2. Can 't connect to local MySQL server through socket '/tmp/mysql.sock '(2) ";

这边提供另一个解决方案: 解决方案链接

重启服务:

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

  2. Starting MySQL SUCCESS!

  3. #测试下命令行登录

  4. [root@VM-0-10-centos bin]# mysql -u root -p

  5. Enter password:

  6. #到这一步直接回车,不比输入密码,因为刚才已经跳过密码验证了

  7. MySQL [(none)]> exit;

  8. Bye

  9. [root@VM-0-10-centos bin]#

第五步添加软连接,方便重启

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

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

  3. #添加完软连接就可以在任意目录下愉快地重启了

  4. [root@VM-0-10-centos bin]# service mysql restart

  5. Shutting down MySQL.... SUCCESS!

  6. Starting MySQL.......... SUCCESS!

第七步:登录mysql,修改密码

 
  1. #编辑my.cnf

  2. vim /etc/my.cnf

  3. #注释掉

  4. #skip-grant-tables

  5. #重启mysql

  6. service mysql restart

  7. mysql -u root -p

  8. mysql> use mysql;#使用数据库

  9. mysql> set password for root@localhost = password('mysql123');#修改数据库密码为mysql123

  10. mysql> update user set user.Host='%' where user.User='root';#开放远程连接

  11. mysql>flush privileges;

第七步:设置开机启动

 
  1. 1、将服务文件拷贝到init.d下,并重命名为mysql

  2. [root@localhost /]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

  3. 2、赋予可执行权限

  4. [root@localhost /]# chmod +x /etc/init.d/mysqld

  5. 3、添加服务

  6. [root@localhost /]# chkconfig --add mysqld

验证navicat远程连接

什么?你们项目没用过主从复制和读写分离?

2、Slave库搭建(参考主库搭建 ↑ )

3、绑定主从关系(这一步主要是修改一些配置文件)

(1)开启master的二进制日志

①配置my.cnf配置文件

vi /etc/my.cnf

②添加二进制日志配置,开启二进制(mysql-bin只是二进制日志名称,可以自行指定)

 
  1. server-id=1 #id是一定要指定的,是唯一的标识(master数据库要比slave数据库的id优先级高才行)

  2. 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只是二进制日志名称,可以自行指定)

 
  1. server-id=2

  2. log-bin=mysql-bin

注意:每一台指定唯一的一个server-id标识

修改完配置服务需重启服务

[root@VM_0_16_centos ~]# service mysqld restart

②配置slave指向master,登录数据库

 
  1. 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;

  2. mysql>flush privileges;

  3. mysql>start slave;

  4. mysql> show slave status\G;

  5. *************************** 1. row ***************************

  6. Slave_IO_State:

  7. Master_Host: 10.0.3x.xx

  8. Master_User: root

  9. Master_Port: 3306

  10. Connect_Retry: 60

  11. Master_Log_File: mysql-bin.000002

  12. Read_Master_Log_Pos: 154

  13. Relay_Log_File: localhost-relay-bin.000002

  14. Relay_Log_Pos: 4

  15. Relay_Master_Log_File: mysql-bin.000002

  16. Slave_IO_Running: YES

  17. Slave_SQL_Running: YES

  18. Replicate_Do_DB:

  19. Replicate_Ignore_DB:

  20. Replicate_Do_Table:

  21. Replicate_Ignore_Table:

  22. Replicate_Wild_Do_Table:

  23. Replicate_Wild_Ignore_Table:

  24. Last_Errno: 0

  25. Last_Error:

  26. Skip_Counter: 0

  27. Exec_Master_Log_Pos: 154

  28. Relay_Log_Space: 154

  29. Until_Condition: None

  30. Until_Log_File:

  31. Until_Log_Pos: 0

  32. Master_SSL_Allowed: No

  33. Master_SSL_CA_File:

  34. Master_SSL_CA_Path:

  35. Master_SSL_Cert:

  36. Master_SSL_Cipher:

  37. Master_SSL_Key:

  38. Seconds_Behind_Master: NULL

  39. Master_SSL_Verify_Server_Cert: No

  40. Last_IO_Errno: 2003

  41. Last_IO_Error: error connecting to master 'root@10.0.33.18:3306' - retry-time: 60 retries: 9

  42. Last_SQL_Errno: 0

  43. Last_SQL_Error:

  44. Replicate_Ignore_Server_Ids:

  45. Master_Server_Id: 0

  46. Master_UUID:

  47. Master_Info_File: /usr/local/mysql/data/master.info

  48. SQL_Delay: 0

  49. SQL_Remaining_Delay: NULL

  50. Slave_SQL_Running_State:

  51. Master_Retry_Count: 86400

  52. Master_Bind:

  53. Last_IO_Error_Timestamp: 210419 15:17:11

  54. Last_SQL_Error_Timestamp:

  55. Master_SSL_Crl:

  56. Master_SSL_Crlpath:

  57. Retrieved_Gtid_Set:

  58. Executed_Gtid_Set:

  59. Auto_Position: 0

  60. Replicate_Rewrite_DB:

  61. Channel_Name:

  62. Master_TLS_Version:

  63. 1 row in set (0.00 sec)

主要看这俩进程是否YES:

什么?你们项目没用过主从复制和读写分离?

OK,主从复制配置文件到此修改完成。

提示:若主从挂调,可以优先在这里查看报错信息。

什么?你们项目没用过主从复制和读写分离?

4、测试主从复制效果

什么?你们项目没用过主从复制和读写分离?

什么?你们项目没用过主从复制和读写分离?

二、读写分离配置

1.初始化一个SpringBoot工程,并添加Sharding-jdbc依赖

数据源配置代码如下:

 
  1. sharding.jdbc.datasource.names=master,slave

  2. # 主数据源

  3. sharding.jdbc.datasource.master.type=com.alibaba.druid.pool.DruidDataSource

  4. sharding.jdbc.datasource.master.driver-class-name=com.mysql.jdbc.Driver

  5. sharding.jdbc.datasource.master.url=jdbc:mysql://10.0.33.18:3308/sharding?useUnicode=true&characterEncoding=utf-8&useSSL=false

  6. sharding.jdbc.datasource.master.username=root

  7. sharding.jdbc.datasource.master.password=mysql123

  8. # 从数据源

  9. sharding.jdbc.datasource.slave.type=com.alibaba.druid.pool.DruidDataSource

  10. sharding.jdbc.datasource.slave.driver-class-name=com.mysql.jdbc.Driver

  11. sharding.jdbc.datasource.slave.url=jdbc:mysql://10.0.33.19:3306/sharding?useUnicode=true&characterEncoding=utf-8&useSSL=false

  12. sharding.jdbc.datasource.slave.username=root

  13. sharding.jdbc.datasource.slave.password=mysql123

  14. # 读写分离配置

  15. sharding.jdbc.config.masterslave.load-balance-algorithm-type=round_robin

  16. sharding.jdbc.config.masterslave.name=dataSource

  17. sharding.jdbc.config.masterslave.master-data-source-name=master

  18. sharding.jdbc.config.masterslave.slave-data-source-names=slave

2.测试读写分离效果

如下,在mysql-master 容器中,查看sql日志,可以看到插入的sql在主数据库执行:

什么?你们项目没用过主从复制和读写分离?

如下,查看mysql-slave的sql日志,读取列表数据再从数据库执行,说明我们配置的读写分离是成功的。

什么?你们项目没用过主从复制和读写分离?

原文链接:
http://www.cnblogs.com/dk1024/p/14703463.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值